Jump to content

GNU/Linux Installer Server: Installation & Configuration

 What I'll be explaining from beginning to end is the setup and network installation of a server you can host (be that bare-metal or inside a virtual machine) that enables you to install various distributions of Linux onto clients from a network server instead of from USB, CD, or other local media.

 

2125703930_Screenshotfrom2022-07-1920-39-25.thumb.png.6fa7a8ca63e282aa4806e6e221a034a5.png

 

This is a rather advanced topic I'll be covering. For that reason it is expected that you already have (at the minimum) a fundamental understanding of certain network concepts (IP addresses, subnets, default gateways, routers, protocols like DHCP, HTTP, FTP, SSH), what Linux is, and how to install it. Regardless of that being said, if you need additional help with networking, or how to install Linux feel free to leave a comment and someone or myself will help you wherever you're stuck. 🙂 

 

For the purposes of this installation I'll be using Ubuntu Server 20.04 inside a VM on a server on my network.

 

Index

Spoiler

1. Network Setup

     1.1 - DNSMASQ

          1.1.1 - Installing DNSMASQ

          1.1.2 - Configuring DNSMASQ

     1.2 - ISC-DHCP-SERVER

2. TFTP & HTTP Setup

     2.1 - TFTP Setup

     2.2 - HTTP Setup

3. iPXE Setup

4. Main.ipxe Setup

     4.1 - Arch Compatibility

     4.2 - Debian Compatibility

     4.3 - RHEL Compatibility

 

1. Network Setup

Spoiler

When installing your choice of Linux ensure that your configuration uses one of the following:

A. A Static IP address that your router will not hand out to other clients (ie. Reserve the IP address in the router using the NIC MAC or exclude it from the DHCP pool).

B. That this server itself will act as the DHCP server for the network. (ie. An isolated network or you plan to disable DHCP all together in your router.)

C. For everyone locked out of their Routers there is an alternative (all-be-it less ideal). Leave DHCP enabled during OS setup. We will elaborate on your options in a bit.

 

There are two Debian packages that are popular when someone needs to host DHCP services on their network. Ether of which we will need as that is how our clients are going to perform their pre-boot initialization. Those packages are:

  1. DNSMASQ
  2. ISC-DHCP-SERVER

Which one you should use is entirely dependent on your network setup but both are more than capable of serving the primary purpose we need. One has a feature that gives it an advantage over the other in this use case though in that it has the ability to serve as a ProxyDHCP server. A feature of DNSMASQ.

 

Very briefly, ProxyDHCP is a service that forwards a DHCP client request to another DHCP server on the network (such as your router). This exists because having more than one DHCP server on a network is generally undesirable as it can cause conflicts. However if you plan to have this network fully isolated or don't mind using this server as your DHCP server then ISC-DHCP-SERVER is also adequate. For everyone locked out of their routers DNSMASQ is your best option if you need to integrate this into an existing LAN.

 

Regardless of superiority or what makes one better than the other I will be briefly covering both.

 

1.1 - DNSMASQ

Spoiler

1.1.1 - Installing DNSMASQ

Spoiler

DNSMASQ can be installed with:

apt install dnsmasq

After this an error may occur stating dnsmasq cannot start because a service is already running on port 53.

 

This is likely caused by systemd-resoved which is important for Name Resolution but there's a quick fix for that. Start by disabling the service.

systemctl stop systemd-resolved
systemctl disable systemd-resolved
systemctl mask systemd-resolved

 

If you decide you need to reverse what you just disabled this can be done with the sequence of commands:

systemctl unmask systemd-resolved
systemctl enable systemd-resolved
systemctl start systemd-resolved

 

Next delete and recreate /etc/resolv.conf with your preference of DNS:

rm /etc/resolv.conf
echo "nameserver 192.168.0.233" >> /etc/resolv.conf

I'm using a private DNS but you can use any Public DNS you wish.

 

From here you should be able to start DNSMASQ and have Name Resolution service restored:

systemctl start dnsmasq
systemctl status dnsmasq

The output of which should appear similar to:

