четверг, 27 декабря 2012 г.

Использование EFI BIOS для загрузки CentOS

Улучшения неизбежны
Время летит быстро и вот уже на повсюду на прилавках магазинов маячат 2ТБ накопители. И всё бы шло своим чередом в плане увеличения ёмкости, ставь более вместительный HDD да ставь, вот только при установке накопителя в 2.5ТБ пользователь уже сталкивается с проблемой - ограничение 2,2ТБ на раздел. В этом случае надо уже использовать GPT таблицу разделов. И тут мы, пользователи линуксов подходим к другому ограничению - загрузчик grub не понимает таблицу разделов GPT. grub2 понимает, а вот grub в своё время этому не научили. Казалось бы, современные дистрибутивы уже вполне таки обзаводятся grub2. Новые дистрибутивы да, обзаводятся. Но не надо забывать и о серверных дистрибутивах, в которых основная задача как раз поддержка системы с учётом неизменности мажорных версий ПО. Что же делать в этом случае? Нам поможет загрузка с помощью EFI BIOS!

Я давно уже хотел выяснить что же из себя представляет технология загрузки операционной системы из EFI BIOS. Технология разрабатывается давно, но понятной информации, представленной в виде последовательности шагов по переходу с обычной загрузки операционной системы при использовании “MBR” записи на накопителе на загрузку с использованием EFI BIOS я почему то не нашёл. Эта статья и призвана заполнить образовавшийся пробел.

Итак, нам требуется материнская плата с EFI BIOS, в целом скорее всего это будет любая материнская плата способная работать с Sandy Bridge архитектурой процессоров. Наверняка материнские платы с EFI BIOS есть и от компании AMD, мне они не знакомы. В любом случае есть ли поддержка подобного BIOS или такая поддержка отсутствует можно выяснить на сайте производителя конкретной материнской платы. Я приобрёл материнскую плату от ASUS P8Q77-M. Дальнейшая работа будет вестись с этой платой.

Новый накопитель, на который требуется перенести систему. Для себя я выбрал Seagate ST2000DM001. На него и будем переносить систему. Многие возразят, ведь данный накопитель ниже обозначенного предела в 2.2ТБ и в этом случае можно обойтись без загрузки с помощью EFI BIOS, разместив загрузчик в MBR. Что тут скажешь - это конечно же так. Вот только следующий порог ёмкости накопителя находится уже в районе 2.5ТБ и уж с ним точно возникнут сложности. Я решил не откладывать решение этого вопроса на потом, когда у меня появится накопитель бОльшей ёмкости, а попробовать разобраться во всём сейчас.

И наконец установленная в данный момент система CentOS 6.3, которую и надо перенести на новый накопитель.

UEFI
Для лучшего понимания дальнейших действий требуется прояснить каким образом осуществляется загрузка с помощью EFI BIOS.
  1. Система включается, запускаются POST тесты
  2. Загружается EFI BIOS
  3. В EFI BIOS находится собственный менеджер загрузки, с помощью которого выясняется какие EFI приложения должны запуститься и откуда (например указан диск, раздел) 
  4. Менеджер загрузки запускает EFI приложения с раздела отформатированного под файловую систему FAT (HFS/HFS+ для Apple-Intel Mac). Этот раздел зовётся EFI System Partition (ESP)
  5. EFI приложения могут запускать другие приложения
Исходя из этой информации можно понять что для загрузки операционной системы нам требуется указать менеджеру загрузки который находится в EFI BIOS требуемый диск на котором находится наше EFI приложение.
  • Переменные с информацией о путях загрузки EFI приложений можно указать с помощью так называемого UEFI Shell. Скачиваем его по ссылкам, вскоре он нам понадобится. Указанная оболочка достаточно мощное средство работы с EFI BIOS, нам же требуется только указание пути к EFI приложению.
    x86_64 UEFI Shell 2.0 (Beta)
    i386 UEFI Shell 2.0 (Beta)
  • EFI приложение поставляется вместе с CentOS 6 (RHEL 6) и находится в директории “/boot/efi/EFI/redhat/”. В этой директории находится только один файл - grub.efi
    Если диск который будет установлен размечается на разделы в отдельной операционной системе, эти файлы лучше сразу скопировать куда нибудь на переносной носитель. Если же новый диск подключен к системе которая будет переноситься, просто запоминаем местонахождение скачанного файла EFI Shell и EFI файла приложения от Red Hat.

