Форум русскоязычного сообщества Ubuntu


Следите за новостями русскоязычного сообщества Ubuntu в Twitter-ленте @ubuntu_ru_loco

Автор Тема: Создание настроенного образа, загрузка по сети и rootfs в памяти  (Прочитано 4445 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Nick2018

  • Автор темы
  • Новичок
  • *
  • Сообщений: 8
    • Просмотр профиля
Запутался. Помогите распутать и улучшить понимание.

Есть старая 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 и отпишусь.
Скорее всего не поможет, т.к. проблема пока в другом.

У кого есть мысли по теме?
« Последнее редактирование: 11 Октября 2018, 17:21:02 от Nick2018 »

Оффлайн Nick2018

  • Автор темы
  • Новичок
  • *
  • Сообщений: 8
    • Просмотр профиля
всё-таки в pxelinux.cfg/default
должно быть kernel vmlinuz, а не memdisk

предполагается, что к загрузке ядра он должен перейти после развёртывания initrd.img в памяти и отработки скрипта ram

после этого управление должно передаваться ядру на примонтированной в памяти фаловой системе.

Но этого не происходит. Т.е. вообще метод описанный в статье в данном случае не работает даже частично

Вообще, клиент находит и загружает файл ядра из tftpboot, если его переименовать в memdisk, но не понимает что это ядро... вот засада.
Если же написать нормально vmlinuz , то он пишет что не находит ядро. Ядро родное, скопировано из /boot
Если же вместо vmlinuz написать memdisk, то процесс проходит дальше, как я уже писал, распаковывается initrd.img, но дальше ничего.

Loading boot sector... booting... и зависает

Размер диска в памяти как бы увеличил, но до него дело пока не доходит.

Оффлайн Nick2018

  • Автор темы
  • Новичок
  • *
  • Сообщений: 8
    • Просмотр профиля
Ну... до исполнения скрипта ram добрался...

Решение - заменил родное ядро на сетевое, от netboot сборки
и удалил строчку

configure_networking

в скрипте ram

Эта строка не пускала дальше. Было бы хорошо ЗАСТАВИТЬ ЕЁ РАБОТАТЬ, для общего интереса.

Но всё, как будто, и без неё заработало, процесс пошел, но выдал ошибку на строке - не удалось установить соединение.

wget ${rooturl} -O /tmp/rootfs/rootfs.min.tar.gz

где rooturl=http://10.0.0.1/rootfs.min.tar.gz

Ну это понятно, мой HTTP сервер на это не заточен. Но ведь FTP то должен работать?
Ведь и ядро и initrd.img только что скачаны по tftp с tftpboot

Вот так должно работать, но не работает
wget ftp://10.0.0.1:69/rootfs.min.tar.gz -O /tmp/rootfs/rootfs.min.tar.gz

Если без порта 69, то ломится на 21 порт и выдает ошибку соединения
Если с портом 69, то тоже выдает ошибку что не удалось соединиться

попытался заменить wget на tftp и ftp клиенты методом, который предварительно проверил

echo "get rootfs.min.tar.gz"|tftp 10.0.1.1

Выдает ошибку, что не найден tftp, также как и ftp клиент.
Если удасться их внедрить в initramfs но получу опять ошибку соединения, то значит придется решать неявную проблему с configure_networking
Если же они заработают, то вся задача будет решена.

Возникает вопрос какие вообще команды/утилиты доступны внутри initramfs на этапе исполнения скрипта ram?
Что такое "модуль" initramfs и какие программные пакеты он в себя включает? Как узнать на пассивной системе какие модули добавлены и какие пакеты в этих модулях. Как туда дотавить нужные пакеты? Где об этом подробно написано? В манах искал, ничего не нашел.

К примеру, грузится модуль netboot - что там есть, как добавить туда tar, tftp, и т.д. ?






Сейчас такая проблема.

1. Если оставить в скрипте

Пользователь добавил сообщение 14 Октября 2018, 19:54:00:
Мда... перебрав все варианты, вернулся к исправлению configure_networking

Эта функция останавливается с ошибками
ipconfig: no devices to configure
Kernel panic

Т.е. эта падла тупо не видит сетевых устройств.  >:(

Если с эталонного диска загрузиться, с которого я образ rootfs делаю, то всё работает, правда сеть долго конфигурируется.

Похоже это ошибка в дистрибутиве Linux, т.к. в интернете многие спрашивают об этом и единственное решение - изменить код этой функции и профиксить что-то в системе.

Что изменить и как именно профиксить не ясно. Я разное пробовал, не получилось.

Народ! Тут вообще спецы есть или я не по адресу зашел?
« Последнее редактирование: 14 Октября 2018, 19:54:00 от Nick2018 »

 

Страница сгенерирована за 0.024 секунд. Запросов: 20.