4. 运维自动化之系统部署-PXE
本文内容
- 系统安装过程和配置anaconda
- 制作自动化安装系统的应答文件
- DHCP服务
- TFTP服务
- 利用PXE实现自动化的系统部署
1 系统安装过程
1.1 运维自动化发展历程及技术应用

1.2 系统安装过程
Linux的安装过程如下:
- 加载boot loader
- 加载启动安装菜单
- 加载内核和initrd文件
- 加载根系统
- 运行anaconda的安装向导
1.2.1 Linux的安装光盘的安装相关文件
在系统光盘的isolinux目录下有和安装相关的文件, 安装操作系统需要的必要文件
[18:03:49 root@CentOS-8-1 ~]#ll /misc/cd/isolinux
total 72859
-r--r--r-- 1 root root 2048 Jun 9 2020 boot.cat
-r--r--r-- 1 root root 84 Jun 9 2020 boot.msg
-r--r--r-- 1 root root 293 Jun 9 2020 grub.conf
-r--r--r-- 2 root root 65114456 Jun 9 2020 initrd.img
-r--r--r-- 1 root root 38912 Jun 9 2020 isolinux.bin
-r--r--r-- 1 root root 3075 Jun 9 2020 isolinux.cfg
-r--r--r-- 1 root root 116096 Nov 9 2019 ldlinux.c32
-r--r--r-- 1 root root 180700 Nov 9 2019 libcom32.c32
-r--r--r-- 1 root root 22804 Nov 9 2019 libutil.c32
-r--r--r-- 1 root root 182704 May 13 2019 memtest
-r--r--r-- 1 root root 186 Jul 31 2019 splash.png
-r--r--r-- 1 root root 2885 Jun 9 2020 TRANS.TBL
-r--r--r-- 1 root root 26788 Nov 9 2019 vesamenu.c32
-r-xr-xr-x 2 root root 8913656 May 8 2020 vmlinuz
- boot.cat: 相当于grub的第一阶段, 引导系统
- grub.conf: 相当于grub的第二阶段
- isolinux.bin: 光盘引导程序, 在mkisofs的选项中需要明确给出文件路径, 这个文件属于SYSLINUX项目
- isolinux.cfg: 启动菜单的配置文件, 当光盘启动后(即运行isolinux.bin), 会自动去找isolinux.cfg文件. 这是启动菜单, 和kickstart文件不一样
- vesamenu.c32: 是光盘启动后的启动菜单图形界面, 也属于SYSLINUX项目, menu.c32提供纯文本的菜单
- memtest: 内存检测程序
- splash.png: 光盘启动菜单界面的背景图
- vmlinuz: 是内核映像
- ininrd.img: ramfs文件, 启动时需要的相关驱动
进入到救援模式的几种方法:
开机按ESC进入到启动菜单, 选择光盘启动
-
手动选择Troubleshooting, 然后进入到rescue选项
-
按ESC, 进入boot: , 按rescue, 回车, 进入到救援模式
-
按ESC, 进入boot, 按linux rescue, 回车, 进入到救援模式
-
在光盘启动界面, 按tab键, 然后输入rescue, 作为内核参数