● dnsmasq.service - dnsmasq - A lightweight DHCP and caching DNS server
     Loaded: loaded (/lib/systemd/system/dnsmasq.service; enabled; vendor preset: enabled)
     Active: active (running) since Thu 2022-07-21 22:43:15 UTC; 4s ago
    Process: 2126 ExecStartPre=/usr/sbin/dnsmasq --test (code=exited, status=0/SUCCESS)
    Process: 2127 ExecStart=/etc/init.d/dnsmasq systemd-exec (code=exited, status=0/SUCCESS)
    Process: 2152 ExecStartPost=/etc/init.d/dnsmasq systemd-start-resolvconf (code=exited, status=0/SUCCESS)
   Main PID: 2151 (dnsmasq)
      Tasks: 1 (limit: 9397)
     Memory: 2.3M
     CGroup: /system.slice/dnsmasq.service
             └─2151 /usr/sbin/dnsmasq -x /run/dnsmasq/dnsmasq.pid -u dnsmasq -7 /etc/dnsmasq.d,.dpkg-dist,.dpkg-old,.dpkg-new --local-service --trust-anchor=.,20326,8,2,e06d44b80b8f1d39a95c0b0d7c65d0845>

Jul 21 22:43:15 ipxe-linux systemd[1]: Starting dnsmasq - A lightweight DHCP and caching DNS server...
Jul 21 22:43:15 ipxe-linux dnsmasq[2126]: dnsmasq: syntax check OK.
Jul 21 22:43:15 ipxe-linux dnsmasq[2151]: started, version 2.80 cachesize 150
Jul 21 22:43:15 ipxe-linux dnsmasq[2151]: DNS service limited to local subnets
Jul 21 22:43:15 ipxe-linux dnsmasq[2151]: compile time options: IPv6 GNU-getopt DBus i18n IDN DHCP DHCPv6 no-Lua TFTP conntrack ipset auth nettlehash DNSSEC loop-detect inotify dumpfile
Jul 21 22:43:15 ipxe-linux dnsmasq[2151]: reading /etc/resolv.conf
Jul 21 22:43:15 ipxe-linux dnsmasq[2151]: using nameserver 192.168.0.233#53
Jul 21 22:43:15 ipxe-linux dnsmasq[2151]: read /etc/hosts - 7 addresses
Jul 21 22:43:15 ipxe-linux systemd[1]: Started dnsmasq - A lightweight DHCP and caching DNS server.

If you see "Active: failed" and other error, failed, failed indicators then something is wrong.

 

1.1.2 - Configuring DNSMASQ

Spoiler

Edit the dnsmasq configuration file:

nano /etc/dnsmasq.conf

To the top or bottom of this file append the following parameters.

port=0
tftp-root=/pxe-boot
dhcp-no-override
pxe-prompt="PXE booting in", 30
pxe-service=X86PC, "Boot from network", undionly.kpxe
pxe-service=X86-64_EFI, "Boot from network", ipxe.efi
dhcp-range=192.168.0.202,proxy
dhcp-boot=,,192.168.0.202
  • port=0 just says this isn't going to act as a DNS server.
  • tftp-root=/pxe-boot says the root directory for TFTP files that will be served to clients.
  • dhcp-no-override helps compatibility with older clients.
  • pxe-prompt="PXE booting in", 30 is a predominately cosmetic feature. It will delay the launch of PXE if you don't want to giving you the chance to hit ESC.
  • pxe-service=X86PC, "Boot from network", undionly.kpxe this is for x86 legacy clients that don't support UEFI Network Boot.
  • pxe-service=X86-64_EFI, "Boot from network", ipxe.efi this is for x64 UEFI clients that support UEFI Network Boot.
  • dhcp-range=192.168.0.202,proxy this tells DNSMASQ to behave as a ProxyDHCP. Replace the IP with the IP of your server.
  • dhcp-boot=,,192.168.0.202 tells the client what the "next-server" IP is. (Where to fetch the iPXE file)

 

 

1.2 - ISC-DHCP-SERVER

Spoiler

Start by installing the isc-dhcp-server package with:

apt install isc-dhcp-server

You should immediately be able to edit the servers configuration with:

nano etc/dhcp/dhcpd.conf

At the beginning or the end of this file append:

subnet 192.168.0.0 netmask 255.255.255.0 {
range 192.168.0.2 192.168.0.254;
next-server 192.168.0.202; }