Разметка нового диска
Размечать новый диск будем программой parted, поскольку fdisk и не может работать с GPT таблицами разделов. Перед разметкой желательно уточнить тип физического сектора который имеет диск - 512Б или 4КБ. Это можно выяснить запустив программу parted с указанием нового диска. Как можно видеть из вывода parted, модель диска которую я приобрёл имеет 4КБ сектор взамен стандартного 512Б. А это значит что для избежания просадки в скорости работы требуется ровнять создаваемые разделы по границе в 1МБ.



Для разметки в этом случае к программе parted применяется ключ “-a optimal” и первый раздел начинается не с нуля, а с 1МБ. Обратитесь к статье Выравнивание раздела диска в случае необходимости.
Итак, запускаем parted с указанием нового диска который требует разметки
parted -a optimal /dev/new_disk
Приступаем к созданию новых разделов
(parted) mklabel gpt
(parted) unit MB
(parted) mkpartfs "EFI System Partition" fat16 1 20
(parted) mkpartfs primary ext2 20 200
(parted) mkpart primary 201 -1
(parted) set 1 boot on
(parted) set 3 lvm on
(parted) p
  • Первый раздел у нас будет так называемый EFI System Partition (ESP). Файловая система на нём должна быть обязательно FAT, разрядность не важна. Можно создать FAT12, FAT16 или FAT32. В последнем случае минимальный раздел у этого типа - 512МБ, что явно избыточно для маленького системного раздела который требуется. FAT16 с минимумом в 20МБ будет вполне достаточно. Именно на этот раздел будут помещены EFI файл оболочки и EFI файл представленный компанией Red Hat. 
  • Второй раздел требуется для директории /boot. В этой директории находится grub, файлы ядер (kernel) и образов (initrd). Из файловых систем для этой цели лучше всего подходит ext2. Поскольку у grub отсутствует возможность загружаться из LVM раздела нам требуется выделить под него отдельный раздел. Если LVM не планируется, достаточно будет сделать второй раздел корневым и отвести ему всю оставшуюся ёмкость накопителя. В случае использования менеджера логических томов LVM, переходим к созданию заключительного раздела на накопителе.
  • Третий раздел отводится под LVM. Под этот раздел отводится вся оставшаяся ёмкость диска.
  • Устанавливаем дополнительные флаги разделов: boot и lvm 
При просмотре таблицы разделов командой должна появиться приблизительно следующая информация.


Перенос системы на новый накопитель
Монтируем созданный системный раздел в подходящую директорию
$ sudo mount -t vfat /dev/sda1 /mnt
На этот раздел требуется скопировать файл оболочки и EFI файл приложения от Red Hat. Скачанный файл оболочки размещаем под именем Shellx64.efi прямо в корень раздела, а файл приложения который находится в директории “/boot/efi/EFI/redhat/” переносим в созданную директорию “/EFI/redhat/”. В эту же директорию требуется скопировать файл конфигурации grub.conf, который находится в директории “/boot/grub/grub.conf”. Следует учесть, что поскольку нумерация разделов изменилась, требуется отредактировать файл grub.conf на актуальную конфигурацию, замените в этом файле строки с (hd0,0) на (hd0,1).
На этом работу с системным разделом EFI можно считать завершённой. Отключаем системный раздел командой umount и монтируем раздел который у нас будет как /boot.
$ sudo mount /dev/sda2 /mnt
На вновь подключенный раздел копируем всё что находится у нас в директории /boot с диска на котором в данный момент находится система. Если раздел /boot находится у вас на корневом разделе, то копируем и остальные файлы системы. В случае если у вас корневой раздел, /swap, /home и прочие разделы находятся на LVM, переносим LVM на новый диск. Подробнее о том как это сделать можно прочитать в Повести о Linux и LVM Помним о том что требуется изменить файл /etc/fstab, указав в нём местонахождение разделов нового накопителя. При использовании LVM в файле /etc/fstab возможно потребуется изменить только местонахождение корневого раздела.

