Программный RAID в Linux на основе MD-устройств успел отлично зарекомендовать себя в работе и пользуется заслуженной популярностью у администраторов, сочетая надежность и простоту создания и управления. Но со все более широким распространением UEFI-систем приходится сталкиваться с некоторыми особенностями. Многие, если есть такая возможность, переключают настройки в режим совместимости, но это неправильно, UEFI - это стандарт для современных устройств и поэтому надо учиться работе с ним.
Онлайн-курс по устройству компьютерных сетей
На углубленном курсе "Архитектура современных компьютерных сетей" вы с нуля научитесь работать с Wireshark и «под микроскопом» изучите работу сетевых протоколов. На протяжении курса надо будет выполнить более пятидесяти лабораторных работ в Wireshark.
Статья обновлена 02.09.2023
Другой возможной альтернативой программного RAID является использование встроенного в материнскую плату или недорогого внешнего контроллера. Но в этом случае вы получаете проблему совместимости, такой массив будет работать только со своим семейством контроллеров, сегодня их не так и много, но тем не менее. Также вы не сможете производить работы по восстановлению и обслуживанию массива в онлайн, данные на дисках в это время будут недоступны.
Скажем больше, мы не видим никаких преимуществ у встроенных и недорогих контроллеров перед программной реализацией, особенно на простых массивах, не требующих сложных вычислений (RAID 1 и 10). А учитывая всю гибкость mdadm, программный RAID по многим параметрам будет выглядеть гораздо привлекательнее.
Конфигурация разделов Linux с UEFI
Для примера рассмотрим применяемую по умолчанию во многих дистрибутивах схему со всеми файлами в одном разделе. Однако это не означает, что вам следует применять именно ее, данная схема выбрана нами для простоты подачи материала.
EFI - он же ESP (EFI system partition) - специальный раздел с файловой системой FAT который содержит загрузчик, вызываемый микропрограммой UEFI, должен находиться в основной таблице разделов и не может располагаться в программных RAID-массивах, томах LVM или пулах ZFS. Данный раздел должен располагаться на каждом диске, с которого предусматривается загрузка.
Linux RAID - специальные разделы, из которых собирается программный RAID, в нашем случае используется один массив md0, располагающийся на двух дисках. Данные разделы имеют специальные заголовки, что позволяет даже при подключении к другой системе правильно определить их тип и собрать массив заново.
Swap - раздел подкачки, используется как механизм виртуальной памяти, а также для организации режима сна (в настольных системах). Некоторые современные системы не используют раздел подкачки (Ubuntu) используя для этой цели специальный файл в корневом разделе. Swap можно объединить в программный RAID, но смысла в этом немного, более того, при использовании отдельных swap-разделов системе будет доступен вдвое больший объем для подкачки. Также отсутствие swap-раздела при отказе одного из дисков не блокирует загрузку системы.
Некоторые особенности Ubuntu Server 18.04
Начиная с версии 18.04 Ubuntu Server по умолчанию предлагается с новым инсталлятором Subiquity, который очень просто отличить по обновленному внешнему виду:
При использовании данного инсталлятора вы не сможете установить систему на программный RAID (как на системах с UEFI, так и без), установка закончится ошибкой. Поэтому для создания программного RAID следует использовать сборку с классическим установщиком, которую можно получить в разделе альтернативных загрузок.
Также легко можно отличить дистрибутивы по наименованию, образ с Subiquity содержит в наименовании слово live (ubuntu-18.04.3-live-server-amd64.iso).
Создание программного RAID при установке системы для Debian и Ubuntu до 18.04
Все дальнейшие действия мы будем производить на системе Debian 10, однако все сказанное будет справедливо для любой основанной на Debian системе, а с некоторыми поправками и для любого дистрибутива Linux.
Прежде всего создадим в начале каждого диска системный раздел EFI размером в 499 МБ (по умолчанию Debian и Ubuntu используют близкие к этому размеры разделов).
Затем выполним необходимую разметку, основное условие - одинаковые размеры томов на обоих дисках, тип файловой системы и точка монтирования не играют никакого значения, можете принять предлагаемые по умолчанию. В нашем случае будет создано два раздела почти на весь размер диска, оставляя немного места в конце для разделов подкачки. В итоге у вас должно получиться примерно так:
В итоге каждый диск содержит три раздела: ESP, будущие разделы Linux RAID и разделы подкачки. Порядок следования разделов и размер разделов для RAID должны быть одинаковы на обоих дисках. После того, как первоначальная разметка выполнена соберем программный RAID 1 из разделов для данных, в нашем случае sda2 и sdb2:
Теперь разметим созданный массив, создав там корневой раздел. Помните, что один программный массив Linux (md-устройство) может содержать только один раздел, если вам нужно несколько разделов, то потребуется создать несколько массивов.
Далее продолжаем установку в обычном режиме, программный RAID-массив создан, а к загрузчику мы вернемся после завершения этого процесса.
Создание программного RAID при установке системы для Ubuntu до 20.04 и новее
Настройка программного RAID в новом установщике Ubuntu достаточно серьезно отличается от настройки в debian-installer и может вызвать затруднения даже у опытного пользователя. Начнем с того, что пометим первый диск как загрузочный, для этого в меню диска следует выбрать Use As Boot Device.
Для UEFI систем будет автоматически создан ESP-раздел, создать такой раздел руками в Subiquity невозможно, затем проделываем ту же операцию со вторым диском, выбрав в его меню Add As Another Boot Device. После чего там будет создан второй ESP-раздел. Также это обеспечит установку загрузчика сразу на оба диска.
Затем переходим к свободному пространству (free space) на дисках и создаем там раздел (или разделы) нужного размера, важное условие - в поле Format обязательно ставим Leave unformatted. Если в поле Size ничего не указывать, то будет создан раздел максимального размера. Аналогичные действия выполняем и для другого диска. Помним, что одно md-устройство - это один раздел.
После того как вы создали на обоих дисках одинаковые неформатированные разделы переходим в пункт Create software RAID (md), где указываем желаемый уровень RAID - в нашем случае зеркало - и выбираем используемые для него разделы.
После этого среди доступных дисковых устройств у нас появится md-устройство программного RAID, на свободном месте которого создаем новый раздел, где указываем файловую систему и точку монтирования (для системного раздела - /).
Далее продолжаем установку в обычном режиме.
Настройка загрузчика EFI и его копирование на второй раздел
Перед тем как настраивать загрузчик нам потребуется получить некоторые данные, в частности идентификаторы (UUID) разделов, их можно получить командой:
lsblk -o +uuid
В полученном выводе прежде всего обратим внимание на идентификаторы EFI-разделов.
Они разные, в то время как UUID RAID-разделов совпадают. Чтобы понять, что это означает и какие может иметь последствия откроем /etc/fstab:
Как видим, разделы монтируются по идентификаторам и в случае выхода из строя первого диска вы не сможете загрузиться со второго, так как система не сможет смонтировать EFI-раздел. В некоторых источниках советуют изменить строку монтирования, используя вместо UUID явное указание устройства, например, /dev/sda1. Да, если мы отключим первый диск, то второй превратится в sda и система загрузится, но если диск выйдет из строя, физически определяясь в системе или на его месте будет новый диск без разметки, то такой фокус не сработает.
Правильно будет изменить идентификатор одного из разделов, чтобы они были одинаковы. Так как UUID раздела на первом диске уже используется в файлах конфигурации, то изменим его у раздела на втором диске.
Для работы с разделами FAT32 нам потребуется установить дополнительные утилиты:
apt install dosfstools
После чего выполним:
mkdosfs -i 2396BE56 /dev/sdb1
Где 2396BE56 - идентификатор первого EFI-раздела (/dev/sda1), его следует указывать в одну строку без пробелов и тире, а /dev/sdb1 - второй EFI раздел.
Теперь получим список текущих загрузочных записей EFI:
efibootmgr -v
Здесь нас интересует запись под номером 5 - debian, которая отвечает за загрузку системы и указывает на первый жесткий диск. Запомните или запишите путь к EFI-образу для загрузки системы: \EFI\debian\shimx64.efi.
Создадим аналогичную запись для второго диска:
efibootmgr -c -d /dev/sdb -p 1 -L "debian 2" -l "\EFI\debian\shimx64.efi"
Немного поясним назначение ключей команды:
- -c (--create) создать новую запись
- -d (--disk) диск, на котором находится системный раздел EFI
- -p (--part) номер раздела EFI
- -L (--label) метка(наименование) для загрузочной записи
- -l (--loader) путь образа EFI для загрузки
Так как наш EFI-раздел располагается в /dev/sdb1, то в опциях -d и -p указываем /dev/sdb и 1 соответственно, а в качестве пути указываем данные из первой загрузочной записи, которые мы получили на предыдущем шаге. Обратите внимание, что при указании пути к образу EFI используется обратный слеш.
Еще раз убедимся, что запись выполнена правильно:
efibootmgr -v
Обе строки должны отличаться только меткой и GUID раздела (уникальный GPT-идентификатор, который позволяет микропрограмме UEFI найти нужный раздел).
Если обнаружена ошибка, то запись следует удалить и создать заново, для удаления используйте команду:
efibootmgr -b 6 -B
Ключ -b (--bootnum) указывает на номер записи, а -B (--delete-bootnum) предписывает удалить ее.
Последним шагом скопируем содержимое загрузочного раздела с первого диска на второй, для этого смонтируем второй EFI-раздел:
mount /dev/sdb1 /mnt
И скопируем на него содержимое первого EFI-раздела:
cp -R /boot/efi/EFI/ /mnt
После чего отмонтируем раздел:
umount /dev/sdb1
На этом настройка завершена, система теперь может быть успешно загружена с любого диска.
Установка загрузчика EFI на RAID-массив
Несмотря на то, что размещение загрузчика EFI на RAID-массиве не рекомендуется, в случае использования "зеркала" такая настройка возможна и оказывается более простой в эксплуатации, при этом следует понимать, что в данном случае у вас остается единственный экземпляр загрузчика и вырастают риски того, что он окажется поврежден при отказе диска.
Прежде всего установим недостающие инструменты:
apt install dosfstools
Затем создадим на основном разделе временную папку и скопируем туда содержимое EFI-загрузчика:
mkdir /boot/tmp
cp -a /boot/efi/* /boot/tmp/
Ключ -a предписывает сохранять структуру и атрибуты копируемых файлов.
Затем отмонтируем загрузочный раздел:
umount /boot/efi
И создадим зеркальный массив из EFI-разделов:
mdadm --create --verbose /dev/md1 --level=1 --raid-devices=2 --metadata=1.0 /dev/sda1 /dev/sdb1
Ключевой особенностью здесь является использование metadata=1.0, которая сохранит метаданные RAID в конце раздела, в противном случае UEFI не сможет получить к ним доступ.
Затем создадим на нем раздел FAT32:
mkfs.vfat /dev/md1
И снова смонтируем его как загрузочный раздел:
mount /dev/md1 /boot/efi
После чего вернем файлы загрузчика обратно:
cp -a /boot/tmp/* /boot/efi/
Теперь выполним команду:
lsblk -o +uuid
И выясним идентификатор ESP-раздела, помечен желтым на скриншоте:
Теперь откроем /etc/fstab и заменим идентификатор загрузочного раздела /boot/efi на только что полученный нами:
После чего добавим запись о нашем втором массиве в конфигурацию mdadm и обновим загрузочный образ, если этого не сделать, то все будет работать, однако загрузочный массив будет определяться в системе как /dev/md127:
mdadm --examine --scan | grep metadata=1.0 >> /etc/mdadm/mdadm.conf
Теперь, на всякий случай, откроем файл /etc/mdadm/mdadm.conf и убедимся, что в нем нет дублей записей для массивов, в противном случае загрузка системы станет невозможной.
Если все нормально, то обновляем загрузочный образ:
update-initramfs -u
И перезагружаем систему:
reboot
Настройка закончена, система может грузиться с любого диска.
Онлайн-курс по устройству компьютерных сетей
На углубленном курсе "Архитектура современных компьютерных сетей" вы с нуля научитесь работать с Wireshark и «под микроскопом» изучите работу сетевых протоколов. На протяжении курса надо будет выполнить более пятидесяти лабораторных работ в Wireshark.
Последние комментарии