option client-arch code 93 = unsigned integer 16;
  if option client-arch != 00:00 {
     filename "ipxe.efi";
  } else {
     filename "undionly.kpxe";
  }
  • subnet is the network you plan to advertise
  • netmask is the network bit:host bit ratio.
  • range signifies what IP's will be handed out via DHCP
  • next-server is our TFTP server (Where to fetch the iPXE file)
  • The option command followed by the lines composing an if/else statement determine if the requesting client needs the Legacy or UEFI version of iPXE and hands it out accordingly.

If you intend on using this server as your networks primary DHCP server you may need to configure your Default Gateway IP so clients still know the way to your router. This can be accomplished by adding:

option routers 192.168.0.1;

When you're done restart isc-dhcp-server:

service isc-dhcp-server restart

 

 

 

2. TFTP & HTTP Setup

Spoiler

In order for network clients to get the files we specified in the Network Setup portion of this tutorial in addition to Operating System files we'll be hosting both a TFTP & Apache (HTTP) server. Both can be installed at once using:

apt install tftpd-hpa apache2


2.1 - TFTP Setup

Spoiler

Starting with TFTP edit it's configuration file using:

nano /etc/default/tftpd-hpa

And modify it to appear as:

TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/pxe-boot"
TFTP_ADDRESS=":69"
TFTP_OPTIONS="--secure"

 

 

2.2 - HTTP Setup

Spoiler

To edit Apache's configuration file use:

nano /etc/apache2/sites-available/000-default.conf

And modify it to appear as:

<VirtualHost *:80>
        ServerAdmin some@mail.com
        DocumentRoot /pxe-boot

        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

<Directory />
        Options +FollowSymLinks +Indexes
        Require all granted
</Directory>

 

 

Now restart both services.

systemctl restart tftpd-hpa && systemctl restart apache2

At this point you should be able to visit a blank Apache page if you go to the IP assigned to the server from a web browser on another computer.

 

3. iPXE Setup

Spoiler

To get started with iPXE we have to start by making sure we have a whole plethora of packages installed.

apt install make gcc binutils perl mtools mkisofs syslinux liblzma-dev isolinux git

Depending on your distro most of these may already be accounted for.

 

After this we need to download the latest version of iPXE from Git:

git clone https://github.com/ipxe/ipxe.git

And move inside the downloaded folder:

cd ipxe/src

 

What we've done here so far is we've downloaded the source code of iPXE and all of the tools needed to compile it. Before we do though we need to embed a script. The script is going to be a pre-determined set of basic instructions we want iPXE to do as soon as it get's downloaded by our clients. To do that run:

nano embed.ipxe

and copy paste the following inside:

#!ipxe
dhcp && goto netboot || goto dhcperror

:dhcperror
prompt --key s --timeout 10000 DHCP failed, hit 's' for the iPXE shell; reboot in 10 seconds && shell || reboot

:netboot
chain tftp://${next-server}/main.ipxe ||
prompt --key s --timeout 10000 Chainloading failed, hit 's' for the iPXE shell; reboot in 10 seconds && shell || reboot

There's more information here than there really needs to be but it's fine. Save & exit.

 

Now what you do next is dependent on your needs:

  1. If you ONLY need iPXE for Legacy clients run: make bin/undionly.kpxe EMBED=embed.ipxe
    1. When it finishes compiling: cp bin/undionly.kpxe /pxe-boot
  2. If you ONLY need iPXE for UEFI clients run: make bin-x86_64-efi/ipxe.efi EMBED=embend.ipxe
    1. When it finishes compiling: cp bin-x86_64-efi/ipxe.efi /pxe-boot
  3. If you NEED BOTH Legacy & UEFI make a copy of the ipxe folder and compile both files independently. Once done. Move them to /pxe-boot.

At this stage if you have a PXE client ready on the network booting it you should see the client get an IP, update to the new iPXE version, and fail looking for main.ipxe. This is good.

 

4. Main.ipxe Setup

Spoiler

Main.ipxe is the iPXE script that composes the menu displayed at the beginning of this tutorial. The level of functionality you have here is actually pretty incredible and I cannot cover everything but this github post is an excellent resource if you want to try and go beyond the scope of what I plan to cover.

 

Below is an very simple test main.ipxe you can use to make sure the server is working.