Запуск EFI Shell
Перезагружаем систему и заходим в EFI BIOS. Нам требуется отыскать надпись "Launch EFI Shell from file system device". Эта надпись может находиться в разделе “Boot Option Menu”, либо при явном выборе меню “Exit”. Подтверждаем выбор и после этого менеджер загрузки начинает искать EFI приложение на подключенных накопителях (HDD, USB Flash и пр.), с последующим запуском найденного приложения.
У вас на экране монитора должно появиться запущенное приложение EFI Shell. Возможно, после подтверждения выбора надписи "Launch EFI Shell from file system device" у вас появится сообщение о том что “FileName.efi not found”, в этом случае файл Shellx64.efi следует переименовать на то имя которое запрашивается.
Итак, EFI Shell запущен, теперь можно приступать к указанию пути к EFI приложению размещённому так же на системном разделе. 

Просмотрим информацию о загрузочных записях которые существуют в данный момент
Shell> bcfg boot dump -v
Добавим четвёртую (счёт начинается с нуля) опцию к загрузочному меню. Обратите внимание на то что для указания пути используется обратный слэш.
Shell> bcfg boot add 3 fs0:\EFI\redhat\grub.efi "CentOS"
Если потребуется удалить вновь созданную четвёртую опцию, поможет команда
Shell> bcfg boot rm 3
Для изменения позиции с #4 на #0 поможет команда
Shell> bcfg boot mv 3 0
Последнее можно сделать и из меню EFI BIOS, в разделе приоритетов загрузки.
С дополнительной информацией можно ознакомиться в статье по UEFI
Как видите EFI Shell предоставляются достаточно большие возможности по работе со значениями EFI BIOS находящимися в NVRAM. Выходим из EFI Shell по команде exit, перезагружаем систему и при повторном посещении EFI BIOS мы видим что в разделе приоритетов загрузки (Boot option priorities), помимо выбора подключенных накопителей появилась возможность выбора опции "CentOS (ёмкость накопителя)". После выбора новой опции, требуется изменить дополнительно опции в разделе "CSM" (Compatibility Support Module) - "Launch CSM" - "auto" и в разделе "Secure boot" - "OS Type" - "Other OS". В BIOS разных производителей эти разделы могут именоваться несколько иначе, суть в том чтобы указать загрузку именно EFI приложения с системного раздела, а не MBR запись. В последнем случае у вас на дисплее появится сообщение о том что MBR запись не найдена (что вполне логично, потому что она действительно должна отсутствовать на новом накопителе). Перезагружаем систему и видим запуск знакомого загрузчика grub на новом накопителе! 

Финальные штрихи
В целом система готова к использованию, осталась лишь пара деталей. При обновлении ядра системы у нас обновляются также и опции загрузки нового ядра в файле “/boot/grub/grub.conf”, но теперь файл grub.conf находится в директории “/EFI/redhat/” на другом разделе накопителя. Поэтому при очередном обновлении всё равно будет загружено предыдущее ядро, поскольку записи в этом файле не будут обновлены. Чтобы это исправить, примонтируем ESP раздел к директории “/boot/efi” и создадим символьную ссылку на новый файл конфигурации в директории “/boot/grub” (неиспользуемый файл конфигурации в этой директории следует удалить). Будет разумнее сделать монтированием с использованием UUID раздела. Узнать его можно с помощью команды
blkid /dev/partition_name
Добавляем записи в файл /etc/fstab
UUID=b460fc21-d517-4592-9e3e-348b7a88c8f0 /boot     ext2    defaults           1 2
UUID=A774-EAC4                            /boot/efi vfat    rw,umask=077       0 0
Создаём символьную ссылку на файл grub.conf
ln -s /boot/efi/EFI/redhat/grub.conf /boot/grub/grub.conf
Перенос системы завершён, протестируем новый накопитель.


1 комментарий: