PXE+Kickstart 无人值守安装服务

如果生产环境中有数百台服务器都需要安装系统,我们就需要使用 PXE + TFTP +FTP + DHCP + Kickstart 服务
搭建出一个无人值守安装系统。这种无人值守安装系统可以自动地为数十台服务器安装系统,这一方面将运维
人员从重复性的工作中解救出来,也大大提升了系统安装的效率。

无人值守安装系统的工作流程PXE(Preboot eXecute Environment,预启动执行环境)是由 Intel 公司开发的
技术,可以让计算机通过网络来启动操作系统(前提是计算机上安装的网卡支持 PXE 技术),主要用于在无
人值守安装系统中引导客户端主机安装 Linux 操作系统。Kickstart 是一种无人值守的安装方式,其工作原理
是预先把原本需要运维人员手工填写的参数保存成一个ks.cfg 文件,当安装过程中需要填写参数时则自动匹
配 Kickstart 生成的文件。所以只要Kickstart 文件包含了安装过程中需要人工填写的所有参数,那么从理论
上来讲完全不需要运维人员的干预,就可以自动完成安装工作。
系统:
[root@11 ~]# cat /etc/redhat-release 
Red Hat Enterprise Linux Server release 7.0 (Maipo)

IP配置如下
IPADDR=192.168.11.100
NETMASK=255.255.255.0
GATEWAY=192.168.11.1
BOOTPROTO=static
ONBOOT=yes
准备yum
[root@11 ~]# mount /dev/cdrom /mnt/
mount: /dev/sr0 is write-protected, mounting read-only
[root@11 ~]# cat /etc/yum.repos.d/my.repo 
[myrepo]
name=myrepo
baseurl=file:///mnt
gpgcheck=0
enabled=1
1、配置DHCP
[root@11 ~]# yum install dhcp -y
配置dhcp
[root@11 ~]# vim /etc/dhcp/dhcpd.conf 
[root@11 ~]# cat /etc/dhcp/dhcpd.conf 
allow booting;
allow bootp;
ddns-update-style interim;
ignore client-updates;
subnet 192.168.11.0 netmask 255.255.255.0 {
option subnet-mask 255.255.255.0;
option domain-name-servers 192.168.11.100;
range dynamic-bootp 192.168.11.150 192.168.11.200;
default-lease-time 21600;
max-lease-time 43200;
next-server 192.168.11.100;
filename "pxelinux.0";
}
重启dhcp并设置为开机自启
[root@11 ~]# systemctl restart dhcpd
[root@11 ~]# systemctl enable dhcpd
ln -s '/usr/lib/systemd/system/dhcpd.service' '/etc/systemd/system/multi-user.target.wants/dhcpd.service'

2、配置TFTP
[root@11 ~]# yum install tftp-server -y
TFTP 是
一种非常精简的文件传输服务程序,它的运行和关闭是由 xinetd 网络守护进程服务来管理的。xinetd 服务程序
会同时监听系统的多个端口,然后根据用户请求的端口号调取相应的服务程序来响应用户的请求。需要开启
 TFTP 服务程序,只需在 xinetd 服务程序的配置文件中把 disable 参数改成 no 就可以了。保存配置文件并
退出,然后重启 xinetd服务程序,并将其加入到开机启动项中(在 RHEL 7 系统中,已经默认启用了 xinetd
 服务程序,因此在将其添加到开机启动项中的时候没有输出信息属于正常情况)。
[root@11 ~]# vim /etc/xinetd.d/tftp 
[root@11 ~]# cat /etc/xinetd.d/tftp 
# default: off
# description: The tftp server serves files using the trivial file transfer \
#   protocol.  The tftp protocol is often used to boot diskless \
#   workstations, download configuration files to network-aware printers, \
#   and to start the installation process for some operating systems.
service tftp
{
    socket_type     = dgram
    protocol        = udp
    wait            = yes
    user            = root
    server          = /usr/sbin/in.tftpd
    server_args     = -s /var/lib/tftpboot
    disable         = no
    per_source      = 11
    cps         = 100 2
    flags           = IPv4
}
[root@11 ~]# systemctl restart xinetd
[root@11 ~]# systemctl enable xinetd
TFTP 服务程序默认使用的是 UDP 协议,占用的端口号为 69,所以在生产环境中还需要在 firewalld
 防火墙管理工具中写入使其永久生效的允许策略,以便让客户端主机顺利获取到引导文件。
