web-dev-qa-db-ja.com

Arch Linux:eth0キャリアなし-ネットワークが起動時に失敗する

問題

私のコンピューターは、dhcpが必要なネットワークに接続されています。したがって、/etc/rc.confのネットワーク構成は次のようになります。

interface=eth0
address=
netmask=
broadcast=
gateway=

私のディーモンは

DAEMONS=(!hwclock syslog-ng network netfs crond ntpd)

この構成では、Archは「ネットワーク」で長時間起動時にハングします(それでも「[完了]」と表示されますが、起動後は接続されません)。私は2つの回避策を見つけました:

回避策1

  • ディーモンからnetworkを削除します
  • 起動後にmii-tool --reset eth0dhcpcd eth0を実行します(これらのコマンドを/etc/rc.localに配置すると、どういうわけか機能しません。

次に、dhcpは非常に高速に動作します(reset!のため)。最初のコマンドを実行する前に、ip link show eth0の出力には「NOCARRIER」が含まれています。その後、そうではありません。 (また、mii-toolは最初に「リンクなし」を示し、その後eth0: 10 Mbit, half duplex, link okを示します。

回避策2

  • ネットワーク構成をに変更します

    interface=eth0
    address=x.y.z.21
    netmask=255.255.255.0
    broadcast=xxx.y.z.255
    gateway=x.y.z.254
    

    一方、x、y、zは、ネットワークの特定のアドレスを構築します(dhcpが使用されますが、静的IPを取得します)。

  • コマンドmii-tool --reset eth0およびdhcpcd eth0/etc/rc.localに追加します

これで、ネットワークは起動時にすぐに起動し(成功したかどうかはわかりませんが)、/etc/rc.localのコマンドが実行され、ログイン後に接続は正常になります。

何をすべきか?

したがって、問題はdhcpcdが「キャリアを求めて」またはsthでスタックしていることのようです。

一部のディーモンはネットワークを必要とするため、回避策は好きではありません(開始しているように見えますが)。起動時にeth0をdhcpの準備をするために何ができますか?それとも別の問題がありますか?

4
user905686

DHCPが必要な場合、DHCPが完了する前に_eth0_を準備することはできません。本当に必要なのは、マシンが起動プロセスを待たずに完了し、ネットワーク構成をバックグラウンドで続行することだと思います。たとえば、これによりすばやくログインでき、通常、ネットワーク構成は必要なときに完了します。これを行うには、initスクリプトにDHCP自体を試行させる代わりに、DHCPを含むネットワーク構成を動的に処理するデーモンを開始させる必要があります。

ネットワークに応じたネットワークサービスの監視に関しては、特定のローカルアドレスではなく_0.0.0.0_にバインドしている場合、通常、ループバックインターフェイス以上を設定する必要はありません。 (デーモンは通常デフォルトでそれを行うので、特定のアドレスにバインドさせない限り機能するはずです)

バックグラウンドネットワーク構成の目的で、私は NCDプログラミング言語 をお勧めします。これにより、ネットワーク構成を特別な言語でプログラムできます。 _/etc/ncd.conf_でDHCPを実行する簡単なNCDスクリプト(_eth0_)は次のとおりです。

_process lan {
    # Set device.
    var("eth0") dev;

    # Wait for device, set it up, and wait for network cable.
    net.backend.waitdevice(dev);
    net.up(dev);
    net.backend.waitlink(dev);

    # DHCP configuration.
    # net.ipv4.dhcp() will block here until it obtaines an IP address.
    # Note that it will only obtain the IP address, and *not* assign it;
    # we do that with a separate command below.
    net.ipv4.dhcp(dev) dhcp;

    # Check IP address - make sure it's not local.
    # If you have other reserved subnets around, check for those too.
    ip_in_network(dhcp.addr, "127.0.0.0", "8") test_local;
    ifnot(test_local);

    # Assign IP address, as obtained by DHCP.
    net.ipv4.addr(dev, dhcp.addr, dhcp.prefix);

    # Add default route, as obtained by DHCP.
    net.ipv4.route("0.0.0.0", "0", dhcp.gateway, "20", dev);

    # Configure DNS servers, as obtained by DHCP.
    net.dns(dhcp.dns_servers, "20");
}
_

これを使用するには、networkデーモンを無効にし、代わりに_badvpn-ncd_デーモンを使用します。起動すると、NCDデーモンがバックグラウンドでネットワーク構成を処理します。または、_badvpn-ncd_プログラムを使用して、ターミナルから直接テストすることもできます。 NCDをインストールできます AURから

デーモンが実際に稼働中のネットワークインターフェイスに依存している場合は、initスクリプトを使用せずに、daemon()コマンドを使用してNCDから適切なタイミングでデーモンを起動できます(安定バージョンでは使用できません)。

NCDに代わるものとして、 netcfg および ifplugd があります。 Archネットワーク構成ファイルを使用できる場合もありますが、NCDと比較すると非常に制限されています。

[〜#〜]編集[〜#〜]:システムでリンク検出に問題があることを見逃したようです。確認するには、_eth0_を下げたまま、自動インターフェイス構成なしで起動してみてください。次に、ログインして試してください。

_ip link set dev eth0 up
_

ネットワークケーブルが接続されていると仮定すると、リンクはすぐに確立され、_NO CARRIER_フラグが消えます。そうでない場合は、ハードウェア(またはドライバー)に問題がある可能性があります。

1
Ambroz Bizjak