#!ipxe
:MENU
menu
item --gap -- ---------------- iPXE boot menu ----------------
item hello        Hello world
item shell          ipxe shell
choose --default return --timeout 5000 target && goto ${target}

:hello
echo "hello world"
boot ||
goto MENU

:shell
shell ||
goto MENU

autoboot

Navigate to /pxe-boot, create an empty file named main.ipxe, then copy paste the contents above. Save the file.

 

If you take an iPXE client and boot off the network now you should eventually be brought to this page:

 

1638868896_Screenshotfrom2022-07-2216-47-31.png.77c4dcf5e44c64da0e3fc52cfa229d83.png

 

As mentioned before there is a lot of flexibility with what you can do with the script behind these menus. You can get pretty creative but I'm just going to go over how I setup mine breaking it down into easier to understand blocks starting with the Global Variables at the top of the file. Open main.ipxe again and delete everything except #!ipxe at the top.

 

At the top of my file I've used the following setup:

#!ipxe

set url    http://${next-server}/
set initrd ${url}initrd/
set iso    ${url}iso/
set kernel ${url}kernel/
set ucode  ${url}ucode/

These set <variable> <value> statements help save space and time later in the script by making it so that something repetitive doesn't have to be written out again and again and again, instead substituting the variable.

Set statements are entirely optional, they're not a requirement, and how you form your folder tree in /pxe-boot will determine how useful they are.

 

For me I have six variables I want to declare.

  1. ${url} is the server address that hosts my TFTP & HTTP services (ie. this server).
  2. ${next-server} is the IP I have assigned this server. iPXE knows what it is from DHCP.
  3. ${initrd} is my RAM Disk folder. When you plan to install from the network that data has to be stored somewhere and that somewhere is RAM.
  4. ${iso} is my folder for .ISO files and plain folders both containing OS's.
  5. ${kernel} is my folder for vmlinuz kernel files.
  6. ${ucode} is my folder for intel & amd ucode files which are needed for some distros.

If you're really so inclined nothing stops you from combining, mixing & matching, or going with a completely different structure. You have complete creative freedom here. The one important thing to understand though is anything downloaded from http://${next-server}/ are files inside the /pxe-boot folder. So for whatever folder structure you pick you will likely want to declare ${url} at least so you don't have to type the server address over and over.

 

The next segment of my config file is the menu itself:

menu
item exit                 Exit iPXE and continue BIOS boot
item --gap -- --------------- iPXE Install Menu ---------------
item arch                 Arch Linux 5.18.7
item bodhi                Bodhi 6.0.0
item centos               CentOS 7
item debian               Debian 11.4.0 (Requires Internet)
item elementaryos         ElementaryOS 6.1
item fedora-s             Fedora 36 Server
item fedora-w             Fedora 36 Workstation
item kubuntu              Kubuntu 22.04 LTS
item lubuntu              Lubuntu 22.04 LTS
item manjaro              Manjaro 21.3.2
item mint                 Linux Mint 20.3
item peppermintos         PeppermintOS
item popos                PopOS 22.04 LTS
item rocky                Rocky 9.0
item ubuntu-d             Ubuntu Desktop 22.04 LTS
item ubuntu-s             Ubuntu Server  20.04 LTS
item xubuntu              Xubuntu 22.04 LTS
item --gap -- -------------------------------------------------
choose target && goto ${target}

I have a lot of OS's here for demonstration and educational purposes. Additionally not every OS can be started the same way as you'll find out later.

The menu is open to a fair bit of creative freedom so long as you adhere to a few basic rules:

  1. menu must be at the top.
  2. item <variable> <description> items in the middle.
  3. choose target && goto ${target} needs to sit at the end.

Item is a command and the following <variable> acts as a hyperlink (in a sense) which we will discuss in the next section. The description is the only part visible to the user when booting and can be whatever you like within reason.

 

What comes next is where things get complicated and I'm going to do my best to paraphrase it while keeping it descriptive. The Linux distros listed above are based on three different kernels, those being Debian, Arch, and RHEL. These different distrobutions require special parameters and in some instances distros based on the same kernel still require special parameters in order to boot.

 

NOTE: This compatibility list will be subject to later updates with time adding what is necessary for other distros to be supported.


4.1 - Arch Compatibility

Spoiler

This method includes Arch 5.18.7 & Manjaro 21.3.2:

