PXE Magic:使用菜单的灵活网络启动

作者:Kyle Rankin

当系统管理员管理越来越多的服务器时,自动化是如何演变的,这很有趣。当您只管理少量服务器时,插入安装 CD 并手动设置选项是没问题的。随着服务器数量的增长,您可能会意识到设置 kickstart 或 FAI(Debian 的全自动安装程序)环境来自动化安装时的所有手动配置是有意义的。现在,您启动安装 CD,输入一些启动参数以将机器指向 kickstart 服务器,然后去喝杯咖啡,等待机器安装完成。

当您有一天需要一次安装三到四台机器时,您可以刻录额外的 CD,也可以研究 PXE 启动。预启动执行环境 (Preboot eXecution Environment) 是英特尔开发的一项开放标准,允许机器通过网络而不是从本地介质(如软盘、CD 或硬盘驱动器)启动。现代服务器和带有集成网卡的较新笔记本电脑和台式机应在 BIOS 中支持 PXE 启动——在某些情况下,它默认启用,而在其他情况下,您需要进入 BIOS 设置才能启用它。

由于现在许多现代服务器都提供内置的远程电源和远程终端,或者可以通过串行控制台服务器或联网 KVM 进行远程访问,如果您设置了 PXE 启动环境,您可以远程开机,然后从远处启动和安装机器。

如果您以前从未设置过 PXE 启动服务器,本文的第一部分介绍了启动并运行您的第一个 PXE 服务器的步骤。如果 PXE 启动对您来说已经很熟悉了,请跳到名为“PXE 菜单 Magic”的部分。在那里,我将介绍如何在 PXE 启动时配置启动菜单,这样您就不必查找 MAC 地址并在安装前进行大量设置,只需启动、选择您的操作系统,就可以开始了。之后,我将讨论如何将救援工具(如 Knoppix 和 memtest86+)集成到您的 PXE 环境中,以便任何可以从网络启动的机器都可以使用它们。

PXE 设置

PXE 设置需要三个主要的 инфраструктура 组件:DHCP 服务器、TFTP 服务器和 syslinux 软件。DHCP 和 TFTP 可以驻留在同一台服务器上。当系统尝试从网络启动时,DHCP 服务器为其分配 IP 地址,然后告诉它 TFTP 服务器的地址以及要运行的引导程序名称。然后,TFTP 服务器提供该文件,在本例中,该文件是启用 PXE 的 syslinux 二进制文件。该程序在启动的机器上运行,然后可以加载 Linux 内核或其他也通过网络在 TFTP 服务器上共享的操作系统文件。一旦内核加载完成,操作系统就会像往常一样启动,如果您正确配置了 kickstart 安装,安装就会开始。

配置 DHCP

任何相对较新的 DHCP 服务器都将支持 PXE 启动,因此如果您尚未设置 DHCP 服务器,只需使用您的发行版的 DHCP 服务器软件包(可能名为 dhcpd、dhcp3-server 或类似的名称)。配置 DHCP 以适应您的网络在某种程度上超出了本文的范围,但许多发行版都附带了一个默认配置文件,该文件应该可以作为一个很好的起点。安装 DHCP 服务器后,编辑配置文件(通常在 /etc/dhcpd.conf 中),找到 subnet 部分(或者每个主机部分,如果您通过 DHCP 配置了静态 IP 分配,并且希望这些主机进行 PXE 启动),并添加两行

next-server ip_of_pxe_server;
filename "pxelinux.0";

next-server 指令告诉主机 TFTP 服务器的 IP 地址,filename 指令告诉它要从该服务器下载和执行哪个文件。将 next-server 参数更改为与您的 TFTP 服务器的 IP 地址匹配,并将 filename 设置为 pxelinux.0,因为这是启用 PXE 的 syslinux 可执行文件的名称。

在 subnet 部分中,您还需要将 dynamic-bootp 添加到 range 指令中。以下是更改后的示例 subnet 部分

subnet 10.0.0.0 netmask 255.255.255.0 {
    range dynamic-bootp 10.0.0.200 10.0.0.220;
    next-server 10.0.0.1;
    filename "pxelinux.0";
}
安装 TFTP

