问题
我的电脑连接到需要 dhcp 的网络。因此我的网络配置/etc/rc.conf
如下
interface=eth0
address=
netmask=
broadcast=
gateway=
我的恶魔是
DAEMONS=(!hwclock syslog-ng network netfs crond ntpd)
使用此配置,Arch 在启动时会在“网络”处挂起很长时间(仍然显示“[完成]”,但启动后我没有连接)。我找到了两个解决方法:
解决方法 1
network
从守护进程中移除- 运行
mii-tool --reset eth0
并dhcpcd 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 eth0
并dhcpcd 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
标志消失。如果没有,则可能是硬件(或驱动程序)有问题。