Schlagwort-Archive: zfs

Proxmox: mehrfach redundante (boot) EFI Partitionen

Hintergrund:

In den letzten Wochen habe ich angefangen den ersten Teil unserer Infrastruktur von SmartOS zu einem Proxmox (<=6.3) Cluster zu migrieren. Dabei ist mir nach der Installation der ersten 4 Server ein suboptimales Partitionsschema des Proxmox Installers aufgefallen.

Partitionsschema nach einem Proxmox ZFS Raid 10:

Proxmox ZFS Raid 10

Partitionsschema nach einem Proxmox ZFS Raid 1 und nachträglichem hinzufügen eines Spare:

Proxmox ZFS Raid 1 + (nachträglich) zpool add rpool spare /dev/sdc

Fällt eines der System(Boot)relevanten Datenträger aus, hängt der Bootprozess des Betriebssystems nur noch von dem verbliebenen, funktionierenden und korrekt partitioniertem Datenträger bei diesem Proxmox Node ab!

Um diesen suboptimalen Umstand zu ändern, sollte beim Proxmox Installer zunächst immer nur ein ZFS RAID1 ausgewählt werden. Anschließend wird durch manuelle Nacharbeiten ein (auf allen Platten, für Redundanz) ähnliches Partitionsschema erstellt.

Nachfolgend ein Beispiel anhand eines Partitionsschemas eines NVME (PCIe) Servers:

root@server22:~# fdisk -l /dev/nvme0n1
Disk /dev/nvme0n1: 1.5 TiB, 1600321314816 bytes, 3125627568 sectors
Disk model: SAMSUNG MZPLL1T6HAJQ-00005
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 00099FA8-DBB4-48C5-9AFA-2C00C1487F39

Device           Start        End    Sectors  Size Type
/dev/nvme0n1p1      34       2047       2014 1007K BIOS boot
/dev/nvme0n1p2    2048    1050623    1048576  512M EFI System
/dev/nvme0n1p3 1050624 3125627534 3124576911  1.5T Solaris /usr & Apple ZFS
root@server22:~#

HINWEIS: Bei der manuellen Erstellung des Partitionslayouts mittels fdisk beginnt der first sector erst ab 2048 ! Damit nun eine Gleichgroße ZFS rpool Partition erstellt werden kann, ziehen wir die 1 Megabyte Differenz von der EFI System Partition einfach ab.

Beispiel eines manuell erstellen Partitionsschema der Spare NVME:

root@server22:~# fdisk -l /dev/nvme2n1
Disk /dev/nvme2n1: 1.5 TiB, 1600321314816 bytes, 3125627568 sectors
Disk model: SAMSUNG MZPLL1T6HAJQ-00005
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 000EED53-B426-C849-B6A2-004943B65D5A

Device           Start        End    Sectors  Size Type
/dev/nvme2n1p1    2048       4061       2014 1007K BIOS boot
/dev/nvme2n1p2    4096    1050623    1046528  511M EFI System
/dev/nvme2n1p3 1050624 3125627534 3124576911  1.5T Solaris /usr & Apple ZFS
root@server22:~#

HINWEIS: Bitte nicht einfach ungeschickt mittels sfdisk das ganze GPT Partitionsschema einfach von (der nvme0n1) dem Quelldatenträger in ein File sichern und wieder auf (der nvme2n1) dem Zieldatenträger wiederherstellen! Dies dupliziert die GPT UUID und alle Partitions UUIDs und führt zu seltsamen Bootvorgängen! (Beispiel: initramfs Updates werden nicht zuverlässig übernommen)

Step 1 – Neuen GPT disklabel und BIOS Boot Partition erstellen:

root@server22:~# fdisk /dev/nvme2n1
Command (m for help): g
Command (m for help): n
Partition number (1-128, default 1):
First sector (2048-3125627534, default 2048):
Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-3125627534, default 3125627534): 4061
Do you want to remove the signature? [Y]es/[N]o: Y
Command (m for help): w
root@server22:~#

Step 2 – Neue EFI System Partition erstellen:

root@server22:~# fdisk /dev/nvme2n1
Command (m for help): n
Partition number (2-128, default 2):
First sector (4062-3125627534, default 4096):
Last sector, +/-sectors or +/-size{K,M,G,T,P} (4096-3125627534, default 3125627534): 1050623
Command (m for help): w
root@server22:~#