配置并运行 DHCP 服务器后,您就可以安装 TFTP 了。pxelinux 可执行文件需要支持 tsize 选项的 TFTP 服务器,tftpd-hpa 或 atftp 是两个不错的选择。在许多发行版中,这些选项已经以这些名称打包,因此只需安装您的发行版的软件包,或者按照项目官方网站上的安装说明进行操作。

根据您的 TFTP 软件包,如果尚未为您添加条目,您可能需要在 /etc/inetd.conf 中添加一个条目

tftp           dgram   udp     wait    root  /usr/sbin/in.tftpd
/usr/sbin/in.tftpd -s /var/lib/tftpboot

正如您在本示例中看到的,-s 选项(用于 tftpd-hpa)指定 /var/lib/tftpboot 作为包含我的文件的目录,但在某些系统上,这些文件通常存储在 /tftpboot 中,因此请查看您的 /etc/inetd.conf 文件和您的 tftpd 手册页,如果不确定,请检查其约定。如果您的发行版使用 xinetd 并且没有在 /etc/xinetd.d 中为您创建文件,请创建一个名为 /etc/xinetd.d/tftp 的文件,其中包含以下内容

# default: off
# description: The tftp server serves files using 
# the trivial file transfer protocol. 
# The tftp protocol is often used to boot diskless 
# workstations, download configuration files to network-aware
# printers, and to start the installation process for
# some operating systems.
service tftp
{
        disable = no
        socket_type             = dgram
        protocol                = udp
        wait                    = yes
        user                    = root
        server                  = /usr/sbin/in.tftpd
        server_args             = -s /var/lib/tftpboot
        per_source              = 11
        cps                     = 100 2
        flags                   = IPv4
}

由于 tftpd 是 inetd 或 xinetd 的一部分,您无需启动任何服务。最多,您可能需要重新加载 inetd 或 xinetd;但是,请确保您运行的任何软件防火墙都允许 TFTP 端口(端口 69 udp)作为输入。

添加 Syslinux

现在 TFTP 已设置好,剩下的就是安装 syslinux 软件包(大多数发行版都提供,或者您可以按照项目主页上的安装说明进行操作),将提供的 pxelinux.0 文件复制到 /var/lib/tftpboot(或您的 TFTP 目录),然后创建 /var/lib/tftpboot/pxelinux.cfg 目录以保存 pxelinux 配置文件。

PXE 菜单 Magic

您可以配置带或不带菜单的 pxelinux,许多管理员使用不带菜单的 pxelinux。使用 pxelinux 菜单有令人信服的理由,我将在下面讨论,但首先,以下是一些 pxelinux 设置的配置方式。

当许多人配置 pxelinux 时,他们基于以下事实为机器或机器类创建配置文件:当 pxelinux 加载时,它会在 TFTP 服务器上的 pxelinux.cfg 目录中按以下顺序搜索配置文件

  • 文件名为 01-MACADDRESS,每个十六进制对之间用连字符分隔。因此,对于 MAC 地址为 88:99:AA:BB:CC:DD 的服务器,仅针对该机器的配置文件将命名为 01-88-99-aa-bb-cc-dd(我注意到它是否为小写很重要)。

  • 文件以主机的十六进制 IP 地址命名。在这里,pxelinux 将从十六进制 IP 的末尾删除一位数字,并在每次文件搜索失败时重试。当管理员购买大量相同品牌的机器时,通常会使用此方法,这些机器通常具有非常相似的 MAC 地址。然后,管理员可以配置 DHCP 以将特定 IP 范围分配给这些 MAC 地址。然后,可以将启动选项应用于所有该组。

  • 最后,如果找不到任何特定文件,pxelinux 将查找名为 default 的文件并使用它。

pxelinux 的一个不错的功能是它使用与 syslinux 相同的语法,因此,例如,从 CD 移植配置可以从 syslinux 选项开始,然后是您的自定义网络选项。以下是旧 CentOS 3.6 kickstart 的示例配置

default linux
label linux
    kernel vmlinuz-centos-3.6
    append text nofb load_ramdisk=1 initrd=initrd-centos-3.6.img 
    ↪network ks=http://10.0.0.1/kickstart/centos3.cfg
为什么使用菜单?

