LINUX.ORG.RU

Не инициализируются устройства при сетевой загрузке Ubuntu ... initrd.img

 , ,


0

1

Сетевую загрузку пилил следующим диким способом. Извиняюсь за длинный текст, но так будет ближе к делу. Если нужна дополнительная информация, спрашивайте.

Если есть совсем другой способ, буду благодарен за подробную инструкцию. Однако, пробовал через debootstrap и chroot на i386 системе - не получилось.

В итоге запилил следующее.

0) Клиентская бездисковая машина - сервер на базе Intel Xeon E5

1) Установил минимальный Ubuntu 14.04.5 LTS Server amd64 с загрузочной флэшки и репозитория в интернете. Затем настроил свои скрипты и прикладной софт. Проверил - работает, идет мониторинг этой машины на удаленном zabbix-сервере.

2) Отредактировал /etc/initramfs-tools/initramfs.conf

BOOT=ram

3) Добавил скрипт ram, как рекомендовано здесь но с изменениями, подробно описанными здесь там поэтапно описаны мемуары моей борьбы, есть вопросы но нет ответов

4) На работающей системе создал initrd.img для сетевой загрузки

mkinitramfs -o /home/user1/initrd.img

5) Выключил клиентскую машину, отсоединил диск, примонтировал на рабочей машине, почистил ненужное и упаковал целиком, вместе с директорией boot.

find . -print0 | cpio --null -ov --format=newc | gzip -9 > /путь с архиву/rootfs.cpio.gz
6) Скопировал всё на третью машинуу в каталог /../../tftpboot - это PXE-сервер на базе старой писишки. Забегая вперёд, поскольку родное ядро категорически не хотело грузиться, заимствовал ядро linux из сетевой сборки netboot.tar.gz. Остальное не знаю как применить, не пригодилось.

Получилось следующее

/../../tftpboot/
pxelinux.cfg/
             default
initrd.img
linux
pxelinux.0
rootfs.cpio.gz

файл default настроен так

timeout 0
default default
label default
    kernel linux
    append initrd=initrd.img boot=ram rooturl=ftp://10.0.1.1/rootfs.cpio.gz
7) Настроил DHCP и TFTP на основе dnsmasq

8) Включаю целевую бездисковую машину,

стартует получение IP по DHCP, получен IP, загружены pxelinux.0 linux initrd.img стартовал скрипт ram но остановился на строке configure_networking, с ошибкой

ipconfig: no devices to confugure
/init: .: line 222: can't open 'run/net-*.conf'
Kernel panic - not syncing: Attempted to kill init! exitcode=0x00000200
...

содержимое этого скрипта-ram с отладочным кодом и неудачными попытками

retry_nr=0

do_rammount()
{

log_begin_msg "configure_networking"

# Вешается внутри этой функции
    configure_networking

    E=$?
    #if [ $E ]; then
	log_begin_msg "ERROR=$E"
    #fi
log_end_msg

    /bin/sleep 30

log_begin_msg "mkdir -p /tmp/rootfs"
    mkdir -p /tmp/rootfs
log_end_msg

    cd /tmp/rootfs
      IP=`echo "${rooturl}"|sed -e 's/^[^0-9.]*\([0-9.]*\)\/\(.*\)$/\1/'`
    FILE=`echo "${rooturl}"|sed -e 's/^[^0-9.]*\([0-9.]*\)\/\(.*\)$/\2/'`
#Это осталось от попыток качать образ tftp и ftp клиентами, которых не нашлось. Но до закачки всё равно пока не доходит из-за отсутствия устройств.

log_begin_msg "wget ftp://$IP:69/$FILE -O /tmp/rootfs/$FILE"
    wget ftp://$IP:69/$FILE -O /tmp/rootfs/$FILE
log_end_msg

#log_begin_msg "echo get "$FILE"|ftp "$IP
#    echo "get $FILE"|ftp $IP
#log_end_msg

log_begin_msg "mkdir -p ${rootmnt}"
    mkdir -p ${rootmnt}
log_end_msg

log_begin_msg "mount -t tmpfs -o size=6G none ${rootmnt}"
    mount -t tmpfs -o size=6G none ${rootmnt}
log_end_msg

log_begin_msg "gzip -dc /tmp/rootfs/rootfs.cpio.gz|cpio -idm -"
    cd ${rootmnt}
    gzip -dc /tmp/rootfs/rootfs.cpio.gz|cpio -im -
log_end_msg
}