1.2.2 安装菜单的内核参数
可以在安装光盘的启动菜单配置文件: isolinux/isolinux.cfg中设置相关的内核加载参数, 实现不同的安装过程
isolinux.cfg文件中每个安装对应菜单选项:
- 加载内核: isolinuz/vmlinuz
- 向内核传递参数: append initrd=initrd.img 参数设置
指定内核参数方法:
- 在启动菜单界面, 选择一种安装方法, 按tab键, 在后面增加参数
- 在启动菜单界面, 任意选中一种安装方法, 按ESC键: boot: linux 参数设置
常见的内核参数:
- text: 默认启动GUI安装接口, 可以指定文本方式的安装界面
- rescue: 进入救援模式
- inst.repo=path: 指定安装源文件的路径, 可以是以下格式
CentOS 6
DVD Drive repo=cdrom :device
Hard Drive repo=hd:device/path
HTTP Server repo=http://host/path
HTTPS Server repo=https://host/path
FTP Server repo=ftp://username:passwd@host/path
NFS Server repo=nfs:server:/path
ISO images on an NFS Server repo=nfsiso:server:/path
CentOS 7
Any CD/DVD drive inst.repo=cdrom
Hard Drive inst.repo=hd:device:/path
HTTP Server inst.repo=http://host/path
HTTPS Server inst.repo=https://host/path
FTP Server inst.repo=ftp://username:passwd@host/path
NFS Server inst.repo=nfs:[options:]server:/path - askmethod: 选择安装源文件的获取方法, 提供了光盘, 本地硬盘, NFS, FTP, HTTP多种安装源, 此项CentOS 7以后版已放弃
- ks=path: 指定自动化安装应答文件路径, 如: initrd=initrd.img inst.ks=http://192.168.8.8/ksdir/ks8.cfg
- ip=:指定ip地址信息
ip=method, method 可以为DHCP
ip=interface:method 指定特定窗口
ip=ip::gateway:netmask:hostname:interface:none 静态IP
1.2.3 anaconda安装向导
anaconda是Linux系统安装程序, 可以提供两种风格的安装界面
- gui: 图形工具
- tui: 基于图形库curses的文本窗口
anaconda工作过程
- 安装过程使用的语言
- 键盘类型
- 时区和时间
- 安装源文件路径
- 选定要安装的程序包
- 安装目标存储设备及分区设置
Basic Storage: 本地磁盘
特殊设备: iSCSI - KDUMP功能
- 设定主机名和配置网络接口
- 安全策略
- 管理员密码
- 创建一个普通用户
anaconda的配置方式
- 交互配置方式
- 通过读取事先给定的配置文件自动完成配置, 加载内核参数: ks=/path实现指明kickstart文件的位置, 各种路径格式如下:
DVD drive: ks=cdrom:/PATH/TO/KICKSTART_FILE
Hard drive: ks=hd:device:/directory/KICKSTART_FILE
HTTP server: ks=http://host:Port/path/to/KICKSTART_FILE
FTP server: ks=ftp://host:port/path/to/KICKSTART_FILE
HTTPS server: ks=https://host:port/path/to/KICKSTART_FILE
NFS server: ks=nfs:host:/path/to/KICKSTART_FILE
2 自动安装的应答文件
实现自动安装前, 需要制作对应的安装应答文件, 称为kickstart文件, 用于保存安装过程需要指定的选项
2.1 kickstart文件使用过程
- Create a Kickstart file
- Make the Kickstart file availables on removable media, a hard drive or a network location
- Create boot media, which will be used to begin the installation
- Make the installation source available
- Start the Kickstart installation
2.2 kickstart文件的格式
2.2.1 kickstart文件格式官方说明
注意: 不同操作系统版本的应答文件格式不同, 不能混用
2.2.2 kickstart文件格式说明
kickstart文件主要包括三个部分:命令段,程序包段,脚本段
- 命令段:指明各种安装前配置,如键盘类型等
命令段中的常见命令:
keyboard: 设定键盘类型
lang: 语言类型
zerombr:清除mbr
clearpart:清除分区
part: 创建分区
rootpw: 指明root的密码
timezone: 时区
text: 文本安装界面
network:指定网络设置
firewall:设置防火墙设置
selinux:设置selinux设置
reboot:安装完自动重启
user:安装完成后为系统创建新用户
url: 指明安装源
- 程序包段:指明要安装的程序包组或程序包,不安装的程序包等
%packages
@^environment group: 指定环境包组,如:@^minimal-environment
@group_name
package
-package
%end
- 脚本段:
%pre: 安装前脚本
%post: 安装后脚本
注意:
CentOS 8,7,6 不同版本的kickstart文件格式不尽相同,不可混用
%addon, %packages, %onerror, %pre 、 %post 必须以%end结束,否则安装失败
2.3 kickstart文件创建
创建kickstart文件的方式:
- 可使用创建工具:system-config-kickstart ,注意:此方法 CentOS 8 不再支持
- 依据某模板修改并生成新配置,CentOS安装完后,会自动参考当前系统的安装过程,生成一个kickstart文件 /root/anaconda-ks.cfg
检查ks文件的语法错误:
使用 ksvalidator 工具可以检查kickstart的文件格式是否有语法错误,来自于 pykickstart 包
格式:
ksvalidator /PATH/TO/KICKSTART_FILE
范例: 将远程管理主机的ssh key添加到系统安装kickstart文件, 实现系统安装好, 就可以直接ssh基于key验证连接
- 在管理主机本地生成公钥和私钥
- 管理主机使用ssh-copy-id将key传给自己本机, 生成authorized_keys文件
- 在kickstart文件中, 创建authorized_keys文件, 修改权限, 将上一步生成的key信息复制到kickstart的key文件中, 相当于在安装系统的时候, 就把远程管理主机的key添加到了ssh验证中, 之后就可用基于key验证, 不需要输入密码
假定CentOS 8 作为远程管理主机
1. 生成远程管理主机的公钥和私钥
[18:55:35 root@CentOS-8-1 ~]#ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:QyrO/TW6kDpVuspItUqKR4G6IQIuZON40i+PQwUcGGY root@CentOS-8-1
The key's randomart image is:
+---[RSA 3072]----+
|.E.. |
|+ o |
| . . . |
|o+. . o. |
|O..oo .oS |
|Oo=+ +o. . |
|+Bo.+.+. o |
|o++=o..o o . |
|o.++=o +. |
+----[SHA256]-----+
2. 将key传给自己本地
[18:55:39 root@CentOS-8-1 ~]#ssh-copy-id 10.0.0.81
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
The authenticity of host '10.0.0.81 (10.0.0.81)' can't be established.
ECDSA key fingerprint is SHA256:r5nZbKITDuMpv35jbqsfjYh8JVFnMaO5/avXQxh6Hmk.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@10.0.0.81's password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh '10.0.0.81'"
and check to make sure that only the key(s) you wanted were added.
[18:56:14 root@CentOS-8-1 ~]#ls .ssh
authorized_keys
[18:57:18 root@CentOS-8-1 ~]#cat /root/.ssh/authorized_keys
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCt92c0R+BMldavwCdmnRD2xWOlZ+YcZUEAvQcCoyWWe1DszF72qyk4zlb0SJ9s/oNbLkxg5LQ2afuR/E37sQ61d+5nq5LZUyiY6yX4qFDojUeMyk2rqiO/e3edolZahadOuuS8nbkL7hHM/qTo2MyWfQgESwbNGOfgnnIZ5PbBeCO3OlpWL2yJeFdnDWTPNGfSfzNAyQXicPW2M8Q1Pri4RBTSqfcVHN4MbvpWsgcjMp4nopLk/sZfoI8YeXJIc0gWc0aVC3ymKd49nKNeMm9VJ5bDIBN/AMzUhL+15zL7v68Y6lbBoRlK+wFAkO6GWT7LTxue+iXlbjLvH9+rjGHfZKY9aSKYV8EyVCb4IvWoOqp4bOfsY6nNghRVZsuEjxLy/Hpb4h+p+Ywq2XoUdxunEJUlBabg5SY62aKjJEl9TPUONexrn5Q4CkFItrGStI6rklSeQyg8gVaNme8cxgBqovOcVuKMrLz5TfwyFonaKzKQWp+aGkuJyIO/O0e+/iE= root@CentOS-8-1
3. 在kickstart文件里创建 authorized_keys 文件, 把刚才创建出来的远程主机的key复制到kickstart文件里, 注意需要修改文件和目录权限
******************************************
mkdir /root/.ssh # 这个.ssh文件, 只有发生了远程ssh连接后才会在服务器端生成, 所以在制作kickstart时要手动创建.
chmod 700 /root/.ssh
cat > /root/.ssh/authorized_keys << EOF
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCt92c0R+BMldavwCdmnRD2xWOlZ+YcZUEAvQcCoyWWe1DszF72qyk4zlb0SJ9s/oNbLkxg5LQ2afuR/E37sQ61d+5nq5LZUyiY6yX4qFDojUeMyk2rqiO/e3edolZahadOuuS8nbkL7hHM/qTo2MyWfQgESwbNGOfgnnIZ5PbBeCO3OlpWL2yJeFdnDWTPNGfSfzNAyQXicPW2M8Q1Pri4RBTSqfcVHN4MbvpWsgcjMp4nopLk/sZfoI8YeXJIc0gWc0aVC3ymKd49nKNeMm9VJ5bDIBN/AMzUhL+15zL7v68Y6lbBoRlK+wFAkO6GWT7LTxue+iXlbjLvH9+rjGHfZKY9aSKYV8EyVCb4IvWoOqp4bOfsY6nNghRVZsuEjxLy/Hpb4h+p+Ywq2XoUdxunEJUlBabg5SY62aKjJEl9TPUONexrn5Q4CkFItrGStI6rklSeQyg8gVaNme8cxgBqovOcVuKMrLz5TfwyFonaKzKQWp+aGkuJyIO/O0e+/iE= root@CentOS-8-1
EOF
chmod 600 /root/.ssh/authorized_keys
******************************************
4. 将第三步中所有内容复制到kickstart文件中的%post <脚本> %END 字段里, 系统安装完成后自动执行
范例: 利用图形化制作CentOS7自动化安装kickstart文件, 在CentOS 8搭建http yum仓库提供下载
Centos 6 & 7 有system-config-kickstart图形化工具, Centos8不兼容, 因为python 2和3互不兼容
服务器一般是最小化安装, 因此, 需要在Windows安装Xmanager来打开服务器端的system-config-kickstart图形化工具
大致步骤
- 在服务器端安装system-config-kickstart
- Windows安装Xmanager
通过Windows Xmanager打开CentOS7上图形界面,因为服务器是最小化安装,所以即使在安装system-config-kickstart包时安装了很多其他图形化包,但是并没有安装图形化界面
- 定义变量export DISPLAY=WindowsIP:N.N
- 在服务器端运行system-config-kickstart, 会在Xmanager打开kickstart配置文件
步骤:
- CentOS-7安装 system-config-kickstart 程序包
[19:12:50 root@centos-7-1 ~]#yum -y install system-config-kickstart
- 在Windows本地安装xManager

