Обладнання: бездисковий компʼютер intel nuc7jy
Умови: швидке завантаження через UEFI по протоколу HTTP
Зазвичай для цього використовують якісь lightweight дистрибутиви на зразок Thinstation. Основна ідея зробити завантаження швидким і надійним. Протокол TFTP набагато повільніше за HTTP і має менше можливостей керувати завантаженнями (доступи, тюнинг,…).
Спочатку я пішов таким шляхом: беру готовий образ thinstation, звідти беру grubx64.efi і вантажу його через TFTP. Але при спробі завантажитися, були помилки на grub. Тоді беру grubx64.efi з образу Debian, і помилок вже немає, але неможливо вказати шлях до lib.squash (а я збирав з параметром fastboot для зменшення образу і це була ще одна моя помилка), оскільки це grub, то нічого ми передати не зможемо. На всяк випадок ось частина конфігу grub для завантаження через http
menuentry 'ThinStation' --class thinstation --class gnu-linux --class gnu --class os --unrestricted { set enable_progress_indicator=1 set gfxpayload=keep set root=(http,192.168.1.2) linux /boot/vmlinuz splash=silent,theme:default console=tty1 LM=$LM initrd /boot/initrd }
Коли писав статтю, то наштовхнувся на таке
/build/packages/base/etc/init.d/fastboot: FILE_NET="$squash_server$squash_location"lib.squash
Можливо можна якось “підшаманити” з цими параметрами і завантажити lib.squash
Потім наштовхнувся на статтю , де замість grub використовувався завантажувач iPXE. І дійсно, з ним все пішло як треба. Ось конфіг dhcp:
subnet 192.168.1.0 netmask 255.255.255.0 { range 192.168.1.10 192.168.1.20; option routers 192.168.1.1; option domain-name-servers 8.8.4.4, 8.8.8.8; option subnet-mask 255.255.255.0; default-lease-time 86400; max-lease-time 86400; option tftp-server-name "192.168.1.2"; next-server 192.168.1.2; filename "boot/efi64/ipxe.efi"; }
Після цього бездискова машина завантажується, але мережі немає, бо відсутній драйвер для мережевої карти в самому linux’i. Ще була спроба зібрати initrd виключно для машини intel nuc7jy (так, такий шаблон був у thinstation), але і тут драйвера теж не виявилося. Щоб дізнатися, який драйвер необхідний, вантажимося з LiveCD і через lspci -v. Але і тут був сюрприз: LiveCD показує r8169, який вже є і мережа працює нормально, а тут він теж є, але мережа не працює ((. Далі гуг нам підказує:
So to summarize.
– If you have a RTL8111/8168/8411 card do not use the r8169 driver
– Install the r8168 driver instead
Беремо драйвера звідси і збираємо їх для того ядра, для якого вже зібраний образ thinstation, отже для 5.15.51TS, далі перезбираємо образ initrd і … драйвер є, але не підвантажується, бо …
probe failed with error 49 linux
modprobe key was rejected by service
а це нам каже, що увімкнений підпис драйверів у ядрі і просто так ми не зможемо підвантажити наш драйвер. Всі спроби як підписати драйвер для зібраного ядра thinstation були марні, тому, як це не прикро, треба збирати ядро без опції підпису. Примусовий підпис для модулів ядра можна прибрати через grub, передавши параметр module.sig_enforce=0, але у нас не grub ))), тому збираємо ядро. Конкретно те ядро швидко не знайшов, тому вирішив збирати 5.15.131TS. Ось тут написано як відключити. Ну і треба ще раз перезібрати сам модуль r8168 для мережевої карти, бо, навіть, якщо версії ядра відрізняються мінорно, модуль не підгружається (може це можна якось відключити, але я не знайшов).
Пару слів про нюанси роботи з thinstation.
збірка thinstation проходить в chroot’і
thinstation.conf.buildtime – файл, який використовується для задання параметрів після завантаження бездискової станції. Для того, щоб IP адреса отримувалася при завантаженні, потрібно це явно вказати (без цього просто не будете отримувати IP адресу, і не важливо, чи додали ви пакет dhcp чи ні). Тому додаємо таке:
NET_USE_DHCP=on NET_DHCP_DELAY=3 NET_USE=BOTH NET_REMOTE_ACCESS_FROM=0.0.0.0 NET_FILE_ENABLED=On #NET_FILE_METHOD=tftp
build.conf – файл який використовується при збірці initrd, тобто впливає конфігурацію зібраного linux образу:
param basename thinstation param basepath configs param baseurl http://192.168.1.2 param initrdcmd "gzip -9" param bootverbosity 3 param bootimages "pxe" param bootserver "192.168.1.2"
І після цього всього можна вантажити rdesktop, але… на нових windows при логіні через RDP показує сертифікат і немає кнопки прийняти його, тому прийшлося перейти на freerdp у якого в рази більше опцій.
Також були нюанси з роздільною здатністю монітора, але це було тому, що не був включений драйвер відеокарти до шаблону machine.
Статистика така: ядро vmlinux = 8.2Mb, образ ОС initrd = 320Mb. Час завантаження через http ~ 15-20 sec. В порівнянні з TFTP 2.5 min при initrd = 120Mb.
iPXE.
Приведу конфіг autoexec.ipxe який я використовував для збірки iPXE:
#!ipxe dhcp chain http://192.168.1.2:80/boot/efi64/boot.ipxe
А ось конфіг autoexec.ipxe який я використовую вже для завантаження образів:
#!ipxe kernel http://192.168.1.2:80/boot/vmlinuz initrd=initrd module.sig_enforce=0 initrd http://192.168.1.2:80/boot/initrd boot
Один коментар до “[Thinstation] Збираємо образ з нуля для завантаження через UEFI+PXE+HTTP”
досить складний шлях, адже пишуть скористатися ./build –allmodules а потім використати hwlister.sh і потім файли створені утилітою firmware.list та module.list завантажити в ..build/machine/ і потім в build.conf додати строку machine