Данный пост возник в результате моей собственной попытки понять, как именно можно добиться отказоустойчивости в конфигурации с EFI-загрузчиком и корнем системы на RAID-массиве. Базовая проблема заключается в том, что разделы с файлами EFI не могут быть расположены на рейде, что приводит к курьезной ситуации, когда сам линукс установлен на рейд, но загрузчик оказывается только на одном диске. Как оказалось, выход конечно есть, но требует дополнительных манипуляций. Я пошел длинным путем и решил описать установку дебиана через Live-CD при помощи debootstrap, что позволяет акцентировать внимание на момент установки загрузчика.
В самом низу будет видео, демонстрирующее все описанные ниже шаги.
Исходная позиция: система с двумя неразмеченными дисками, загруженная с Live-CD
Действия в консоли Live-CD
Размечаем первый диск.
Следующий набор команд создаст на диске GPT-таблицу c двумя разделами: 1 — EFI-раздел на 100 Мб, 2 — раздел под будущее зеркало, размером в 10 Гб
- fdisk /dev/sda
- g
- n
- 1
- [default]
- +100M
- t
- 1
- n
- 2
- [default]
- +10G
- w
Скопируем конфигурацию разделов на второй диск, чтобы они были идентичны
- sfdisk -d /dev/sda | sfdisk /dev/sdb
Отформатируем первые разделы дисков в FAT32
- mkfs.fat -F32 /dev/sda1
- mkfs.fat -F32 /dev/sdb1
Создадим зеркало md0 из вторых разделов дисков sda и sdb
- mdadm --create --metadata=0.90 /dev/md0 -l 1 -n 2 /dev/sda2 /dev/sdb2
Форматируем и монтируем рейд
- mkfs.ext4 /dev/md0
- mount /dev/md0 /mnt
При помощи утилиты debootstrap скачиваем и разворачиваем на смонтированном рейде основу дебиана
- debootstrap --arch amd64 stable /mnt https://deb.debian.org/debian
Переходим в свежую систему при помощи chroot
- mount --bind /dev /mnt/dev
- mount --bind /proc /mnt/proc
- mount --bind /sys /mnt/sys
- chroot /mnt
Действия в chroot-окружении
Устанавливаем пароль root
- passwd
Создаем директорию под файлы EFI
- mkdir /boot/efi
Выясняем ID рейда и прописываем содержимое fstab
- blkid /dev/md0
- vi /etc/fstab
- UUID="..." / ext4 errors=remount-ro 1 1
- /dev/sda1 /boot/efi vfat umask=0077 0 1
Важно: рейд указываем через ID, EFI-раздел — по имени.
Монтируем согласно fstab (рейд уже смонтирован, то есть по факту домонтируем EFI)
- mount -a
Устанавливаем в нашу систему поддержку рейдов, что потребуется в дальнейшем для корректной работы загрузчика.
- apt update
- apt install mdadm
Опционально настроим локали и часовой пояс
- apt install locales
- dpkg-reconfigure locales
- dpkg-reconfigure tzdata
Установим ядро
- apt install linux-image-amd64
Установим и настроим загрузчик
- apt install grub-efi
- update-grub2
Проинсталлируем GRUB на диски
- grub-install /dev/sda
- grub-install /dev/sdb
В момент инсталляции загрузчика на sda каталог /boot/efi/ заполняется файлами. Для отказоустойчивости необходимо скопировать эти файлы с sda1 на sdb1…
- mkdir /boot/efi2
- mount /dev/sdb1 /boot/efi2
- cp -RT /boot/efi /boot/efi2
… и добавить второй диск в список UEFI, чтобы система знала, что на нем тоже есть все необходимые файлы
- efibootmgr -c -g -d /dev/sdb -p 1 -L "debian 2" -l '\EFI\debian\shimx64.efi'
Таким образом у нас оба диска будут в списке загрузчика и при смерти любого из них система будет способна загрузиться.
Используя утилиту efibootmgr в дальнейшем можно удалить из списка замененные диски, а для добавленных дисков нужно будет повторить шаги второго диска:
1. скопировать таблицу разделов,
2. отформатировать первый раздел и скопировать на него файлы EFI,
3. добавить второй раздел в существующий рейд,
4. заинсталлировать на диск grub,
5. добавить этот диск в UEFI.
Выходим из chroot
- exit
Действия в консоли Live-CD
Перезагружаемся
- reboot
Вывод
Обеспечить отказоустойчивость системы на рейд-массиве можно путем создания EFI-раздела на каждом диске, копировании на него файлов EFI и добавлении в список загрузчика при помощи утилиты efibootmgr.
Видео, в котором я последовательно показываю весь процесс с момента создания виртуальной машины:
Использованные материалы
- Instruction how to install Debian using debootstrap
- Install Debian with Debootstrap + Grub EFI
- RAID, EFI and grub-install