- 在服务器端(CentOS 7)定义环境变量
[19:55:16 root@centos-7-1 ~]#export DISPLAY=10.0.0.1:0.0
- Centos 7启动 system-config-kickstart
[20:02:08 root@centos-7-1 ~]# system-config-kickstart
Xlib: extension "RANDR" missing on display "10.0.0.1:0.0".
/usr/share/system-config-kickstart/kickstartGui.py:104: GtkWarning: GtkSpinButton: setting an adjustment with non-zero page size is deprecated
xml = gtk.glade.XML ("/usr/share/system-config-kickstart/system-config-kickstart.glade", domain="system-config-kickstart")
Loaded plugins: fastestmirror



CentOS 8 上搭建内部yum仓库 http
yum -y install httpd; systemctl start httpd
按照yum仓库路径格式创建目录
[12:33:05 root@centos8 ~]#mkdir /var/www/html/centos/{6,7,8}/os/x86_64/ -pv
mkdir: created directory '/var/www/html/centos'
mkdir: created directory '/var/www/html/centos/6'
mkdir: created directory '/var/www/html/centos/6/os'
mkdir: created directory '/var/www/html/centos/6/os/x86_64/'
mkdir: created directory '/var/www/html/centos/7'
mkdir: created directory '/var/www/html/centos/7/os'
mkdir: created directory '/var/www/html/centos/7/os/x86_64/'
mkdir: created directory '/var/www/html/centos/8'
mkdir: created directory '/var/www/html/centos/8/os'
mkdir: created directory '/var/www/html/centos/8/os/x86_64/'
0 directories, 2 files
[20:16:46 root@CentOS-8-1 ~]#tree /var/www/html/
/var/www/html/
└── centos
├── 6
│ └── os
│ └── x86_64
├── 7
│ └── os
│ └── x86_64
└── 8
└── os
└── x86_64
10 directories, 0 files
实验环境
挂载光盘到 /var/www/html/centos/{7,8}/os/x86_64/
在8上制作yum仓库, 通过7的kickstart图形化工具创建7的kickstart应答文件
在新的服务器安装7系统
将iso文件挂载到/var/www/html/centos/{6,7,8}/os/x86_64/目录下
添加一个额外的光驱, 用于挂载7的安装光盘
echo "alias scandisk='echo - - - > /sys/class/scsi_host/host0/scan;echo - - - > /sys/class/scsi_host/host1/scan;echo - - - > /sys/class/scsi_host/host2/scan'" >> /root/.bashrc
[20:30:00 root@CentOS-8-1 ~]#scandisk # 新添加的光驱需要重启服务器才能识别, 或者使用scandisk命令别名
[20:30:03 root@CentOS-8-1 ~]#lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 50G 0 disk
├─sda1 8:1 0 1G 0 part /boot
├─sda2 8:2 0 20G 0 part /
├─sda3 8:3 0 2G 0 part [SWAP]
├─sda4 8:4 0 1K 0 part
└─sda5 8:5 0 27G 0 part /data
sr0 11:0 1 7.7G 0 rom /var/www/html/centos/8/os/x86_64 # 挂载到8的目录
sr1 11:1 1 4.5G 0 rom # 挂载到7的目录
[20:24:45 root@CentOS-8-1 ~]#mount /dev/sr0 /var/www/html/centos/8/os/x86_64/ # 挂载8的安装光盘
mount: /var/www/html/centos/8/os/x86_64: WARNING: device write-protected, mounted read-only.
[20:31:43 root@CentOS-8-1 ~]#mount /dev/sr1 /var/www/html/centos/7/os/x86_64/
mount: /var/www/html/centos/7/os/x86_64: WARNING: device write-protected, mounted read-only.
生产环境
直接把iso文件拷贝到yum服务器主机,然后mount直接把iso文件挂到var/www/html/centos/{6,7,8}/os/x86_64/目录下
mount CentOS-8.2.2004-x86_64-dvd1.iso /var/www/html/centos/8/os/x86_64/











Package Selection
需要在配置Xmanager之前, 就去本地7的yum仓库修改yum配置文件, 否则无法继续包的安装选项

先将配置临时保存, 然后配置yum仓库



关闭Xmanger
把base标签改成development

再次打开Xmanager, 验证开始接受yum仓库信息


导入刚才保存的ks文件

选择要安装的软件, 这里测试安装mariadb客户端

安装后执行脚本, 添加创建新系统yum配置文件

mkdir /root/.ssh
chmod 700 /root/.ssh
cat > /root/.ssh/authorized_keys << EOF
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCt92c0R+BMldavwCdmnRD2xWOlZ+YcZUEAvQcCoyWWe1DszF72qyk4zlb0SJ9s/oNbLkxg5LQ2afuR/E37sQ61d+5nq5LZUyiY6yX4qFDojUeMyk2rqiO/e3edolZahadOuuS8nbkL7hHM/qTo2MyWfQgESwbNGOfgnnIZ5PbBeCO3OlpWL2yJeFdnDWTPNGfSfzNAyQXicPW2M8Q1Pri4RBTSqfcVHN4MbvpWsgcjMp4nopLk/sZfoI8YeXJIc0gWc0aVC3ymKd49nKNeMm9VJ5bDIBN/AMzUhL+15zL7v68Y6lbBoRlK+wFAkO6GWT7LTxue+iXlbjLvH9+rjGHfZKY9aSKYV8EyVCb4IvWoOqp4bOfsY6nNghRVZsuEjxLy/Hpb4h+p+Ywq2XoUdxunEJUlBabg5SY62aKjJEl9TPUONexrn5Q4CkFItrGStI6rklSeQyg8gVaNme8cxgBqovOcVuKMrLz5TfwyFonaKzKQWp+aGkuJyIO/O0e+/iE= root@CentOS-8-1
EOF
chmod 600 /root/.ssh/authorized_keys
mkdir /etc/yum.repos.d/backup
mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/backup
cat > /etc/yum.repos.d/base.repo << EOF
[base]
name=CentOS
baseurl=https://mirrors.aliyun.com/centos/\$releasever/os/\$basearch/ # $符号需要进行转义, 否则会直接扩展变量
gpgcheck=0
[extra]
name=extras
baseurl=https://mirrors.aliyun.com/centos/\$releasever/extras/\$basearch
gpgcheck=0
enabled=1
[epel]
name=EPEL
baseurl=http://mirrors.aliyun.com/epel/\$releasever/\$basearch
gpgcheck=0
EOF
保存ks文件到/root目录下, 退出Xanager, 修改ks文件的时区设置, 安装vim
[21:21:52 root@centos-7-1 ~]#vim ks.cfg
...
# System timezone
timezone Asia/Shanghai
...