:arch
kernel ${kernel}arch/5.18.7/vmlinuz-linux
initrd ${ucode}arch/5.18.7/amd-ucode.img
initrd ${ucode}arch/5.18.7/intel-ucode.img
initrd ${initrd}arch/5.18.7/initramfs-linux.img
imgargs vmlinuz-linux initrd=amd-ucode.img initrd=intel-ucode.img initrd=initramfs-linux.img archiso_http_srv=${iso}archlinux-2022.07.01-x86_64/ ip=dhcp
boot

NOTE: Arch & Manjaro need to have all their files extracted from the .ISO before uploading them to the HTTP server.

If you need help locating the kernel & initrd files from the .ISO:

  1. Arch
    1. archlinux-2022.07.01-x86_64/arch/boot/x86_64/vmlinuz-linux
    2. archlinux-2022.07.01-x86_64/arch/boot/amd-ucode.img
    3. archlinux-2022.07.01-x86_64/arch/boot/intel-ucode.img
    4. archlinux-2022.07.01-x86_64/arch/boot/x86_64/initramfs-linux.img
  2. Manjaro
    1. manjaro-kde-21.3.2-220704-linux515/boot/vmlinuz-x86_64
    2. manjaro-kde-21.3.2-220704-linux515/boot/amd_ucode.img
    3. manjaro-kde-21.3.2-220704-linux515/boot/intel_ucode.img
    4. manjaro-kde-21.3.2-220704-linux515/boot/initramfs-x86_64.img

 

 

4.2 - Debian Compatibility

Spoiler

NOTE: Debian is a bit divided. Scroll down more if you don't see your distro.

 

This method includes Kubuntu 22.04, Lubuntu 22.04, Linux Mint 20.3, Ubuntu Desktop 22.04, Ubuntu Server 20.04.3 & Xubuntu 22.04

:kubuntu
kernel ${kernel}kubuntu/22.04/vmlinuz ip=dhcp url=${iso}kubuntu-22.04-desktop-amd64.iso initrd=initrd
initrd ${initrd}kubuntu/22.04/initrd
boot

If you need help locating the kernel & initrd files from the .ISO:

  1. Kubuntu
    1. kubuntu-22.04-desktop-amd64.iso/casper/vmlinuz
    2. kubuntu-22.04-desktop-amd64.iso/casper/initrd
  2. Lubuntu
    1. lubuntu-22.04-desktop-amd64.iso/casper/vmlinuz
    2. lubuntu-22.04-desktop-amd64.iso/casper/initrd
  3. Linux Mint
    1. linuxmint-20.3-cinnamon-64bit.iso/casper/vmlinuz
    2. linuxmint-20.3-cinnamon-64bit.iso/casper/initrd.lz
  4. Ubuntu Desktop
    1. ubuntu-22.04-desktop-amd64.iso/casper/vmlinuz
    2. ubuntu-22.04-desktop-amd64/casper/initrd
  5. Ubuntu Server
    1. ubuntu-20.04.3-live-server-amd64.iso/casper/vmlinuz
    2. ubuntu-20.04.3-live-server-amd64.iso/casper/initrd
  6. Xubuntu
    1. xubuntu-22.04-desktop-amd64.iso/casper/vmlinuz
    2. xubuntu-22.04-desktop-amd64.iso/casper/initrd

The next method includes Bodhi 6.0.0, ElementaryOS 6.1 & PopOS 22.04

:elementaryos
kernel ${kernel}elementaryos/6.1/vmlinuz boot=casper ip=dhcp url=${iso}elementaryos-6.1-stable.20211218-rc.iso initrd=initrd.lz
initrd ${initrd}elementaryos/6.1/initrd.lz
boot

If you need help locating the kernel & initrd files from the .ISO:

  1. Bodhi
    1. bodhi-6.0.0-64.iso/casper/vmlinuz
    2. bodhi-6.0.0-64.iso/casper/initrd.gz
  2. ElementaryOS
    1. elementaryos-6.1-stable.20211218-rc.iso/casper/vmlinuz
    2. elementaryos-6.1-stable.20211218-rc.iso/casper/initrd.lz
  3. PopOS
    1. pop-os_22.04_amd64_intel_10.iso/casper/vmlinuz.efi
    2. pop-os_22.04_amd64_intel_10.iso/casper/initrd.gz

