更多 PXE 魔法

作者:Kyle Rankin

在本文中,我决定继续探讨我在专栏中写过的一个主题,但不是直接在专栏中,而是在2008年4月刊中以一篇名为“PXE 魔法”的专题文章形式发表的。在那篇文章中,我讨论了如何从头开始设置 PXE 服务器,包括如何安装和配置 DHCP 和 TFTP。最终,我甚至提供了一个基本的 pxelinux 配置来帮助您入门。从那时起,使用 pxelinux 的 PXE 菜单变得更加复杂和图形化,如果您是新手,可能会觉得有点令人生畏。在本专栏中,我将解释如何利用 Debian 和 Ubuntu 项目在其 PXE 配置方面所做的工作,来创建您自己精美的 PXE 菜单,而无需进行太多额外的工作。我知道并非每个人都使用 Debian 或 Ubuntu,因此,如果您使用不同的发行版,请稍安勿躁,不要急着发送愤怒的电子邮件;您仍然可以使用我在此处展示的 PXE 配置用于您的发行版,前提是它提供了一些关于如何 PXE 引导其安装程序的基本示例。只需将这些步骤用作起点,并调整 PXE 配置以使其适合您即可。

简单的 Ubuntu PXE 菜单

如果这是您第一次配置 PXE 服务器,那么第一步,我建议您按照“PXE 魔法”文章中的步骤安装和配置 DHCP 和 TFTP。否则,如果您已经有现有的服务器,只需确保 DHCP 配置为指向您的 TFTP 服务器(如果在同一台机器上,那也没问题)。并且,如果您在 tftpboot 目录中已经有任何类型的 pxelinux 配置,我建议您备份它并将其移开——我将假设您的整个 /var/lib/tftpboot(或某些系统上的 /tftpboot)目录在开始时是空的。在本文的其余部分中,我将 /var/lib/tftpboot 作为存储 PXE 配置文件的位置,因此如果您使用 /tftpboot,请相应地调整命令。

Debian 和 Ubuntu 都为各自的发行版提供了一个不错的All-in-One网络引导配置,这使得您自己 PXE 引导特定发行版变得简单。该文件名为 netboot.tar.gz,位于 netboot 目录中,以及其余不同的安装镜像。例如,i386 Ubuntu 12.04 发行版(名为 Precise)的 netboot.tar.gz 可以在 http://us.archive.ubuntu.com/ubuntu/dists/precise/main/installer-i386/current/images/netboot/netboot.tar.gz 找到。

要开始,cd 到您的 tftpboot 目录,然后使用 wget 拉取 netboot.tar.gz 文件(我假设您需要 root 权限才能执行所有这些步骤,因此我在所有命令前面都加上了 sudo),然后解压 tarball


$ cd /var/lib/tftpboot
$ sudo wget http://us.archive.ubuntu.com/ubuntu/dists/precise/
↪main/installer-i386/current/images/netboot/netboot.tar.gz
$ sudo tar xzf netboot.tar.gz
$ ls
netboot.tar.gz  pxelinux.0  pxelinux.cfg  
 ↪ubuntu-installer  version.info

正如 ls 命令所示,创建了一个 ubuntu-installer 目录以及指向 ubuntu-installer 目录内真实文件的 pxelinux.0 和 pxelinux.cfg 符号链接。无需执行任何其他配置,只要您的 DHCP 和 TFTP 服务器正常运行,您就可以使用此配置 PXE 引导服务器,并获得如图 1 所示的引导菜单。

图 1. Ubuntu Precise PXE 引导菜单

Ubuntu 采取了额外的步骤,用其配色方案对 PXE 菜单进行了主题化,甚至还提供了徽标。与我在之前的“PXE 魔法”文章中演示的 PXE 菜单不同,此菜单的功能更像是一个 GUI 程序。您可以使用箭头键导航它,使用 Enter 键选择菜单项,使用 Tab 键编辑菜单项。

多操作系统 PXE 菜单

如果您只对 PXE 引导单个版本的 Ubuntu 或 Debian 感兴趣,那么您就完成了。当然,如果您想要选择特定发行版的 32 位或 64 位版本,或者如果您想在几个不同的发行版之间进行选择怎么办?虽然您可以在每次想要更改时覆盖您的 tftpboot 目录,但只需对配置进行一些额外的调整,您就可以轻松地使用同一个菜单托管多个发行版。

将 Precise 移动到子菜单

首先,让我们清除 /var/lib/tftpboot 目录中的任何现有文件。让我们使用 i386 Precise netboot.tar.gz 开始,但让我们调整文件的组织方式,将 precise 隔离在其自己的目录中


$ cd /var/lib/tftpboot
$ sudo mkdir precise
$ cd precise
$ sudo wget http://us.archive.ubuntu.com/ubuntu/dists/precise/
↪main/installer-i386/current/images/netboot/netboot.tar.gz
$ sudo tar xzf netboot.tar.gz

所有有趣的 PXE 配置都可以在 ubuntu-installer/i386 目录中找到,因此在根 tftpboot 目录中备份这些文件的副本,以便您可以编辑它们


