How to Perform a Linux Userspace Reboot (kexec) Without Hardware Restart for Debian Systems with RAID Controllers


2 views

When dealing with RAID controllers that require lengthy initialization, traditional reboots can be painfully slow. The kexec system call allows us to load a new kernel into memory and boot it without going through BIOS/firmware initialization.

First verify your system supports kexec:

# Check kexec support
grep KEXEC /boot/config-$(uname -r)
# Install necessary packages
sudo apt-get install kexec-tools linux-image-$(uname -r)

Here's the complete workflow for Debian systems:

# 1. Load the new kernel
sudo kexec -l /boot/vmlinuz-$(uname -r) \
--initrd=/boot/initrd.img-$(uname -r) \
--command-line="$(cat /proc/cmdline)"

# 2. Perform the reboot (takes effect immediately)
sudo kexec -e

For RAID arrays, we need to ensure proper module loading:

# Create custom initrd with RAID modules
sudo mkinitramfs -o /boot/initrd-kexec.img $(uname -r)
# Then specify this initrd in kexec command
sudo kexec -l /boot/vmlinuz-$(uname -r) \
--initrd=/boot/initrd-kexec.img \
--command-line="$(cat /proc/cmdline)"

Create a systemd service for automated kexec reboots:

[Unit]
Description=Load kexec kernel
After=network.target

[Service]
Type=oneshot
ExecStart=/usr/sbin/kexec -l /boot/vmlinuz-$(uname -r) \
--initrd=/boot/initrd.img-$(uname -r) \
--command-line="$(cat /proc/cmdline)"
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

If kexec fails, check:

  • dmesg | grep kexec for kernel messages
  • Verify ACPI tables with acpidump
  • Test with kexec --test before actual execution

When dealing with RAID controllers that require lengthy initialization periods, traditional reboots become time-consuming. The hardware-level restart forces the RAID controller through its entire POST sequence before Linux can load.

The kexec system call allows loading a new kernel into memory and executing it without going through firmware/bootloader stages. This means your RAID controller maintains its state while the OS restarts.

# Install kexec-tools on Debian
sudo apt-get install kexec-tools

First, verify your system supports kexec:

grep KEXEC /boot/config-$(uname -r)
# Should return CONFIG_KEXEC=y

Basic usage for immediate reboot:

sudo kexec -l /boot/vmlinuz-$(uname -r) --initrd=/boot/initrd.img-$(uname -r) --reuse-cmdline
sudo kexec -e

For RAID arrays that maintain consistency during soft reboots, consider adding these parameters:

sudo kexec -l /boot/vmlinuz-$(uname -r) \
--initrd=/boot/initrd.img-$(uname -r) \
--append="root=/dev/md0 raid=noautodetect"

If devices fail to initialize properly after kexec:

  • Check dmesg for hardware-related errors
  • Try passing specific kernel parameters with --append
  • Verify your initramfs includes necessary RAID modules

Create a systemd service for automatic kexec reboots:

[Unit]
Description=Load kernel for kexec
Before=reboot.target

[Service]
Type=oneshot
ExecStart=/usr/sbin/kexec -l /boot/vmlinuz-$(uname -r) --initrd=/boot/initrd.img-$(uname -r) --reuse-cmdline
RemainAfterExit=yes

[Install]
WantedBy=reboot.target

Typical soft reboot times with kexec:

  • Regular system: 5-15 seconds
  • RAID systems (without controller reset): 10-25 seconds
  • Compared to full reboots (with RAID init): 1-5 minutes