The next method includes Debian 11.4.0

:debian
kernel ${kernel}debian/11.4.0/vmlinuz initrd=initrd.gz
initrd ${initrd}debian/11.4.0/initrd.gz
boot

This requires a Internet connection and the two needed files can be downloaded here.
vmlinuz & initrd.gz will download the installation files from a Debian mirror. No .ISO required but an Internet Connection will be.

 

4.3 - RHEL Compatibility

Spoiler

NOTE: RHEL is a bit divided. Scroll down more if you don't see your distro.

 

This method includes CentOS 7 & Fedora 36 Workstation:

:centos
kernel ${kernel}centos/7/vmlinuz root=live:${iso}CentOS-7-x86_64-Minimal-2009.iso initrd=initrd.img
initrd ${initrd}centos/7/initrd.img
boot

If you need help locating the kernel & initrd files from the .ISO:

  1. CentOS
    1. CentOS-7-x86_64-Minimal-2009.iso/images/pxeboot/vmlinuz
    2. CentOS-7-x86_64-Minimal-2009.iso/images/pxeboot/initrd.img
  2. Fedora Workstation
    1. Fedora-Workstation-Live-x86_64-36-1.5.iso/images/pxeboot/vmlinuz
    2. Fedora-Workstation-Live-x86_64-36-1.5/images/pxeboot/initrd.img

 

The next method works for Fedora 36 Server & Rocky 9.0:

:fedora-s
kernel ${kernel}fedora-s/36/vmlinuz inst.repo=${iso}Fedora-Server-dvd-x86_64-36-1.5 initrd=initrd.img
initrd ${initrd}fedora-s/36/initrd.img
boot

NOTE: Fedora Server & Rocky need to have all their files extracted from the .ISO before uploading them to the HTTP server.

If you need help locating the kernel & initrd files from the .ISO:

  1. Fedora Server
    1. Fedora-Server-dvd-x86_64-36-1.5.iso/images/pxeboot/vmlinuz
    2. Fedora-Server-dvd-x86_64-36-1.5.iso/images/pxeboot/initrd.img
  2. Rocky
    1. Rocky-9.0-x86_64-minimal.iso/images/pxeboot/vmlinuz
    2. Rocky-9.0-x86_64-minimal.iso/images/pxeboot/initrd.img

 

 

As of this time, for reference, this is my complete main.ipxe file:

#!ipxe

set url    http://${next-server}/
set initrd ${url}initrd/
set iso    ${url}iso/
set kernel ${url}kernel/
set ucode  ${url}ucode/

menu
item exit                 Exit iPXE and continue BIOS boot
item --gap -- --------------- iPXE Install Menu ---------------
item arch                 Arch Linux 5.18.7
item bodhi                Bodhi 6.0.0
item centos               CentOS 7
item debian               Debian 11.4.0 (Requires Internet)
item elementaryos         ElementaryOS 6.1
item fedora-s             Fedora 36 Server
item fedora-w             Fedora 36 Workstation
item kubuntu              Kubuntu 22.04 LTS
item lubuntu              Lubuntu 22.04 LTS
item manjaro              Manjaro 21.3.2
item mint                 Linux Mint 20.3
item peppermintos         PeppermintOS
item popos                PopOS 22.04 LTS
item rocky                Rocky 9.0
item ubuntu-d             Ubuntu Desktop 22.04 LTS
item ubuntu-s             Ubuntu Server  20.04 LTS
item xubuntu              Xubuntu 22.04 LTS
item --gap -- -------------------------------------------------
choose target && goto ${target}

:arch
kernel ${kernel}arch/5.18.7/vmlinuz-linux
initrd ${ucode}arch/5.18.7/amd-ucode.img
initrd ${ucode}arch/5.18.7/intel-ucode.img
initrd ${initrd}arch/5.18.7/initramfs-linux.img
imgargs vmlinuz-linux initrd=amd-ucode.img initrd=intel-ucode.img initrd=initramfs-linux.img archiso_http_srv=${iso}archlinux-2022.07.01-x86_64/ ip=dhcp
boot

