LINUX.ORG.RU
ФорумAdmin

PXE boot - не присваивается IP


0

0

Пытаюсь настроить загрузку с PXE,
http://www.faqs.org/docs/Linux-mini/NFS-Root.html
Загружается ядро и initramfs, находится сетевая карта, но не находится корневая файловая система.
Драйвер карты вкомпилирован в ядро, и карта обнаруживается, но
если я выхожу в shell, то вижу, что ifconfig eth0 говорит, что нет сетевого адреса у карты

# grep IP_PNP .config
CONFIG_IP_PNP=y
CONFIG_IP_PNP_DHCP=y
# CONFIG_IP_PNP_BOOTP is not set
# CONFIG_IP_PNP_RARP is not set

cat /var/tftp/pxelinux.cfg

DEFAULT boot/kernel
APPEND ip=dhcp nfsroot=192.168.9.220:/var/tftp/preinstall
#пробовал добавлять root=nfs
#пробовал добавлять root=/dev/nfs
#пробовал вписывать конкретный ip=<client-IP-number>::<gateway-IP-number>:<netmask>:<client-hostname>:eth0:off
APPEND initrd=boot/initramfs

# grep NFS .config
CONFIG_NFS_FS=y
CONFIG_NFS_V3=y
CONFIG_NFS_V3_ACL=y
# CONFIG_NFS_V4 is not set
CONFIG_ROOT_NFS=y
CONFIG_NFSD=y
CONFIG_NFSD_V3=y
# CONFIG_NFSD_V3_ACL is not set
# CONFIG_NFSD_V4 is not set
CONFIG_NFS_ACL_SUPPORT=y
CONFIG_NFS_COMMON=y

Ядро собираю при помощи genkernel --no-clean --mdadm --lvm --disklabel --symlink all
--netboot не добавляю, потому что насколько я понял - это для загрузки с iso-образов дисков

Куда копать?

Ответ на: комментарий от ArsenShnurkov

Вообще говоря, для этого включена опция CONFIG_IP_PNP_DHCP=y

Поиск по $KERNEL_SRC/Documentation показал, что для получения IP по DHCP надо передать ядру параметр ip=dhcp. Как именно это сделать я не знаю, т.к. никогда подобное не настраивал.

+ см. $KERNEL_SRC/Documentation/kernel-parameters.txt, $KERNEL_SRC/Documentation/filesystems/nfsroot.txt

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

Нормально это разжевать до минимальных понятий и всё такое? Это не линуксфорум и не форум убунты. Тут скажут куда копать, минимальное умственное усилие приложить придётся.

Я с этой темой знаком слабо. В tinycore, загрузку которого я обустроил по сети, dhclient вызывается в загрузочных скриптах внутри initrd.

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

для получения IP по DHCP надо передать ядру параметр ip=dhcp


Он добавлен, в начальном сообщении см. строчку
APPEND ip=dhcp nfsroot=192.168.9.220:/var/tftp/preinstall

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

Он добавлен, в начальном сообщении см. строчку

Извиняюсь, не заметил.

А ты пробовал прописать статический IP-адрес, «в обход» DHCP?

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

А ты пробовал прописать статический IP-адрес


Да, пробовал, в начальном сообщении см. строчки
#пробовал добавлять root=/dev/nfs
#пробовал вписывать конкретный ip

так же пробовал это делать одновременно

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

Это не линуксфорум и не форум убунты.


А мне кажется, что основная причина такая:

Я с этой темой знаком слабо.

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

в начальном сообщении см. строчки

Блин, я похоже ещё не до конца проснулся...

А может попробовать собрать ядро полностью монолитно и без initramfs-образа? А то возможно какие-то скрипты оттуда сбрасывают настройки сети. Или сделать наоборот - заставить скрипты из initramfs запускать dhcp-клиент и выкинуть поддержку DHCP из ядра.

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

В общем, текущее состояние:
- без initramfs загружается, если строчка такая:
APPEND root=/dev/nfs ip=dhcp nfsroot=192.168.9.220:/var/tftp/preinstall,tcp rw

