Я настроил 2 виртуальные машины с virtualbox:
- 1-й (именуемый сервер после этого) действует как сервер dhcp (isc-dhcp-server) и tftp (atftpd)
- другой (названный "клиент" после этого) как бездисковый компьютер.
Процесс загрузки клиента начинается с 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.