将ks.cfg文件拷贝到CentOS 8 yum仓库目录下
在CentOS7上生成kickstart文件, 然后传到yum服务器上
[20:31:58 root@CentOS-8-1 ~]#mkdir /var/www/html/ks # 创建存放ks文件的目录
#应答文件制作完成后, 检查语法
[21:25:06 root@centos-7-1 ~]#ksvalidator ks.cfg
#语法无误, 则传给yum仓库
[21:25:22 root@centos-7-1 ~]#scp ks.cfg 10.0.0.81:/var/www/html/ks/centos7.cfg
验证8的yum仓库上可以访问到ks文件

安装新的系统, 应答文件的使用需要在开机时, 指定应答文件的路径
准备一个新的CentOS7虚拟机, 对于磁盘大小一定要大于ks文件中的分区总大小(此前ks分区一个430个G
, 因此准备的新的虚拟机要大于430个G), 内存2个G以上
无需挂载7的安装光盘, 而是利用7的最小化启动光盘进行启动, 然后利用ks文件中的yum仓库进行软件安装
https://mirror.tuna.tsinghua.edu.cn/centos-vault/7.8.2003/isos/x86_64/

新的虚拟机挂载NetInstall光盘

开机, 开机时进入菜单, 按ESC键, 进入boot命令行-指定应答文件路径


linux ks=http://10.0.0.81/ks/centos7.cfg
敲回车

进入安装

如果安装完, 一直卡在等待界面, 可能是因为grub安装失败, 需要重启, 进入救援模式, 安装grub2, 退出救援模式
可以在安装前, 先检查下ks文件, 看看有没有指定bootloader安装位置, bootloader --append="net.ifnames=0" --location=mbr, 如果没有选择安装boot loader 这里会显示 --location=none

chroot /mnt/sysimage
grub2-install /dev/sda
mount /dev/sr0 /mnt
grub2-mkconfig -o /boot/grub2/grub.cfg
sync
重启
如何实现基于网络自动化安装
目前, 虽然可以实现利用ks文件进行自动化安装, 但是系统还需要插入最小化启动安装光盘, 来提供内核文件, boot loader, grub等, 因此, 需要实现基于网络的完全自动化安装, 把这些依赖的文件存放在固定的服务器上, 达到只要网络通, 可以通过新的服务器的网卡找到对应服务器上的文件, 然后下载安装
在新的服务器上开机, 选择菜单, 进行安装即可
4 实现DHCP服务
主机获取网络配置可以通过两种方式:
- 静态指定
- 动态获取:
bootp:boot protocol MAC与IP一一静态对应
dhcp:增强的bootp,动态
自动化安装过程需要配置dhcp服务器, 一是让新的服务器, 安装完成后自动获取ip地址, 需要在ks文件中, 指定ip地址通过dhcp获取. 二是需要dhcp服务器通知新的服务器, 存放了内核文件, boot loader等文件的服务器的地址, 这样新的服务器才能通过网络下载启动安装必要的文件, 实现不依赖于本地的光盘
大概流程:
通过dhcp获取一个ip地址以及tftp服务器地址 --> 从tftp服务器下载启动安装的依赖数据 --> 执行安装ks文件
4.1 DHCP工作原理
DHCP: Dynamic Host Configuration Protocol,动态主机配置协议,UDP协议,C/S模式
dhcp server:67/udp
dhcpv4 client :68/udp,dhcpv6 client:546/udp
- 主要用途:
用于内部网络和网络服务供应商自动分配IP地址给用户
用于内部网络管理员作为对所有电脑作集中管理的手段
自动化安装系统
解决IPV4资源不足问题
- DHCP共有八种报文

