利用PXE自动化安装CentOS系统

概念

PXE(Preboot Excution EnvironmentIntel,预启动执行环境)公司研发,没有任何操作系统的主机能够基于网络完成系统的安装工作。

装系统这件事在平时我们可能偶尔就装个一台两台不管是用U盘来装还是用光盘来装效率差距都不大,但是在工作中如果我们面临需要安装的机器数量成百上千,那这个时候我们再去用U盘或者光盘装系统岂不是累个半死又没有效率?所以我们需要自动化安装系统来帮助我们提升工作效率。


操作部分

准备

CentOS任意版本ISO文件,我接下来的实验中服务机的系统为CentOS7.3

在VM做实验需要把网卡设置为仅主机模式,然后在虚拟网络编辑器里关掉仅主机模式的DHCP。这里要注意如果关掉DHCP在win上VM1网卡(仅主机模式虚拟网卡)需要手动配置静态IP

进入系统后先按照本地IP地址配置静态IP然后挂载IOS文件配置好yum源


第一步,安装并配置DHCP服务

在上述准备工作中的配置静态IP地址和配置yum源就不再描述,如果还是希望看看yum源的配置请看我关于搭建博客的那篇文章。

yum -y install dhcp

刚装好DHCP是启动不了服务器的,需要先配置

当打开dhcp的配置文件/etc/dhcp/dhcpd.conf后会提示去/usr/share/doc/dhcp*/dhcpd.conf.example查看配置文件的写法

#
# DHCP Server Configuration file. 
#   see /usr/share/doc/dhcp*/dhcpd.conf.example
#   see dhcpd.conf(5) man page
#
option domain-name "test.com";
option domain-name-servers 114.114.114.114,8.8.8.8; #DNS服务器地址
option routers 192.168.179.1; #网关地址

default-lease-time 600; #默认租期(单位秒)
max-lease-time 7200; #最大租期

subnet 192.168.179.0 netmask 255.255.255.0 {
        range 192.168.179.10 192.168.179.20; #配置分配IP范围
        filename "pxelinux.0"; #指定引导文件名称
        next-server 192.168.179.2; #指定引导文件服务器IP地址
} 

因为我本地win的地址是192.168.179.1,服务机的IP地址是192.168.179.2所以配置就按照以上来配置。

注意:这个配置文件里面的配置行都必须在结尾加上分号,不然无法启动

接下来就是启动DHCP

[root@mini7 ~]# systemctl start dhcpd.service
[root@mini7 ~]# 

顺利启动,没有任何报错信息

[root@mini7 ~]# systemctl enable dhcpd.service 
Created symlink from /etc/systemd/system/multi-user.target.wants/dhcpd.service to /usr/lib/systemd/system/dhcpd.service.
[root@mini7 ~]# 

设置开机自动启动,到此DHCP安装配置完毕。


第二步,安装并配置TFTP服务

[root@mini7 ~]# yum -y install tftp-server

安装tftp完成,在后续我们需要一个pxelinux.0文件,所以还需要安装包含这个文件的包syslinux

[root@mini7 ~]# yum -y install syslinux

安装syslinux完成

[root@mini7 ~]# systemctl start tftp
[root@mini7 ~]# systemctl enable tftp
Created symlink from /etc/systemd/system/sockets.target.wants/tftp.socket to /usr/lib/systemd/system/tftp.socket.
[root@mini7 ~]# 

启动tftp服务并设置开机启动


第三步,搭建yum源并配置kickstart文件以及上传文件至文件服务目录

首先安装httpd或者ftp,这里我用httpd来示范。

yum -y install httpd 

安装httpd完毕

到这里就需要把整个ISO文件的内容放置到httpd的网站根目录下,这里我因为是在虚拟机上做实验就不用复制过去了,我直接在网站根目录下创建一个文件夹然后直接把光驱设备挂载到文件夹上。

[root@mini7 ~]# mkdir /var/www/html/CentOS7
[root@mini7 ~]# mount /dev/sr0 /var/www/html/CentOS7/
mount: /dev/sr0 is write-protected, mounting read-only
[root@mini7 ~]# 

到这里yum源就已经配置完毕

至于kickstart文件我们可以参照系统安装完毕后在家目录生成的anaconda.ks.cfg文件来改一个我们需要的出来。

[root@mini7 ~]# mkdir /var/www/html/ks
[root@mini7 ~]# cp anaconda-ks.cfg /var/www/html/ks/CentOS7.cfg
[root@mini7 ~]# chmod a+r /var/www/html/ks/CentOS7.cfg #这里别忘了给ks文件加上其他用户的读权限,因为默认anaconda-ks.cfg的权限是600

在httpd的目录中创建文件夹ks并将anaconda.ks.cfg复制过去改名为CentOS7,下一步就是更改ks文件为我们需要的文件。

#version=DEVEL
# System authorization information
auth --enableshadow --passalgo=sha512
# Use CDROM installation media
url --url=http://192.168.179.2/CentOS7/
# Use graphical install
text
# Run the Setup Agent on first boot
firstboot --enable
reboot
ignoredisk --only-use=sda
# Keyboard layouts
keyboard --vckeymap=us --xlayouts='us'
# System language
lang en_US.UTF-8