# Это основная функция
mountroot(){

log_begin_msg "for x in $(cat /proc/cmdline); do"
    for x in $(cat /proc/cmdline); do
	case $x in
	rooturl=*)
		export rooturl=${x#rooturl=}
		;;
	esac
    done
log_end_msg

    /bin/sleep 10

# Это я добавил просто так, т.к. ничего не получалось
log_begin_msg "load_modules"
    load_modules
log_end_msg

    /bin/sleep 10

log_begin_msg "wait_for_udev 10"
    wait_for_udev 30
log_end_msg

    /bin/sleep 10

log_begin_msg "delay=${ROOTDELAY:-180}"
    delay=${ROOTDELAY:-180}
log_end_msg

    /bin/sleep 10

# Этот блок не решает проблему. Устройств как не было , так и не появляются
log_begin_msg "modprobe af_packet;ifdown*;modprobe e1000e;ifup*"
    modprobe af_packet
    ifdown eth3;ifdown eth2;ifdown eth1;ifdown eth0
    #rmmod e1000e; modprobe -r e1000e;
    modprobe e1000e
    ifup eth0; ifup eth1; ifup eth2; ifup eth3
    ls /sys/class/net
log_end_msg

    /bin/sleep 10

# Это тоже добавлено просто так, может поможет, не помогло
log_begin_msg "resolve_device /dev/eth0"
    resolve_device /dev/eth0
log_end_msg

    /bin/sleep 10

log_begin_msg "do_rammount"
    # Досюда доходит, но далее оно повиснет
    do_rammount
log_end_msg

# Досюда и до цикла не доходит

    /bin/sleep 1

log_begin_msg "while [ ${retry_nr} -lt ${delay} ] && [ ! -e ${rootmnt}${init} ]; do"
    while [ ${retry_nr} -lt ${delay} ] && [ ! -e ${rootmnt}${init} ]; do
	/bin/sleep 3
	log_begin_msg "do_rammount"
	    do_rammount
	log_end_msg
	retry_nr=$(( ${retry_nr} + 1 ))
    done
log_end_msg
}

Ответ на: комментарий от MariaRTI
/boot|⇒ busybox cpio -t -F intel-ucode.img
kernel/x86/microcode/GenuineIntel.bin
3413 blocks
/boot|⇒ y -Qo intel-ucode.img
/boot/intel-ucode.img is owned by intel-ucode 20180807.a-1
/boot|⇒ y -Qi intel-ucode | grep Description
Description     : Microcode update files for Intel CPUs

если других initrd или initramfs рядом с этим файлом не наблюдается не наблюдается, возможно ядро само монтирует rootfs.

не проще посмотреть уже /proc/cmdline ? может быть там что-то вроде

/boot|⇒ cat /proc/cmdline
\\boot\vmlinuz-linux ro root=UUID=3dd381ba-5d99-408b-8b6e-f1981ac9c972 quiet elevator=noop initrd=/boot/intel-ucode.img initrd=/boot/initramfs-linux.img

dhampire ★★★
()
Ответ на: комментарий от dhampire

Мне кажется, что эта проблема возникает только у последнего билда. Таким образом разработчики закрывают упрощенный доступ к структуре initrd и стимулируют на переход на новую версию.

