В большинстве случаев на серверные системы Linux
ставится на RAID, железный или программный. В простом случае программный рейд создаётся при помощи mdadm
, в форме зеркала. Корень и разделы системные и данных легко ставятся на получившиеся /dev/mdX
-разделы и такое решение отлично защищает от потери данных в случае аппаратной неисправности жесткого диска. Однако, в стандартной установке загрузчик ставится только на один жёсткий диск и в случае его поломки система не загрузится. Поставим задачу зарезервировать ещё и загрузку, т.е. сделать систему загружаемой с любого из дисков зеркала.
Будем рассматривать наиболее простую конфигурацию и разбиение носителей — 2 NVMe-тома, на которых всего по 2 раздела: для UEFI и для корня системы. Например:
# fdisk /dev/nvme0n1 ... Device Start End Sectors Size Type /dev/nvme0n1p1 2048 526335 524288 256M EFI System /dev/nvme0n1p2 526336 879097934 878571599 419G Linux RAID
Имеем первый раздел для EFI и второй под корень системы. Корень уже в mdadm массиве уровня 1, с ним все уже в порядке. Второй такой же носитель /dev/nvme1n1
имеет в точности такую же разбивку.
После установки получим efi
-раздел, монтируемый в /boot/efi
и параметры загрузки EFI вроде
# efibootmgr -v BootCurrent: 0000 Timeout: 1 seconds BootOrder: 0000,0002,0006,0005 Boot0000* debian HD(1,800,80000,0496eff8-477c-4335-ada1-ce9200ddff6e)File(\EFI\debian\grubx64.efi) Boot0002* UEFI: Built-in EFI Shell Vendor(5023b95c-db26-429b-a648-bd47664c8012,)..BO Boot0005* UEFI: Intel(R) I350 Gigabit Network Connection ACPI(a0341d0,0)PCI(3,3)PCI(0,0)MAC(MAC(0cc47ada7688,1)..BO Boot0006* UEFI: IP4 Intel(R) I350 Gigabit Network Connection ACPI(a0341d0,0)PCI(3,3)PCI(0,0)MAC(MAC(0cc47ada7688,1)..BO Boot0007* UEFI: Intel(R) I350 Gigabit Network Connection ACPI(a0341d0,0)PCI(3,3)PCI(0,1)MAC(MAC(0cc47ada7689,1)..BO Boot0008* UEFI: IP4 Intel(R) I350 Gigabit Network Connection ACPI(a0341d0,0)PCI(3,3)PCI(0,1)MAC(MAC(0cc47ada7689,1)..BO
Раздел /dev/nvme0n1p1
непустой и содержит загрузчик. Аналогичный раздел со второго носителя /dev/nvme1n1p1
пустой. Запишем загрузчик в него и добавим его в последовательность загрузки. В случае BIOS срабатывал штатный grub-install
на второй диск. Здесь аналогичный способ перепишет строчку в последовательности загрузки efiboot
выше и по сути переключит загрузку на второй диск. Поступим иначе, а именно наново сделаем загрузку на второй диск, её сохраним, и затем вернём загрузку с первого.
Для начала подменим уже смонтированный раздел /dev/nvme0n1p1
аналогичным со второго диска
umount /boot/efi mount -o umask=0077 /dev/nvme1n1p1 /boot/efi
и убедимся, что смонтировался именно он. Если этот раздел не отформатирован при загрузке сделаем это сейчас
mkfs.vfat -F32 /dev/nvme1n1p1
FAT32
может не быть в системе изначально, он доустанавливается из dosfstools
. Раздел должен быть пустым.
Далее стандартными средствами, по мануалу дебиана прописываем загрузчик:
apt-get install --reinstall grub-efi grub-install /dev/nvme1n1 update-grub
В результате получаем загрузчик в /boot/efi (смонтированный на /dev/nvme1n1p1) и строчку в последовательности UEFI
-загрузки
# efibootmgr -v BootCurrent: 0000 Timeout: 1 seconds BootOrder: 0000,0002,0006,0005 Boot0000* debian HD(1,800,80000,37194fa6-dca2-491e-a0cf-a7fded36e2c5)File(\EFI\debian\grubx64.efi) Boot0002* UEFI: Built-in EFI Shell Vendor(5023b95c-db26-429b-a648-bd47664c8012,)..BO Boot0005* UEFI: Intel(R) I350 Gigabit Network Connection ACPI(a0341d0,0)PCI(3,3)PCI(0,0)MAC(MAC(0cc47ada7688,1)..BO Boot0006* UEFI: IP4 Intel(R) I350 Gigabit Network Connection ACPI(a0341d0,0)PCI(3,3)PCI(0,0)MAC(MAC(0cc47ada7688,1)..BO Boot0007* UEFI: Intel(R) I350 Gigabit Network Connection ACPI(a0341d0,0)PCI(3,3)PCI(0,1)MAC(MAC(0cc47ada7689,1)..BO Boot0008* UEFI: IP4 Intel(R) I350 Gigabit Network Connection ACPI(a0341d0,0)PCI(3,3)PCI(0,1)MAC(MAC(0cc47ada7689,1)..BO
Посмотрим таблицу идентификаторов UUID
# blkid /dev/nvme0n1p1: UUID="AC77-0809" TYPE="vfat" PARTUUID="0496eff8-477c-4335-ada1-ce9200ddff6e" /dev/nvme0n1p2: UUID="9643fce5-dcfb-1ff3-d03d-14004857da61" UUID_SUB="f5c3d323-29ec-3079-0e58-3259275e26db" LABEL="s00:0" TYPE="linux_raid_member" PARTUUID="d37e4df1-07ef-467e-acf8-ab98bbb60f87" /dev/nvme1n1p1: UUID="4072-D808" TYPE="vfat" PARTUUID="37194fa6-dca2-491e-a0cf-a7fded36e2c5" /dev/nvme1n1p2: UUID="9643fce5-dcfb-1ff3-d03d-14004857da61" UUID_SUB="f5e0f678-9b1d-3111-df00-74096ddf7e6d" LABEL="s00:0" TYPE="linux_raid_member" PARTUUID="660ba68e-7e25-4287-a646-3f555b510533" /dev/md0: UUID="ce3f9f38-e7d9-4c89-ae36-2127a71670e0" TYPE="ext4" /dev/nvme0n1: PTUUID="86a68d04-a4d9-4296-8a1a-48d02b7171fb" PTTYPE="gpt" /dev/nvme1n1: PTUUID="1bc21b63-6011-42e9-80ab-1fd120b69907" PTTYPE="gpt"
и убедимся, что в последовательности загрузки стоит идентификатор именно второго диска. Но оригинальная строчка с загрузчиком первого диска перезаписана. Поэтому, вручную добавим строчку для второго диска под другим номером и под другим названием аналогично существующей:
efibootmgr -c -d /dev/nvme1n1 -p 1 -L "debian1" -l "\EFI\debian\grubx64.efi"
Проверяем результат
# efibootmgr -v BootCurrent: 0000 Timeout: 1 seconds BootOrder: 0000,0002,0006,0005 Boot0000* debian HD(1,800,80000,37194fa6-dca2-491e-a0cf-a7fded36e2c5)File(\EFI\debian\grubx64.efi) Boot0001* debian1 HD(1,800,80000,37194fa6-dca2-491e-a0cf-a7fded36e2c5)File(\EFI\debian\grubx64.efi) Boot0002* UEFI: Built-in EFI Shell Vendor(5023b95c-db26-429b-a648-bd47664c8012,)..BO Boot0005* UEFI: Intel(R) I350 Gigabit Network Connection ACPI(a0341d0,0)PCI(3,3)PCI(0,0)MAC(MAC(0cc47ada7688,1)..BO Boot0006* UEFI: IP4 Intel(R) I350 Gigabit Network Connection ACPI(a0341d0,0)PCI(3,3)PCI(0,0)MAC(MAC(0cc47ada7688,1)..BO Boot0007* UEFI: Intel(R) I350 Gigabit Network Connection ACPI(a0341d0,0)PCI(3,3)PCI(0,1)MAC(MAC(0cc47ada7689,1)..BO Boot0008* UEFI: IP4 Intel(R) I350 Gigabit Network Connection ACPI(a0341d0,0)PCI(3,3)PCI(0,1)MAC(MAC(0cc47ada7689,1)..BO
И меняем порядок загрузки на необходимый
# efibootmgr -o 0000,0001,0002
Вторая часть — это вернуть обратно первый загрузчик. Перемонтируем обратно раздел с ним на оригинальный с первого диска
umount /boot/efi mount /boot/efi
Убеждаемся, что смонтировался именно он, и стандартными средствами записываем загрузчик
apt-get install --reinstall grub-efi grub-install /dev/nvme1n1 update-grub
Аналогичное можно было сделать и с помощью efibootmgr
, как это делали для второго раздела.
В любом способе в конечном варианте загрузки должны видеть примерно следующую последовательность UEFI
# efibootmgr -v BootCurrent: 0000 Timeout: 1 seconds BootOrder: 0000,0001,0002 Boot0000* debian HD(1,800,80000,0496eff8-477c-4335-ada1-ce9200ddff6e)File(\EFI\debian\grubx64.efi) Boot0001* debian1 HD(1,800,80000,37194fa6-dca2-491e-a0cf-a7fded36e2c5)File(\EFI\debian\grubx64.efi) Boot0002* UEFI: Built-in EFI Shell Vendor(5023b95c-db26-429b-a648-bd47664c8012,)..BO Boot0005* UEFI: Intel(R) I350 Gigabit Network Connection ACPI(a0341d0,0)PCI(3,3)PCI(0,0)MAC(MAC(0cc47ada7688,1)..BO Boot0006* UEFI: IP4 Intel(R) I350 Gigabit Network Connection ACPI(a0341d0,0)PCI(3,3)PCI(0,0)MAC(MAC(0cc47ada7688,1)..BO Boot0007* UEFI: Intel(R) I350 Gigabit Network Connection ACPI(a0341d0,0)PCI(3,3)PCI(0,1)MAC(MAC(0cc47ada7689,1)..BO Boot0008* UEFI: IP4 Intel(R) I350 Gigabit Network Connection ACPI(a0341d0,0)PCI(3,3)PCI(0,1)MAC(MAC(0cc47ada7689,1)..BO
Таким образом загрузка будет происходить с любого из дисков, даже если один из них выйдет из строя.