Boot Arch Linux from an mdadm array

Written on February 24, 2012

This method will allow you to configure your /boot directory or partition on a raid 0, 5, or 6. This was not previously possible before grub2. The code in this write-up was tested against a virtual machine with 2 20GB hard disks, with a couple of raid 0 partitions.

First, Boot your arch install image. Once running in your live environment, configure your partitions. It's very important to remember that your first partition must begin further into the disk than the typical default of 2048 sectors, 4096 worked for me. My test box has the following partition table on each disk.

[[email protected] ~]# fdisk -l /dev/sda

Disk /dev/sda: 21.5 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 cylinders, total 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x2a8e3edb

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *        4096    37752831    18874368   fd  Linux raid autodetect
/dev/sda2        37752832    41943039     2095104   fd  Linux raid autodetect

Next create your arrays.

mdadm --create /dev/md0 --raid-devices=2 --level=0 /dev/sda1 /dev/sdb1
mdadm --create /dev/md1 --raid-devices=2 --level=0 /dev/sda2 /dev/sdb2

Once your arrays are set, run through your normal arch setup process, skipping all of the bootloader steps. Remember on the "Prepare Hard Drives" step to choose "Manually configure block devices, filesystems, and mountpoints", and choose the appropriate /dev/mdX devices.

After the install is complete, we have a few more steps to get grub2 installed. Make sure you've got networking.

dhcpcd eth0

Prepare your installed root, and chroot into it.

cp /etc/resolv.conf /mnt/etc/resolv.conf 
mount -o bind /proc/ /mnt/proc/
mount -o bind /sys/ /mnt/sys/
mount -o bind /dev/ /mnt/dev/
chroot /mnt/

Now that we are essentially running within our installed environment, we can install grub2.

pacman -Sy grub2

Ignore the pacman upgrade request, and allow pacman to remove the "grub" package, as we don't need it. Next, prepare your mdadm.conf file.

mdadm --examine --scan > /etc/mdadm.conf

Add "mdadm" to the "HOOKS" array in your /etc/mkinitcpio.conf. As of this writing, a bug prevents your /boot/grub/grub.cfg from generating correctly unless you uncomment the line "GRUB_TERMINAL_OUTPUT=console" in your /etc/default/grub. Generate your /boot/grub/grub.cfg and install grub2 to every device in your array.

grub-mkconfig -o /boot/grub/grub.cfg
grub-install /dev/sda
grub-install /dev/sdb

Re-generate your init image.

mkinitcpio -p linux

You should see a message go by saying

Custom /etc/mdadm.conf file will be used in initramfs for assembling arrays.

If you don't see this message, make sure you didn't miss any steps above. You should be able to boot from any disk in your array into your new arch install.

If you hit busybox, boot back into your live environment, chroot back into your installed environment, modify your /etc/default/grub to uncomment "GRUB_DISABLE_LINUX_UUID=true", and re-run the grub-mkconfig command from above. I've seen a udev/UUID bug that sometimes prevents your initramfs mdadm from correctly assembling your arrays.

Most of the information in the article was pieced together from and and maybe a couple of other places.

Written on February 24, 2012