(一)基础介绍与环境配置

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

  • PXE的工作过程

PXE 无人值守安装_centos

PXE 部署拓扑图:

PXE 无人值守安装_linux_02

【本次实验因为资源不足的原因将服务器的功能集成到一台服务器中】

  • 实验环境如下

主机名称

操作系统

IP地址

备注

Server

CentOS 8.3

IP:172.25.200.100/24

gateway:172.25.100.254

dns:172.25.200.100

使用Apache 站点作为系统安装文件获取的方式

Client

none



(二) 实验操作-单系统安装

1.初始化环境

#把光驱连接到虚拟机中,并配置网络信息
[root@localhost ~]# nmcli con mod ens160 ipv4.method manual ipv4.address 172.25.200.100/24 ipv4.gateway 172.25.200.254 ipv4.dns 172.25.200.100 autoconnect yes&&nmcli con up ens160
[root@localhost ~]# hostnamectl set-hostname server
[root@localhost ~]# bash
####关闭防火墙#####
[root@server ~]# systemctl disable --now firewalld
[root@server ~]# iptables -F
[root@server ~]#setenforce 0
[root@server ~]# sed -i 's/=enforcing/=disabled/g' /etc/selinux/config


####### 配置yum源  #######
[root@server ~]#mkdir /root/back
[root@server ~]#mv /etc/yum.repos.d/* /root/back/
[root@server ~]#mkdir -p /mnt/cdrom
[root@server ~]#mount /dev/sr0 /mnt/cdrom
[root@server ~]#cd /etc/yum.repos.d/
[root@server yum.repos.d]#cat >>cdrom.repo<<OK
[AppStream]
name=AppStream
baseurl=file:///mnt/cdrom/AppStream
enabled=1
gpgcheck=0

[BaseOS]
name=BaseOS
baseurl=file:///mnt/cdrom/BaseOS
enabled=1
gpgcheck=0
OK
[root@server yum.repos.d]#yum makecache
[root@server yum.repos.d]#cd ~

2.配置DHCP服务

[root@server ~]#yum -y install dhcp-client dhcp-server
[root@server ~]#cp -a /usr/share/doc/dhcp-server/dhcpd.conf.example /etc/dhcp/dhcpd.conf
[root@server ~]#vim /etc/dhcp/dhcpd.conf
subnet 172.25.200.0 netmask 255.255.255.0 {
  range 172.25.200.30 172.25.200.40;
  option domain-name-servers 172.25.200.100;
  option domain-name "example.com";
  option routers 172.25.200.254;
  option broadcast-address 172.25.200.255;
  default-lease-time 600;
  max-lease-time 7200;
  next-server 172.25.200.100;				#设置客户端从那台服务器中获取引导文件
  filename "pxelinux.0";					#开始启动文件的名称.
}
[root@server ~]#systemctl enable dhcpd
[root@server ~]#systemctl restart dhcpd

3.TFTP服务配置

#xinetd属于tftp的主程序
[root@server ~]#yum -y install xinetd tftp tftp-server
[root@server ~]#vim /etc/xinetd.d/tftp     #centos8 没有这个文件,需要自己手写
server tftp
{ 
   socket_type = dgram
   protocol    = udp
   wait        = yes
   user        = root
   server      = /usr/sbin/in.tftpd
   server_args = -s /var/lib/tftpboot		#设置tftp服务的工作目录
   disable     = no					       #设置tftp服务启动选项,no为启动,yes为禁用
   per_source  = 11
   cps         = 100 2
   flags       = IPv4

}
[root@server ~]#systemctl enable xinetd  tftp
[root@server ~]#systemctl restart xinetd tftp

4.SYSLinux 配置

#安装syslinux 引导加载程序,并拷贝文件到tftp的工作目录(/var/lib/tftpboot)下
[root@server ~]#yum -y install syslinux
[root@server ~]#cd /var/lib/tftpboot
[root@server tftpboot]#cp /usr/share/syslinux/pxelinux.0 .
[root@server tftpboot]#cp /mnt/cdrom/isolinux/* . 
[root@server tftpboot]#mkdir pxelinux.cfg
[root@server tftpboot]#cp isolinux.cfg pxelinux.cfg/default
[root@server tftpboot]#chmod 644 pxelinux.cfg/default
[root@server tftpboot]#vim pxelinux.cfg/default
#default: 默认加载选项
1 default linux
#超时时间 默认为600秒
2 timeout 600
#标题
61 label linux 
#菜单
 62 menu label ^Install Red Hat Enterprise Linux 8.0 
 #kernel 参数指定要启动的内核
 63 kernel vmlinuz 
 #append 指定追加给内核的参数,指定系统安装所需文件的获取路径,指定ks文件路径
