Re: RAID + UEFI

Matteo Guglielmi <[email protected]>
Newsgroups gmane.linux.debian.fai
Message-ID <[email protected]>
varoius snippets to get RAID + UEFI




# disk_config/EFIKEES

disk_config disk1 disklabel:gpt fstabkey:uuid
primary /boot/efi 512M     vfat rw createopts="-n EFIS"
primary -          20G-    -    -
primary -          10G-50G -    -
primary -          10G     -    -

disk_config disk2 disklabel:gpt
primary -         512M     -    -
primary -          20G-    -    -
primary -          10G-50G -    -
primary -          10G     -    -

disk_config raid fstabkey:uuid
raid1 /    disk1.2,disk2.2 ext4 defaults mdcreateopts="-e 1.2" createopts="-L root"
raid1 /tmp disk1.3,disk2.3 ext4 defaults mdcreateopts="-e 1.2" createopts="-L tmp"
raid1 swap disk1.4,disk2.4 swap sw       mdcreateopts="-e 1.2" createopts="-L swap"




# scripts/EFI/30-add-os-entry

if ifclass EFIKEES ; then
  DISKS=($disklist)

  bdevice=/dev/${DISKS[0]}
else
  bdevice=$BOOT_DEVICE
fi

if ifclass CENTOS ; then
  ifclass COS7 && label='CentOS' || label='CentOS Linux'

  $ROOTCMD grub2-mkconfig -o /boot/efi/EFI/centos/grub.cfg

  efibootmgr -c -d $bdevice -p 1 -L "$label" -l '\EFI\centos\grubx64.efi'
fi




# hooks/mountdisks.EFI

DISKS=($disklist)

if ifclass EFIKEES ; then
  # BOOT_DEVICE is /dev/md0
  sgdisk -c 1:EFI1 -c 2:RAID -c 3:RAID -c 4:RAID /dev/${DISKS[0]}

  sgdisk -c 1:EFI2 -c 2:RAID -c 3:RAID -c 4:RAID /dev/${DISKS[1]}
fi





# then, when the pc boot for the first time after FAI, you
# can cerate a one time script/service which runs something
# like this (see here below).
#
# the script should be installed by FAI and executed on the
# pc during its first boot.
#
# NOTE: some functions in this script are not reported here,
#       but it's quite easy to undestand what they do.


efi1='/dev/disk/by-partlabel/EFI1'

efi2='/dev/disk/by-partlabel/EFI2'

[ -b $efi1 -a -b $efi2 ] || exit 20

efi1d=$(lsblk -npo pkname $efi1)

efi1p=$(lsblk -npo kname $efi1)

efi2d=$(lsblk -npo pkname $efi2)

efi2p=$(lsblk -npo kname $efi2)

[ -n "$efi1d" -a -n "$efi1p" -a -n "$efi2d" -a -n "$efi2p" ] || exit 21

mountpoint -q /boot/efi && [ -d /boot/efi/EFI ] || exit 22

[ ! -f /etc/mdadm/mdadm.conf ] || mdadmconf='/etc/mdadm/mdadm.conf'

[ ! -f /etc/mdadm.conf ] || mdadmconf='/etc/mdadm.conf'

[ -n "$mdadmconf" ] || exit 23

tar -cf /tmp/EFI.tar -C /boot/efi EFI

umount /boot/efi

efi1psize=$(blockdev --getsize64 $efi1p)

efi2psize=$(blockdev --getsize64 $efi2p)

