после append
строки в вашем файле pxelinux cfg добавьте опцию:
ipappend 2
Это скажет загрузочному ядру выполнить транзакцию DHCP с помощью загрузочной сетевой карты PXE.
Я настроил 2 виртуальные машины с virtualbox: первая (именуемая сервером после этого) действует как dhcp (isc-dhcp-server) и tftp (atftpd), другая (именуемая в дальнейшем «client») как бездисковый компьютер ,
Процесс загрузки клиента начинается с 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 msgstr "так что ядро использует старые имена eth0 / eth1, но поведение идентично (за исключением, конечно, что имена в журналах больше не являются enpXsY, а ethZ).
Смысл наличия двух сетевых интерфейсов в этой виртуальной машине состоит в том, что эта система предназначена для развертывания систем (с помощью уже работающих cdebootstrap и ручных сценариев) на оборудовании, которое имеет два сетевых интерфейса. У меня не было возможности попробовать это в реальной ситуации, но я убежден, что проблема будет и там (почему бы и нет?), Поэтому я действительно хотел бы иметь некоторые мнения здесь.
Спасибо и извините за WoT.
после append
строки в вашем файле pxelinux cfg добавьте опцию:
ipappend 2
Это скажет загрузочному ядру выполнить транзакцию DHCP с помощью загрузочной сетевой карты PXE.
Итак, вот журнал и если не считать его ...
При загрузке бездискового клиента PXE, если этот клиент имеет несколько сетевых интерфейсов, ядро может либо привести к панике ядра, либо зависнет IP-Config.
Причина этого заключается в том, что в IP-Config есть ошибка, и никто не хочет ее исправлять. По сути, IP-Config слишком быстро и многократно воздействует на DHCP-сервер. Из-за этого DHCP не отвечает второй (или третий) раз, когда IP-Config достигает его. Поэтому IP-Config не может разрешить DHCP, и без IP-адреса невозможно установить корневой каталог, а затем происходит сбой ядра.
Обходной путь - это (если вы используете iPXE):
kernel $ vmlinuz-4.4.0-43-generic boot = nfs netboot = nfs тихая всплеск паники = 30 nfsroot = 10.0.0.1 / корневая сеть ksdevice = bootif BOOTIF = $ ip = $ { не ф}: 192.168.1.1: 192.168.1.1: 255.255.255.0 ::: никто
initrd $ 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 ::: никто
Я не ожидаю, что ваши записи будут выглядеть именно так. Это всего лишь примеры . Итак, отредактируйте свой соответственно.
1) Вам необходимо установить статический IP-адрес непосредственно в параметрах ядра (или в приложении). Если вы этого не сделаете, IP-Config попытается запустить DHCP, а вы этого не хотите .
2) Вы хотите заставить PXE запрашивать только у одного интерфейса NIC, а не у всех. Чтобы заставить его использовать только один интерфейс, вы используете «network ksdevice = bootif BOOTIF = $ » в iPXE и используете «IPAPPEND 2» в обычном PXE. Напишите это точно так, как показано выше.
Это оно! Два простых шага и вы уже в пути.
BOOTIF заставляет PXE использовать только основной интерфейс, на который был загружен PXE. Он будет игнорировать все остальные интерфейсы. IPAPPEND делает то же самое.