Step 3 – Neue Solaris /usr & Apple ZFS Partition erstellen:

root@server22:~# fdisk /dev/nvme2n1
Command (m for help): n
Partition number (3-128, default 3):
First sector (4062-3125627534, default 1050624):
Last sector, +/-sectors or +/-size{K,M,G,T,P} (1050624-3125627534, default 3125627534):
Do you want to remove the signature? [Y]es/[N]o: Y
Command (m for help): w
root@server22:~#

Step 4 – Nachkorrekturen des Linux filesystem Type zum korrekten Partitionstyp:

root@server22:~# fdisk /dev/nvme2n1

Welcome to fdisk (util-linux 2.33.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

Command (m for help): p
Disk /dev/nvme2n1: 1.5 TiB, 1600321314816 bytes, 3125627568 sectors
Disk model: SAMSUNG MZPLL1T6HAJQ-00005
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 000EED53-B426-C849-B6A2-004943B65D5A

Device           Start        End    Sectors  Size Type
/dev/nvme2n1p1    2048       4061       2014 1007K Linux filesystem
/dev/nvme2n1p2    4096    1050623    1046528  511M Linux filesystem
/dev/nvme2n1p3 1050624 3125627534 3124576911  1.5T Linux filesystem

Command (m for help): t
Partition number (1-3, default 3): 1
Partition type (type L to list all types): 4

Changed type of partition 'Linux filesystem' to 'BIOS boot'.

Command (m for help): t
Partition number (1-3, default 3): 2
Partition type (type L to list all types): 1

Changed type of partition 'Linux filesystem' to 'EFI System'.

Command (m for help): t
Partition number (1-3, default 3): 3
Partition type (type L to list all types): 48

Changed type of partition 'Linux filesystem' to 'Solaris /usr & Apple ZFS'.

Command (m for help): p
Disk /dev/nvme2n1: 1.5 TiB, 1600321314816 bytes, 3125627568 sectors
Disk model: SAMSUNG MZPLL1T6HAJQ-00005
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 000EED53-B426-C849-B6A2-004943B65D5A

Device           Start        End    Sectors  Size Type
/dev/nvme2n1p1    2048       4061       2014 1007K BIOS boot
/dev/nvme2n1p2    4096    1050623    1046528  511M EFI System
/dev/nvme2n1p3 1050624 3125627534 3124576911  1.5T Solaris /usr & Apple ZFS

Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.

root@server22:~# sync
root@server22:~#

Step 5 – BIOS Boot Partitionsinhalt kopieren:

root@server22:~#
root@server22:~# dd if=/dev/nvme0n1p1 of=/dev/nvme2n1p1
2014+0 records in
2014+0 records out
1031168 bytes (1.0 MB, 1007 KiB) copied, 0.0812011 s, 12.7 MB/s
root@server22:~#
root@server22:~# sync
root@server22:~#

Step 6 – EFI System Dateien kopieren (Teil 1-2):

root@server22:~#
root@server22:~# mkfs.fat -F32 /dev/nvme2n1p2
mkfs.fat 4.1 (2017-01-24)
root@server22:~#
root@server22:~# mkdir /tmp/NEW
root@server22:~#
root@server22:~# mount /dev/nvme0n1p2 /boot/efi
root@server22:~#
root@server22:~# mount /dev/nvme2n1p2 /tmp/NEW
root@server22:~#

Step 7 – EFI System Dateien kopieren (Teil 2-2):

root@server22:~#
root@server22:~# cp -prfv /boot/efi/EFI /tmp/NEW
'/boot/efi/EFI' -> '/tmp/NEW/EFI'
'/boot/efi/EFI/proxmox' -> '/tmp/NEW/EFI/proxmox'
'/boot/efi/EFI/proxmox/5.4.73-1-pve' -> '/tmp/NEW/EFI/proxmox/5.4.73-1-pve'
'/boot/efi/EFI/proxmox/5.4.73-1-pve/vmlinuz-5.4.73-1-pve' -> '/tmp/NEW/EFI/proxmox/5.4.73-1-pve/vmlinuz-5.4.73-1-pve'
'/boot/efi/EFI/proxmox/5.4.73-1-pve/initrd.img-5.4.73-1-pve' -> '/tmp/NEW/EFI/proxmox/5.4.73-1-pve/initrd.img-5.4.73-1-pve'
'/boot/efi/EFI/proxmox/5.4.106-1-pve' -> '/tmp/NEW/EFI/proxmox/5.4.106-1-pve'
'/boot/efi/EFI/proxmox/5.4.106-1-pve/vmlinuz-5.4.106-1-pve' -> '/tmp/NEW/EFI/proxmox/5.4.106-1-pve/vmlinuz-5.4.106-1-pve'
'/boot/efi/EFI/proxmox/5.4.106-1-pve/initrd.img-5.4.106-1-pve' -> '/tmp/NEW/EFI/proxmox/5.4.106-1-pve/initrd.img-5.4.106-1-pve'
'/boot/efi/EFI/systemd' -> '/tmp/NEW/EFI/systemd'
'/boot/efi/EFI/systemd/systemd-bootx64.efi' -> '/tmp/NEW/EFI/systemd/systemd-bootx64.efi'
'/boot/efi/EFI/BOOT' -> '/tmp/NEW/EFI/BOOT'
'/boot/efi/EFI/BOOT/BOOTX64.EFI' -> '/tmp/NEW/EFI/BOOT/BOOTX64.EFI'
root@server22:~#
root@server22:~# cp -prfv /boot/efi/loader /tmp/NEW
'/boot/efi/loader' -> '/tmp/NEW/loader'
'/boot/efi/loader/entries' -> '/tmp/NEW/loader/entries'
'/boot/efi/loader/entries/proxmox-5.4.73-1-pve.conf' -> '/tmp/NEW/loader/entries/proxmox-5.4.73-1-pve.conf'
'/boot/efi/loader/entries/proxmox-5.4.106-1-pve.conf' -> '/tmp/NEW/loader/entries/proxmox-5.4.106-1-pve.conf'
'/boot/efi/loader/loader.conf' -> '/tmp/NEW/loader/loader.conf'
root@server22:~#
root@server22:~# ls -allt /tmp/NEW
total 37
drwxrwxrwt 10 root root   10 May 11 18:54 ..
drwxr-xr-x  5 root root 4096 May 11 11:30 EFI
drwxr-xr-x  3 root root 4096 May 11 11:30 loader
drwxr-xr-x  4 root root 4096 Jan  1  1970 .
root@server22:~#
root@server22:~# umount /tmp/NEW
root@server22:~# umount /boot/efi
root@server22:~#
root@server22:~# sync
root@server22:~#

Status der verschiedenen UUIDs abfragen!

root@server22:~#
root@server22:~# blkid | grep vfat
/dev/nvme0n1p2: UUID="DF2E-AA00" TYPE="vfat" PARTUUID="000a92a9-754b-420f-b10a-d473d87b995e" 
/dev/nvme1n1p2: UUID="DF2F-1100" TYPE="vfat" PARTUUID="0007d0ba-8c9f-431f-85e5-71a1387f396b" 
/dev/nvme2n1p2: UUID="6000-2000" TYPE="vfat" PARTUUID="00063fc4-7155-7c47-8e32-c94bee9df5d5" 
root@server22:~#

HINWEIS: Proxmox (> 6.3 / 6.4) verwendet bei EFI Systemen nicht mehr GRUB2 sondern das neue “proxmox-boot-tool” !!!

Damit nun die zusätzliche EFI Partition bei Änderungen an dem initramfs (mittels update-initramfs) oder an Kernelparametern / Kernelmodulen ebenfalls durch das proxmox-boot-tool berücksichtigt wird, muss die EFI Partitions UUID in /etc/kernel/proxmox-boot-uuids hinzugefügt werden !!!

Step 8 – Zusätzliche (EFI) VFAT Partition mit in die neue “proxmox-boot-toolSystematik mit aufnehmen !

root@server22:~#
root@server22:~# grep -r "DF2E-AA00" /etc
/etc/kernel/proxmox-boot-uuids:DF2E-AA00
root@server22:~#
root@server22:~# cat /etc/kernel/proxmox-boot-uuids
DF2E-AA00
DF2F-1100
root@server22:~#
root@server22:~# blkid | grep vfat
/dev/nvme2n1p2: UUID="6000-2000" TYPE="vfat" PARTUUID="00063fc4-7155-7c47-8e32-c94bee9df5d5" 
/dev/nvme0n1p2: UUID="DF2E-AA00" TYPE="vfat" PARTUUID="000a92a9-754b-420f-b10a-d473d87b995e" 
/dev/nvme1n1p2: UUID="DF2F-1100" TYPE="vfat" PARTUUID="0007d0ba-8c9f-431f-85e5-71a1387f396b" 
root@server22:~#
root@server22:~# echo "6000-2000" >> /etc/kernel/proxmox-boot-uuids
root@server22:~#
root@server22:~# cat /etc/kernel/proxmox-boot-uuids
DF2E-AA00
DF2F-1100
6000-2000
root@server22:~#

Beispiel – Eines initramfs Updates:

root@server22:~#
root@server22:~# update-initramfs -u -k all
update-initramfs: Generating /boot/initrd.img-5.4.106-1-pve
Running hook script 'zz-proxmox-boot'..
Re-executing '/etc/kernel/postinst.d/zz-proxmox-boot' in new private mount namespace..
Copying and configuring kernels on /dev/disk/by-uuid/DF2E-AA00
        Copying kernel and creating boot-entry for 5.4.106-1-pve
        Copying kernel and creating boot-entry for 5.4.73-1-pve
Copying and configuring kernels on /dev/disk/by-uuid/DF2F-1100
        Copying kernel and creating boot-entry for 5.4.106-1-pve
        Copying kernel and creating boot-entry for 5.4.73-1-pve
Copying and configuring kernels on /dev/disk/by-uuid/6000-2000
        Copying kernel and creating boot-entry for 5.4.106-1-pve
        Copying kernel and creating boot-entry for 5.4.73-1-pve
update-initramfs: Generating /boot/initrd.img-5.4.73-1-pve
Running hook script 'zz-proxmox-boot'..
Re-executing '/etc/kernel/postinst.d/zz-proxmox-boot' in new private mount namespace..
Copying and configuring kernels on /dev/disk/by-uuid/DF2E-AA00
        Copying kernel and creating boot-entry for 5.4.106-1-pve
        Copying kernel and creating boot-entry for 5.4.73-1-pve
Copying and configuring kernels on /dev/disk/by-uuid/DF2F-1100
        Copying kernel and creating boot-entry for 5.4.106-1-pve
        Copying kernel and creating boot-entry for 5.4.73-1-pve
Copying and configuring kernels on /dev/disk/by-uuid/6000-2000
        Copying kernel and creating boot-entry for 5.4.106-1-pve
        Copying kernel and creating boot-entry for 5.4.73-1-pve
root@server22:~#
root@server22:~# proxmox-boot-tool refresh
Running hook script 'proxmox-auto-removal'..
Running hook script 'zz-proxmox-boot'..
Re-executing '/etc/kernel/postinst.d/zz-proxmox-boot' in new private mount namespace..
Copying and configuring kernels on /dev/disk/by-uuid/DF2E-AA00
        Copying kernel and creating boot-entry for 5.4.106-1-pve
        Copying kernel and creating boot-entry for 5.4.73-1-pve
Copying and configuring kernels on /dev/disk/by-uuid/DF2F-1100
        Copying kernel and creating boot-entry for 5.4.106-1-pve
        Copying kernel and creating boot-entry for 5.4.73-1-pve
Copying and configuring kernels on /dev/disk/by-uuid/6000-2000
        Copying kernel and creating boot-entry for 5.4.106-1-pve
        Copying kernel and creating boot-entry for 5.4.73-1-pve
root@server22:~#
root@server22:~# sync; reboot

Beispiel – Zusätzliche EFI System Partition wird vom “BIOS” erkannt:

3x UEFI OS

Zum Schluss kann die gewünschte ZFS Partition als Spare hinzugefügt werden:

root@server22:~#
root@server22:~# zpool add rpool spare /dev/nvme2n1p3
root@serverg22:~#
root@server22:~# zpool status -v
  pool: rpool
 state: ONLINE
config:

        NAME                                                 STATE     READ WRITE CKSUM
        rpool                                                ONLINE       0     0     0
          mirror-0                                           ONLINE       0     0     0
            nvme-eui.000342304e7002050025384100000004-part3  ONLINE       0     0     0
            nvme-eui.000342304e7001990025384100000004-part3  ONLINE       0     0     0
        spares
          nvme2n1p3                                          AVAIL

errors: No known data errors
root@server22:~#

Ziel – Mehrfach redundante “BIOS boot” & “EFI System” Partitionen:

redundante BIOS boot & EFI System Partitionen