$ cd /var/lib/tftpboot
$ sudo cp -a precise/ubuntu-installer/i386/boot-screens 
 ↪precise/ubuntu-installer/i386/pxelinux.0 
 ↪precise/ubuntu-installer/i386/pxelinux.cfg .

不幸的是,您复制的 boot-screens 目录下的所有配置文件都引用 ubuntu-installer/i386/boot-screens,而您希望它们仅引用 boot-screens,因此下一步是运行一个快速的 Perl 单行命令来搜索并删除配置文件中找到的任何 ubuntu-installer/i386/ 实例


$ cd /var/lib/tftpboot/boot-screens
$ sudo perl -pi -e 's|ubuntu-installer/i386/||' *

指向 Ubuntu Precise 内核和 initrd 的特定 pxelinux 配置可以在 precise/ubuntu-installer/i386/boot-screens/txt.cfg 下找到。如果您查看该文件,它看起来会像这样


default install
label install
        menu label ^Install
        menu default
        kernel ubuntu-installer/i386/linux
        append vga=788 initrd=ubuntu-installer/i386/
        ↪initrd.gz -- quiet 
label cli
        menu label ^Command-line install
        kernel ubuntu-installer/i386/linux
        append tasks=standard pkgsel/language-pack-patterns= 
         ↪pkgsel/install-language-support=false vga=788 
         ↪initrd=ubuntu-installer/i386/initrd.gz -- quiet

您想要做的是在根级别的 boot-screens 目录下创建此配置文件的副本,但是因为您将 tarball 解压到一个名为 precise(而不是根目录)的目录中,所以您需要进行另一次搜索和替换,并在对 ubuntu-installer 目录的任何引用前面添加 precise。否则,内核和 initrd 的路径将是错误的


$ cd /var/lib/tftpboot/boot-screens
$ sudo cp ../precise/ubuntu-installer/i386/boot-screens/txt.cfg 
 ↪precise-i386.cfg
$ sudo perl -pi -e 's|ubuntu-installer|precise/ubuntu-installer|g' 
 ↪precise-i386.cfg

完成后,/var/lib/tftpboot/boot-screens/precise-i386.cfg 文件应如下所示


default install
label install
        menu label ^Install
        menu default
        kernel precise/ubuntu-installer/i386/linux
        append vga=788 initrd=precise/ubuntu-installer/i386/initrd.gz 
         ↪-- quiet 
label cli
        menu label ^Command-line install
        kernel precise/ubuntu-installer/i386/linux
        append tasks=standard pkgsel/language-pack-patterns= 
         ↪pkgsel/install-language-support=false vga=788 
         ↪initrd=precise/ubuntu-installer/i386/initrd.gz -- quiet

最后,在您喜欢的文本编辑器中打开 /var/lib/tftpboot/boot-screens/menu.cfg。此文件包含与 PXE 菜单系统有关的大部分配置,该文件应如下所示


menu hshift 13
menu width 49
menu margin 8

menu title Installer boot menu^G
include boot-screens/stdmenu.cfg
include boot-screens/txt.cfg
include boot-screens/gtk.cfg
menu begin advanced
        menu title Advanced options
        include boot-screens/stdmenu.cfg
        label mainmenu
                menu label ^Back..
                menu exit
        include boot-screens/adtxt.cfg
        include boot-screens/adgtk.cfg
menu end
label help
        menu label ^Help
        text help
   Display help screens; type 'menu' at boot prompt to 
    ↪return to this menu
        endtext
        config boot-screens/prompt.cfg

您想要做的是将 include boot-screens/txt.cfg 行替换为指向您创建的新 precise-i386.cfg 文件的子菜单。我使用了现有的高级子菜单作为开始示例。结果文件应如下所示


menu hshift 13
menu width 49
menu margin 8

menu title Installer boot menu^G
include boot-screens/stdmenu.cfg
menu begin precise-i386
        menu title Precise 12.04 i386
        include boot-screens/stdmenu.cfg
        label mainmenu
                menu label ^Back..
                menu exit
        include boot-screens/precise-i386.cfg
menu end
include boot-screens/gtk.cfg
menu begin advanced
        menu title Advanced options
        include boot-screens/stdmenu.cfg
        label mainmenu
                menu label ^Back..
                menu exit
        include boot-screens/adtxt.cfg
        include boot-screens/adgtk.cfg
menu end
label help
        menu label ^Help
        text help
   Display help screens; type 'menu' at boot prompt to 
    ↪return to this menu
        endtext
        config boot-screens/prompt.cfg

当您现在 PXE 引导时,您应该看到一个标记为 Precise 12.04 i386 的菜单选项,如图 2 所示。当您选择该选项并按 Enter 键时,您就可以像以前一样访问标准的安装选项。

图 2. 子菜单中的 Precise

添加 Precise 64 位

现在您已经让 32 位 Precise 安装正常工作,让我们也添加 64 位发行版。在删除任何现有的 netboot.tar.gz 文件后,您基本上将执行与之前相同的初始步骤。 netboot.tar.gz 文件的结构使其可以安全地在同一个 precise 目录中解压缩


$ cd /var/lib/tftpboot/precise
$ sudo rm netboot.tar.gz
$ sudo wget http://us.archive.ubuntu.com/ubuntu/dists/precise/
↪main/installer-amd64/current/images/netboot/netboot.tar.gz
$ sudo tar xzf netboot.tar.gz

由于您已经复制了 boot-screens 目录,因此您可以跳过复制和修改 64 位 txt.cfg 的步骤,使其指向正确的目录


$ cd /var/lib/tftpboot/boot-screens
$ sudo cp ../precise/ubuntu-installer/amd64/boot-screens/txt.cfg 
 ↪precise-amd64.cfg
$ sudo perl -pi -e 's|ubuntu-installer|precise/ubuntu-installer|g' 
 ↪precise-amd64.cfg

现在,再次打开 /var/lib/tftpboot/boot-screens/menu.cfg,并添加一个额外的菜单项,指向您创建的 precise-amd64.cfg 文件。该文件最终如下所示


menu hshift 13
menu width 49
menu margin 8

menu title Installer boot menu^G
include boot-screens/stdmenu.cfg
menu begin precise-i386
        menu title Precise 12.04 i386
        include boot-screens/stdmenu.cfg
        label mainmenu
                menu label ^Back..
                menu exit
        include boot-screens/precise-i386.cfg
menu end
menu begin precise-amd64
        menu title Precise 12.04 amd64
        include boot-screens/stdmenu.cfg
        label mainmenu
                menu label ^Back..
                menu exit
        include boot-screens/precise-amd64.cfg
menu end
include boot-screens/gtk.cfg
menu begin advanced
        menu title Advanced options
        include boot-screens/stdmenu.cfg
        label mainmenu
                menu label ^Back..
                menu exit
        include boot-screens/adtxt.cfg
        include boot-screens/adgtk.cfg
menu end
label help
        menu label ^Help
        text help
   Display help screens; type 'menu' at boot prompt to 
    ↪return to this menu
        endtext
        config boot-screens/prompt.cfg
添加新的 Ubuntu 发行版

因此,您对您的 12.04 PXE 菜单感到满意,然后 Ubuntu 发布了 12.10 Quantal,所以现在您想将该版本的 32 位版本添加到您的菜单中。只需将之前的步骤适应于这个新版本即可。首先,创建一个目录来存储新版本,并拉取和解压新的 netboot.tar.gz 文件


$ cd /var/lib/tftpboot
$ sudo mkdir quantal
$ cd quantal
$ sudo wget http://us.archive.ubuntu.com/ubuntu/dists/quantal/
↪main/installer-i386/current/images/netboot/netboot.tar.gz
$ sudo tar xzf netboot.tar.gz

接下来,将 quantal txt.cfg 文件复制到您的根 boot-screens 目录,并在其上运行 Perl 单行命令,使其指向正确的目录


$ cd /var/lib/tftpboot/boot-screens
$ sudo cp ../quantal/ubuntu-installer/i386/boot-screens/txt.cfg 
 ↪quantal-i386.cfg
$ sudo perl -pi -e 's|ubuntu-installer|quantal/ubuntu-installer|g' 
 ↪quantal-i386.cfg

最后,再次编辑 /var/lib/tftpboot/boot-screens/menu.cfg,并添加额外的菜单项,指向您创建的 quantal-i386.cfg 文件。您应该放在先前子菜单下方的附加部分如下所示


menu begin quantal-i386
        menu title Quantal 12.10 i386
        include boot-screens/stdmenu.cfg
        label mainmenu
                menu label ^Back..
                menu exit
        include boot-screens/quantal-i386.cfg
menu end

生成的 PXE 菜单应如图 3 所示。要添加 64 位版本,只需将上述 Precise 64 位版本的步骤适应于 Quantal 即可。最后,如果您还想混合和匹配 Debian 发行版,步骤几乎相同,只是您需要从其项目镜像中跟踪 Debian netboot.tar.gz,并将 precise 替换为 Debian 项目名称,如 squeeze。此外,在您看到的每个引用 ubuntu-installer 的搜索和替换中,您都将 ubuntu-installer 更改为 debian-installer。

图 3. 现在有三个选项

Kyle Rankin 是 Linux Journal 的技术编辑和专栏作家,也是 Purism 的首席安全官。他是 Linux Hardening in Hostile NetworksDevOps TroubleshootingThe Official Ubuntu Server BookKnoppix HacksKnoppix Pocket ReferenceLinux Multimedia HacksUbuntu Hacks 的作者,也是许多其他 O'Reilly 书籍的撰稿人。Rankin 经常就安全和开源软件发表演讲,包括在 BsidesLV、O'Reilly Security Conference、OSCON、SCALE、CactusCon、Linux World Expo 和 Penguicon 上。您可以在 @kylerankin 上关注他。

加载 Disqus 评论