# Network information
network  --bootproto=dhcp --device=ens33 --ipv6=auto --activate
network  --hostname=mini7.shadow.com

# Root password
rootpw --iscrypted 6w91q9G4PKgEOsunw$oA8FVCaTL.7TRi6QuuDHLBmHeKPYeMwmWNBLI5nWXHZUbRwbJEWmwgL9VQGjC1s3NvVO4NOX0.G2M6QioHbZ6.
# System services
services --enabled="chronyd"
# System timezone
timezone Asia/Shanghai --isUtc --nontp
# System bootloader configuration
bootloader --append=" crashkernel=auto" --location=mbr --boot-drive=sda
# Partition clearing information
clearpart --all --initlabel --drives=sda
# Disk partitioning information
part / --fstype="xfs" --ondisk=sda --size=10240
part /app --fstype="xfs" --ondisk=sda --size=7000
part /boot --fstype="xfs" --ondisk=sda --size=512
part swap --fstype="swap" --ondisk=sda --size=1024

%packages
@^minimal
@core
chrony
kexec-tools

%end

%addon com_redhat_kdump --enable --reserve-mb='auto'
%end

%anaconda
pwpolicy root --minlen=6 --minquality=50 --notstrict --nochanges --notempty
pwpolicy user --minlen=6 --minquality=50 --notstrict --nochanges --notempty
pwpolicy luks --minlen=6 --minquality=50 --notstrict --nochanges --notempty
%end

这个文件我贴出来了,这里面写的信息其实就是手动安装系统时图形引导安装程序中的各项设置内容,按照自己的要求改就行了。


第四步,完善/var/lib/tftpboot目录所需文件

之前我们装好的tftp虽然启动了,但是还没有在共享目录下配置所需要的文件,这一步就来做这个事情。

[root@mini7 ks]# cd /var/lib/tftpboot/
[root@mini7 tftpboot]# cp /cd/isolinux/{vmlinuz,initrd.img,isolinux.cfg} . #复制内核文件虚拟文件系统还有启动菜单到当前目录
[root@mini7 tftpboot]# cp /usr/share/syslinux/{menu.c32,pxelinux.0} . #复制启动菜单背景和pxelinux.0到当前目录
[root@mini7 tftpboot]# mkdir pxelinux.cfg #创建pxelinux.cfg文件夹
[root@mini7 tftpboot]# mv isolinux.cfg
pxelinux.cfg/default #移动isolinux.cfg到pxelinux.cfg中并改名为default
[root@mini7 tftpboot]# tree #目录完整状态
.
├── initrd.img
├── menu.c32
├── pxelinux.0
├── pxelinux.cfg
│   └── default
└── vmlinuz

1 directory, 5 files
[root@mini7 tftpboot]# 

现在目录中的文件已经配置完毕了,现在就是要更改菜单文件default

[root@mini7 tftpboot]# vim pxelinux.cfg/default
default menu.c32
timeout 600

menu title PXE CentOS Linux 7
label linux
  menu label ^Auto Install Minimal CentOS Linux 7
  kernel vmlinuz
  append initrd=initrd.img ks=http://192.168.179.2/ks/CentOS7 #应答文件地址

label check
  menu label Boot from  ^Local Drivers
  localboot 0xffff

如上所示,将菜单文件改成以上的格式。


第五步,排除限制并测试是否成功

接下来就是关闭防火墙和selinux的过程了

[root@mini7 tftpboot]# systemctl stop firewalld
[root@mini7 tftpboot]# systemctl disable firewalld
[root@mini7 tftpboot]# setenforce 0
[root@mini7 tftpboot]# vim /etc/selinux/config 
SELINUX=permissive #更改为这样,需要重启计算机生效
[root@mini7 tftpboot]# mv /etc/httpd/conf.d/welcome.conf /etc/httpd/conf.d/welcome #删除httpd的欢迎页
[root@mini7 tftpboot]# systemctl restart httpd #重启各服务
[root@mini7 tftpboot]# systemctl restart dhcpd
[root@mini7 tftpboot]# systemctl restart tftp
[root@mini7 tftpboot]# 

下面开始测试是否成功

首先创建一个新的虚拟机

点稍后安装操作系统,硬盘按照前面ks文件中的大小指定,网卡一定要设置成仅主机,因为服务机所在的网段是仅主机。

新的虚拟机建好了之后直接开机

如图所示,如果看到了这个界面那么恭喜你已经成功了一半。

究竟成功与否还是要先安装之后看看是否按照我们预先设定的要求来安装的。要注意的是CentOS7的安装需要内存至少得有1100M以上,否则报错无法安装。

如果看到以上界面说明已经成功了。


总结

自动化运维是趋势,而自动化安装系统只是自动化运维的第一步。知道得越多踏入的领域就越多那么自己就会发现自己不知道的东西就更多了,所以,学习一途永无止境。