64 append initrd=initrd.img inst.stage2=http://172.25.200.100/centos8 ks=http://172.25.200.100/ks.cfg quiet

5.Apache 配置

[root@server ~]#yum -y install httpd
[root@server ~]#systemctl enable --now httpd
[root@server ~]#mkdir -p /var/www/html/centos8
[root@server ~]#cp -arf /mnt/cdrom/* /var/www/html/centos8/
[root@server ~]#cp -arf /mnt/cdrom/.discinfo  /var/www/html/centos8/
[root@server ~]#cp -arf /mnt/cdrom/.treeinfo /var/www/html/centos8/
[root@server ~]#systemctl restart httpd

6.编辑ks文件

#系统在安装完成时,会在/root目录下生成一个anaconda-ks.cfg文件,使用这个文件充当模板,对其进行修改
[root@server ~]#cp /root/anaconda-ks.cfg /var/www/html/ks.cfg
[root@server ~]#chmod 777 /var/www/html/ks.cfg
[root@server ~]#vim /var/www/html/ks.cfg
 5 repo --name="AppStream" --baseurl="http://172.25.200.100/centos8/AppStream" 
 6 repo --name="BaseOS" --baseurl="http://172.25.200.100/centos8/BaseOS" 
 23 #cdrom
 24 url --url="http://172.25.200.100/centos8"		#设置安装方式,系统安装文件从那里获取
  
 31 clearpart --all  --initlabel					#初始化硬盘
 34 timezone Asia/Shanghai --isUtc --nontp			#设置时区为亚洲/上海

7.安装测试

  1. 创建好后进行开机,【注意:网卡模式需与PXE 服务器相同】

PXE 无人值守安装_linux_03

PXE 无人值守安装_centos_04


(三) 扩展实验—多系统安装

1.添加一个光驱,放入CentOS7的镜像

PXE 无人值守安装_linux_05

PXE 无人值守安装_centos_06

如图:

2.拷贝镜像文件,修改引导文件

[root@server ~]# mount /dev/sr0 /opt
[root@server ~]# mkdir -p /var/www/html/centos7
[root@server ~]# cp -arf /opt/* /var/www/html/centos7
[root@server ~]#cd /var/lib/tftpboot
[root@server tftpboot]#mkdir centos8
[root@server tftpboot]#cp -arf /var/www/html/centos8/isolinux/* centos8/
[root@server tftpboot]#mkdir centos7
[root@server tftpboot]#cp -arf /opt/isolinux/*  /var/lib/tftpboot/centos7
[root@server tftpboot]#vim pxelinux.cfg/default
#加载【菜单】 vesamenu.c32 文件
  1 default  vesamenu.c32
 61 label 1、InstallCentos8
 62   menu label ^Install CentOS Linux 8
 63   kernel centos8/vmlinuz
 64   append initrd=centos8/initrd.img inst.stage2=http://172.25.200.100/centos8     ks=http://172.25.200.100/centos8-ks.cfg quiet
 65 label 2、InstallCentos7
 66   menu label ^Install CentOS Linux 7
 67   kernel centos7/vmlinuz
 68   append initrd=centos7/initrd.img inst.stage2=http://172.25.200.100/centos7     ks=http://172.25.200.100/centos7-ks.cfg quiet
 
  [root@server tftpboot]#mv /var/www/html/ks.cfg /var/www/html/centos8-ks.cfg
  [root@server tftpboot]#cp -a /root/anaconda-ks.cfg /var/www/html/centos7-ks.cfg
  
  [root@server tftpboot]#vim /var/www/html/centos7-ks.cfg
  4 repo --name="cddrom" --baseurl="http://172.25.200.100/centos7/" 
  6 %packages			#%packages 预安装软件,@是软件包组,以%end结尾
  7 @^minimal
  8 @core
  9 chrony
 10 kexec-tools
 11 %end
 22 #cdrom
 23 url --url="http://172.25.200.100/centos7"
 30 clearpart --all  --initlabel
 33 timezone Asia/Shanghai --isUtc --nontp

3.安装测试

PXE 无人值守安装_linux_07

步骤和刚刚差不多,如下

PXE 无人值守安装_centos_08

启动后可以看到,有一个安装菜单,选择第二个选项,进行安装CentOS 7

PXE 无人值守安装_linux_09

等待安装完成即可

(四) 踩坑记录

1.无法找到DHCP服务器

如下截图:

PXE 无人值守安装_centos_10

解决如下:

[root@server ~]# vim /etc/dhcp/dhcpd.conf 

#在地址池 添加
  next-server 172.25.200.100;
  filename "pxelinux.0";

