Automated AlmaLinux 8 Installation on Dell PowerEdge R430

Feb 18, 2026 Hardware RAID LACP Bonding

In this guide, we will demonstrate the full process of deploying AlmaLinux 8 on a bare-metal Dell PowerEdge R430 server using a custom ISO generated by net2boot.xyz. We will cover network configuration, LACP bonding, and automated disk partitioning.

1. Generating the ISO

Go to the Create ISO form and configure the following:

  • OS Selection: AlmaLinux 8
  • Network: Static IP, Netmask, Gateway, Hostname.
  • Bonding: Checked "Enable LACP bonding (802.3ad)".
Important regarding LACP:
I checked the bonding box because my switch ports are configured with LACP Fallback. If your switch does not support Fallback, do not enable this option, otherwise PXE boot will fail.

Root Password: Enter the generated SHA-512 hash of your root password (check the tooltip for instructions on how to generate it).

net2boot ISO generation form - OS selection
OS Selection in net2boot Form

Disk Partitioning Strategy:

Since we are booting in Legacy BIOS mode, I selected standard partitioning (no UEFI).
Goal: RAID 1 for the OS (on two 960GB SSDs) and a separate partition for VM storage (on a 3.5TB SSD).

[root@ctrl ~]# lsblk --nodeps -o NAME,SIZE,TYPE,MODEL --exclude 7,11,251 --sort SIZE
NAME   SIZE   TYPE  MODEL
sdb    931.5G disk  CT1000BX100SSD1
sdc    931.5G disk  CT1000BX100SSD1
sda    3.5T   disk  INTEL SSDSC2KB03
net2boot disk layout configuration
Disk Layout Configuration

Note that for each group, I selected SSD as the disk type. If you have NVMe or HDD drives, be sure to select the correct type.

Testing on Virtual Machines?
If you want to test this ISO on a virtual server, always select HDD as the disk type.

How does the installer choose disks if we don't provide device names or serial numbers?

net2boot sorts disks by size — the operating system is always installed on the smallest disks.
Additionally, the form includes the disk type — in case the system has different drive types (e.g., SSD for OS, NVMe for databases, and HDD for backups).
This approach covers over 95% of possible scenarios.

Complete the captcha and click Create ISO. The download will start automatically (~2 MB).

2. Verifying ISO Content

Before connecting the image to the server, let's look inside.

Mount the ISO locally to check the contents:

net2boot@thinkpad:~/Downloads$ sudo mount -o loop ctrl.net2boot.xyz_155.iso /mnt
mount: /home/net2boot/Downloads/mnt: WARNING: source write-protected, mounted read-only.

net2boot@thinkpad:~/Downloads$ ls /mnt
autoexec.ipxe  boot.catalog  esp.img  ipxe.lkrn  isolinux.bin  isolinux.cfg  ks.cfg  ldlinux.c32

We see the following files:

  • autoexec.ipxe — iPXE script
  • ks.cfg — Kickstart file
  • isolinux.cfg — Syslinux bootloader files
  • esp.img — UEFI boot partition

Let's inspect autoexec.ipxe, which configures the network and loads the kernel/initrd:

#!ipxe
set repo http://repo.almalinux.org/almalinux/8/BaseOS/x86_64/os
set idx:int32 0
:loop
isset ${net${idx}/mac} || goto reboot
set net${idx}/ip 46.30.40.97
set net${idx}/netmask 255.255.255.192
set net${idx}/gateway 46.30.40.66
set dns 8.8.8.8
ifopen net${idx} || goto next_iface
show ip
show netmask
show gateway
show dns
show mac
kernel ${repo}/images/pxeboot/vmlinuz rd.neednet=1 nameserver=8.8.8.8 BOOTIF=${mac} ip=${ip}::${gateway}:${netmask}:::off inst.ks=hd:LABEL=NET2BOOT:/ks.cfg initrd=initrd.img || goto next_iface
initrd --name initrd.img ${repo}/images/pxeboot/initrd.img  || goto next_iface
boot
:next_iface
ifclose net${idx}
inc idx
goto loop
:reboot
reboot

And the ks.cfg (kickstart) file. The magic happens in the %pre script section — this is where disks are sorted and grouped (ssd, nvme, hdd).

