web-dev-qa-db-ja.com

複数のネットワークインターフェイスがある場合、Linuxはpxeでフリーズします

Virtualboxで2台の仮想マシンをセットアップしました:

  1. 1番目(この名前のサーバー)は、dhcp(isc-dhcp-server)およびtftp(atftpd)サーバーとして機能します。
  2. もう1つ(この名前は「クライアント」と呼ばれます)はディスクレスコンピューターです。

クライアントのブートプロセスはsyslinuxで始まり、syslinuxは引数initrd=ram_test.img nfsroot=10.0.0.1:/srv/nfsroot/stretch,rw ip=dhcp rwを渡すLinuxカーネルをロードします。

コンピューターは64ビットコンピューターとして定義されており、サーバーはDebian安定版で起動し、クライアントには起動用のDebian安定版も提供されます。

クライアントのネットワークインターフェイスが1つしかない場合(内部ネットワーク、「インテルプロ/ 100MTデスクトップ(8254OEM)」カードタイプ)は問題ありませんが、同じタイプでMACアドレスが異なる別のカードを追加するとすぐに問題が発生します。 LinuxがDHCPアドレスをフェッチしようとするまでは問題ありません。

その時点で、システムは「ランダム:高速初期化完了」というフレーズでフリーズします。この前に私が見ることができ、おそらくもっと興味深い他のことは次のとおりです。

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秒後、「ランダム:crnginitdone」のみが表示されます。

これが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";
}

物事を機能させるには(少なくとも1つのインターフェイスのみで)、ファイル/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に起因すると思いますが、失敗している正確なポイントを見つけることができず、Webの検索も失敗しました。

これをすべて書いているときに、DEVICE=eth0の行initramfs.confに気づき、これである可能性があると思いましたが、linux-kernelパラメーターを変更してnet.ifnames=0 biosdevname=0を追加しようとしました。カーネルは古いeth0/eth1名を使用しますが、動作は同じです(もちろん、ログ内の名前がenpXsYではなくethZであることを除いて)。

そのVM)に2つのネットワークインターフェイスがあることのポイントは、そのシステムが2つのネットワークインターフェイスを持つハードウェアにシステムを(cdebootstrapと手動スクリプトを介して)展開することを目的としているためです。実際に試してみる機会がありましたが、問題もあると思いますので(なぜそうならないのか)、ここで意見を述べたいと思います。

ありがとう、そしてWoTをお詫びします。

2
user3459474

pxelinuxcfgファイルのappend行の後に、オプションを追加します。

ipappend 2

これにより、起動カーネルはPXE起動NICを使用してDHCPトランザクションを実行するようになります。

1
Pat

だから、ここにそれの長短があります...

PXEディスクレスクライアントを起動するときに、そのクライアントに複数のネットワークインターフェイスがある場合、カーネルがクラッシュしてカーネルパニックになるか、IP-Configがハングする可能性があります。

これが発生する理由は、IP-Configにバグがあり、誰もそれを修正する気がないためです。基本的に、IP-ConfigはDHCPサーバーにすばやく繰り返しヒットします。そのため、DHCPは、IP-Configが2回目(または3回目)にヒットしたときに応答しません。したがって、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に1つのNICインターフェイスからのみクエリを実行し、すべてのインターフェイスからはクエリを実行しないようにします。1つのインターフェイスのみを使用するように強制するには、「network ksdevice = bootif BOOTIF = $ {」を使用します。 iPXEでは「netX/mac}」であり、通常のPXEでは「IPAPPEND2」を使用します。上記のように正確に記述してください。

それでおしまい! 2つの簡単なステップとあなたはあなたの道にいるでしょう。

BOOTIFは、PXEがロードされたプライマリインターフェイスのみを使用するようにPXEに強制します。他のすべてのインターフェースは無視されます。 IPAPPENDはまったく同じことをします。

0
Qchan