2.设备空间不足

错误截图:

PXE 无人值守安装_centos_11

原因:因设备空间,如内存或者硬盘等空间太小,导致无法分配资源

解决方法:在虚拟机中扩大内存和硬盘容量

3.设置安装源/软件选择出错

报错如下:

原因:

这个是因为我们没有把/mnt/cdrom的隐藏文件拷走,这是8版本以后才有的问题

-r--r--r--. 1 root root 44 11月 18 2020 .discinfo -r--r--r--. 1 root root 1520 11月 18 2020 .treeinfo

解决:

[root@localhost html]# cp -a /mnt/cdrom/.discinfo  centos8/
[root@localhost html]# cp -a /mnt/cdrom/.treeinfo  centos8/

(五)扩展—引导配置文件解析

1.ks.文件:

ks.cfg文件组成大致分为3段

1.命令段:

键盘类型,语言,安装方式等系统的配置,有必选项和可选项,如果缺少某项必选项,安装时会中断并提示用户选择此项的选项

# Keyboard layouts  设置键盘类型
keyboard --xlayouts='cn'

#镜像源添加
repo --name="cdrom" --baseurl="http://172.25.200.100/centos7/"

# System language		设置语言
lang zh_CN.UTF-8

# Network information
network  --hostname=localhost.localdomain     #主机名
# 网络配置信息,设置IP获取方式,网关及DNS等信息

network  --bootproto=dhcp --device=eno160  --activate


# Use CDROM installation media
#cdrom										#通过光驱安装
url --url="http://172.25.200.100/centos7"      #通过网络安装


rootpw --iscrypted $6$pycwcbYpXtke.WN7$g0aOZ8e/whCVpHbmqO4KsyH98wnv5Over9ooGjax6iBA.DJeJzt.klj7vVYjCj2XJ9Fx0O46LB3qzkfIpJxOS.								#设置root信息和密码,密码被加密过的


# System bootloader configuration

# 引导程序相关参数

bootloader --append="crashkernel=auto" --location=mbr --boot-drive=sda

autopart --type=lvm

# Partition clearing information

# 初始化磁盘设置

clearpart --none --initlabel

 
# 分区设置

# part / --fstype=ext4 --size=18000 #开始分区
# part swap --grow --size=1024



2.软件包段:

%packages

@groupname:指定安装的包组

package_name:指定安装的包

-package_name:指定不安装的包

在安装过程中默认安装的软件包,安装软件时会自动分析依赖关系。




3.脚本段(可选):

%pre:预安装脚本(由于只依赖于启动镜像,支持的命令很少)

%post:后安装脚本(基本支持所有命令)

注意:软件包段和脚本段必须以%end 结尾

2.default 文件

default linux
# 显示 'boot: ' 提示符。为 '0' 时则不提示,将会直接启动 'default' 参数中指定的内容。
prompt 1
# 在用户输入之前的超时时间,单位为 1/10 秒。
timeout 60
#显示某个文件的内容,注意文件的路径。默认是在 /tftpboot 目录下。也可以指定位类似 'install/rhel4.4-inst/boot.msg' 这样的,路径+文件名。
display boot.msg
F1 boot.msg #按下 'F1' 这样的键后显示的文件。注意路径。默认是 /tftpboot。注:syslinux 官方网站上说目前只能使用 F1-F10。
F2 options.msg
F3 general.msg
F4 param.msg
F5 rescue.msg
# 'label' 指定你在 'boot:' 提示符下输入的关键字。
# 比如:
# boot: linux[ENTER]
# 这个会启动 'label linux' 下标记的 kernel 和 initrd.img 文件。
# 这里还定义了其它几个关键字:
# boot: text
# boot: ks
# kernel 参数指定要启动的内核。同样要注意路径,默认是 /tftpboot 目录。
# append 指定追加给内核的参数,能够在 gurb 里使用的追加给内核的参数,在这里也都可以使用。
# 使用 kickstart 安装。
# 可以在 ks 参数后直接指定 kickstart 文件的位置。
label linux
kernel vmlinuz
append ks=nfs:192.168.175.1:/mnt/install/ks.cfg initrd=initrd.img
label text
kernel vmlinuz
append initrd=initrd.img text
label ks
kernel vmlinuz
append ks initrd=initrd.img

参考文献如下:

《Linux就该怎么学》—19章

PXE配置中ks.cfg文件介绍_Filter_CPH的博客-CSDN博客

pxe-多系统选择安装_pxe 多系统_SkywrathKreys的博客-CSDN博客

Pxe无人值守安装linux(对default文件有较详细的解释)_pxe default_Linucle的博客-CSDN博客