Ubuntu 11.10 dhclient-enter-hook.d 脚本未调用

Ubuntu 11.10 dhclient-enter-hook.d 脚本未调用

我有一个安装了 Ubuntu 11.10 的盒子。并且该盒子配置为从 dhcp 获取 IP 和主机名。

我们已经在 /etc/dhcp/dhclient-enter-hooks.d/ 文件夹中设置了脚本。但这些脚本未被调用/执行。我在另一个安装了 Ubuntu 10.04 的机器中也有类似的脚本,并且钩子脚本可以毫无问题地执行。一个区别是 11.10 机器中安装了 NetworkManager。

# ps -ef | grep dhclient
root       746   695  0 03:52 ?        00:00:00 /sbin/dhclient -d -4 -sf /usr/lib/NetworkManager/nm-dhcp-client.action -pf /var/run/dhclient-eth0.pid -lf /var/lib/dhcp/dhclient-559273da-a027-458e-b124-bdbb4976ee17-eth0.lease -cf /var/run/nm-dhclient-eth0.conf eth0

我如何测试 /etc/dhcp/dhclient-enter-hooks.d 中的脚本是否未运行?我在 /etc/dhcp/dhclient-enter-hooks.d 中放置了一个简单的脚本“mytest”,其中包含以下代码。文件 /tmp/enter-hook.out 从未生成。

#!/bin/sh
echo "this is test file to test dhclient-enter-hook" > /tmp/enter-hook.out

我的 /etc/network/interfaces 片段

# cat /etc/network/interfaces 
auto lo
iface lo inet loopback

auto eth0 inet dhcp

答案1

由于这个问题实际上不是一个问题,我假设问题是“我如何让 dhclient-{enter,exit}-hooks 运行?”简短的回答是,如果不做一些工作,你就无法做到这一点。请参阅这个错误对该问题进行良好的讨论并提出一些解决方案。

正如 OP 所建议的,网络管理器 (NM) 是问题所在。以下是 NM 调用 dhclient 的示例:

/sbin/dhclient -d -4 -sf /usr/lib/NetworkManager/nm-dhcp-client.action \
    -pf /var/run/dhclient-wlan1.pid -lf <lease file> \
    -cf /var/run/nm-dhclient-wlan1.conf wlan1

注意“-sf /usr/lib/NetworkManager/nm-dhcp-client.action”。这是 NM 提供的一个特殊程序,它覆盖了 dhclient 的默认脚本(位于 /sbin/dhclient-script)。默认脚本的行为与您预期的一样,并在“man dhclient-script”中进行了记录。

nm-dhcp-client.action 是一个 C 程序,因此您需要源代码来弄清楚它的作用。但查看源代码后您会注意到它默认不直接运行任何进入/退出脚本。

可能最好的(最不黑客的)解决方案是编写一个 /etc/NetworkManager/dispatcher.d 脚本,在接口出现时运行进入/退出脚本如果 DHCP* 环境变量存在(请参阅 man NetworkManager)。由于您只能传递 NM 提供给调度程序脚本的变量,因此这可能不是一个完全透明的解决方案。

一个未经测试、有点老套但更简单的替代方案是重命名 /usr/lib/NetworkManager/nm-dhcp-client.action,并在其位置放置一个脚本,该脚本无条件地执行新命名的 nm-dhcp-client.action。您几乎可以复制运行进入/退出挂钩的 /sbin/dhclient-script 的大部分内容,因此创建脚本应该非常简单。这应该适用于预先存在的挂钩脚本,而前一种解决方案可能不适用(由于预期变量不可用)。

NM 确实应该已经在运行这些钩子了,因为似乎有些包如果没有它就无法按预期运行。

答案2

刚刚遇到了一个似乎与问题无关的解决方案 - 接口没有正确声明,这导致/etc/network/interfaces了差异。没有一个钩子脚本被调用,我正准备继续涉及 NetworkManager 的解决方法:确保在/etc/network/interfaces

# interfaces(5) file used by ifup(8) and ifdown(8)
# these two lines are here by default
auto lo
iface lo inet loopback

# this was missing in my case and while the address was retrieved via DHCP, additional 
# options like ntp-servers were never retrieved:
auto eth0
iface eth0 inet dhcp

相关内容