我有一个 DHCP 服务器,用于执行 Debian 的无人值守安装:从 PXE 启动,然后使用预置安装操作系统。
DHCP 服务器(Debianisc-dhcp-server
软件包)配置为在发放新租约时执行一项操作(执行 HTTP POST):
subnet 192.168.0.0 netmask 255.255.252.0 {
[...]
filename "pxelinux.0";
on commit {
set client_ip = binary-to-ascii(10, 8, ".", leased-address);
execute("curl", "-X", "POST", [...])
}
}
[...]
host vmhost2 {
hardware ethernet 00:19:66:60:c3:61;
fixed-address 192.168.1.13;
}
我注意到在无人值守安装期间,HTTP POST 执行了两次:第一次是在机器启动几秒钟后(这是预期的),第二次是在大约三十秒后,当 Debian 安装程序配置网络时。
我没想到会有第二个请求。事实上,这是相应的预置配置:
di netcfg/get_hostname 字符串 vmhost2 di netcfg/get_domain 字符串 pelicandd.com di netcfg/choose_interface 选择自动 di netcfg/disable_autoconfig 布尔值 true di netcfg/disable_dhcp 布尔值 true di netcfg/dhcp_failed 注意 di netcfg/dhcp_options 选择手动配置网络 di netcfg/get_ipaddress 字符串 192.168.1.13 di netcfg/get_netmask 字符串 255.255.252.0 di netcfg/get_gateway 字符串 192.168.1.1 di netcfg/get_nameservers 字符串 192.168.1.3 192.168.1.4 8.8.8.8 8.8.4.4 di netcfg/confirm_static 布尔值 true
我认为该netcfg/disable_dhcp
选项表示安装程序不需要联系 DHCP 服务器,但实际上却需要。
问题:
尽管有预先设置选项,为什么安装程序仍第二次联系 DHCP 服务器?
有没有办法阻止它这样做,是通过预先设置选项,还是通过修改 ISC DHCP 服务器的配置来忽略第二个租约?
答案1
第一个 DHCP DORA(发现、提供、请求、接受)序列由客户端 PXE 固件触发,尝试查找 IP/MASK 和 PXE 数据(NBP + TFTP 位置)。
然后,PXE 固件通过 TFTP 检索并运行相应的 kernel+initrd。当此内核开始运行时,它需要 IP/MASK,然后它会触发第二个 DHCP DORA 序列(这是一个常规的“非 PXE”DHCP 请求)
为了避免第二次 DHCP 命中,您必须手动设置静态网络配置在“内核”命令行上;您无法在必须通过网络检索的按下文件上设置此信息,因为内核将被迫使用 DHCP 来使其网络服务正确工作,以检索预先设置的文件……您能看到先有蛋还是先有鸡的问题吗?
您可以将相应的静态网络预置变量“附加”到内核命令行,或者使用 Pxelinuxipappend
命令。
注意:请注意,在预置文件或内核命令行中使用预置变量的语法略有不同,即:
d-i netcfg/get_ipaddress string 192.168.1.13 <<< preseed file
netcfg/get_ipaddress=192.168.1.13 <<< kernel command line
最终版本append
应如下所示。删除换行符,此处添加换行符只是为了增强可读性并防止水平滚动。
append
[...]
netcfg/get_ipaddress=192.168.1.13
netcfg/get_netmask=255.255.252.0
netcfg/get_gateway=192.168.1.1
netcfg/get_nameservers=192.168.1.3
netcfg/disable_autoconfig=true