[root@11 ~]# firewall-cmd --permanent --add-port=69/udp
success
[root@11 ~]# firewall-cmd --reload
success
3、配置Syslinux服务程序
[root@11 ~]# yum install syslinux -y
SYSLinux 是一个用于提供引导加载的服务程序。与其说 SYSLinux 是一个服务程序,不如说更需要
里面的引导文件,在安装好 SYSLinux 服务程序软件包后,/usr/share/syslinux 目录中会出现很多引
导文件。
我们首先需要把 SYSLinux 提供的引导文件复制到 TFTP 服务程序的默认目录中,也就是前文提到的
文件 pxelinux.0,这样客户端主机就能够顺利地获取到引导文件了。另外在 RHEL7 系统光盘镜像中
也有一些我们需要调取的引导文件。确认光盘镜像已经被挂载到/media/cdrom 目录后,使用复制命
令将光盘镜像中自带的一些引导文件也复制到 TFTP 服务程序的默认目录中。
[root@11 ~]# mount /dev/cdrom /media/
mount: /dev/sr0 is write-protected, mounting read-only
[root@11 ~]# cd /var/lib/tftpboot/
[root@11 tftpboot]# cp /usr/share/syslinux/pxelinux.0 .
[root@11 tftpboot]# cp /media/images/pxeboot/{vmlinuz,initrd.img} .
[root@11 tftpboot]# cp /media/isolinux/{vesamenu.c32,boot.msg} .
[root@11 tftpboot]# mkdir pxelinux.cfg
[root@11 tftpboot]# cp /media/isolinux/isolinux.cfg pxelinux.cfg/default
[root@11 tftpboot]# vim pxelinux.cfg/default 
[root@11 tftpboot]# cat pxelinux.cfg/default 
default linux
append initrd=initrd.img inst.stage2=ftp://192.168.11.100 ks=ftp://192.168.11.100/pub/ks.cfg quiet 
[root@11 tftpboot]# yum install vsftpd -y
[root@11 tftpboot]# systemctl restart vsftpd
[root@11 tftpboot]# systemctl enable vsftpd
ln -s '/usr/lib/systemd/system/vsftpd.service' '/etc/systemd/system/multi-user.target.wants/vsftpd.service'
[root@11 tftpboot]# cp -r /media/* /var/ftp
在 firewalld 防火墙管理工具中写入使 FTP 协议永久生效的允许策略,然后在 SELinux 中放行 FTP 传输
[root@11 ~]# firewall-cmd --permanent --add-service=ftp
success
[root@11 ~]# firewall-cmd --reload
success
[root@11 ~]# setsebool -P ftpd_connect_all_unreserved=on

[root@11 ftp]# cp ~/anaconda-ks.cfg /var/ftp/pub/ks.cfg
[root@11 ftp]# chmod +r /var/ftp/pub/ks.cfg 

[root@11 ftp]# vim /var/ftp/pub/ks.cfg 
[root@11 ftp]# cat /var/ftp/pub/ks.cfg 
#version=RHEL7
# System authorization information
auth --enableshadow --passalgo=sha512

# Use network installation
url --url="ftp://192.168.11.100"
# Run the Setup Agent on first boot
firstboot --enable
ignoredisk --only-use=sda
# Keyboard layouts
keyboard --vckeymap=us --xlayouts='us'
# System language
lang en_US.UTF-8

# Network information
network  --bootproto=dhcp --device=eno16777736 --onboot=on --ipv6=auto
network  --bootproto=dhcp --hostname=localhost.localdomain
# Root password
rootpw 12345678
# System services
services --enabled="chronyd"
# System timezone
timezone Asia/Shanghai --isUtc
# System bootloader configuration
bootloader --location=mbr --boot-drive=sda
autopart --type=lvm
# Partition clearing information
clearpart --none --initlabel 

%packages
@core
chrony

%end

测试即可