标准的 pxelinux 设置工作正常,许多管理员都在使用它,但它令人恼火的方面之一是,即使您知道您想在服务器上安装 CentOS 3.6,您也必须首先获取 MAC 地址。因此,您可以去机器上找到列出 MAC 地址的标签,将机器启动到 BIOS 中以读取 MAC,或者让它在网络上获得租约。然后,您需要为该主机的 MAC 创建自定义配置文件,或者确保其 MAC 是您已配置的组的一部分。根据您的基础设施,此步骤可能会为每台服务器增加大量时间。即使您批量购买服务器并按 IP 范围分组,如果您想在一台服务器上安装不同的操作系统会发生什么?然后,您必须进行额外的工作来跟踪 MAC 以设置排除项。

使用 pxelinux 菜单,我可以预先配置我需要的任何不同的网络启动场景,并为它们分配一个编号。然后,当机器启动时,我会得到一个 ASCII 菜单,我可以自定义该菜单,其中列出了所有这些选项及其编号。然后,我可以选择我想要的选项,按 Enter,安装就开始运行了。除此之外,现在我可以选择添加非 kickstart 镜像,并使它们可供我的所有服务器使用,而不仅仅是某些组。使用此功能,您可以使救援工具(如 Knoppix 和 memtest86+)可供网络上任何可以 PXE 启动的机器使用。您甚至可以设置超时,就像使用启动 CD 一样,它将选择默认选项。我使用它在 30 秒后选择我的标准 Knoppix 救援模式。

配置 PXE 菜单

由于 pxelinux 共享 syslinux 的语法,如果您有任何带有花哨的 syslinux 菜单的 CD,您可以参考它们以获取示例。由于您希望所有主机都可以使用它,请将任何更具体的配置文件移出 pxelinux.cfg,并创建一个名为 default 的文件。当 pxelinux 程序找不到任何更具体的文件时,它将加载此配置。以下是包含两个选项的示例菜单配置:第一个通过网络启动 Knoppix,第二个启动 CentOS 4.5 kickstart

default 1
timeout 300
prompt 1
display f1.msg
F1 f1.msg
F2 f2.msg

label 1
    kernel vmlinuz-knx5.1.1
    append secure nfsdir=10.0.0.1:/mnt/knoppix/5.1.1 
    ↪nodhcp lang=us ramdisk_size=100000 init=/etc/init 
    ↪2 apm=power-off nomce vga=normal
    ↪initrd=miniroot-knx5.1.1.gz quiet BOOT_IMAGE=knoppix
label 2
    kernel vmlinuz-centos-4.5-64
    append text nofb ksdevice=eth0 load_ramdisk=1
    ↪initrd=initrd-centos-4.5-64.img network
    ↪ks=http://10.0.0.1/kickstart/centos4-64.cfg 

syslinux 手册页中记录了所有这些选项,但我在这里重点介绍一些。default 选项设置超时到期时要启动哪个标签。超时以十分之一秒为单位,因此在本示例中,超时为 30 秒,之后它将使用 label 1 下设置的选项启动。display 选项列出默认情况下要显示的任何消息,因此如果您想为这两个选项显示花哨的菜单,您可以在 /var/lib/tftpboot/ 中创建一个名为 f1.msg 的文件,其中包含类似的内容

----| Boot Options |-----
|                       |
| 1. Knoppix 5.1.1      |
| 2. CentOS 4.5 64 bit  |
|                       |
-------------------------

<F1> Main | <F2> Help
Default image will boot in 30 seconds...

请注意,我在菜单中列出了 F1 和 F2。您可以创建多个文件,当用户按下功能键时,这些文件将输出到屏幕。如果您有超出单个屏幕容量的菜单选项,或者如果您想在启动时提供额外的文档(如果您像我一样为您的 kickstart 服务器创建自定义启动参数,这将非常方便),这将非常有用。在本示例中,我可以创建 /var/lib/tftpboot/f2.msg 文件并添加一个简短的帮助文件。

虽然此菜单相当基本,但请查看 syslinux 配置文件和项目页面,以获取有关如何使用颜色甚至自定义图形来美化它的示例。

额外功能:PXE 救援盘

