iVentoy 配合第三方 DHCP Server 说明

  • 1. 背景说明

通过网络安装系统(PXE)流程的第一步就是客户端向服务端发送DHCP请求来分配一个IP地址。因此必须有一个 DHCP Server 的角色。
iVentoy 内部集成了一个 DHCP Server,简单场景下可以直接使用这个内部集成的 DHCP Server。但此时局域网内不能再有其他的 DHCP Server。
iVentoy 也可以不启用这个内部的 DHCP Server 而是和第三方 DHCP Server 配合工作。

注意:第三方 DHCP Server 必须支持 next-server 和 bootfile 这两个选项的配置。

  • 2. 启动文件

iVentoy 配合第三方 DHCP Server 工作时,自身不再提供DHCP Server的功能,而是只作为文件服务器的角色提供文件下载的服务。
客户端进入PXE流程之后,首先和DHCP Server交互获取到IP地址,以及 next-server地址 (就是 iVentoy)和 bootfile 选项的值。 然后接着就会通过 TFTP 从 next-server (iVentoy)那里下载 bootfile 文件,也就是启动文件。启动文件执行之后再加载启动菜单。这个是PXE启动的基本流程。

这里有一个不好处理的地方就是,客户端有可能是Legacy BIOS模式也有可能是UEFI模式,这个是不确定的,而Legacy BIOS模式和UEFI模式所需要的启动文件又是不一样的。
如果客户端是UEFI模式,而iVentoy给客户端发送了Legacy BIOS模式的启动文件,则客户端会直接挂死,无法启动。

那有没有办法判断客户端到底是Legacy BIOS模式还是UEFI模式呢(以及IA32 UEFI模式和ARM64 UEFI模式)?有办法!
客户端在进入PXE流程的时候,首先是向DHCP Server发送DHCP请求报文以获取IP地址,而在这个请求报文里面就携带了客户端的相关信息,其中就有客户端BIOS模式的信息。
但问题又来了,这个信息只在DHCP请求报文里面存在,当客户端获取完IP地址,通过TFTP来向iVentoy下载启动文件的时候,是不携带这些信息的,这样 iVentoy 还是无法 区分客户端到底是什么BIOS模式,该给它发送哪个启动文件。

iVentoy 针对不同的场景采用两种不同的方式来解决这个问题,分别对应两种不同的外部DHCP Server模式,即 External 模式和 ExternalNet 模式。

  • 2.1 External 模式

External 模式的使用场景是 iVentoy 和第三方的DHCP Server位于同一个局域网内(比如同一个VLAN内)。
在这个模式下,iVentoy 还是会启动内部的DHCP Server,只不过它只监听DHCP报文,不会做出任何响应,因此它不会干扰外部DHCP Server的工作。
因为客户端发出的DHCP请求报文是广播形式的,第三方DHCP Server能接收到,iVentoy也能接收到。(他俩在同一个VLAN内)。
同时通过监听客户端的DHCP报文,iVentoy内部会记录下这个客户端的BIOS模式,等后面该客户端来向iVentoy请求下载启动文件时,iVentoy就可以给出正确的启动文件了。
因此这种模式下,第三方DHCP Server不需要区分客户端的BIOS模式,只需要配置一个共同的启动文件名称(比如 iventoy_loader_16000)就可以了。
这个文件名其实是一个虚拟的文件名,iVentoy会根据记录信息判断出客户端的BIOS模式然后发送真实的文件给客户端。

  • 2.2 ExternalNet 模式

ExternalNet 模式的使用场景是 iVentoy 和第三方的DHCP Server位于不同的局域网内(比如不同的VLAN内)。
iVentoy 无法监听DHCP报文,因为DHCP报文被隔离在客户端所在的VLAN内,无法到达 iVentoy。
在这个模式下,iVentoy 就彻底不再启动内部的 DHCP Server(因为启动了也没用)。那启动文件怎么区分呢?交给第三方DHCP Server来完成。
即这种模式下第三方DHCP Server必须能够动态的根据客户端DHCP报文中的信息来告诉客户端不同的启动文件名。
比如,如果客户端是Legacy BIOS模式,则bootfile的值需为 iventoy_loader_16000_bios, 如果是UEFI模式,则bootfile的值需为 iventoy_loader_16000_uefi 等等。
因此,这种模式对于第三方DHCP Server的要求很高,必须能够根据DHCP报文的信息动态设置bootfile选项。
大部分DHCP Server都不支持这种高级功能(甚至一些DHCP Server连最基本的 next-server 和 bootfile 选项的配置都不支持)。
当然也有支持的,比如 Windows Server 下的DHCP Server 以及 Linux系统中的dhcp server。
以 Linux 下的DHCP Server为例,可以在 /etc/dhcp/dhcpd.conf 中按照如下配置:

subnet 10.0.0.0 netmask 255.255.255.0 {
    option routers 10.0.0.254;
    range 10.0.0.2 10.0.0.253;

    class "pxeclients" {
        match if substring (option vendor-class-identifier, 0, 9) = "PXEClient";
        next-server 10.0.0.1;

        if option architecture-type = 00:07 {
            filename "iventoy_loader_16000_uefi";
        } else {
            filename "iventoy_loader_16000_bios";
        }
    }
}

当然,特殊情况特殊对待,比如我的环境中所有的电脑都是UEFI模式的,那即使第三方DHCP Server不支持这种高级设置也没事,直接按照UEFI模式配置bootfile的值即可。

  • 2.3 特殊应用

即使 iVentoy 和第三方 DHCP Server 位于同一个VLAN内,也可以使用 ExternalNet 模式,只要能满足你的要求。
而且这种使用方式还有一个好处,就是在 ExternalNet 模式下 iVentoy 不再启动内部的 DHCP Server,这样 iVentoy 和第三方DHCP Server可以运行在同一个系统内。
External 模式则不行,因为External 模式下 iVentoy 还是会启动内部的DHCP Server,这样两者运行在同一个系统内时会有端口号冲突。

  • 3. 使用方法

1. 在 iVentoy 的 参数配置 页面选择 DHCP 服务器模式 为 External 或者 ExternalNet


2. 第三方 DHCP Server 中配置 next-server 地址为 iVentoy 运行时选择的本机IP地址。

3. 如果是 External 模式则 bootfile 配置为 iventoy_loader_16000
    注意最后的 16000 是和 iVentoy 的 HTTP 服务端口号对应的,如果你在参数配置页面修改了这个值则这里也要对应修改(比如 iventoy_loader_17000)。

4. 如果是 ExternalNet 模式则则 bootfile 根据BIOS模式Legacy BIOS模式、X64 UEFI模式、IA32 UEFI模式、ARM64 UEFI模式,分别配置为
    iventoy_loader_16000_biosiventoy_loader_16000_uefiiventoy_loader_16000_ia32iventoy_loader_16000_aa64