if ifclass RHEL ; then
  efi1dsecsize=$(< /sys/block/${efi1d##*/}/queue/hw_sector_size)

  efi2dsecsize=$(< /sys/block/${efi2d##*/}/queue/hw_sector_size)

  dd if=/dev/zero of=$efi1p bs=$efi1dsecsize \
    count=$[efi1psize/efi1dsecsize] conv=noerror,sync

  dd if=/dev/zero of=$efi2p bs=$efi2dsecsize \
    count=$[efi2psize/efi2dsecsize] conv=noerror,sync
else
  pv -q --stop-at-size -s $efi1psize /dev/zero > $efi1p

  pv -q --stop-at-size -s $efi2psize /dev/zero > $efi2p
fi

sgdisk -t 1:FD00 -c 1:RAID $efi1d

sgdisk -t 1:FD00 -c 1:RAID $efi2d

i=9

mdadm --create /dev/md/$i --level 1 --raid-disks 2 --metadata 1.0 $efi1p $efi2p

mkfs.fat -F32 /dev/md/$i

uuid=$(blkid | grep -Pohi "/dev/md/*$i.+uuid=\"*\K[^\"]+")

[ -n "$uuid" ] || exit 24

grep -q '/boot/efi' /etc/fstab || exit 25

sed -i "/\/boot\/efi/c UUID=$uuid /boot/efi vfat noauto,umask=0077 0 2" /etc/fstab

mount /boot/efi || exit 26

tar -xf /tmp/EFI.tar -C /boot/efi

sed -i '/^ARRAY/d' $mdadmconf

mdadm --detail --scan >> $mdadmconf

uuid=$(grep -Pohi "/dev/md/*$i.+uuid=\"*\K[^\"\s]+" $mdadmconf)

[ -n "$uuid" ] || exit 27

sed -i "s#/dev/md/*$i#<ignore>#g" $mdadmconf

grep -q '<ignore>' $mdadmconf || exit 28

[ ! -b /dev/md/$i ] || espdev=/dev/md/$i

[ ! -b /dev/md$i ] || espdev=/dev/md$i

[ -n "$espdev" ] || exit 29

cat > /etc/systemd/system/sync-esp.service <<-EOF
[Unit]
Description=sync esp
DefaultDependencies=no
After=local-fs.target

[Service]
Type=oneshot
ExecStart=$(which bash) -c 'if [ ! -b $espdev ] ; then $(which mdadm) -A $espdev --uuid=$uuid --update=resync ; fi'
ExecStart=$(which sleep) 3
ExecStart=$(which mount) /boot/efi
RemainAfterExit=yes

[Install]
WantedBy=sysinit.target
EOF

systemctl daemon-reload

systemctl enable sync-esp.service

osids=($(efibootmgr | perl -nle \
  'if (/^boot([0-9a-f]+).+(centos|opensuse|sle[sd]|fedora|red\s*hat|ubuntu|debian)/i) { print "$1" }'))

[ ${#osids[@]} -gt 0 ] || exit 30

for osid in ${osids[@]} ; do
  efibootmgr -Bb $osid # remove all os entries
done

if ifclass CENTOS ; then
  ifclass COS7 && label='CentOS' || label='CentOS Linux'

  bootloader='\EFI\centos\grubx64.efi'

  grub2-mkconfig -o /boot/efi/EFI/centos/grub.cfg
elif ifclass REDHAT ; then
  label='Red Hat Enterprise Linux'

  bootloader='\EFI\redhat\grubx64.efi'

  grub2-mkconfig -o /boot/efi/EFI/redhat/grub.cfg
elif ifclass FEDORA ; then
  label='Fedora'

  bootloader='\EFI\fedora\grubx64.efi'

  grub2-mkconfig -o /boot/efi/EFI/fedora/grub.cfg
elif ifclass OSUSE ; then
  label='opensuse'

  bootloader='\EFI\opensuse\grubx64.efi'

  grub2-mkconfig -o /boot/grub2/grub.cfg
elif ifclass SLES ; then
  label='sles'

  bootloader='\EFI\sles\grubx64.efi'

  grub2-mkconfig -o /boot/grub2/grub.cfg
elif ifclass SLED ; then
  label='sled'

  bootloader='\EFI\sled\grubx64.efi'

  grub2-mkconfig -o /boot/grub2/grub.cfg
elif ifclass DEBIAN ; then
  label='debian'

  bootloader='\EFI\debian\grubx64.efi'

  update-grub -o /boot/grub/grub.cfg
elif ifclass UBUNTU ; then
  label='ubuntu'

  bootloader='\EFI\ubuntu\grubx64.efi'

  update-grub -o /boot/grub/grub.cfg
else
  exit 31
fi

assertNoError || exit 32

efibootmgr -c -d $efi2d -p 1 -L "${label}2" -l "$bootloader"

efibootmgr -c -d $efi1d -p 1 -L "${label}1" -l "$bootloader"

assertNoError || exit 33

if which dracut &> /dev/null ; then
  dracut -f
else
  update-initramfs -u
fi

reboot



# you will now have 2 efi entries to boot the same OS
#
# when one drive fails, just select the working one.

________________________________
From: linux-fai <[email protected]> on behalf of Thomas Lange <[email protected]>
Sent: Friday, January 22, 2021 10:33:25 AM
To: fully automatic installation for Linux
Subject: Re: RAID + UEFI

>>>>> On Thu, 21 Jan 2021 18:13:25 +0100, Alexander Thomas <[email protected]> said:


    > I would prefer the second method because it is not a hack. I have
    > successfully tried it with only 1 disk in the RAID during install, but
    > with 2 disks there is a problem. The disk_config for this 2-disk case
    > currently looks like:

    > disk_config disk1 disklabel:gpt bootable:1

    > primary /boot/efi  512M     vfat  rw
    > primary -  512M     -  -
    > primary -  1G-4G    -  -
    > primary -  30G-36G  -  -
    > primary -  4G-      -  -

    > disk_config disk2 sameas:disk1 bootable:1

    > Obvious problem: the `sameas` also clones the /boot/efi mount point,
    > and install fails with “mount point /boot/efi used twice”.
    > Is there an easy way around this, like some mountdisks hook script, or
    > is the ESP-inside-RAID a better option after all?
The only workaround I know is not to use samas, but to copy the config
from disk1 to disk2 and then remove the mount point from disk2.

--
regards Thomas
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.