Запутался. Помогите распутать и улучшить понимание.
Есть старая PC - PXE-сервер (DHCP, NFS, TFTP серверы), 32-разрядный. Ubuntu 14.04.5 LTS i386
Есть клиентские БЕЗДИСКОВЫЕ машины Intel Xeon E5 c оперативкой от 8GB, на которых не будет пользователей кроме root и не нужны варианты загрузки. В биосе этих машин установлена PXE загрузка, но пока она ничего не находит, и после 3 попыток система загружается с временного локального источника. Вариант загрузки должен быть по умолчанию. Т.е. развитое меню не нужно. На машинах запускаются скрипты через cron, результат отправляется на zabbix-сервер. Новизны ОС не требуется, поэтому я остановился на Ubuntu 14.04.5 LTS amd64
Сразу возникло непонимание, как создавать образ целевой системы с нуля и сконфигурировать его для PXE загрузки. Все примеры, которые удалось найти, описывают сборку клиентской системы на сервере через debootstrap, а у меня он другой системы. А потом загрузку с nfs, что мне также не подходит. Либо рекламируют какие нибудь извраты и пакеты, что мне также не нужно. Хотелось бы обойтись вообще без nfs и специальных крутых пакетов. От сервера требуется только выдать IP, отдать образы по PXE и всё.
Я попробовал на Писишке-сервере (Ubuntu 14.04.5 LTS i386) выполнить установку целевой системы через debootstrap, указав нужную версию Ubuntu, она собралась, но без ядра, с пустой директорией boot. Установить ядро (apt-get install linux-image-версия ) не получилось, на любую версию ядра выдет кучу ошибок несовместимости. Что делать дальше с недоустановленной системой ума не приложу.
Тогда я сделал установочную флэшку, подключил HDD к одному из хостов и установил минимальный Ubuntu-сервер на HDD целевой системы. Настроил весь прикладной софт, протестил - всё работает как надо.
Теперь нужно почистить диск и сделать на основе этого диска образ(1 или 2 файла ?) для PXE загрузки прямо в память клиентской машины, монтирование и дальнейшую работу без промежуточной перезагрузки. Понятно, что все варианты с сетевой установкой не по теме.
Также я попробовал на этой же целевой машине повторить эксперимент с созданием такой же системы, через debootstrap, всё в точности по инструкциям. Теперь версии операционок и разрядность совпадают (amd64). На этапе установки ядра получил теже самые ошибки. Забил на этот способ.
В интернете множество статей, но при всём богатстве выбора не нашел ни одной подходящей и просто понятной инструкции. Только окончательно запутался.
Итак.
Как из HDD со свеже установленной и настроенной системой сделать образ для загрузки с PXE сервера прямо в память этой же или подобной целевой машины?
Как сконфигурировать PXE-сервер, в данном случае? Там уже работают - DHCP(сервер ip выдает, клиент получает) и TFTP(проверил клиентом, стянул файл), а также ненужный nfs. Конфигурацию TFTP, может быть, надо поправить для PXE.
Подскажите пошагово, желательно на основе только базового функционала, без каких либо упрощающих мега пакетов и специальных файловых систем.
Пользователь добавил сообщение 11 Октября 2018, 17:13:57:
и тишина!
В общем, попытался сделать по аналогии с методом описанным здесь
https://habr.com/post/164147/Но без squashfs, без debootstrap
В свежеустановленной и настроенной операционке сделал настройки initramfs как описано в статье.
Но скрипт ram немного изменил, с учетом своих условий
#!/bin/bash
retry_nr=0
do_rammount()
{
configure_networking
mkdir -p /tmp/rootfs
# вот отсюда отличия начинаются. Я убрал блок с временным монтированием squashfs, и заменил копирование на распаковку tar.gz архива прямо в rootmnt
# Но не вижу пока что это хотя бы цеплялось и ошибки выдавало. Видимо, скрипт не запускается.
wget ${rooturl} -O /tmp/rootfs/rootfs.min.tar.gz
mkdir -p {rootmnt}
mount -t tmpfs -o size=1G none ${rootmnt}
tar -C ${rootmnt} --numeric-owner -xzpf /tmp/rootfs/rootfs.min.tar.gz
#архив больше не нужен.
эрэм эрэф /tmp/rootfs
}
mountroot(){
for x in $(cat /proc/cmdline); do
case $x in
rooturl=*)
export rooturl=${x#rooturl=}
;;
esac
done
wait_for_udev 10
delay=${ROOTDELAY:-180}
do_rammount
while [ ${retry_nr} -lt ${delay} ] && [ ! -e ${rootmnt}${init} ]; do
/bin/sleep 1
do_rammount
retry_nr=$(( ${retry_nr} + 1 ))
done
}
В статье не написано, но я изменил и одну опцию в файле /etc/initramfs-tools/initramfs.conf
MODULES=most
BUSYBOX=y
COMPCACHE_SIZE=""
COMPRESS=gzip
#только это поменял
BOOT=ram
DEVICE=
NFSROOT=auto
Затем, как описано в статье пересобрал initrd.img, в результате(по моему недосмотру) пересобрался образ по ссылке в /boot
mkinitramfs -o /initrd.img
Ну и ладно, не смертельно. Скопировал его на pxe-сервер в каталог tftpboot
Выключил целевую машину, отсоединил диск, примонтировал на рабочей машине, почистил очевидное и ненужное и упаковал целиком, вместе с директорией boot.
tar --numeric-owner -czvpf /rootfs.min.tar.gz --one-file-system ./
получилось 225MB.
положил его на PXE сервер в каталог /var/lib/tftpboot
туда же положил pxelinux.0
и файл pxelinux.conf/default настроил так
default vesamenu.c32
aprompt 1
timeout 2
label ubuntu
menu label Ubuntu
kernel vmlinuz
append initrd=initrd.img boot=ram rooturl=http://10.0.0.1/rootfs.min.tar.gz ip=dhcp
этот вариант не заработал. После получения IP по DHCP, попытка загрузить pxelinux.cfg/default. Он найден, но дальше ошибка - не могу найти ядро vmlinuz. Пробовал версию указывать, не помогло. Ядро(два наименования) лежит рядом с pxelinux.0, который загрузился нормально.
заменил default и kernel на memdisk и загрузка прошла дальше.
Про vmlinuz и memdisk в статье ни слова. Возможно, скорее всего, memdisk не нужен, но пока без него ещё хуже.
Включил клиентскую машину(теперь она без диска)
Получен IP по DHCP
Стартовалf PXE загрузка
Загрузился memdisk
Затем сразу загрузился initrd.img
Какой-то(неизвестно какой) image распаковался gzip успешно. Чем сжат initrd.img я не знаю, он утилитой создавался. Может это он.
Затем прочиталась command line (строка append)
Затем много данных о конфигурации MEMDISK. Почему то он всего 57353.5K - этого очень мало. Я заказывал больше - 1G. А потом еще в командной строке пытался ramdisk_size=1G.
Затем Loading boot sector... booting...
и завис намертво с противным писком
Возможно памяти выделил маловато, но вроде бы до этого ещё не дошли. Сейчас попытаюсь увелить в обоих местах до 4G и отпишусь.
Скорее всего не поможет, т.к. проблема пока в другом.
У кого есть мысли по теме?