Arch Linux:eth0 没有运营商 - 启动时网络失败

Arch Linux:eth0 没有运营商 - 启动时网络失败

问题

我的电脑连接到需要 dhcp 的网络。因此我的网络配置/etc/rc.conf如下

interface=eth0
address=
netmask=
broadcast=
gateway=

我的恶魔是

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

使用此配置,Arch 在启动时会在“网络”处挂起很长时间(仍然显示“[完成]”,但启动后我没有连接)。我找到了两个解决方法:

解决方法 1

  • network从守护进程中移除
  • 运行mii-tool --reset eth0dhcpcd eth0在启动后(将这些命令放入时它不起作用/etc/rc.local

然后 dhcp 工作非常快(因为重置!)。在执行第一个命令之前,ip link show eth0输出中有“NO CARRIER”。之后,没有了。(此外,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 eth0dhcpcd eth0/etc/rc.local

现在网络在启动时快速启动(虽然我不知道是否成功),命令/etc/rc.local被执行并且登录后连接良好。

该怎么办?

因此问题似乎dhcpcd停留在“等待承运人”或诸如此类的状态。

我不喜欢这个解决方法,因为有些守护进程需要网络(尽管它们似乎可以启动)。我该怎么做才能eth0在启动时准备好 dhcp?还是有其他问题?

答案1

假设您需要 DHCP,则在 DHCP 完成之前您无法准备好eth0。我怀疑您真正想要的是让机器完成启动过程而不等待它,并让网络配置在后台进行。例如,这将允许您快速登录,并且通常,网络配置将在您需要时完成。要做到这一点,您不必让 init 脚本自己尝试 DHCP,而是必须让它们启动一个守护进程来动态处理网络配置,包括 DHCP。

关于您对依赖于网络的网络服务的观察,它们通常不需要设置超过环回接口,假设您将它们绑定到0.0.0.0而不是任何特定的本地地址。(守护进程通常默认执行此操作,因此除非您让它们绑定到某个特定地址,否则它应该可以工作)

对于后台网络配置,我推荐我的NCD编程语言,它允许您使用特殊语言编写网络配置。下面是一个简单的 NCD 脚本 ( /etc/ncd.conf),它将在 上执行 DHCP 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

如果您的守护进程确实依赖于网络接口的启动,您可以使用命令在适当的时间从 NCD 启动守护进程daemon(),而无需使用它们的初始化脚本(稳定版本中不可用)。

NCD 的一些替代方案包括网络配置插件。虽然他们可能能够使用 Arch 网络配置文件,但与 NCD 相比,它们的功能极其有限。

编辑:我似乎忽略了您的系统在链接检测方面存在问题。要检查,请尝试在没有任何自动接口配置的情况下启动,并保持eth0关闭。然后登录并尝试:

ip link set dev eth0 up

假设网络电缆已插入,则链接应快速建立,从而使NO CARRIER标志消失。如果没有,则可能是硬件(或驱动程序)有问题。

相关内容