Категорії
Thinstation

[Thinstation] Загружаємо ОС з UEFI через HTTP використовуючи grub

Навіщо взагалі брати grub, якщо є простий і зручний iPXE?Бо є нюанси з драйверами.

Чи є інші loader’и окрім iPXE/grub, які підтримують UEFI+HTTP?Ні.

Чи правда, що grub повільніший за iPXE в декілька разів?Так.

В цій статті розкажу, чому саме вирішив перейти на grub і що за нюанси. У замовника зʼявилася нова машина на базі asrock j4125b-itx і все начеб-то ок, але при спробі завантажитися через iPXE отримуємо помилку:

No more network devices.

Дізнаємося, який драйвер мережевої карти підходить. Для цього завантажуємо будь-який LiveCD linux і дивимося на вивід lspci -v

driver: r8169

Дізнаємося, який драйвер використовує iPXE. Так, сам iPXE в собі має базу драйверів і на її основі він працює. Щоб це дізнатися, збираємо iso-образ iPXE з такими параметрами

$ make bin-x86_64-efi/ipxe.iso DEBUG=pci,image,device

і після завантаження бачимо наступне:

downloading NBP file ok
autoexec.ipxe ok
debug(pci):
(10ec:8168) has driver "rtl8168"
...
probe failed: Connection timed out
...
http://10.5.0.7:80/boot/vmlinuz... Network unreachable

Ага! Отже, використовується драйвер саме 8168, а не 8169. Наскільки це критично і чи є взагалі відмінність? Виявляється, трохи є. Якщо коротко, то 8169 це покращена версія 8168 і в більшості сучасних дистрибутивів використовується саме 8169, звичайно, якщо мережева карта із сучасних. Інколи буває, що для старої мережевої карти вже немає драйвера 8168 і підвантажується 8169 який несумісний саме з цією картою. Тоді треба окремо збирати саме 8168 і завантажувати саме його.

Що можна зробити в цій ситуації? Звичайно, що спробувати завантажити драйвер для 8169, сподіваючись, що він нормально запрацює. Як це зробити? В першу чергу я спробував розібратися, як iPXE визначає різницю між 8169 і 8168. Цілком можливо, що цей спосіб не зовсім правильний чи не всі виробники притримуються стандартів чи ще щось. На швидку правлю на 8169 і перезбираю образ і … те саме, але тепер драйвер 8169 і теж не може завантажитися. Пишу розробнику, але це ні до чого суттєвого не призводить.

Що ж, настав час розбиратися з grub, бо з iPXE справа зайшла в глухий кут. Ставимо необхідні пакети (під Debian):

# apt install grub-pc-bin grub-efi-amd64-bin

і збираємо loader з підтримкою efi/http/net:

# grub-mkimage -p '(http,10.5.0.7)/EFI' -O x86_64-efi -o grubx64.efi tftp efinet http net

Якщо є якісь складнощі зі збіркою, то можна скачати готовий grubx64.efi від Ubuntu 18. Але розмір буде 1.2Мб, проти 250Кб, якщо збирати самому. Доречі, loader від iPXE теж займає, майже 1Мб.

Коротко поясню, що до чого:

  • boot server = 10.5.0.7
  • /EFI – це шлях відносно кореня TFTP/HTTP де лежать власне loader grubx64.efi, grub.cfg і все інше, що треба для роботи grub.

Створюємо grub.cfg такого змісту і кладемо його у /EFI відносно кореня TFTP/HTTP:

function load_video {
insmod efi_gop
insmod efi_uga
insmod video_bochs
insmod video_cirrus
insmod all_video
insmod font
}

#menuentry "ts" {
load_video
set gfxpayload=keep
set gfxmode=auto
loadfont unicode
font=unicode
insmod gfxterm
insmod gzio
insmod png
insmod http
insmod net
insmod progress

timeout=5

menuentry "Thinstation" {
echo "Network status: "
net_dhcp
net_ls_addr

echo "Loading linux kernel"
linux (http,10.5.0.7:80)/boot/vmlinuz ip=dhcp
echo "Loading initrd"
initrd (http,10.5.0.7:80)/boot/initrd

}

Тепер копіюємо папку з модулями grubx86_64-efi (зазвичай вона лежить у /usr/lib/grub) в /EFI і папку зі штрифтами (/boot/grub/fonts) теж у /EFI.

Отже, після цих маніпуляцій в папці /EFI відносно кореня TFTP/HTTP лежить наступне:

# ls /srv/tftp/EFI
fonts grub.cfg grubx64.efi x86_64-efi

Зауваження!

Пару слів скажу про момент з параметром ip=dhcp. З незрозумілих поки причин, після завантаження thinstation не отримував адресу по DHCP, взагалі не відправляв запитів на її отримання. Як тільки додали цей параметр – пішло, але через деякий час знову перестав. Прибрали параметр і після цього знову все запрацювало. Зараз працює без параметра ip=dhcp.

Все інше лишається без змін і можна використовувати дані з попередньої статті .

Якщо у вас увімкнений secure boot, то в grub.cfg замість linux / initrd треба використовувати відповідно linuxefi / initrdefi. Ви не можете міксувати чи доповнювати (бо процес завантаження образу linux в памʼять кардинально відрізняється), ви повинні використовувати лише або все з суфіксом efi, або все без нього. Наявність рядка

GRUB_USE_LINUXEFI=true

у /etc/default/grub відповідно сгенерує вам параметри з суфіксом efi.

Повна документація по grub.

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *

Домашняя страничка Andy
Записки молодого админа
Самостоятельная подготовка к Cisco CCNA
Самостоятельная подготовка к Cisco CCNP
Powered by Muff