简洁版本
我知道这个问题与其他问题非常相似,我确实在互联网上搜索了答案,但似乎没有一种方法有效,或者解决方案似乎“太复杂,无法成为最佳实践”(我会尝试解释)。我正在寻找一种安全的方法如何从命令行禁用 DHCP(在脚本中使用)。
背景
我正在尝试使用 Ubuntu Server 12.04 和 remastersys 创建“Live-Cd”(效果很好)。默认情况下,系统配置为在启动时使用 DHCP 获取 IP。没问题 - 重要的是,脚本(在启动后运行)能够(在某些特定情况下)使用ifconfig
(不是 /etc/network/interfaces):
ifconfig eth0 192.168.0.1
其实这也行得通,但 IP 只会持续到之前获得的租约的 DHCP 租约时间结束。新的 IP 将被分配给 eth0,这(简而言之)会破坏系统。我想“没什么大不了的,肯定会有类似的事情:”
ifconfig eth0
dhcp已禁用
但我最终意识到,它没那么容易工作。编辑/etc/network/interfaces
有点棘手,因为它是由 remastersys (实际上是 casper 的 23networking 脚本) 生成的。
我可以重写它并重新启动网络,但活动的 dhclient.leases 会发生什么?DHClient 是否仍会在后台运行(它不应该,但有些帖子建议它会在后台运行,我的测试表明,如果 dhclient 被终止,它会“随机”重新启动),我是否必须删除或清空 dhclient.leases 文件,resolv.conf 怎么办?
绝望
总而言之 - 在我看来,它并不是那么“简单”,而且有点“感觉不稳定”。本问题 (156183)建议删除 dhclient 包,但是:这会解决问题吗?这会破坏其他东西吗?
真的没有这个命令吗?我希望我只是忽略了它。
答案1
我会尽量给你举一个简单的例子能确实,但它不是完整的例子,因为确切的设置、需求等可能有很大差异。
首先,让我们做一些假设以使这个案例更简单:
- 您没有使用网络管理器
- 您没有使用
resolvconf
,而是使用静态 /etc/resolv.conf 文件 allow-hotplug
如果拔出/插入电缆,您的接口文件不包含要重新配置的行。
让我们设置辅助变量 DEV
## your device is eth0
# stop /etc/interface control of the eth0 device, should also stop/kill dhcp for that device
ifdown eth0
## stop dhclient to be sure, don't worry about leases files etc
pkill dhclient
## ubuntu precise calls dhclient with dhclient3
pkill dhclient3
# set ip manually: (NETMASK is quite often 24 == 255.255.255.0)
ifconfig eth0 up 192.168.0.1/NETMASK
# do you need default gw? (for this example it's 192.168.0.254)
route add default gw 192.168.0.254
## if your /etc/resolv.conf is incorrect add correct nameserver like this:
### 8.8.8.8 = goole open dns
echo 'nameserver 8.8.8.8' > /etc/resolv.conf
现在,如果假设 1)为假,则执行(停止网络管理器):
stop network-manager
对于假设 2)要么删除resolvconf
,要么删除/etc/resolv.conf
(如果是符号链接)并将其替换为静态文件
[ -h /etc/resolv.conf ] && rm /etc/resolv.conf
对于假设 3):这应该注释掉热插拔行。我希望这足够了
perl -i -pe 's/^(\s*allow-hotplug)/# $1/g' /etc/network/interfaces
答案2
如果您的发行版有“systemctl”,则可以使用它。它适用于我的 openSUSE 发行版,我使用它以下列方式禁用服务。
systemctl disable wickedd-dhcp4.service
其中 wickedd-dhcp4 是我系统上处理 DHCP 客户端配置的服务的名称。还有一个用于 IPv6 dhcp 配置的服务,您可能也想禁用它。
systemctl disable wickedd-dhcp6.service
答案3
解决这个问题最简单的标准方法很简单:只需告诉您的 DHCP 服务器应该将哪些 IP 分配给某些 MAC 地址。我接触过的每个路由器都有这个功能,如果你正在使用dhcp3-server
,那么就这么简单。
答案4
我使用以下命令在我的服务器上禁用 DHCP。
sudo update-rc.d -f dhcp3-server remove
它的作用是删除任何系统启动链接/etc/init.d/dhcp3-server
。
这样下次重启时 DHCP 就不会启动。
就是这样,简单、干净、轻松且安全。