2

Я настроил 2 виртуальные машины с virtualbox:

  1. 1-й (именуемый сервер после этого) действует как сервер dhcp (isc-dhcp-server) и tftp (atftpd)
  2. другой (названный "клиент" после этого) как бездисковый компьютер.

Процесс загрузки клиента начинается с syslinux, который загружает ядро linux, передавая ему аргументы initrd=ram_test.img nfsroot=10.0.0.1:/srv/nfsroot/stretch,rw ip=dhcp rw .

Компьютеры определены как 64-битные, сервер загружается на стабильной версии Debian, и клиенту также предоставляется стабильная версия Debian для загрузки.

Нет проблем, когда у клиента есть только 1 сетевой интерфейс (внутренняя сеть, тип карты Intel Pro /100MT Desktop (8254OEM)), но как только я добавляю другой того же типа, с другим MAC-адресом, дела идут хорошо, пока linux не попытается получить адрес DHCP.

В этот момент система останавливается на фразе «random: fast init done». Другие вещи, которые я могу видеть до этого и, возможно, более интересные, это:

e1000: enp0s8 NIC Link is Up 1000 Mbps Full Duplex, Flow Control: RX
e1000: enp0s3 NIC Link is Up 1000 Mbps Full Duplex, Flow Control: RX
IPv6: ADDRCONF(NETDEV_CHANGE): enp0s8: link becomes ready
IPv6: ADDRCONF(NETDEV_CHANGE): enp0s3: link becomes ready
IP-Config: no response after 2 secs - giving up
IP-Config: enp0s3 hardware address 08:00:27:2a:1a:3b mtu 1500 DHCP
IP-Config: enp0s8 hardware address 08:00:27:5f:de:30 mtu 1500 DHCP

После остановки через 323 секунды появляется только «random: crng init done».

Вот файл dhcpd.conf:

allow booting;
allow bootp;
subnet 10.0.0.0 netmask 255.255.255.0 {
  #range: 10.0.0.0xC0/26
  range 10.0.0.192 10.0.0.250;
  option broadcast-address 10.0.0.255;
  option routers 10.0.0.1;
  filename "tftp://10.0.0.1/pxelinux.0";
}

Чтобы все работало (по крайней мере, только с одним интерфейсом), мне пришлось изменить файл /srv/nfsroot/stretch/etc/initramfs-tools/initramfs.conf чтобы он выглядел так (комментарии и пустые строки удалены):

MODULES=netboot
BUSYBOX=auto
KEYMAP=fr
COMPRESS=gzip
DEVICE=eth0
NFSROOT=auto
BOOT=nfs

Я думаю, что проблема связана с аргументами, предоставленными ядру в конфигурации syslinux, или initramfs.conf но я не могу найти точную точку, в которой у меня происходит сбой, и поиск в Интернете также был неудачным.

При написании всего этого я заметил строку DEVICE=eth0 в initramfs.conf и подумал, что это может быть так, но я просто попытался изменить параметры ядра Linux, чтобы добавить его net.ifnames=0 biosdevname=0 чтобы Ядро использует старые имена eth0/eth1, но поведение идентично (за исключением, конечно, что имена в журналах больше не enpXsY, а ethZ).

Смысл наличия двух сетевых интерфейсов в этой виртуальной машине состоит в том, что эта система предназначена для развертывания систем (с помощью уже работающих cdebootstrap и ручных сценариев) на оборудовании, которое имеет два сетевых интерфейса. У меня не было возможности попробовать это в реальной ситуации, но я убежден, что проблема будет и там (почему бы и нет?) так что мне бы очень хотелось иметь здесь несколько мнений.

Спасибо и извините за WoT.

2 ответа2

1

после строки append в вашем файле pxelinux cfg добавьте опцию:

ipappend 2

Это скажет загрузочному ядру выполнить транзакцию DHCP с помощью загрузочной сетевой карты PXE.

0

Итак, вот длинный и короткий из этого ...

При загрузке бездискового клиента PXE, если этот клиент имеет несколько сетевых интерфейсов, ядро может либо привести к панике ядра, либо зависнет IP-Config.

Причина этого заключается в том, что в IP-Config есть ошибка, и никто не хочет ее исправлять. По сути, IP-Config слишком быстро и многократно воздействует на DHCP-сервер. Из-за этого DHCP не отвечает второй (или третий) раз, когда IP-Config достигает его. Поэтому IP-Config не может разрешить DHCP, и без IP-адреса невозможно установить корневой каталог, а затем происходит сбой ядра.

Обходной путь - это (если вы используете iPXE):

kernel ${base-url}vmlinuz-4.4.0-43-generic boot=nfs netboot=nfs quiet splash panic=30 nfsroot=10.0.0.1/root network ksdevice=bootif BOOTIF=${netX/mac} ip=${ip}:192.168.1.1:192.168.1.1:255.255.255.0:::none
initrd ${base-url}initrd.img-4.4.0-43-generic

Если вы используете обычный PXE:

KERNEL vmlinuz-4.4.0-43-generic 
IPAPPEND 2 
APPEND vga=794 boot=nfs root=/dev/nfs initrd=initrd.img-4.4.0-43-generic quiet splash panic=30 -- nfsroot=192.168.1.1:/root ip=192.168.1.2:192.168.1.1:192.168.1.1:255.255.255.0:::none

Я не ожидаю, что ваши записи будут выглядеть именно так. Это всего лишь примеры. Итак, отредактируйте свой соответственно.

1) Вам необходимо установить статический IP-адрес непосредственно в параметрах ядра (или в приложении). Если вы этого не сделаете, IP-Config попытается запустить DHCP, а вы этого не хотите.

2) Вы хотите заставить PXE запрашивать только у одного интерфейса NIC, а не у всех. Чтобы заставить его использовать только один интерфейс, вы используете «network ksdevice = bootif BOOTIF = $ {netX/mac}» в iPXE и используете "IPAPPEND 2" в обычном PXE. Напишите это точно так, как показано выше.

Это оно! Два простых шага и вы уже в пути.

BOOTIF заставляет PXE использовать только основной интерфейс, на который был загружен PXE. Он будет игнорировать все остальные интерфейсы. IPAPPEND делает то же самое.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .