PXE:不再仅仅适用于服务器网络!
在 2008 年 4 月号的 Linux Journal 中,Kyle Rankin 的文章 “PXE Magic” 解释了 PXE(预启动执行环境)的工作原理,以及如何安装自己的 PXE 服务器,并将 Knoppix 等救援工具与支持 PXE 的 Kickstart 安装集成在一起。我以前使用过 Kyle 的许多 PXE Magic(他和我曾在以前的公司共事),但最近我发现自己不仅要管理 Linux 服务器网络,还要管理整个局域网,其中包括 Ubuntu 笔记本电脑、台式机和服务器,以及 Windows 笔记本电脑、台式机和服务器。我开始构思一台 PXE 服务器,它不仅能让我启动服务器和从网络启动救援工具,还能在用户计算机出现故障时为他们提供一个临时环境。在我看来,这台 PXE 服务器的终极目标甚至应该是能够通过网络安装 Windows 机器。经过大量的试验和错误,我最终找到了方法,并且出人意料地,我能够自动化基于网络的 Windows 安装……首先引导 Linux。
我知道我的这个系统的目标之一是为我的网络用户提供一个他们可以在紧急情况下 PXE 启动的环境——这个环境对他们来说应该看起来很熟悉,并且允许他们执行诸如查看电子邮件、浏览网页、即时消息等基本任务。幸运的是,我们这里的大部分员工都在桌面上运行 Ubuntu,因此决定使用 Linux 终端服务器项目 (LTSP) 来实现 Ubuntu 终端服务器是一个简单的决定。
与任何 PXE 实现一样,LTSP 服务器需要 TFTP 服务器、正确配置的 DHCP 服务器和 syslinux 软件。简而言之,客户端启动;网络适配器中的 PXE 代码运行;机器获得 DHCP 地址和服务器地址,以通过 TFTP 获取 syslinux 代码;然后,它实际上运行一个 TFTP 客户端并下载该代码并执行它,启动引导过程。感谢 Ubuntu LTSP 维护人员的辛勤工作,服务器的设置快速而简单。
安装 LTSP 服务器有两种途径:普通安装或独立安装。普通 LTSP 安装假设您的网络上已存在 DHCP 服务器,而独立 LTSP 安装则假设没有 DHCP 服务器,它将自动安装 DHCP 基础设施并将其与 LTSP 服务器集成。我们的公司局域网上已经有一个 DHCP 服务器,所以我选择进行普通 LTSP 安装,并将其与我们现有的 Microsoft Windows DHCP 服务器集成。
我首先在一台戴尔 1950 服务器上安装了标准的 Ubuntu 8.04 桌面,因为 LTSP 服务器必须充当任何登录用户的 GNOME 桌面。之后,我在我们的局域网上为服务器分配了一个静态 IP(与台式机和笔记本电脑在同一子网上)。安装 LTSP 服务器非常简单——只需在 GNOME 终端输入以下命令:sudo apt-get install ltsp-server openssh-server任务就完成了。LTSP 服务器上的最后一步是构建瘦客户端环境。只需在 GNOME 终端运行:sudo ltsp-build-client即可启动剩余的配置步骤并构建 LTSP chroot。
现在 LTSP 服务器本身已经准备就绪,我必须启用我们的网络进行 PXE 启动,这意味着要修改 Windows DHCP 服务器。这花了一些试验和错误,但与 Kyle 在他的文章中提到的 DHCP 服务器配置非常相似,只需要在 DHCP 作用域中添加两个配置选项。在 Microsoft 术语中,这些是“066 引导服务器主机名”选项,我将其设置为分配给 LTSP 服务器的 IP 地址,以及“067 引导文件名”选项,我将其设置为 “ltsp/i386/pxelinux.0”。最后一个 DHCP 选项似乎有点晦涩难懂,直到我意识到 Ubuntu TFTP 服务器的根目录是 /var/lib/tftpboot。如果您正在运行其他 DHCP 服务器,请参阅 DHCP 注释侧边栏,或参考您的 DHCP 服务器文档,了解如何向 DHCP 作用域添加选项。
DHCP 注释
我提到了将 LTSP 服务器与 Microsoft Windows DHCP 服务器集成,但让服务器与其他 DHCP 服务器一起工作并不困难。如果您正在运行“标准”ISC dhcpd 服务器,请参阅 Kyle 的 “PXE Magic” 文章(列在资源中)。他包含了示例配置选项,以及关于它们如何工作的出色解释。如果您正在运行 dnsmasq(在 OpenWRT 和其他嵌入式或轻量级 Linux 发行版中很流行),则dhcp-option=66,<ltsp_ip_address>和dhcp-option=pxe,67,pxelinux.0在 dnsmasq.conf 文件中应该是您所需要的(我在家运行此配置)。
此时,我可以启动局域网上的 PC,按 F12,选择 Onboard NIC 作为启动设备,大约 30 秒后,我得到了一个 GDM 登录屏幕!此时我可以登录到 LTSP 会话,但我必须以 Ubuntu 服务器上已有的用户之一身份登录。这很接近了,但还不是我想要的,因为理想的设置是允许我们 Windows 域中的任何人登录到 LTSP 会话。修复这个问题意味着将服务器与我们的公司 Active Directory 集成。这曾经是一项主要的繁琐工作,但对于 Ubuntu 8.04 及更高版本,只需一个 apt-get 和几个命令即可完成。
实现所有这些魔力的软件包称为 likewise-open。首先,我运行了
sudo apt-get install likewise-open
来获取 likewise 软件包。之后,我必须让 Ubuntu 服务器“加入” Windows 域。我通过运行以下命令完成此操作:
sudo domainjoin-cli join <fqdn.mydomain.com> <DomainAdminUID>
我希望 likewise 在机器启动时运行,所以我发出了
sudo update-rc.d likewise-open defaults
我还希望针对默认域检查登录,因此我在 /etc/samba/lwiauthd.conf 文件中添加了以下行
winbind use default domain = yes
最后,我使用以下命令启动了 likewise-open 守护程序:
sudo /etc/init.d/likewise-open start
现在,我的 PXE LTSP 客户端可以针对公司 Active Directory 进行身份验证。任务的第一步完成了!
我的 PXE 冒险的下一步发生在我被告知需要使用全新的 Windows 版本刷新大约 30 台笔记本电脑时。以前的 Windows 工作人员用来安装 Windows 的方法是通过映像机器。不幸的是,我找不到以前使用过的映像文件。由于为我们拥有的每个硬件平台重新开发有效映像所涉及的问题和时间限制,我选择进行无人值守的 Windows 安装。
我知道 Windows 包括远程安装服务 (RIS),但因为我时间紧迫,所以我不太愿意学习一种全新的技术。但是,还有另一种选择:Unattended,一个开源项目。我大约在一年前发现了 Unattended 项目,虽然我在我的家庭实验室中尝试过它,但我从未在公司环境中尝试过。像许多 Linux 管理员一样,我听到 “Windows” 就畏缩,但因为我被赋予了这项任务,我想我会尽力理解 Windows 安装过程,并从中获得一些可重复性和理解。
Unattended 依赖于 Windows 2000/XP 安装程序的第一步本质上是一个 DOS 程序这一事实。当机器 PXE 启动到 Unattended 安装时发生的事情有点复杂,但它允许很大的灵活性。基本上,机器启动到 Linux 内核和 shell,其中插入了 Unattended 提供的一些脚本。该脚本对系统磁盘进行分区并创建一个基本的 FAT 文件系统,然后引导您完成一些菜单,您可以在其中选择操作系统类型(如果您已使用不同的 Microsoft 操作系统版本设置了 Unattended)、安装选项和您可能打包的可选软件。您需要预先回答特定安装的所有问题,包括 CD 密钥、用户名、要加入的工作组或域以及管理用户。Unattended 脚本会自动消化所有这些内容并创建一个 unattend.txt 文件,该文件将放在新创建的 FAT 文件系统上。然后,启动一个 FreeDOS 会话,Windows 安装程序和操作系统位从 Unattended 服务器上的 Samba 共享复制,然后使用 unattend.txt 文件启动安装程序。此时,安装是无需人工干预的,并且在没有管理员干预的情况下进行。Unattended 团队甚至进一步创建了自定义脚本,可以安装您可能想要添加到配置中的其他软件(例如,自动 VPN 或 Microsoft Office)。
由于 Unattended 没有打包安装,并且安装过程与标准./configure && make install非常不同,所以我坐下来花了一些时间阅读网站上的文档。基本上,如上所述,Unattended 系统利用 PXE 和 Linux,加上 Samba 用于分发安装位,以及一堆 Perl、shell 和批处理脚本来完成许多安装 “魔法”。
文档要求您拥有可用的 DHCP 和 DNS 服务器,以及 Samba 服务器。我已经为 LTSP 服务器配置了 DHCP 和 DNS,因此根据分步文档,sudo apt-get install samba安装了 Samba 服务器。接下来,我从网站下载了 Unattended 发行版,并在 /opt/unattended 中解压缩了它。然后,我在我们的 DNS 服务器上创建了一个 CNAME 记录,该记录将 ntinstall 指向安装服务器的真实主机名。然后,我在 /etc/samba/smb.conf 中配置了 Samba 服务器,并包含以下共享信息:
[global] ... guest account = guest unix extensions = off ... [install] comment = Unattended writable = no locking = no path = /path/to/unattended/install guest ok = yes
最后,是时候用 Windows 位填充操作系统分发点了。这是通过在 <unattended root>/install/os 目录下为您选择安装的任何 Windows 版本创建目录来完成的。在我的例子中,我创建了一个 /opt/unattended/install/os/winxp 目录,并通过 Samba 将该目录挂载到我的桌面上。然后,我将 Windows 安装媒体放入我桌面上的 CD 驱动器中,并将 CD 中的 /i386 目录复制到服务器上的 /install/os/winxp 共享中。现在,我的 Unattended 服务器理论上已经准备好安装系统了……除了没有办法从启动菜单中选择 Unattended 安装。
在这里,Kyle 的文章再次提供了帮助。我需要的是一个 PXE 启动菜单,感谢他的文章,我能够在很短的时间内完成一个。我必须从 Unattended 网站上的 linuxboot zip 文件中的 tftpboot 目录中取出 bzImage 和 initrd 文件,并将它们放在 /var/lib/tftpboot/ltsp/i386/ 目录中(我将 bzImage 重命名为 unat,将 intird 重命名为 unatin.img,以便更好地区分它们)。
然后,我在服务器上创建了一个 /var/lib/tftpboot/ltsp/i386/pxelinux.cfg/default 文件(清单 1),其中包含来自 LTSP 服务器和 Unattended 服务器配置的 syslinux 引导参数的组合。请注意 DISPLAY 和 LABEL 指令。DISPLAY 指令声明当机器启动时,您会在屏幕上看到文件 pxemenu.msg。这包含菜单的文本。LABEL 指令是您键入以启动特定菜单选项的内容。在本例中,如果我键入 “1”,我会得到 Ubuntu LTSP 会话(这也是默认选项),如果我键入 “2”,我会得到 Unattended Windows 安装。
清单 1. pxelinux.cfg/default 文件示例
default 1 serial 0,9600n8 timeout 300 prompt 1 DISPLAY pxemenu.msg F1 pxemenu.msg LABEL 1 KERNEL vmlinuz APPEND ro initrd=initrd.img quiet splash LABEL 2 KERNEL unat APPEND initrd=unatin.img z_user=guest z_password=guest ↪z_path=//192.168.1.20/install
现在,当我启动 PXE 客户端时,我可以选择是转到 Ubuntu LTSP 会话还是 Unattended 安装。此时,我测试了 Unattended 安装,它在某种程度上起作用了——它安装了一个基本的 Windows 系统,但它没有安装任何驱动程序,也没有安装操作系统的任何补丁。我意识到我被 Ubuntu 的驱动程序覆盖范围和更新管理器宠坏了,但我仍然坚持不懈地继续完善系统,以便驱动程序和更新安装在没有我的干预的情况下发生。
事实证明,我不需要重新发明轮子,因为驱动程序问题和更新问题都已由 Unattended 团队解决。就驱动程序而言,有一种方法可以将 DriverPacks(驱动程序的大型压缩存档)集成到 Unattended 系统中。这对于本文的范围来说有点太复杂了,但有关更多信息,请参阅 “资源” 部分中的 DriverPack 链接。
关于自动更新安装,Unattended 人员使用的方法在其资源利用方面非常类似于 Linux。在 Unattended 根路径下,有两个目录:/install/scripts 和 /install/tools 目录。scripts 目录包含 Windows 批处理文件 (.bat),这些文件用于自动安装各种软件包以及一些基本更新。tools 目录包含一组脚本,这些脚本将查看您的 Unattended 服务器的当前配置和 scripts 目录,然后将其与 Unattended 团队维护的 CVS 树进行比较。然后,脚本将获取最新的 .bat 文件,并将它们放在 scripts 目录中的正确位置。此时,使用 Unattended 系统完成的下一个 Windows 安装将获得所有补丁并自动安装它们。系统甚至会在适当的时候重新启动,然后继续安装系列中的下一个补丁。要更新 Unattended 系统的补丁存储库,只需运行:./script-update; ./check; ./prepare从 Unattended 根目录下的 /install/tools 目录。
事实证明,CVS 脚本存档以及 wiki 上的脚本存档非常宝贵。这些资源使我能够完成安装的完全自动化,现在,我拥有了一个满足我们公司 Windows 需求的配置。在安装开始时输入大约 30 秒的机器特定信息后,我现在可以走开,并且知道 Windows、Office、Cisco VPN 客户端、Symantec Anti-Virus 以及我的 Windows 用户需要的许多其他东西都将按照我的方式自动完成,而无需我自己或另一位工作人员来照看它。
最后,感谢 Ubuntu 和 LTSP 团队的努力,我现在拥有了一个环境,即使在用户的系统可能出现某种问题时,也能让我的用户做一些工作。而且,感谢 Unattended 团队,我不必亲自坐在 Windows 机器旁安装它,也不必处理半生不熟的映像或其他奇怪的打包解决方案。我已经开始获得关于如何进一步扩展这个系统的其他想法。
资源
“PXE Magic:使用菜单的灵活网络引导”,作者:Kyle Rankin(2008 年 4 月号 LJ):www.linuxjournal.com/article/9963
Ubuntu Wiki—LTSP 安装:https://help.ubuntu.com/community/UbuntuLTSP/LTSPQuickInstall
Ubuntu 8.04 和 8.10 中的 Active Directory 身份验证:anothersysadmin.wordpress.com/2008/04/06/howto-active-directory-authentication-in-ubuntu-804
Unattended:Windows 部署系统:unattended.sourceforge.net
Unattended 分步说明:unattended.sourceforge.net/step-by-step.php
Unattended Wiki:ubertechnique.com/unattended/FrontPage
将 DriverPacks 与 Unattended 结合使用:ubertechnique.com/unattended/BTS_Driver_Packs
Unattended 脚本存档:ubertechnique.com/unattended/Scripts
Bill Childers 是硅谷的一位 IT 经理,与妻子和两个孩子住在一起。他非常喜欢 Linux,可能应该时不时地多晒晒太阳。在他的业余时间,他为吉尔罗伊大蒜节工作,但他身上没有大蒜味。