этот параметр rw нужен потому что без него не будет запускаться /etc/init.d/rpc.statd (потому что не сможет записать временный файл),
а если rpc.statd не запустится, то nfs-папка не сможет перемонтироваться с доступом на запись ( http://bugs.gentoo.org/198601#c7 )

- если надо запускать с initramfs, то мне пока не удалось.
Использую строчки

APPEND ip=dhcp nfsroot=192.168.9.220:/var/tftp/preinstall,tcp rw
APPEND initrd=boot/initramfs init=/linuxrc root=/dev/ram0
APPEND real_root=/dev/nfs


в процессе загрузки запускается udhcpc (v1.7.4)
и говорит, что

bad_msg "The DHCP Server did not send a valid root-path."
bad_msg "Please check your DHCP setup, or provide a nfsroot=<...> parameter."


На самом деле, root-path задан на dhcp сервере:
option root-path «192.168.9.220:/var/tftp/preinstall»;
кроме того, я вижу в wireshark, что он реально отдается по запросу:
Option: (t=17,l=34) Root Path = «192.168.9.220:/var/tftp/preinstall»

11 22 31 39 32 2e 31 36 38 2e 39 2e 32 32 30 3a  ."192.168.9.220:
2f 76 61 72 2f 74 66 74 70 2f 70 72 65 69 6e 73  /var/tftp/preins
74 61 6c 6c                                      tall

это не говоря о том, что прописан параметр ядра

Пока больше идей нет.

ArsenShnurkov ()

Ну зачем так делать? Тебе ж написали - сделай свой инитрд, там и монтируй. Эти все монтирования nfs из ядра - седая неподдерживаямая древность, которую написали до появления initrd. Ну не задача это ядра монтировать загадочные файловые системы. Ты б еще с cryptfs поверх obexfs попытался загрузиться через ядро.

vga ★★ ()

1. взять любой минидистрибутив, в котором PXE из-коробки

2. посмотреть конфиги

3. поблагодарить анонимуса

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

сделай свой инитрд, там и монтируй.


Обрати внимание, что в предыдушем сообщении перед твоим ответом написано, что из ядра монтируется нормально. Не монтируется как раз из инитрд.

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

2. посмотреть конфиги

3. поблагодарить анонимуса


Не за что его благодарить. Если бы он конкретно для gentoo сказал - было бы. А смотрение конфигов требует особых уличных скриптописательских навыков.

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

Ты думаешь, я другой тред весь читал? :-) Ну теперь я почитал твой тред, воспользовался http://www.google.com/codesearch

оказалось, строки, которые ты кидал - это ваши гентушные строки

                       if [ "${NFSIP}" != '' ] && [ "$NFSPATH" != '' ]
                        then
                                NFSROOT="${NFSIP}:${NFSPATH}"
                        else
                                bad_msg "The DHCP Server did not send a valid root-path."
                                bad_msg "Please check your DHCP setup, or provide a nfsroot=<...> parameter."
                        fi 

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

Профит.

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

А конструктивно, в качестве такого дистра я использовал debian-live. Правда не через nfs, а через http+squash, но вполне успешно.

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

А насчет того треда - сходи и поправься, вместо linux напиши gentoo, потому linux к твоим проблемам не имеет никакого отношения.

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

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

ZOMG.

Добавляем ключик -x в самую первую строку в файле, что стало что-то вроде #!/bin/sh -x

И смотрим логи.

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

В настоящий момент у меня получилось загрузиться с initramfs.


Объединил все строки APPEND в одну в меню syslinux,
возможно дело было в этом.


В итоге pxelinux.cfg/default выглядит так:

DEFAULT menu.c32 

LABEL kernelboot
MENU LABEL Linux PXE boot using kernel
KERNEL boot/kernel
APPEND root=/dev/nfs ip=dhcp nfsroot=192.168.9.220:/var/tftp/preinstall rw

LABEL initramfs
MENU LABEL Linux with initramfs
KERNEL boot/kernel
APPEND initrd=boot/initramfs root=/dev/ram0 init=/linuxrc real_root=/dev/nfs ip=dhcp nfsroot=192.168.9.220:/var/tftp/preinstall rw

