PXE简介
PXE,就是预启动执行环境,是一种引导启动的方式。这种协议一般由两部分构成,一部分是服务器端,一个是客户端。简单来说,我们通过这种方式可以自己创建一个“安装源”,在安装系统的时候只要能找到这个“源”便可以实现系统的安装。在实现无人值守的安装前,我们必须要搭建一些服务,来实现“安装源”的建立,例如ftp、http、tftp、dhcp等。当一台主机启动时,标准输入输出会将PXE客户端调入我们的内存中进行相关的操作,并提示相关的选项,在这里我们可以进行选择。PXE的客户端通过网络下载(download)启动文件到本地运行。具体过程是,PXE客户端通过网卡向局域网内发送ip请求,然后DHCP服务器会提供给给它一个ip地址和系统安装所需要的文件,接下使用接收到的文件进行系统安装。而安装的过程又需要其他服务器提供的资源,例如:yum源,内核文件等,当主机拿到这些资源,便可以顺利的安装了。最终结果是:任意一台主机在选着网络启动时会获取DHCP服务器分发的ip,通过通过获取到的ip地址与局域网内的TFTP服务器通信并获取启动文件,与FTP或者HTTP通信并获取yum源文件及内核文件等。之后开始自动安装,而这个过程不需要人在做任何操作。
PXE安装优点,这种安装系统的方式可以不受光驱,光盘以及一些外部设备的限制,还可以做到无人值守,大大减轻了运维人员的工作负荷,像在一些主机数量庞大的机房进行批量安装,PXE将是你不二的选择。
整体方案
在实现PXE自动批量安装系统时,首先我们需要有DHCP服务器为我们提供IP地址,如果在一个网络中你连IP地址都获取不到,何谈自动化。其次我们要安装一个系统,那么需要的文件必须要有人为我们提供才可以,应为是网络自动安装,本地是没有任何资源的,我们可以使用HTTP,FTP服务来实现。最后就是获取我们的安装文件,这些文件会引导我们的计算机如何启动,如何配置,我们选择TFTP服务起来提供。整体框架如下图:
以CentOS 7为例,PXE的组件:
DHCP
tftp server
yum repository
kickstart
安装前准备
选择一台主机同时搭建(yum)HTTP、TFTP、DHCP服务,为该子网内的主机提供服务。添加一块仅主机连接的网卡做DHCP专用通道IP10.0.0.1/24。客户端也添加一块仅主机连接的网卡专用通道。
由于涉及到主机间不同基于不同协议的通信,所以为了避免不必要的麻烦,我们选择关闭防火墙以及selinux。生产场景中不建议这样做。
[root@node1 ~]# iptables -F #清空防火墙配置
[root@node1 ~]# setenforce 0 #临时关闭selinux
安装服务
由于我们需要HTTP、TFTP、DHCP服务来提供相应的服务,所以我们必须要在系统中安装,相应的服务。这里需要注意,如果你的系统时最小化安装,那么建议你先安装一些包组,GCC等。如果安装过程中出现包依赖问题,依次安装相应的包即可。
[root@node1 ~]# yum -y install dhcp tftp-server httpd #安装dhcp、tftp、httpd
[root@node1 ~]# yum -y install xinetd #安装超级守护进程xinetd
[root@node1 ~]# systemctl enable dhcpd #开机自启动dhcp
[root@node1 ~]# systemctl enable tftp #开机自启动tftp
[root@node1 ~]# systemctl enable httpd #开机自启动http
[root@node1 ~]# systemctl start httpd #启动http服务
[root@node1 ~]# systemctl start tftp.socket #启动tftp服务
配置的虚拟机网卡和dhcpd.conf的网段要一致否则服务启动失败。所以先配置dhcpd.conf
配置DHCP服务
[root@node1 ~]# rpm -ql dhcp #查看DHCP相关文件
.....前面省略
/usr/share/doc/dhcp-4.2.5/dhcpd.conf.example #DHCP配置示例
/usr/share/doc/dhcp-4.2.5/dhcpd6.conf.example
......后面省略
[root@node1 ~]# cd /etc/dhcp
[root@node1 dhcp]# cp /usr/share/doc/dhcp-4.2.5/dhcpd.conf.example . #复制模板配置文件
[root@node1 dhcp]# mv dhcpd.conf.example dhcpd.conf #改名为dhcpd.conf,顶替以前的配置文件
[root@node1 dhcp]# vim dhcpd.conf # 打开模板文件并添加以下内容
.......前面省略
subnet 10.0.0.0 netmask 255.255.255.0 { # 这里写的ip地址为子网的地址,故为10.0.0.0
range 10.0.0.200 10.0.0.250; # 子网的范围,之后主机请求获取的ip地址就是这其中的一个
next-server 10.0.0.1; # 指明tftp服务器的地址
filename "pxelinux.0"; # 指明PXE文件位置,这个在申请ip的时候会发送给安装主机
}
......后面省略
保存退出
[root@node1 network-scripts]# systemctl restart dhcpd #重启DHCP服务
注意:如果你设置的子网有问题,那么你将不能重启dhcp服务,请检查你配置的子网是否正确。dhcp服务器的地址必须固定,不能是自动获取的ip。
准备yum源文件及kickstart文件
yum源文件我们是放在http服务器上的,由http服务来提供,所以我们要把相应的文件复制到http服务器上。并且我们安装的主机系统可能是CentOS 6 也可能是CentOS7或者Ubantu等,所以我们在准备yum文件时,需要准备不同系统、不同版本的文件,我们这里只提供CentOS 7的两种系统的安装。向我们先规划一下目录文件,在进行复制。如下所示。
我们规划好了目录结构,接下来便是创建这些目录结构,并提供相应的文件。
[root@node1 ~]# cd /var/www/html/
[root@node1 html]# mkdir /var/www/html/centos/7/x86_64 -pv
提供yum源文件,这里有两种方案来实现yum源文件的提供:
方案1:我们挂载CentOS 7的光盘将光盘里的Packages目录与repodata目录复制到对应的目录下(如果复制,建议全部复制);
方案2:我们创建1个光盘驱动器,添加CentOS 7的ISO镜像,然后我们将对应的关盘挂载到/var/www/html/centos下对应的目录上。
综上所述,我们选择方案2。
[root@node1 html]# mount -r /dev/cdrom/ /var/www/html/centos/7/x86_64
mount: /dev/sr0 写保护,将以只读方式挂载
[root@node1 html]# ls /var/www/html/centos/7/x86_64
接下来准备ksdir目录下的安装引导文件kickstart,可以从原有服务器同系统直接拷贝。这里因为没有参考,需要重新制作。
[root@node1 ksdir]# yum -y install system-config-kickstart
[root@node1 ksdir]# system-config-kickstart
弹出配置程序按顺序设置,最后保存至/var/www/html/ksdir/centos7.cfg
vim ks.cfg #编辑文件,指定安装过程中需要安装的软件,在文件末尾添加
%packages
@base
%end
ksvalidator centos7.cfg #检测语法是否正确
配置PXE环境
[root@node1 ksdir]# yum -y install syslinux
[root@node1 ksdir]# cp /usr/share/syslinux/pxelinux.0 /var/lib/tftpboot/
[root@node1 ksdir]# cp /var/www/html/centos/7/x86_64/images/pxeboot/{vmlinuz,initrd.img} /var/lib/tftpboot/
[root@node1 ksdir]# cp /usr/share/syslinux/{chain.c32,mboot.c32,menu.c32,memdisk} /var/lib/tftpboot/
[root@node1 ksdir]# mkdir /var/lib/tftpboot/pxelinux.cfg/
[root@node1 ksdir]# vim /var/lib/tftpboot/pxelinux.cfg/default
default menu.c32
prompt 5 #显示5秒
timeout 30 #超时时间30秒
MENU TITTLE CentOS 7 PXE Menu #主菜单项名称为CentOS 7 PXE Menu
LABEL linux_autoinst #标签
MENU LABEL Install CentOS 7 x86_64 auto #菜单项标签显示为CentOS 7 x86_64 auto
KERNEL vmlinuz #加载的内核
APPEND initrd=initrd.img inst.repo=http://10.0.0.1/centos/7/x86_64 ks=http://10.0.0.1/ksdir/centos7.cfg