第十七章 PXE 和Kickstart
17.1 PXE简介
17.1.1 系统启动原理
我们在《Linux系统基础》一书中介绍过Linux的开机启动顺序,当时并未做太深入的介绍。现在,我们先来解释一下启动过程中内核和系统主程序的启动。
我们知道,Linux系统的启动程序都存放在/boot/目录下,先ls查看一下里面的文件:
图中我们可以看到有vmlinuz-3.10.0-693.el7.x86_64文件,这就是Linux的系统内核,还有initramfs-3.10.0-693.el7.x86_6.img文件,是系统的镜像文件,我们可以理解为是Linux系统的主程序。
而在开机时,引导程序grub会读取grub配置文件(/boot/grub2/grub.cfg),这个文件中记录了内核文件和镜像文件的存放位置。
vi /boot/grub2/grub.cfg 可见代码段:
上一本书中我们介绍过,这是开机grub界面中一个供选项的代码,里面set root=’hd0,msdos1’表示系统所有启动相关的文件都在第一块磁盘(hd0表示本机第一块磁盘)的第一个分区上(msdos1表示第一个分区)。PS:此配置文件中对于磁盘及分区的表示并未按照sda1 、sda2的方式表示,是一种独立的表示模式。
我们可以在系统中df -h 查看一下:
可见/boot目录挂载的就是sda1分区,与hd0,msdos1表示的意义是完全对应的。也就是由此处指定了开机启动文件的存放位置,然后配置文件中的linux16 行,指定了hd0,msdos1分区中内核文件的文件名,initrd16 行指定了镜像文件的文件名。由此可明确出grub配置文件帮助系统找到了系统内核和镜像,在开机时逐一启动起来。
综上,我们可以知道,其实grub的配置文件其实只是一个说明、指向性的文件,描述了启动中支持的文件系统类型、启动类型、分区表类型等等(有insmod行指定)及各启动文件所在的位置及文件名。
17.1.2 PXE功能
上一节介绍了Linux的启动原理,从中我们可以看出,系统启动时需要激活内核与镜像文件,且内核和镜像文件都存放在/boot目录下。
其实在系统安装时,也需要先启动内核和镜像,然后再启动安装程序。但是我们不一定必须用光盘或优盘安装系统,也可以通过网络安装系统。这就是PXE服务的功能。
我们可以搭建一台PXE服务器,并借助于文件服务(如:tftp、ftp等)把内核、镜像、安装程序共享出来。另一台裸机,开机时设置从网卡启动,直接访问文件服务器,获取内核、镜像等文件并激活,从而实现系统的引导,引导成功后再调用安装程序,开始安装Linux系统。
简单的说,PXE就是当一台裸机需要安装系统时,设置为从网卡启动,则会从其他主机上获取到内核、镜像、安装程序,从而正常安装系统。
17.2 TFTP服务
17.2.1 TFTP简介
我们知道在网络上实现文件传输可以使用FTP服务,其实在局域网内,还有一个TFTP服务,也可以实现文件传输。TFTP服务较为精简,配置简单,传输速度快,更适合于局域网内的文件传输业务。TFTP使用UDP 69端口提供通信,UDP连接不保证传输质量,所以适合于局域网内比较稳定,快速的网络环境。
TFTP服务使用被动进程管理机制。所谓被动服务,就是多个不常使用的服务,由于使用率低,如果每个服务都使用一个专用的守护进程(监听端口),日常又不大用到,那么这些服务将十分浪费内存与CPU资源。所以,这些服务我们可以使用一个总的进程做所有端口的监听,当有客户访问某个服务时,由该总进程捕获到,并调用起相应的服务进程。所以这些服务被称为被动服务。而负责所有端口监听的总进程,我们称为超级进程。在RHEL7.X之前版本,超级进程是xinetd(有时需要手动安装xinetd的软件包才可以使用);而在在RHEL7.X版本中,被动进程可以直接被systemd进程代理监控端口,无需安装xinetd软件包。PS:其实安装了xinetd后,systemd和xinetd都可以完成代理监控功能,后面会有详细介绍。
17.2.2 TFTP服务部署
TFTP服务安装十分简单,只需要安装tftp 和tftp-server两个包,如下:
yum -yinstall tftp tftp-server
安装完毕后,可以编辑配置文件,启动TFTP:
vi /etc/xinetd.d/tftp
里面改:
wait = no ---关闭延时启动
disable = no ---启动tftp,即让超级进程代理监听端口
另外,里面的server_args行指定了tftp默认共享出的目录(/var/lib/tftpboot/),供客户访问。
配置文件配置完毕后,即可启动服务了:
systemctl restart tftp.socket
systemctl enable tftp.socket
注:RHEL7.X中被动服务都以.socket为后缀,服务文件存放在/usr/lib/systemd/system/目录中。PS:常用服务(又称为主动服务)文件也存放在这个目录下,以.service为后缀。
systemctl status tftp.socket ---查看服务状态
lsof -i:69 ---查看端口是否正在被监听,可见是由systemd进程监听的
tips:
如果安装了xinetd软件包,在编辑完tftp配置文件后,可以不用启动tftp.socket服务,可以直接启动超级进程xinetd(启动命令:systemctl restart xinetd),则xinetd会自动查看/etc/xinetd.d/下的所有被动进程配置文件(其中包括tftp),然后统一代理监听。则TFTP服务也可以成功启动(lsof -i:69可见是由xinetd监听的)。
客户端也要安装tftp软件包后,即可访问tftp服务器验证了,格式如下:
tftp ip地址 ---连接tftp服务器
> put 文件名 ---上传文件
> get 文件名 ---下载文件
读者可以自行实验尝试一下文件的上传与下载。
17.3 PXE配置
17.3.1 PXE启动原理
首先,既然PXE是支持网络安装系统的,那么我们就要在客户机主板的bios界面设置为开机从网卡启动(现今主机一般都是支持网卡启动的)。虚拟机开机进入bios是在开机界面是点F2键,如下图最后一行提示文字所示:
进入bios后设置为网络启动,即网卡启动,结果如下图。PS:此界面下点击+、-号(要点shift 和=组合键才能出+的效果)可调整启动顺序:
注:图中只是虚拟机的bios界面,比较简陋。相对于主机或服务器,一般开机按delete键才能进入bios界面,再调整启动顺序,首选从网卡启动。
客户机设置网卡启动后,开机时会由网卡启动主机,那么网卡就需要有ip才能正常通信,所以此时,需要在网络中有一台DHCP服务器给网卡分配ip,并告知其TFTP服务器的地址。则客户机则会使用所获得的ip地址,访问TFTP服务器。
在TFTP服务器上,可以事先共享出Linux系统的引导程序(pxelinux.0)、系统内核(vmlinuz)及镜像文件(initr.img),关于内核和镜像文件的路径、系统安装程序位置等信息会有专用的配置文件(由pxelinux.cfg改编成的default)做指定。
所以,总结来说,就是客户机开机时由网卡启动,申请ip,由网络中的DHCP服务器为其分配ip并告知其TFTP服务器的地址,客户机获取到ip后访问TFTP服务器,获取到引导程序,运行引导程序后,再找TFTP服务器获取启动配置文件,根据该配置文件中的指定,获取系统内核及镜像,启动后引导系统安装程序。具体流程如下图:
17.3.2 PXE安装系统实例
理解了之前的理论原理,下面我们来具体演示一下配置步骤。本实验需要两台虚拟机,服务器IP地址192.168.10.10,具体配置如下:
mount /dev/sr0 /media ---先挂载上系统安装光盘
1、配置tftp服务
yum -y install tftp tftp-server
vi /etc/xinetd/tftp
改:wait =no
disable = no
systemctl restart tftp.socket
2、收集相关文件,使用TFTP共享出去
yum -y install syslinux ---安装引导程序软件包
cd /usr/share/syslinux/
cp pxelinux.0 /var/lib/tftpboot/ ---复制引导程序
cp chain.c32 menu.c32 memdisk mboot.c32 /var/lib/tftpboot/
---复制多个辅助文件
cd /media/isolinux ---进入光盘下的isolinux目录
cp vmlinuz /var/lib/tftpboot/ ---复制内核
cp initrd.img /var/lib/tftpboot/ ---复制镜像
cp vesamenu.c32 /var/lib/tftpboot/ ---复制辅助文件
mkdir /var/lib/tftpboot/pxelinux.cfg
cp isolinux.cfg /var/lib/tftpboot/pxelinux.cfg/default
---复制启动配置文件
3、配置启动配置文件
vi /var/lib/tftpboot/pxelinux.cfg/default
注:该配置文件中设置的是客户机开机时显示的引导菜单界面,里面可以手动配置供选的菜单及很多辅助设置(如显示的背景图片、文字颜色等)。其中label开头的段落表示一个供选项及其执行的操作。一般此文件中我们可以把原有的label段落全部删除,然后手动编写自定义的菜单项,写入案例如下:
label linux ---为供选项设置一个标签
menulabel install CentOS 7 ---menu label后设定供选项的显示文字
kernel vmlinuz ---指定获取Linux内核
append initrd=initrd.img inst.repo=ftp://192.168.10.10/cdrom
---指定,获取系统启动镜像,并指定安装源的FTP路径
4、配置DHCP服务
yum -y install dhcp
vi /etc/dhcp/dhcpd.conf ---写入
subnet 192.168.10.0 netmask 255.255.255.0
{
range 192.168.10.100 192.168.10.200;
filename "pxelinux.0"; ---指定引导程序文件名
next-server 192.168.10.10; ---指定tftp服务器地址
}
systemctl restart dhcpd
5、配置FTP服务发布系统安装程序
yum -y vsftpd
systemctl restart vsftpd
注:客户端以匿名用户身份访问FTP服务即可,所以无需配置
mkdir /var/ftp/cdrom
mount /dev/sr0 /var/ftp/cdrom ---挂载系统安装光盘到ftp目录下
注:此项设置对应第3步的配置文件中对于安装源路径的设置
OK,到此PXE服务器配置完毕。
然后可以使用客户机启动验证PXE引导并获取安装源。
tips:客户机虚拟机建议内存至少在2G以上,若是太小,容易无法正常启动安装程序,造成实验失败。
客户机启动时,观察启动过程,可见到开启后通过DHCP获取ip:
启动后会有显示菜单供选择,即上面步骤3中default文件中的设置:
选中后回车会见到正在获取内核、镜像的界面:
之后进入系统安装界面了。
17.4 kickstart 无人值守安装
17.4.1 kickstart简介
上节我们介绍了PXE启动、安装的配置过程,但是大家会发现,客户机启动成功进入安装界面后,仍需人为手动配置各安装项,那么能否让客户机自动安装系统,而不需要人为参与配置呢?kickstart就是完成此项功能的工具。
当然,CentOS安装过程中有很多需要人为做设置的项,我们可以通过kickstart工具,事先将安装过程中的各项配置保存到一个配置文件中,并将此文件共享出来,让客户机安装系统时自动获取到并执行。
17.4.2 kickstart配置
注意:配置kickstart时,yum源的标签设置(又称id设置,即[]中的标记)必须为development,否则,kickstart中指定软件包时会报下载失败,如下图:
另外,建议服务器端使用GUI图形界面,然后安装kickstart软件包
yum -y install system-config-kickstart
安装后,在“应用程序”菜单中选择“系统工具”=>kickstart,如下图:
点开后,就可以配置各安装细节了:
逐一配置其中各项,其中“安装方法”这一项需要指定为ftp服务器地址与目录,因为我们的安装光盘是通过vsftp服务发布出来的:
之后各项如下图:
注:软件包选择处可用,是因为上面提到的yum源标签设置为development。
其他各项都使用默认设置即可
配置完毕点击“文件”菜单,选择保存,指定保存路径与文件名。PS:这里我们保存到/root/下,文件名为ks.cfg
然后我们把这个ks.cfg文件复制到ftp目录下,以便共享出去。
cp /root/ks.cfg /var/ftp/
然后我们再次编辑/var/lib/tftpboot/pxelinux.cfg/default文件,写入自动安装的供选项:
vi /var/lib/tftpboot/pxelinux.cfg/default ---追加写入
label linux2
menu label install CentOS 7 AUTO
kernel vmlinuz
append initrd=initrd.img inst.repo=ftp://192.168.10.10/cdrom ks=ftp://192.168.10.10/ks.cfg ---指定ks.cfg文件的获取方式,PS:此处与append都是在一行内的
到此,PXE+kickstart自动化安装就部署好了,然后启动客户机,就会有两个供选项,选择下面一项就会自动化安装系统了:
tips:/var/lib/tftpboot/pxelinux.cfg/default文件中的第一行默认是default vesamenu.c32,其实是指开机自动运行 /var/lib/tftpboot/目录下的vesamenu.c32文件,以显示上图的选择界面,我们可以ls /var/lib/tftpboot/ 查看得到:
其实,如果我们想开机时直接进入kickstart自动安装,可以把/var/lib/tftpboot/pxelinux.cfg/default文件中第一行的default改为:default linux2,即设置为供选项的label标签,如下图:
这样,客户机开机后就不会有选择界面了,会直接进入linux2的启动设置。
另外,本实验中我们是以VSFTP服务共享出的安装源,其实,我们也可以使用httpd服务,将光盘安装源及ks.cfg文件共享出来,让客户机使用,只需要在/var/lib/tftpboot/pxelinux.cfg/default文件中设置源为http的url即可。具体操作过程读者应该可以自行配置完成。