PXE 服务器我最喜欢的功能之一是添加 Knoppix 救援盘。现在,每当我需要恢复机器时,我都不需要到处寻找磁盘,只需从网络启动服务器即可。

首先,获取 Knoppix 磁盘。在本示例中,我使用 Knoppix 5.1.1 CD,但我已成功使用过更旧的 Knoppix CD。挂载 CD-ROM,然后转到 CD 上的 boot/isolinux 目录。将 miniroot.gz 和 vmlinuz 文件复制到您的 /var/lib/tftpboot 目录,但将它们重命名为不同的名称,例如 miniroot-knx5.1.1.gz 和 vmlinuz-knx5.1.1。现在,编辑您的 pxelinux.cfg/default 文件,并添加类似于我在上面的示例中使用的行

label 1
    kernel vmlinuz-knx5.1.1
    append secure nfsdir=10.0.0.1:/mnt/knoppix/5.1.1 nodhcp 
    ↪lang=us ramdisk_size=100000 init=/etc/init 2 
    ↪apm=power-off nomce vga=normal
    ↪initrd=miniroot-knx5.1.1.gz quiet BOOT_IMAGE=knoppix

请注意,这里我将其标记为 1,因此如果您已经有一个以此名称命名的标签,您需要决定重命名哪个标签。另请注意,此示例引用了重命名的 vmlinuz-knx5.1.1 和 miniroot-knx5.1.1.gz 文件。如果您将文件命名为其他名称,请务必在此处更改名称。因为我主要处理服务器,所以在 append 行的 init=/etc/init 之后添加了 2,这样它将启动到运行级别 2(仅控制台模式)。如果您想启动到完整的图形环境,请从 append 行中删除 2。

如果您没有设置 NFS 服务器,则最后一步可能是最大的步骤。对于 Knoppix 通过网络启动,您必须在 NFS 服务器上共享其 CD 内容。NFS 服务器配置超出了本文的范围,但在我的示例中,我在 10.0.0.1 上的 /mnt/knoppix/5.1.1 上设置了 NFS 共享。然后,我挂载了我的 Knoppix CD,并将全部内容复制到该目录。或者,您可以将 Knoppix CD 或 ISO 直接挂载到该目录。当 Knoppix 内核启动时,它将挂载该 NFS 共享并直接通过网络访问所需的其余文件。

额外功能:Memtest86+

PXE 环境的另一个不错的补充是 memtest86+ 程序。该程序对系统的 RAM 进行彻底扫描并报告任何错误。如今,一些发行版甚至默认安装它并在启动过程中使其可用,因为它非常有用。与 Knoppix 相比,将 memtest86+ 添加到您的 PXE 服务器非常简单,因为它从单个可启动文件运行。首先,安装您的发行版的 memtest86+ 软件包(大多数都提供),或者从 memtest86+ 站点下载它。然后,将程序二进制文件复制到 /var/lib/tftpboot/memtest。最后,向您的 pxelinux.cfg/default 文件添加一个新标签

label 3
        kernel memtest

就这样。当您在启动提示符下键入 3 时,memtest86+ 程序会通过网络加载并开始扫描。

结论

除了我在这里给出的功能之外,还有许多额外的功能。例如,可以将许多 DOS 启动软盘映像添加到 PXE 环境中,例如 Peter Nordahl 的 NT Password and Registry Editor Boot Disk。我自己使用 pxelinux 菜单有助于我简化服务器 kickstart,并使同时 kickstart 许多服务器变得简单。在启动时,我不仅可以指示要加载哪个操作系统,还可以指示更具体的选项,例如要安装的服务器类型(Web、数据库等)、要使用的主机名以及其他非常具体的调整。除了不再跟踪 MAC 地址的好处之外,您还可以创建一个漂亮的彩色用户友好型启动菜单,该菜单可以记录在案,因此新管理员更容易上手。最后,我已经能够自定义 Knoppix 磁盘,使其在启动时执行非常特定的操作,例如执行负载测试甚至设置网络摄像头服务器——全部来自网络。

Kyle Rankin 是旧金山湾区的高级系统管理员,也是许多书籍的作者,包括 O'Reilly Media 的 Knoppix HacksUbuntu Hacks。他目前是 North Bay Linux 用户组的主席。

加载 Disqus 评论