PXE自动化安装实战

什么是PXE

  PXE(Pre-Boot Execution Environment)是Intel开发的一种引导方式,原本用于使工作站通过网络从远端服务器下载镜像后引导启动系统,与传统的硬盘引导相对应。注意该功能需要网卡包含PXE芯片。

  在启动过程中,BIOS把网卡ROM中的PXE Client(包含了DHCP和TFTP的客户端)调入内存中执行,然后由PXE Client向DHCP服务器请求分配IP地址,再用TFTP(Trivial File Transfer Protocol)或MTFTP(Multicast Trivial File Transfer Protocol)协议下载一个启动软件包到本机内存中执行,由这个启动软件包完成终端基本软件设置,从而在本机引导存放在PXE Server中的终端操作系统。

  实际上目前PXE技术常常和KickStart(一种无人职守安装方式)结合使用,便于系统管理员在大规模的服务器集群环境下对服务器实现批量安装。KickStart通过记录典型的安装过程中所需人工干预填写的各种参数,生成一个名为ks.cfg的文件,从而安装程序可以读取ks.cfg文件实现无人值守的安装过程。不过现在随着虚拟化的普及,物理机的装机量级有所下降。所以在中小型的项目环境下,PXE的上场机会很容易被虚拟化克隆技术所取代。

PXE自动安装流程

  • 管理员在DHCP服务器中将刚刚上架好的机器的MAC地址绑定特定IP和主机名,并指定PXE启动文件。

  • 服务器加电启动,其实会自动在启动方式中尝试网卡启动,网卡加载PXE Client,询问DHCP服务器获取IP地址,然后以TFTP的形式获取Linux启动文件。

  • PXE通过ks.cfg配置文件完成安装

部署PXE服务器

  前面提到,PXE是C/S架构的协议,其中客户端集成在了网卡中,服务端则需要我们自己部署。我们主要在PXE Server上部署DHCP和TFTP服务,并进行引导装机的配置。

  • DHCP服务部署

  和以前一样,我们部署都是默认从最小化安装后,已经进行了初始开局的系统开始操作。首先安装DHCP服务:

yum install -y dhcp

  编辑配置文件/etc/dhcp/dhcpd.conf,初始为空,内容可参考/usr/share/doc/dhcp*/dhcpd.conf.example示例:

vi /etc/dhcp/dhcpd.conf
# 忽略客户端的DNS更新功能
ignore client-updates;
# 动态分配的IP地址段
subnet 192.168.137.0 netmask 255.255.255.0 {
  range 192.168.137.201 192.168.137.240;
  # 客户端的子网掩码
  option subnet-mask 255.255.255.0;
  # 客户端的网关
  option routers 192.168.137.1;
  # 客户端的DNS
  option domain-name-servers 114.114.114.114;
  # 下发给客户端tftp服务器IP
  next-server 192.168.137.142;
  # 下发给客户端的安装文件配置
  filename "pxelinux.0";
}

  注意,最新版的dhcpd已经不需要指定监听网卡,服务会自动监听在配置文件中声明的网段所在的网卡。

  启动服务:

systemctl start dhcpd

  注意,通过netstat可以发现dhcpd监听的是UDP的67端口,故需要在防火墙进行放行:

firewall-cmd --zone=dmz --add-port=67/udp --permanent
firewall-cmd --reload

  另外,本文在虚拟机环境下测试,所以需要关闭虚拟机在vmnet8网段里虚拟机自身的DHCP功能,防止干扰我们的DHCP服务器:

  打开一台处于vmnet8下的虚拟机,验证DHCP功能,发现可以正常获取IP信息,说明DHCP功能正常:

  • TFTP服务部署

  安装TFTP服务端tftp-server,另外TFTP需要xinetd为其提供守护进程,故需要同时安装xinetd包:

yum install xinetd tftp-server

  配置xinetd来管理TFTP:

vi /etc/xinetd.d/tftp
# 将这一行由默认值yes改为no即可
disable                 = no

  开启服务:

systemctl start tftp
systemctl start xinetd

  注意,通过netstat可以发现dhcpd监听的是UDP的69端口,故需要在防火墙进行放行:

firewall-cmd --zone=dmz --add-port=69/udp --permanent
firewall-cmd --reload

  在tftp的工作目录下放置测试文件test,测试其服务是否正常:

cd /var/lib/tftpboot/
touch test

  在测试机windows上开启TFTP客户端功能(关闭windows自带防火墙)访问tftp服务器,尝试下载test文件:

  测试成功,TFTP搭建完毕。

  • 准备PXE安装文件

  在我们作为PXE服务器的虚拟机中挂载系统安装使用的光盘DVD:

mkdir /dvd
mount /dev/cdrom /dvd

  注意,本来可以将光盘内容都放在tftp中,但是由于tftp速度较慢,故只将引导文件保留在tftp中,其他安装文件通过http的形式提供给客户端机器。

  下载部署httpd:

yum install httpd

  复制光盘内容到httpd默认根目录下,开启httpd服务并放行80端口,查看浏览器确认可以访问光盘内容:

cp -r /dvd/ /var/www/html/
systemctl start httpd
firewall-cmd --zone=dmz --add-port=80/tcp --permanent
firewall-cmd --reload

  安装syslinux,因为我们需要他的组件pxelinux.0作为BIOS平台的引导程序。这里推荐直接安装syslinux-tftpboot这个包,比安装syslinux会自动帮我们完成一些设置:

yum install syslinux-tftpboot

  此时查看会发现,我们的默认tftp目录下除了我们自己创建的测试test文件,还自动生成了许多引导文件:

[root@localhost dvd]# ll /var/lib/tftpboot/
total 1452
-rw-r--r--. 1 root root   5696 Oct 31 08:25 cat.c32
-rw-r--r--. 1 root root  20832 Oct 31 08:25 chain.c32
-rw-r--r--. 1 root root    800 Oct 31 08:25 cmd.c32
-rw-r--r--. 1 root root   4620 Oct 31 08:25 config.c32
-rw-r--r--. 1 root root   5388 Oct 31 08:25 cpuid.c32
-rw-r--r--. 1 root root  15064 Oct 31 08:25 cpuidtest.c32
-rw-r--r--. 1 root root   5132 Oct 31 08:25 disk.c32
# 此处省略无意义的输出...

  其中比较重要的是pxelinux.0(PXE启动引导程序),gpxelinux(gPXE引导程序,实现HTTP协议下载Linux镜像从而加速安装)。

  此外,我们还需要手动将下列文件放入tftp工作目录:vmlinuz(vmlinuz是可引导的、压缩的内核文件,vmlinuz是vmlinux的压缩文件。是可执行的Linux内核)、initrd.img(initrd.img是initial ram disk的简写。initrd用来临时的引导硬件到实际内核vmlinuz能够接管并继续引导的状态)、boot.msg(启动信息,可以修改)、pxelinux.cfg/default(安装菜单)。

cp /var/www/html/dvd/images/pxeboot/vmlinuz /var/lib/tftpboot/
cp /var/www/html/dvd/images/pxeboot/initrd.img  /var/lib/tftpboot/
cp /var/www/html/dvd/isolinux/boot.msg /var/lib/tftpboot
mkdir /var/lib/tftpboot/pxelinux.cfg
cp /var/www/html/dvd/isolinux/isolinux.cfg /var/lib/tftpboot/pxelinux.cfg/default
vi /var/lib/tftpboot/pxelinux.cfg/default
# 这里只保留菜单结构的核心配置,其他可以删掉
# 指定默认启动的是'label ks'中标记的启动内核
default ks_CentOS7
# 为'0'时则不提示,将会直接启动'default'参数中指定的内容。如果系统环境固定,大可设置为0
prompt 1
# 在用户输入之前的超时时间
timeout 60
#'label' 指定了在 'boot:' 提示符下输入的关键字,留作多个系统类型时的扩展
label ks_CentOS7
  # 提示字符
  menu label ^Install CentOS 7 by Kickstart
  # 指定要启动的内核
  kernel vmlinuz
  # append指定追加给内核的参数,后面是ks.cfg文件存放位置
  append initrd=initrd.img inst.repo=http://192.168.137.142/dvd inst.ks=http://192.168.137.142/ks/ks.cfg
  • 准备ks.cfg配置文件

  我们通过Kickstart图形化工具,生成我们需要的系统安装过程的模板。当然足够熟悉了以后也可在自己直接编辑生成ks.cfg文件。

  由于测试环境都是最小化安装,这里补一下X图形化环境:

yum -y groupinstall "X Window System"
yum install system-config-kickstart

  在Xshell里配置好Xming转发,即可启动图形化配置界面:

system-config-kickstart

  在图形化界面内,根据喜好完成配置即可(切记其中安装方式中的安装来源选择为HTTP)。这个步骤很简答,不再赘述,如有需要,可以查看我网盘里的详细步骤,或直接下载配置好的最小化测试安装ks文件,下载完配置文件,根据需求添加需要的包,修改自己的磁盘空间和其他参数即可。仅供测试所以只选择了base包,不修改直接使用会无法开机哦~开玩笑的,肯定可以正常开机(附件密码baiyeliuzhuan)。另外,自己想在本地使用图形化界面定制的话,还要提前修改本地repo文件中第一行成[development],否则会无法加载软件包。我是附件(^_−)

  • 自动化安装测试

  新建一个虚拟机,不要添加安装介质,直接加电开机测试效果:

  成功和局域网内的DHCP服务器交互,获取了IP:

  全程无人干预,自动选择,直至安装完毕自动重启:

  本文只是简要对PXE自动安装进行流程梳理,在实际生产环境中,需要在DHCP服务配置中详细规划好机器的MAC和IP对应关系;而且,有些个性化开局的补充操作,需要自己定制脚本放在ks.cfg中,本文暂不涉及。


发表评论

评论列表,共 0 条评论

    暂无评论