linux congelar com pxe quando houver mais de uma interface de rede

2

Eu configurei 2 máquinas virtuais com o virtualbox: o primeiro (servidor nomeado depois disso) um atua como servidor dhcp (isc-dhcp-server) e tftp (atftpd), o outro (chamado "cliente" depois disso) como um computador sem disco.

O processo de inicialização para o cliente começa com o syslinux, que carrega um kernel do Linux passando os argumentos "initrd = ram_test.img nfsroot = 10.0.0.1: / srv / nfsroot / stretch, rw ip = dhcp rw".

Os computadores são definidos como 64bit, o servidor inicializa em um Debian estável e o cliente tem um Debian estável para inicializar também.

Não há problemas quando o cliente tem apenas 1 interface de rede (rede interna, tipo de placa "intel pro / 100MT Desktop (8254OEM)"), mas assim que eu adiciono outro do mesmo tipo, com um endereço MAC diferente , as coisas vão bem até o Linux tentar buscar o endereço DHCP.

Nesse ponto, o sistema congela a frase "random: fast init done". As outras coisas que posso ver antes disso, e provavelmente mais interessantes, são:

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

Após o congelamento, 323 segundos depois, há apenas "random: crng init done".

Aqui está o 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"; }

Para fazer as coisas funcionarem (pelo menos, com apenas 1 interface), eu tive que modificar o arquivo /srv/nfsroot/stretch/etc/initramfs-tools/initramfs.conf para ficar assim (comentários e linhas vazias removidas) :

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

Eu acho que o problema vem dos argumentos fornecidos ao kernel na configuração do syslinux, ou o initramfs.conf, mas não consigo encontrar o ponto exato em que estou falhando, e pesquisar na web também não teve sucesso.

Enquanto escrevia tudo isso, notei a linha "DEVICE = eth0" no initramfs.conf, e pensei que poderia ser isso, mas eu apenas tentei alterar os parâmetros do kernel linux para adicioná-lo "net.ifnames = 0 biosdevname = 0 "para que o kernel use os nomes antigos eth0 / eth1, mas o comportamento é idêntico (exceto, é claro, que os nomes nos logs não são mais enpXsY mas ethZ).

O ponto de ter duas interfaces de rede nessa VM é porque o sistema destina-se a implantar sistemas (através do cdebootstrap e de scripts manuais, já funcionando) em hardware que possui duas interfaces de rede. Eu não tive a oportunidade de tentar isso em uma situação real, mas estou convencido de que o problema também estará lá (por que não?), Então eu realmente gostaria de ter algumas opiniões aqui.

Obrigado, e desculpe pelo WoT.

    
por user3459474 03.05.2018 / 14:18

2 respostas

1

após a linha append em seu arquivo pxelinux cfg, adicione a opção:

ipappend 2

Isso dirá ao kernel de inicialização para executar a transação DHCP usando o NIC de inicialização PXE

    
por 03.05.2018 / 15:01
0

Então, aqui está o log e o mais curto ...

Ao inicializar um cliente sem disco PXE, se esse cliente tiver várias interfaces de rede, o kernel pode travar em um kernel panic ou o IP-Config irá travar.

A razão pela qual isso acontece é porque há um bug no IP-Config e ninguém realmente se importa em consertá-lo. Essencialmente, o IP-Config está atingindo o servidor DHCP muito rapidamente e repetidamente. Por causa disso, o DHCP não responde a segunda (ou terceira) vez que o IP-Config o atinge. Portanto, o IP-Config não consegue resolver um DHCP e sem um IP, o diretório raiz não pode ser configurado e, em seguida, o kernel trava.

O trabalho é o seguinte (se você estiver usando o iPXE):

kernel $ {base-url} vmlinuz-4.4.0-43-genérico boot = nfs netboot = nfs quiet splash pânico = 30 nfsroot = 10.0.0.1 / rede de raiz ksdevice = bootif BOOTIF = $ {netX / mac} ip = $ {ip}: 192.168.1.1: 192.168.1.1: 255.255.255.0 ::: nenhum

initrd $ {base-url} initrd.img-4.4.0-43-genérico

Se você estiver usando o PXE normal:

KERNEL vmlinuz-4.4.0-43-generic

IPAPPEND 2

APPEND vga = 794 boot = nfs root = / dev / nfs initrd = initrd.img-4.4.0-43-genérico pânico de splash silencioso = 30 - nfsroot = 192.168.1.1: / root ip = 192.168.1.2: 192.168.1.1:192.168.1.1:255.255.255.0 ::: nenhum

Não espero que suas entradas sejam exatamente assim. Estes são apenas exemplos . Então, edite o seu de acordo.

1) Você precisa definir um endereço IP estático diretamente nos parâmetros do kernel (ou no append). Se você não fizer isso, o IP-Config tentará executar o DHCP e você não deseja isso .

2) Você quer forçar o PXE a consultar somente a partir de uma interface NIC e não de todas elas. Para forçá-lo a usar apenas uma interface, use "ksdevice = bootif BOOTIF = $ {netX / mac}" no iPXE e use "IPAPPEND 2" no PXE normal. Escreva exatamente como mostrado acima.

É isso! Dois passos fáceis e você estará a caminho.

O BOOTIF força o PXE a usar somente a interface principal na qual o PXE foi carregado. Isso vai ignorar todas as outras interfaces. O IPAPPEND faz exatamente o mesmo.

    
por 15.10.2018 / 05:57