Если вы работаете со старым билдом, а текущая версия уже завершена, то если сделать apt-get dist-upgrade, то ваша система обновится до последнего билда, в котором initrd закрыт этим микрокодом. Ядро последнего билда также заточено на распаковку с учетом этого микрокода, поэтому простое отрезание его приведет к неисправному initrd. Я попробовал уже. Грузится, но зависает с ошибками. Замена ядра также не лучший вариант.

В общем, никогда не делайте dist-upgrade на завершеной версии и не пользуйтесь последним билдом, если хотите работать с initrd...

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

На некоторых моих компах стоят такие. Они были установлены, когда текущей версией была 16, незавершенная. Но откуда они были взяты я уже не помню.

Сейчас у меня есть выход - использовать дистрибутив Ubuntu 14.04.5 билд 31, который у меня есть. Но в этой версии есть проблемы с сетью.

MariaRTI
() автор топика
Ответ на: комментарий от dhampire

Нет. Просто initrd состоит из двух блоков. При распаковке виден только первый - c микрокодом, а второй - gzip-архив идет после него. Можно достать при помощи dd.

MariaRTI
() автор топика
Ответ на: комментарий от MariaRTI

Я ошибся. Новая система упаковки используется также в Ubuntu 18, во всех промежуточных билдах, которые я смотрел. Прям зараза какая-то.

MariaRTI
() автор топика
Ответ на: комментарий от Deleted

А Вы обратили внимание, что в initrd с некоторых пор стал странный размер файлов? Например, в каталоге bin большинство файлов 331792 байта. И это, в частности, может влиять на размер образа, да и вообще не аккуратненько. Те-же самые файлы в корневой ФС имеют совсем другой размер. Смотрел в нескольких версиях.

MariaRTI
() автор топика
Ответ на: комментарий от MariaRTI

А также в initrd (Ubuntu 16 и выше) до безобразия много бинарников

MariaRTI
() автор топика
Ответ на: комментарий от MariaRTI

Например, в каталоге bin большинство файлов 331792 байта.

Обратил, конечно же. Только они это все должны быть симлинками на busybox, а unmkinitramfs, очевидно, не поддерживает генерацию симлинков.

Deleted
()
Ответ на: комментарий от Deleted

Есть идеи как правильно распаковать? Можно на исходной машине в домашнюю директорию.

Была мысль просто перезаписать все бинарники, взяв их из корневой файловой системы, но если они должны быть симлинками, то это только увеличит размер initrd.img

MariaRTI
() автор топика
Ответ на: комментарий от MariaRTI

Опа.. получилось. Для этого нужно запретить busybox в конфиге

MariaRTI
() автор топика
Ответ на: комментарий от Deleted

При включении клиента на экран сначала трижды выводится сообщение

Initializing Intel(R) Boot Agent
PXE 2.1 Build 092 (WfM 2.0)

На это тратится время. Затем логотип. Затем начинаются опросы сетевых карт. Раньше на этом тоже время терялось, но когда подключился к первой по счету, то DHCP и PXE пошел с первого опроса.

Что фактически означают первые сообщения, можно ли сократить время и грузиться начиная с них?

Если возможно, но нужно настраивать bios, то я могу установить нужные настройки в дефолтной прошивке bios. Мои серверы грузятся из дефолтного состояния bios. Такие уж условия.

MariaRTI
() автор топика
Ответ на: комментарий от MariaRTI

При включении клиента на экран сначала трижды выводится сообщение

3 сетевых карты, на каждой инициализируется PXE ROM. Если PXE используется только на первой карте, то разумно на остальных выключить.

Deleted
()
Ответ на: комментарий от MariaRTI

Если возможно, но нужно настраивать bios, то я могу установить нужные настройки в дефолтной прошивке bios. Мои серверы грузятся из дефолтного состояния bios. Такие уж условия.

Для каждого производителя есть свои способы настраивать биос через команды.

Например, так: https://serverfault.com/questions/301413/change-bios-settings-on-supermicro-s...

Deleted
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.