DHCP DISCOVER:客户端到服务器
DHCP OFFER :服务器到客户端
DHCP REQUEST:客户端到服务器
DHCP ACK :服务器到客户端
DHCP NAK:服务器到客户端,通知用户无法分配合适的IP地址
DHCP DECLINE :客户端到服务器,指示地址已被使用
DHCP RELEASE:客户端到服务器,放弃网络地址和取消剩余的租约时间
DHCP INFORM:客户端到服务器, 客户端如果需要从DHCP服务器端获取更为详细的配置信息,则发送Inform报文向服务器进行请求,极少用到
- DHCP服务续租
50% :租赁时间达到50%时来续租,刚向DHCP服务器发向新的DHCPREQUEST请求。如果dhcp服务没有拒绝的理由,则回应DHCPACK信息。当DHCP客户端收到该应答信息后,就重新开始新的租用周期
87.5%:如果之前DHCP Server没有回应续租请求,等到租约期的7/8时,主机会再发送一次广播请求
- 同网段的多个DHCP服务
DHCP服务必须基于本地
先到先得的原则, 从哪个dhcp服务器先收到地址, 就不会用后续的
客户端只需要开启dhcp, 不用指定具体用哪个dhcp服务器, 因此, 网络中有多个dhcp服务器就会冲突
- 跨网段
RFC 1542 Compliant Routers
dhcp relay agent: 中继代理
- 相关协议
arp
rarp
- 租期:
长租期:IP相对稳定,网络资源消耗较少,但是浪费IP资源
短租期:IP相对不稳定,网络资源消耗较多,但是IP资源可以充分利用,可以实现较少IP为较多的主机服务
在CentOS 8(之前的yum仓库服务器) 搭建DHCP服务
工作中, dhcp和yum仓库一般不会在同一个服务器
准备工作: 关掉vmware的dhcp服务, 防止新的虚拟机从dhcp收取地址
- 在服务器端安装dhcp-server包(Centos 8) Centos 7上安装dhcp包
[23:35:49 root@CentOS-8-1 ~]#yum -y install dhcp-server
- dhcpd服务默认是无法启动的, 因为配置文件是空的/etc/dhcp/dhcpd.conf需要编辑dhcpd.conf文件, 添加子网地址
# 用模板文件覆盖系统生成的dhcpd.conf文件
[23:36:30 root@CentOS-8-1 ~]#cp /usr/share/doc/dhcp-server/dhcpd.conf.example /etc/dhcp/dhcpd.conf
cp: overwrite '/etc/dhcp/dhcpd.conf'? yes
# option definitions common to all supported networks...
option domain-name "david.org"; #域名是resolv.conf文件定义的search域名
option domain-name-servers 54.252.183.4, 54.252.183.5;
default-lease-time 86400; #租期, 默认600s, 达到一半时间就要开始续租, 需要时间调长, 比如86400s, 一天
max-lease-time 164000; #最长租期有效期
# No service will be given on this subnet, but declaring it helps the
# DHCP server to understand the network topology.
# 地址段一定和当前网卡IP在同一个地址段, 因为dhcp基于广播实现
subnet 10.0.0.0 netmask 255.255.255.0 { #指定给哪个网段分配地址
range 10.0.0.150 10.0.0.200;
option routers 10.0.0.2; # 10.0.0.2是vmware nat环境的网关, 实际工作中还要看具体的网关地址是多少
}
从当前行到结尾, 非#开头的行加上#
进入末行模式
:.,$s/^\([^#].*\)/#\1/
:.,$s/^[^#].*/#&/ # &符号表示前面搜索出来的所有内容
测试DHCP服务成功
[23:59:37 root@CentOS-8-1 ~]#systemctl enable --now dhcpd
Created symlink /etc/systemd/system/multi-user.target.wants/dhcpd.service → /usr/lib/systemd/system/dhcpd.service.
#找一台机器配置dhcp获取ip, 查看是否获得ip地址, 这里用之前制作ks文件的centos7模拟dhcp客户端
[00:04:43 root@centos-7-1 ~]#vinet
BOOTPROTO=dhcp
NAME=eth0
DEVICE=eth0
ONBOOT=yes
[00:05:02 root@centos-7-1 ~]#nmcli conn reload
[00:05:23 root@centos-7-1 ~]#nmcli conn up eth0 # 执行命令后, 如果远程连接断开, 说明dhcp生效
#在centos7查看dhcp日志
查看cat /var/log/message文件
Mar 14 00:05:28 centos-7-1 dbus[540]: [system] Successfully activated service 'org.freedesktop.nm_dispatcher'
Mar 14 00:05:28 centos-7-1 systemd: Started Network Manager Script Dispatcher Service.
Mar 14 00:05:28 centos-7-1 NetworkManager[548]: <info> [1615651528.4339] dhcp4 (eth0): dhclient started with pid 1116
Mar 14 00:05:28 centos-7-1 nm-dispatcher: req:1 'connectivity-change': new request (2 scripts)
Mar 14 00:05:28 centos-7-1 nm-dispatcher: req:1 'connectivity-change': start running ordered scripts...
Mar 14 00:05:28 centos-7-1 nm-dispatcher: req:2 'down' [eth0]: new request (2 scripts)
Mar 14 00:05:28 centos-7-1 nm-dispatcher: req:2 'down' [eth0]: start running ordered scripts...
Mar 14 00:05:28 centos-7-1 dhclient[1116]: DHCPDISCOVER on eth0 to 255.255.255.255 port 67 interval 4 (xid=0x7523106d)
Mar 14 00:05:29 centos-7-1 dhclient[1116]: DHCPREQUEST on eth0 to 255.255.255.255 port 67 (xid=0x7523106d)
Mar 14 00:05:29 centos-7-1 dhclient[1116]: DHCPOFFER from 10.0.0.81
Mar 14 00:05:29 centos-7-1 dhclient[1116]: DHCPACK from 10.0.0.81 (xid=0x7523106d)
Mar 14 00:05:29 centos-7-1 NetworkManager[548]: <info> [1615651529.5142] dhcp4 (eth0): address 10.0.0.151
Mar 14 00:05:29 centos-7-1 NetworkManager[548]: <info> [1615651529.5142] dhcp4 (eth0): plen 24 (255.255.255.0)
Mar 14 00:05:29 centos-7-1 NetworkManager[548]: <info> [1615651529.5143] dhcp4 (eth0): gateway 10.0.0.2
Mar 14 00:05:29 centos-7-1 NetworkManager[548]: <info> [1615651529.5143] dhcp4 (eth0): lease time 86400
Mar 14 00:05:29 centos-7-1 NetworkManager[548]: <info> [1615651529.5143] dhcp4 (eth0): nameserver '223.5.5.5'
Mar 14 00:05:29 centos-7-1 NetworkManager[548]: <info> [1615651529.5143] dhcp4 (eth0): nameserver '180.76.76.76'
Mar 14 00:05:29 centos-7-1 NetworkManager[548]: <info> [1615651529.5143] dhcp4 (eth0): domain name 'david.org'
Mar 14 00:05:29 centos-7-1 NetworkManager[548]: <info> [1615651529.5143] dhcp4 (eth0): state changed unknown -> bound
Mar 14 00:05:29 centos-7-1 NetworkManager[548]: <info> [1615651529.5156] device (eth0): state change: ip-config -> ip-check (reason 'none', sys-iface-state: 'managed')
Mar 14 00:05:29 centos-7-1 NetworkManager[548]: <info> [1615651529.5165] device (eth0): state change: ip-check -> secondaries (reason 'none', sys-iface-state: 'managed')
Mar 14 00:05:29 centos-7-1 NetworkManager[548]: <info> [1615651529.5180] device (eth0): state change: secondaries -> activated (reason 'none', sys-iface-state: 'managed')
Mar 14 00:05:29 centos-7-1 NetworkManager[548]: <info> [1615651529.5186] manager: NetworkManager state is now CONNECTED_LOCAL
Mar 14 00:05:29 centos-7-1 NetworkManager[548]: <info> [1615651529.5367] manager: NetworkManager state is now CONNECTED_SITE
Mar 14 00:05:29 centos-7-1 NetworkManager[548]: <info> [1615651529.5369] policy: set 'eth0' (eth0) as default for IPv4 routing and DNS
Mar 14 00:05:29 centos-7-1 NetworkManager[548]: <info> [1615651529.5413] device (eth0): Activation: successful, device activated.
Mar 14 00:05:29 centos-7-1 NetworkManager[548]: <info> [1615651529.5421] manager: NetworkManager state is now CONNECTED_GLOBAL
#在dhcp服务器查看dhcp日志
[00:00:49 root@CentOS-8-1 ~]#cat /var/lib/dhcpd/dhcpd.leases
# The format of this file is documented in the dhcpd.leases(5) manual page.
# This lease file was written by isc-dhcp-4.3.6
# authoring-byte-order entry is generated, DO NOT DELETE
authoring-byte-order little-endian;
server-duid "\000\001\000\001'\337\235\355\000\014)\037J\012";
lease 10.0.0.150 { # 150分给了之前ks启动的新的虚拟机
starts 6 2021/03/13 16:02:39; # UTC时间 比北京时间完了8小时
ends 0 2021/03/14 16:02:39;
cltt 6 2021/03/13 16:02:39;
binding state active;
next binding state free;
rewind binding state free;
hardware ethernet 00:0c:29:b9:c5:39; # 分配给客户端的mac地址
}
lease 10.0.0.151 { # 151是分给centos7客户端的
starts 6 2021/03/13 16:05:28;
ends 0 2021/03/14 16:05:28;
cltt 6 2021/03/13 16:05:28;
binding state active;
next binding state free;
rewind binding state free;
hardware ethernet 00:0c:29:54:b7:78; # 该ip地址分配给的主机的mac地址
client-hostname "centos-7-1"; # 客户端的主机名
}

客户端验证ip通过dhcp获取

客户端获取dhcp地址时会自动开启dhclient程序
[00:17:33 root@centos-7-1 ~]#ps aux | grep dhclient
root 1116 0.0 0.5 102904 5516 ? S 00:05 0:00 /sbin/dhclient -d -q -sf /usr/libexec/nm-dhcp-helper -pf /var/run/dhclient-eth0.pid -lf /var/lib/NetworkManager/dhclient-5fb06bd0-0bb0-7ffb-45f1-d6edd65f3e03-eth0.lease -cf /var/lib/NetworkManager/dhclient-eth0.conf eth0
root 1235 0.0 0.0 112808 968 pts/2 R+ 00:17 0:00 grep --color=auto dhclient
在一个使用静态地址的服务器上, 如何通过dhcp再分配一个ip地址
如果服务器配置了通过dhcp获取ip地址, 那么服务器启动会默认执行dhclient, 运行在后台, 想要前台执行, 需要加-d选项, dhclient -d
如果想要手动通过dhcp获取一个ip地址, 需要手动执行dhclient
需要在静态地址的服务器上运行dhclient命令, 这里准备另一个虚拟机, 使用静态地址, 测试dhclient
[00:21:22 root@centos-7-2 ~]#cat /etc/sysconfig/network-scripts/ifcfg-eth0
BOOTPROTO=static # 当前地址是静态获取
NAME=eth0
DEVICE=eth0
ONBOOT=yes
IPADDR=10.0.0.227
NETMASK=255.255.255.0
GATEWAY=10.0.0.2
DNS1=223.5.5.5
DNS2=223.5.5.6
[00:23:24 root@centos-7-2 ~]#dhclient
[00:23:36 root@centos-7-2 ~]#
[00:23:36 root@centos-7-2 ~]#ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:54:b7:90 brd ff:ff:ff:ff:ff:ff
inet 10.0.0.227/24 brd 10.0.0.255 scope global noprefixroute eth0
valid_lft forever preferred_lft forever
inet 10.0.0.152/24 brd 10.0.0.255 scope global secondary dynamic eth0 # 获的新的地址, 通过dhcp
valid_lft 86365sec preferred_lft 86365sec
inet6 fe80::20c:29ff:fe54:b790/64 scope link
valid_lft forever preferred_lft forever
5 实现TFTP服务
轻量级文件服务, 对于小文件, 不是特别复杂的下载需求, 可以使用tftp
对于实现PXE自动化安装, 需要服务器必须配置符合PXE标准的网卡, 其内置ROM芯片, 集成了dhcp客户端和tftp客户端
dhcp客户端用于接收ip地址
tftp客户端用于接收从tftp服务器下载来的内核, boot loader等文件
否则, 新的服务器是空的, 没有硬盘, 无法接受ip, 也就无法获取必要的文件
1. 需要编辑dhcpd配置文件,让客户端网卡知道从哪个服务器获取安装系统所需文件
# No service will be given on this subnet, but declaring it helps the
# DHCP server to understand the network topology.
subnet 10.0.0.0 netmask 255.255.255.0 {
range 10.0.0.150 10.0.0.200;
option routers 10.0.0.2;
next-server 10.0.0.81; #tftp服务器地址, 这里用centos8-1:10.0.0.81, 提供yum, dhcp服务和tftp服务
}
2. 在tftp服务器上安装tftp服务
[00:53:38 root@CentOS-8-1 ~]#yum -y install tftp-server
[00:53:46 root@CentOS-8-1 ~]#rpm -ql tftp-server
/usr/lib/.build-id
/usr/lib/.build-id/8c
/usr/lib/.build-id/8c/6921a9fb21d66da4fb299d516bce9ee6afea34
/usr/lib/systemd/system/tftp.service
/usr/lib/systemd/system/tftp.socket
/usr/sbin/in.tftpd
/usr/share/doc/tftp-server
/usr/share/doc/tftp-server/CHANGES
/usr/share/doc/tftp-server/README
/usr/share/doc/tftp-server/README.security
/usr/share/man/man8/in.tftpd.8.gz
/usr/share/man/man8/tftpd.8.gz
/var/lib/tftpboot #共享所有数据的目录
#启动tftp服务, 监听在udp 69端口
[00:53:59 root@CentOS-8-1 ~]#systemctl start tftp
[00:54:14 root@CentOS-8-1 ~]#ss -ntlu
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port
udp UNCONN 0 0 0.0.0.0:67 # tftp监听udp:67端口 0.0.0.0:*
udp UNCONN 0 0 *:69 *:*
#tftp轻量级文件共享, 没有配置文件, 只能提供文件下载
3. 告诉客户端tftp去服务器上下载哪个文件
制作pxelinux0放在tftp服务器上, 通过dhcp服务, 分配地址同时告诉客户端去tftp下载pxelinux.0文件, 也就是boot loader文件
# No service will be given on this subnet, but declaring it helps the
# DHCP server to understand the network topology.
subnet 10.0.0.0 netmask 255.255.255.0 {
range 10.0.0.150 10.0.0.200;
option routers 10.0.0.2;
next-server 10.0.0.8;
filename "pxelinux.0"; #bootloader启动文件的名称
}
[00:55:38 root@CentOS-8-1 ~]#systemctl restart dhcpd
验证tftp服务可用
#在服务器端添加文件到/var/lib/tftpboot/
[00:56:09 root@CentOS-8-1 ~]#cp /etc/fstab /var/lib/tftpboot/
#客户端安装tftp客户端程序, 用centos-7作为客户端
[00:35:26 root@centos-7-1 ~]#yum -y install tftp
#下载文件
[00:58:40 root@centos-7-1 ~]##tftp 10.0.0.81
[00:58:52 root@centos-7-1 ~]#tftp 10.0.0.81
tftp> get fstab
tftp> quit
[00:59:18 root@centos-7-1 ~]#ls
anaconda-ks.cfg fstab ks.cfg Sys_Init.sh
#tftp下载时需要知道文件的全名,没有补全功能
4. 安装pxelinux.0
[01:01:50 root@CentOS-8-1 ~]#yum provides */pxelinux.0
Last metadata expiration check: 0:06:53 ago on Sun 14 Mar 2021 12:54:59 AM CST.
syslinux-nonlinux-6.04-4.el8.noarch : SYSLINUX modules which aren't run from linux.
Repo : BaseOS
Matched from:
Filename : /usr/share/syslinux/pxelinux.0
syslinux-tftpboot-6.04-4.el8.noarch : SYSLINUX modules in /tftpboot, available for network booting
Repo : BaseOS
Matched from:
Filename : /tftpboot/pxelinux.0
[01:02:22 root@CentOS-8-1 ~]#yum -y install syslinux-nonlinux
[01:02:45 root@CentOS-8-1 ~]#rpm -ql syslinux-nonlinux
/usr/share/syslinux/pxelinux.0
#复制/usr/share/syslinux/pxelinux.0到/var/lib/tftpboot/
[01:03:03 root@CentOS-8-1 ~]#cp /usr/share/syslinux/pxelinux.0 /var/lib/tftpboot/
到此bootloader(grub)阶段结束, 下一步进入菜单选项(isolinux.cfg菜单模板)
1. 复制isolinux.cfg到/var/lib/tftpboot
[01:05:40 root@CentOS-8-1 ~]#mkdir /var/lib/tftpboot/pxelinux.cfg
[01:06:26 root@CentOS-8-1 ~]#cp /misc/cd/isolinux/isolinux.cfg /var/lib/tftpboot/pxelinux.cfg/default
[01:06:49 root@CentOS-8-1 ~]#tree /var/lib/tftpboot/
/var/lib/tftpboot/
├── fstab
├── pxelinux.0
└── pxelinux.cfg
└── default # 这里准备的是进入操作系统安装时的选择菜单
1 directory, 3 files
2. 修改isolinux.cfg文件
[01:07:07 root@CentOS-8-1 ~]#vim /var/lib/tftpboot/pxelinux.cfg/default
#default vesamenu.c32 --> default menu.c32 #默认提供的vesa菜单风格需要图形化界面, 要修改成syslinux-nonlinux包所带的menu.c32,精简版菜单风格,不需要图形界面
[00:58:00 root@CentOS-8-1 ~]#cp /usr/share/syslinux/menu.c32 /var/lib/tftpboot
#关于菜单部分, 只需保留以下三行
default menu.c32
timeout 600
menu title Automatic Install Linux # 大标题
- 子标题
label linux # 标签名, 可以修改为对应的要安装的系统版本
menu label ^Install CentOS Linux 8 # 标签名
kernel vmlinuz
append initrd=initrd.img inst.stage2=hd:LABEL=CentOS-8-2-2004-x86_64-dvd quiet # inst.stage2这里应该指定对应操作系统版本的应答文件路径
- 修改后
default menu.c32 # 菜单风格
timeout 600 # 时间 60s
menu title Automatic Install Linux # 大标题
label CentOS-8 # 安装8的选项
menu label Install CentOS Linux ^8 # 这里在8前面加上托字符, 可以实现, 在菜单界面输入8, 就会跳到安装8的这一行, 相当于快捷键
kernel vmlinuz
append initrd=initrd.img ks=
label CentOS-7 # 安装7的选项
menu label Install CentOS Linux ^7
kernel vmlinuz
append initrd=initrd.img ks=http://10.0.0.81/ks/centos7.cfg
label rescue # 8的救援模式
menu label ^Rescue a CentOS 8 Linux system
kernel vmlinuz
append initrd=initrd.img inst.repo=http://10.0.0.81/centos/8/os/x86_64/ rescue
label rescue
menu label ^Rescue a CentOS 7 Linux system
kernel vmlinuz
append initrd=initrd.img inst.repo=http://10.0.0.81/centos/7/os/x86_64/ rescue
label local # 从本地硬盘启动, 要设为默认启动项, 这样服务器开机就会从硬盘启动, 如果把安装系统作为默认项, 那么60s结束后, 会自动安装系统, 把现有系统清空
menu label Boot from ^local drive
menu default
localboot 0xffff
menu end
# 这样菜单就包括了安装对应版本系统, 进入对应版本的救援模式, 和本地启动三个功能.
# 不过还缺少内核文件路径, 以及initrd文件路径
3. 指定initrd文件和内核文件
[01:40:45 root@CentOS-8-1 /var/lib/tftpboot]#mkdir centos{7,8}
[01:41:17 root@CentOS-8-1 /var/lib/tftpboot]#cp /var/www/html/centos/8/os/x86_64/isolinux/vmlinuz centos8 # 内核文件
[01:41:47 root@CentOS-8-1 /var/lib/tftpboot]#cp /var/www/html/centos/8/os/x86_64/isolinux/initrd.img centos8
[01:41:55 root@CentOS-8-1 /var/lib/tftpboot]#cp /var/www/html/centos/7/os/x86_64/isolinux/vmlinuz centos7
[01:42:08 root@CentOS-8-1 /var/lib/tftpboot]#cp /var/www/html/centos/7/os/x86_64/isolinux/initrd.img centos7
[01:42:17 root@CentOS-8-1 /var/lib/tftpboot]#tree
.
├── centos7
│ ├── initrd.img
│ └── vmlinuz
├── centos8
│ ├── initrd.img
│ └── vmlinuz
├── menu.c32
├── pxelinux.0
└── pxelinux.cfg
└── default
3 directories, 7 files
# 更新后的菜单文件
default menu.c32
timeout 600
menu title Automatic Install Linux
label CentOS-8
menu label Install CentOS Linux ^8
kernel vmlinuz
default menu.c32
timeout 600
menu title Automatic Install Linux
label CentOS-8
menu label Install CentOS Linux ^8
kernel centos8/vmlinuz
append initrd=centos8/initrd.img ks=
label CentOS-7
menu label Install CentOS Linux ^7
kernel centos7/vmlinuz
append initrd=centos7/initrd.img ks=http://10.0.0.81/ks/centos7.cfg
label rescue
menu label ^Rescue a CentOS 8 Linux system
kernel centos8/vmlinuz
append initrd=initrd.img inst.repo=http://10.0.0.81/centos/8/os/x86_64/ rescue
label rescue
menu label ^Rescue a CentOS 7 Linux system
kernel centos7/vmlinuz
append initrd=initrd.img inst.repo=http://10.0.0.81/centos/7/os/x86_64/ rescue
#支持手动安装centos7
label manual
menu label ^Manual Install Centos
kernel vmlinuz
append initrd=initrd.img inst.repo=http://10.0.0.81/centos/7/os/x86_64/
label local
menu label Boot from ^local drive
menu default
localboot 0xffff
menu end
4. 准备CentOS8的应答文件
- CentOS8不支持ks图形化工具, 只能手动创建ks文件, 一般可以使用一个已经装好系统的模板ks文件
#直接利用CentOS8现成的应答文件, 稍作修改, 因为7和8版本的应答文件格式略有不同
[01:42:48 root@CentOS-8-1 /var/lib/tftpboot]#cp ~/anaconda-ks.cfg /var/www/html/ks/centos8.cfg
[01:49:08 root@CentOS-8-1 /var/lib/tftpboot]#vim /var/www/html/ks/centos8.cfg
#version=RHEL8
ignoredisk --only-use=sda
# Partition clearing information
zerombr
text
reboot
clearpart --all --initlabel
selinux --disabled
firewall --disabled
url --url=http://10.0.0.81/centos/8/os/x86_64 # 指定yum仓库路径
bootloader --append="net.ifnames=0" --location=mbr --boot-drive=sda
# Keyboard layouts
keyboard --vckeymap=us --xlayouts='us'
# System language
lang en_US.UTF-8
# Network information
network --bootproto=dhcp --device=eth0 --onboot=on --ipv6=auto --activate
network --hostname=CentOS-8
# Root password
rootpw --iscrypted $6$FG4jjQI/t3A.A.Fg$Uwq66umE4c8oKjiCP8stUql9wE45AioQL.KHJiKF29Y6Q2BA70M/mpDIv9untio9bPaY.flSP.uAQ/JOuOrZz.
# Run the Setup Agent on first boot
firstboot --enable
# Do not configure the X Window System
skipx
# System services
services --disabled="chronyd"
# System timezone
timezone Asia/Shanghai --isUtc --nontp
# Disk partitioning information
part / --fstype="xfs" --ondisk=sda --size=20480
part swap --fstype="swap" --ondisk=sda --size=2048
part /boot --fstype="ext4" --ondisk=sda --size=1024
part /data --fstype="xfs" --ondisk=sda --size=27646
%packages
@^minimal-environment
kexec-tools
vim # 安装工具
wget
lrzsz
%end
%addon com_redhat_kdump --enable --reserve-mb='auto'
%end
%anaconda
pwpolicy root --minlen=6 --minquality=1 --notstrict --nochanges --notempty
pwpolicy user --minlen=6 --minquality=1 --notstrict --nochanges --emptyok
pwpolicy luks --minlen=6 --minquality=1 --notstrict --nochanges --notempty
%end
%post
useradd testpxe # 建个账号, 测试安装后账号自动创建
%end
[01:55:26 root@CentOS-8-1 /var/lib/tftpboot]#ksvalidator /var/www/html/ks/centos8.cfg
- 最终的菜单文件
default menu.c32
timeout 600
menu title Automatic Install Linux
label CentOS-8
menu label Install CentOS Linux ^8
kernel centos8/vmlinuz
append initrd=centos8/initrd.img ks=http://10.0.0.81/ks/centos8.cfg
label CentOS-7
menu label Install CentOS Linux ^7
kernel centos7/vmlinuz
append initrd=centos7/initrd.img ks=http://10.0.0.81/ks/centos7.cfg
label rescue 8
menu label ^Rescue a CentOS 8 Linux system
kernel centos8/vmlinuz
append initrd=initrd.img inst.repo=http://10.0.0.81/centos/8/os/x86_64/ rescue
label rescue 7
menu label ^Rescue a CentOS 7 Linux system
kernel centos7/vmlinuz
append initrd=initrd.img inst.repo=http://10.0.0.81/centos/7/os/x86_64/ rescue
label manual
menu label ^Manual Install Centos
kernel vmlinuz
append initrd=initrd.img inst.repo=http://10.0.0.81/centos/7/os/x86_64/
label local
menu label Boot from ^local drive
menu default
localboot 0xffff
menu end
~
- 修改8的应答文件权限, 因为8的ks文件是从已有的文件拷贝的, 而系统安装好后生成的ks文件权限是600, 需要修改为644, 让其他用户可读
[02:00:09 root@CentOS-8-1 /var/lib/tftpboot]#chmod 644 /var/www/html/ks/centos8.cfg
- 菜单文件需要使用wq!保存, 因为默认是rrr权限
[02:03:55 root@CentOS-8-1 /var/lib/tftpboot]#tree
.
├── centos7
│ ├── initrd.img # intird文件
│ └── vmlinuz # 内核文件
├── centos8
│ ├── initrd.img
│ └── vmlinuz
├── menu.c32 # 菜单风格
├── pxelinux.0 # 安装boot loader的文件
└── pxelinux.cfg
└── default # 安装选项菜单文件
3 directories, 7 files
5. 准备CentOS8特有文件

[02:06:49 root@CentOS-8-1 /var/lib/tftpboot]#cp /var/www/html/centos/8/os/x86_64/isolinux/*.c32 ./
[02:07:00 root@CentOS-8-1 /var/lib/tftpboot]#tree
.
├── centos7
│ ├── initrd.img
│ └── vmlinuz
├── centos8
│ ├── initrd.img
│ └── vmlinuz
├── ldlinux.c32
├── libcom32.c32
├── libutil.c32
├── menu.c32
├── pxelinux.0
├── pxelinux.cfg
│ └── default
└── vesamenu.c32
3 directories, 11 files
[02:07:05 root@CentOS-8-1 /var/lib/tftpboot]#rm -rf vesamenu.c32
[02:08:20 root@CentOS-8-1 /var/lib/tftpboot]#tree
.
├── centos7
│ ├── initrd.img
│ └── vmlinuz
├── centos8
│ ├── initrd.img
│ └── vmlinuz
├── ldlinux.c32
├── libcom32.c32
├── libutil.c32
├── menu.c32
├── pxelinux.0
└── pxelinux.cfg
└── default
3 directories, 10 files
- 确保http, tftp, dhcp服务都启动
[02:10:35 root@CentOS-8-1 /var/lib/tftpboot]#ss -ntlu
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port
udp UNCONN 0 0 0.0.0.0:67 0.0.0.0:*
udp UNCONN 0 0 *:69 *:*
tcp LISTEN 0 128 0.0.0.0:80 0.0.0.0:*
tcp LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
tcp LISTEN 0 128 [::]:22 [::]:*
6. 验证8的系统安装
- 先准备个虚拟机装CentOS-8, 开机

7. 验证7的系统安装
8. 对于已经安装好的系统, 也可以通过PXE进入救援模式
需要开启读条时, 按ESC, 然后选择NET网络启动, 然后进入菜单, 选择救援模式
9. 如果想重装系统, 也可以通过PXE重装
需要开启读条时, 按ESC, 然后选择NET网络启动, 然后进入菜单, 选择要安装的系统版本
补充: PXE启动流程

注意: 安装系统时不要多台一起装, 因为所有服务器都要从服务器下载文件, 占用大量带宽, 一般10几台一起装即可