Однако загрузка происходит не всегда.
Осталось два типа глюков:
1) иногда возникает такая ошибка:
rpcbind: server 192.168.9.220 not responding, timed out
Root-NFS: Unable to get nfsd port number from server, using default
...
Root-NFS: Unable to get mountd port number from server, using default
...
Root-NFS: Server returned error -5 while mounting /var/tftp/preinstall


2) загрузка по PXE работает для физической машины и не работает для виртуальной (виртуальная просто не видит DHCP сервер и не грузит syslinux)

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

На сервере:
net-misc/dhcp-3.1.2_p1
net-ftp/tftp-hpa-5.0
net-fs/nfs-utils-1.1.4-r1

На клиенте:
sys-boot/syslinux-3.71
sys-kernel/gentoo-sources-2.6.32
sys-kernel/genkernel-3.4.10.907
sys-apps/sysvinit-2.87-r3
sys-apps/openrc-0.6.0
sys-apps/baselayout-2.0.1

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

> 2) загрузка по PXE работает для физической машины и не работает для виртуальной (виртуальная просто не видит DHCP сервер и не грузит syslinux)

Так настрой сеть в виртуальной машине.

Скрипты для рамфс лежат здесь: /usr/share/genkernel

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

Скрипты для рамфс лежат здесь: /usr/share/genkernel



Зачем они нужны?

Запускаю серверную виртуальную машину так:
start-stop-daemon --start --quiet --pidfile «» --exec /usr/bin/screen — -dmS «dhcp_tftp_nfs» /bin/bash -c «/usr/bin/kvm -monitor tcp:192.168.9.194:9219,server,nowait -pidfile /var/run/kvm-dhcp_tftp_nfs.pid -m 2048 -smp 3 -vnc 192.168.9.194:5 -usb -usbdevice tablet -name dhcp_tftp_nfs -boot c -hda /mnt/store2T/VirtKVM/dhcp_tftp_nfs/disk.qcow2 -net nic,macaddr=52:54:00:12:17:05,vlan=0 -net tap,ifname=tap_dtn0,vlan=0,script=/etc/kvm/kvm-ifup-br3,downscript=/etc/kvm/kvm-ifdown-br3»

Запускаю клиентскую виртуальную машину так:
start-stop-daemon --start --quiet --pidfile «» --exec /usr/bin/screen — -dmS «diskless» /bin/bash -c «/usr/bin/kvm -monitor tcp:192.168.9.194:9264,server,nowait -pidfile /var/run/kvm-diskless.pid -m 512 -smp 3 -vnc 192.168.9.194:6 -usb -usbdevice tablet -name diskless -boot n -net nic,macaddr=52:54:00:12:77:06,vlan=0 -net tap,ifname=tap_diskless0,vlan=0,script=/etc/kvm/kvm-ifup-br3,downscript=/etc/kvm/kvm-ifdown-br3»

MAC адреса у этих машин разные, они добавляются в бридж:

# brctl show
bridge name	bridge id		STP enabled	interfaces
br3		8000.0016e3a5167e	no		eth1
							tap_diskless0
							tap_dtn0


Почему не грузится - мне не ясно. Пробовал менять номер виртуальной сети на клиентской машине - не помогает.

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

Почему не грузится - мне не ясно.



Причем, после выполнения

# socat - tcp:192.168.9.194:9264           
QEMU 0.12.1 monitor - type 'help' for more information
(qemu) system_reset
system_reset

грузится нормально

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

> > Скрипты для рамфс лежат здесь: /usr/share/genkernel

Зачем они нужны?

Если я правильно понял, ты строшь ramfs стандартными гентовскими средствами и, в итоге, в образ rams попадают скрипты из этой дирки.

Зачем они нужны? У тебя в одном случае был косяк с получением адреса. Для исправления тебе нужно отредактировать эти самые скрипты и включить «отладку», т.е. добавить ключик -x. Я уже писал об этом. Что сложного? Посмотришь, где падает, и пофиксишь.

C VM - запусти две оси и попробуй «погонять» udp/dhcp между ними.

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