%pre --interpreter=/usr/bin/bash
#!/bin/bash
mapfile -t part_disks < <(lsblk -b -d -n -o NAME,SIZE,TYPE --exclude 7,11,251 --sort SIZE | awk '$3 == "disk" && $2 > 0 {print $1}')
hdd=()
nvme=()
ssd=()
for disk in "${part_disks[@]}"; do
rotational=$(cat "/sys/block/$disk/queue/rotational")
if [[ "$disk" =~ ^nvme ]]; then
nvme+=("$disk")
elif [[ "$rotational" -eq 1 ]]; then
hdd+=("$disk")
else
ssd+=("$disk")
fi
done
disks=( ${ssd[@]} )
cat < /tmp/part-include
bootloader --append="crashkernel=auto" --location=mbr --boot-drive=${disks[0]}
part raid.10 --fstype="mdmember" --ondisk=${disks[0]} --size=4096
part raid.11 --fstype="mdmember" --ondisk=${disks[1]} --size=4096
raid swap --device=swap --fstype="swap" --level=RAID1 raid.10 raid.11
part raid.12 --fstype="mdmember" --ondisk=${disks[0]} --size=1 --grow
part raid.13 --fstype="mdmember" --ondisk=${disks[1]} --size=1 --grow
raid / --device=root --fstype="ext4" --level=RAID1 raid.12 raid.13
part /kvm --fstype="ext4" --ondisk=${disks[2]} --size=1 --grow
EOF
interfaces=($(nmcli -t -f DEVICE,TYPE,STATE device status | awk -F: '$2 == "ethernet" && ($3 == "connected" || $3 == "disconnected") {print $1}'))
mac_addr=$(cat /sys/class/net/${interfaces[0]}/address)
bond_slaves=$(IFS=,; echo "${interfaces[*]}")
net="network --device=bond0 --bootproto=static --ip=46.30.40.97 --netmask=255.255.255.192 --gateway=46.30.40.66 --nameserver=8.8.8.8,1.1.1.1 --ipv6=auto --activate --bondslaves=$bond_slaves --bondopts=mode=802.3ad,miimon=300,downdelay=300,updelay=300,xmit_hash_policy=layer2+3,lacp_rate=1"
echo "$net" > /tmp/net-include
%end
# Reboot after installation
reboot
# Use text mode install
text
repo --name="AppStream" --baseurl=http://repo.almalinux.org/almalinux/8/AppStream/x86_64/os
%packages
@^minimal-environment
kexec-tools
curl
%end
# Keyboard layouts
keyboard --vckeymap=us --xlayouts='us'
# System language
lang en_US.UTF-8
# Firewall configuration
firewall --disabled
# Network information
%include /tmp/net-include
network  --hostname=ctrl.net2boot.xyz
# Use network installation
url --url=http://repo.almalinux.org/almalinux/8/BaseOS/x86_64/os
# SELinux configuration
selinux --disabled
firstboot --disable
# Do not configure the X Window System
skipx
# Disk partitioning information
clearpart --all --initlabel
%include /tmp/part-include
# System timezone
timezone Etc/UTC --isUtc
# Root password
rootpw --iscrypted $6$qy3F2EczCMExy4WV$owLDd.zAmqG7OOYU1JMvbu0thZNFntSTrxuYSZ2d1CgLM2Y2fwr9232vIcx1NCHCjhxa2dKiJemC9fDo2N2e11
%addon com_redhat_kdump --enable --reserve-mb='auto'
%end

3. Connecting ISO via iDRAC

  1. Log in to the server's iDRAC.
Dell iDRAC login screen
iDRAC Login Screen
  1. Launch the Virtual Console and Connect the ISO via Virtual CD-ROM.
Dell iDRAC virtual media connection
Virtual Media Connection
  1. Select boot from Virtual CD.
Dell iDRAC boot from virtual CD
Boot from Virtual CD
  1. Reboot the server.
Dell server reboot confirmation
Server Reboot

4. iPXE Network Boot Process

After booting from Virtual CD-ROM, the iPXE script takes over:

  • Iterates through network interfaces.
  • Assigns IP address, netmask, gateway, and nameservers.
  • Downloads the kernel and initrd.

At this stage, you can see all boot steps — nothing complex, just watch.

iPXE network boot process
iPXE Boot Process

5. Installation via Anaconda

Once the kernel and initrd are loaded, the Anaconda installer starts:

  1. Anaconda automatically uses parameters from the kickstart file (ks.cfg).
  2. The operating system installation begins.
AlmaLinux Anaconda installer
Anaconda Installer

As you can see, the process is fully automated. You can go grab a coffee. ☕

6. Completion

Once installation is complete, the server will automatically reboot.

AlmaLinux login screen after installation
Login Screen

Done! Your server is ready to work.