:bodhi
kernel ${kernel}bodhi/6.0.0/vmlinuz boot=casper ip=dhcp url=${iso}bodhi-6.0.0-64.iso initrd=initrd.gz
initrd ${initrd}bodhi/6.0.0/initrd.gz
boot

:centos
kernel ${kernel}centos/7/vmlinuz root=live:${iso}CentOS-7-x86_64-Minimal-2009.iso initrd=initrd.img
initrd ${initrd}centos/7/initrd.img
boot

:debian
kernel ${kernel}debian/11.4.0/vmlinuz initrd=initrd.gz
initrd ${initrd}debian/11.4.0/initrd.gz
boot

:elementaryos
kernel ${kernel}elementaryos/6.1/vmlinuz boot=casper ip=dhcp url=${iso}elementaryos-6.1-stable.20211218-rc.iso initrd=initrd.lz
initrd ${initrd}elementaryos/6.1/initrd.lz
boot

:fedora-s
kernel ${kernel}fedora-s/36/vmlinuz inst.repo=${iso}Fedora-Server-dvd-x86_64-36-1.5 initrd=initrd.img
initrd ${initrd}fedora-s/36/initrd.img
boot

:fedora-w
kernel ${kernel}fedora-w/36/vmlinuz root=live:${iso}Fedora-Workstation-Live-x86_64-36.iso initrd=initrd.img
initrd ${initrd}fedora-w/36/initrd.img
boot

:kubuntu
kernel ${kernel}kubuntu/22.04/vmlinuz ip=dhcp url=${iso}kubuntu-22.04-desktop-amd64.iso initrd=initrd
initrd ${initrd}kubuntu/22.04/initrd
boot

:lubuntu
kernel ${kernel}lubuntu/22.04/vmlinuz ip=dhcp url=${iso}lubuntu-22.04-desktop-amd64.iso initrd=initrd
initrd ${initrd}lubuntu/22.04/initrd
boot

:manjaro
kernel ${kernel}manjaro/21.3.2/vmlinuz-x86_64
initrd ${ucode}manjaro/21.3.2/amd_ucode.img
initrd ${ucode}manjaro/21.3.2/intel_ucode.img
initrd ${initrd}manjaro/21.3.2/initramfs-x86_64.img
imgargs vmlinuz-x86_64 initrd=amd_ucode.img initrd=intel_ucode.img initrd=initramfs-x86_64.img miso_http_srv=${iso}manjaro-kde-21.3.2-220704-linux515/ ip=dhcp
boot

:mint
kernel ${kernel}mint/20.3/vmlinuz ip=dhcp url=${iso}linuxmint-20.3-cinnamon-64bit.iso initrd=initrd.lz
initrd ${initrd}mint/20.3/initrd.lz
boot

:peppermintos
kernel ${kernel}peppermintos/vmlinuz
initrd ${initrd}peppermintos/initrd.img
boot

:popos
kernel ${kernel}popos/22.04/vmlinuz.efi boot=casper ip=dhcp url=${iso}pop-os_22.04_amd64_intel_10.iso initrd=initrd.gz
initrd ${initrd}popos/22.04/initrd.gz
boot

:rocky
kernel ${kernel}rocky/9.0/vmlinuz inst.repo=${iso}Rocky-9.0-x86_64-minimal initrd=initrd.img
initrd ${initrd}rocky/9.0/initrd.img
boot

:ubuntu-d
kernel ${kernel}ubuntu-d/22.04/vmlinuz ip=dhcp url=${iso}ubuntu-22.04-desktop-amd64.iso initrd=initrd
initrd ${initrd}ubuntu-d/22.04/initrd
boot

:ubuntu-s
kernel ${kernel}ubuntu-s/20.04.3/vmlinuz ip=dhcp url=${iso}ubuntu-20.04.3-live-server-amd64.iso initrd=initrd
initrd ${initrd}ubuntu-s/20.04.3/initrd
boot

:xubuntu
kernel ${kernel}xubuntu/22.04/vmlinuz ip=dhcp url=${iso}xubuntu-22.04-desktop-amd64.iso initrd=initrd
initrd ${initrd}xubuntu/22.04/initrd
boot

:exit
exit

That is it for now. Feel free to check back in later, make suggestions for distros to add, or comment distros you got working and I'll add them to the supported list. 🙂 

 

Link to comment
Share on other sites

Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×