前言
本文讨论利用网络系统部署技术实现办公电脑的批量自动装机,可以在无人值守的情况下对电脑进行批量自动安装系统,满足企业大批量电脑装机的需求,提升运维人员的工作效率。
映像 – 对计算机的一个分区、一个磁盘或全部磁盘内容的完整拷贝,一般保存为文件形式,可用来将计算机恢复至拷贝时完全相同的状态。赛门铁克公司的Ghost是最为有名的映像制作工具,Linux下也有PartImage、PartClone等同类工具。
网络映像 – 使用传统的网络安装技术,计算机可以摆脱安装介质的束缚,但还是要经历操作系统的安装过程,并且要重复完成操作系统配置和应用软件安装任务。而网络映像将网络引导和映像技术相结合,可以将安装配置好的操作系统通过网络分发到多台计算机,从而批量完成系统部署任务。
PXE – Preboot eXecution Environment,Intel公司开发的一种网络协议,用于实现计算机通过网络引导,完成操作系统的安装配置。过程中,计算机通过DHCP协议获取IP地址,通过TFTP协议下载引导文件,再通过FTP、NFS、HTTP等高级协议下载操作系统安装文件。
iPXE– PXE协议的开源实现,相较于PXE扩展了更多的功能。
BSDP– Boot Service Discovery Protocol,苹果公司对DHCP协议进行扩展,提出了该协议,用于实现Mac计算机的网络引导。
FOG – 一个利用网络映像技术实现网络计算机克隆与管理的开源项目。
Dnsmasq– 一个轻量级的DNS转发器,用于向小规模网络提供域名解析服务。同时,它还能提供DHCP和TFTP服务,特别是前者支持proxy模式,不向客户机分配IP地址,而只是补充提供引导信息,可以与既有DHCP服务器完美结合,实现PXE网络安装。
1. 项目背景
1.1. 办公电脑装机现状
目前公司的办公电脑主要是ThinkPad的T系列、X系列,以及Macbook Pro,主要使用Windows 10和Mac OS 10操作系统,少数同学会在ThinkPad上安装CentOS、Ubuntu等Linux操作系统。我们对上述几种机型目前采用的装机手段进行了简单调研,详见下表:
1.2. 面临的主要问题
LANDesk不尽如人意
在过去一年的使用中,LANDesk出现了不少问题,例如缺少相应驱动程序、无法正常分区、自动加域失败等等。国内的代理商技术能力有限,很多问题无法解决,反而要靠我们自己编写程序实现。而其作为一个商业软件,每年还要收取不菲的维保费用。
2.新版本Mac OS不再支持映像
Mac OS从10.13版本以后不再支持通过映像来部署系统,包括雷电口克隆和网络映像的方式。目前,公司Macbook下发时安装的还是Mac OS 10.12,需要用户自行升级,这并非长久之计。
参考资料:
https://scriptingosx.com/2017/10/imaging-is-dead/
2. 方案设计
2.1. 需求分析
从前述的问题出发,我们有了一个新的构想:搭建一个自助装机平台,能够满足当前所有的办公电脑装机需求,操作方法简单、统一,甚至对系统部署技术了解不多的人员也能够自行操作。这个平台应该实现如下功能:
基于广泛应用的技术方案,能从互联网上获取丰富资料,能从社区、论坛得到技术支持;
应该是免费的,为公司节省运营成本;
能够对部署的系统进行定制,安装必要的软件,执行必要的配置,自动完成一些后置操作(可能需要连接办公网);
不影响办公网运行,不造成大的流量,不在办公网设备上增加额外配置;
最好能够同时支持PC和Mac,并用类似的方式进行安装;
最好是基于开源项目,通过二次开发来满足灵活的业务需求。
2.2. 方案选型
在头脑风暴阶段,我们首先想到的是官方提供的方案,因为其对操作系统的支持更好。具体如下:
微软提供了MDT(Microsoft Deployment Toolkit),可以将定制好的Windows系统捕获为WIM格式的映像,再通过PXE协议将其部署到其它机器。该服务需要运行在Windows Server上。
对于Mac,可以在一台部署好的Macbook上安装macOS Server这个应用(需要支付少量费用,$19.99,在一个Apple ID下购买即可,可在多台电脑上使用),即可通过BSDP协议在其它机器上实现Mac OS的映像部署。不过,这个方案同样在10.13版本后失效。
Linux对PXE本来就有良好支持,也有很多软件可以实现网络映像功能,例如CloneZilla。
上述方案,都是针对特定的操作系统,甚至部署服务的OS环境都不尽相同,难以形成一个统一的解决方案。何况,Mac的方案已经被验证不支持新版本的Mac OS。
这个时候,一个名为FOG的开源项目进入了我们的视野。在其官方网站fogproject.org的首页上,有一句描述该项目的话:A free open-source network computer cloning and management solution。仔细阅读其官网上的说明,该项目宣称支持Windows、Mac OS和各种Linux发行版的捕获、部署和管理,完全符合我们的需求。所以,我们决定将其作为研究方向,着手验证其对三类操作系统的支持情况。
2.3. 方案验证
FOG项目提供了完善的文档,按照其wiki上的教程操作,即可完成服务器的搭建,待装电脑的注册,以及映像的捕获与部署。
参考资料:FOG wiki
https://wiki.fogproject.org/wiki/index.php?title=Main_Page
下面只就一些关键问题进行说明:
代理DHCP服务器
无论是PXE协议及其衍生版本,还是BSDP协议,实现网络引导的第一步,就是要让计算机获得一个IP地址,并能用该地址连接到网络引导服务器,下载引导文件。因此,DHCP服务必不可少,在传统的方案中,往往由网络引导服务器来提供该服务。但是,现存的网络环境中往往已经配置了DHCP服务器,私自架设可能会影响其它设备正常获取IP地址,造成十分恶劣的后果。而如果搭建一个完全隔离的网络环境,系统装好后,一些需要联网执行的后置操作(如加域),将无法完成。
另一种思路,直接使用现有的DHCP服务器,那么它在向客户机分配IP地址的同时,还需要告知引导服务器的IP地址和引导文件的名称。DHCP协议中规定了43、60、67、68等option来支持这个功能,但一者这些简单的参数使用十分不灵活,二者网络管理员往往不希望别人对DHCP服务器进行配置(更不用提直接在该服务器上搭建PXE服务)。所以,这个方案也不理想。
为了完美解决这个问题,我们使用Dnsmasq提供的一种proxy模式的DHCP服务。根据DHCP协议,在获取IP地址的过程中,客户机会首先广播一个DHCP Discover请求,这时正式DHCP服务器会广播一个DHCP Offer响应,里面包含分配的IP地址。与此同时,代理DHCP服务器也会广播一个DHCP Offer响应,但里面不包含IP地址,只包含网络引导的信息。这两个Offer都会被客户机接收,客户机根据第一个Offer,再广播一个DHCP Request请求,通知自己选择了正式DHCP服务器提供的IP地址,而后者再广播一个DHCP ACK响应,客户机接收后就完成IP地址的配置。接下来,客户机根据代理DHCP服务器提供的信息,继续进行网络引导的后续步骤。
2.Macbook加载iPXE映像
讨论这个问题,要先了解FOG的网络引导过程,它在传统PXE网络安装的基础上进行了扩展。首先,客户机通过DHCP获取IP地址,并获知FOG服务器的IP地址和匹配自己硬件架构的iPXE映像文件名。然后,通过TFTP下载iPXE映像并将其加载,这样客户机上就启动了一个iPXE客户端。这个客户端再通过TFTP下载并执行default.ipxe脚本,该脚本通过HTTP协议加载boot.php来启动FOG客户端。
之所以要先加载iPXE映像,是因为不同客户机的硬件存在差别,有的可能不支持PXE,如Macbook;有的支持标准的PXE,但该协议下只能通过TFTP传输文件,无法使用HTTP等高级协议;有的也支持iPXE,但版本较低,不能完美启动FOG客户端。云平台上的KVM虚拟机就属于最后一种情况,其自带的iPXE是1.0.0+ (4e85b27)版本(4285b27是git版本号,后同),是2017年1月发布的;而FOG服务器上的iPXE映像是1.0.0+ (d2063)版本,是2018年5月发布的。default.ipxe脚本中使用的params命令,只有新版本才支持。如果用旧版本直接加载boot.php,就会出现一个比较丑陋的界面:
这种通过PXE或iPXE去加载另一个iPXE映像的方式,叫做chainloading,详细说明见:
http://www.ipxe.org/howto/chainloading
前面已经说过,Macbook不支持PXE,其网络安装使用的是BSDP协议。因此,问题的关键就是如何让Macbook加载iPXE映像。我们尝试了很多方法,最终方案是需要用U盘制作一个FOS USB启动盘。详细的验证过程见下表:
2.4. 系统拓扑
根据最终设计的方案,自助装机平台的系统拓扑如下:
2.5. 业务逻辑
3. 系统部署
3.1. 环境规划
适逢IT服务组要新建专用的装机操作间,我们也利用这个机会对自助装机平台的运行环境提出了一些要求。
硬件配置
自助装机平台运行在一台高性能工作站上,具体的硬件配置要求如下:
2.网络环境
自助装机平台服务器与待装的办公电脑通过有线网络互联,捕获、部署映像会产生较大的网络流量,因此需要一台性能较好的交换机,带有两个以上万兆光口,其它网口为千兆电口。办公电脑通过普通网线连接到千兆口,服务器通过光纤连接到一个万兆口,另一个万兆口用于上连办公网的接入交换机。
自助装机平台不提供DHCP服务,办公电脑在装机过程中依然从办公网的DHCP服务器获取IP地址,并在安装完成后继续沿用该地址,以便完成加域等后置操作。本方案不需要在办公网的DHCP服务器上配置option。
3.其他准备
由于Macbook没有网口,需要配备雷电口-网口转接器,数量根据并行装机的数量决定;
对于Macbook,需要准备1GB以上的U盘来制作FOS引导盘,数量根据并行装机的数量决定。
3.2. 安装FOG
从官方网站上下载最新版本(本例中是1.5.4)的FOG程序包,解压后进入到bin目录下,执行安装程序(安装前关闭防火墙和selinux):
选择操作系统的类型,本例中是CentOS 7.2,所以选择1:
然后选择安装模式,有两个选项,FOG服务器和存储节点,后者用于搭建分布式的FOG环境,这里选择前者:
接下来,指定FOG服务器的IP地址和使用的网口,本方案使用真实的网络,服务器上只配置了一个网口,绑定其内网地址,这里已经自动识别,不需要更改:
这里需要填写的是你服务器的默认网关,DHCP服务器与FOG服务器不在同一个子网下,因此需要经由网关才能与DHCP通信:
指定DNS服务器的IP地址:
而FOG服务器自身不提供DHCP服务:
最后,选择安装附加的语言包:
重新检查一下所有的安装选项,确认没有问题,就可以开始安装了:
安装到一半时,会出现个提示,询问MySQL密码是否为空,这里先选择“Y”:
安装过程即将结束时,会提示访问FOG的WEB管理网站,去执行安装或更新FOG数据库的操作:
打开提示的URL,出现如下页面,点击“Intall/Update Now”按钮即可:
返回安装向导,按回车键,剩余的程序将自动执行完成:
3.3. 安装后的任务
配置Dnsmasq
如“方案验证”部分所述,我们需要利用Dnsmasq的proxy mode来支持PC笔记本的网络引导。该软件包已经随FOG一起安装,只是服务没有启动。这里创建一个单独的配置文件/etc/dnsmasq.d/ltsp.conf,内容如下:(如果没有这个配置文件,客户端在PXE启动的时候,是不会获取到IP地址的)
注:这里面比较关键的是dhcp-boot和dhcp-range参数,前者指定PXE服务器的IP地址和引导文件的名称,后者将Dnsmasq设置为代理DHCP服务器。
启动Dnsmasq服务,并其设置为开机自动启动:
systemctl start dnsmasqsystemctl enable dnsmasq
systemctl start dnsmasqsystemctl enable dnsmasq
参考资料:ProxyDHCP with dnsmasq
https://wiki.fogproject.org/wiki/index.php?title=ProxyDHCP_with_dnsmasq
2.配置防火墙
配置CentOS 7的firewalld防火墙,开放自助装机平台使用的服务端口:
firewall-cmd –permanent –zone=public –add-service=dhcp
firewall-cmd –permanent –zone=public –add-service=http
firewall-cmd –permanent –zone=public –add-service=mountd
firewall-cmd –permanent –zone=public –add-service=nfs
firewall-cmd –permanent –zone=public –add-service=rpc-bind
firewall-cmd –permanent –zone=public –add-service=tftp
firewall-cmd –reload
参考资料:FOG security
https://wiki.fogproject.org/wiki/index.php/FOG_security
3.制作FOS USB启动盘
如“方案验证”部分所述,Macbook需要使用FOS USB启动盘,下面介绍一下制作方法:
安装必要的软件包:
yum -y install dosfstools parted kpartx grub2-install grub2-efi-modules grub2-efi
在当前目录下创建该脚本,见如下附件:
设置该脚本的权限,并执行:
该脚本执行成功后,会在/tmp目录下生成一个映像文件fos-usb.img。
将U盘插入运行自助装机平台的计算机,使用lsblk命令确认其设备文件名,本例中为/dev/sdb:
使用dd命令,将fos-usb.img的内容写入U盘:
编辑U盘中的boot\grub2\grub.cfg文件,设置自助装机平台服务器的IP地址:
set myfogip=172.25.14.13
参考资料:Building USB Booting FOS Image
https://forums.fogproject.org/topic/7727/building-usb-booting-fos-image/3
4.设置数据库密码
安装FOG的过程中,数据库管理员帐号被设置为空密码,这样非常不安全,需要进行修改。登陆本机的MariaDB数据库,执行如下命令:
/var/www/html/fog/lib/fog/config.class.php
4. 附录
4.1. 如果自助装机平台的IP地址改变
FOG修改IP地址:
/opt/fog/.fogsettings
/etc/httpd/conf.d/fog.conf ServerName
/tftpboot/default.ipxe chain
/etc/dnsmasq.d/ltsp.conf
FOG Configuration – FOG Settings – TFTP Server
FOG Configuration – FOG Settings – Web Server
Storage Management Edit: DefaultMember