预启动执行环境(Preboot eXecution Environment,PXE)也被称为预执行环境,提供了一种使用网络接口(Network Interface)启动计算机的机制。这种机制让计算机的启动可以不依赖本地数据存储设备(如硬盘)或本地已安装的操作系统。
功能 | IP | 用途 |
---|---|---|
PXE服务器 | 192.168.1.130 | DHCP、TFTP、HTTP、PXE |
客户端 | 192.168.1.10 | 测试机,通过pxe安装OS |
组件功能介绍
Kickstart: 将安装过程的参数写入到ks.cfg文件,实现自动安装配置达到无人值守自动安装;
TFTP: 支持PXE 引导的网卡从tftp服务器端下载pxelinux.0、vmlinuz、initrd.img等内核引导文件;
DHCP: PXE引导过程中先获取IP地址,并提供pxelinux.0文件位置;
HTTP: 用于下载ks.cfg以及系统镜像文件。
[root@server ~]# yum install nginx
[root@server ~]# yum install dhcp
[root@server ~]# yum install tftp-server
[root@server ~]# yum install syslinux
建立7和8 web目录
[root@server ~] # mkdir /dataweb/centos/{7,8}/os/x86_64 -p
[root@server /]# tree dataweb/
dataweb/
└── centos
├── 7
│ └── os
│ └── x86_64
└── 8
└── os
└── x86_64
# 修改nginx配置文件
[root@server ~]# cat /etc/nginx/conf.d/repo.conf
server {
listen 80;
server_name localhost;
location / {
root /dataweb;
index index.html index.php index.htm;
autoindex on; # 允许显示目录
}
}
# 挂载光盘到dataweb目录,按实际需求更改挂载点
[root@server ~]# mount /dev/sr0 /dataweb/centos/8/os/x86_64/
mount: /dev/sr0 is write-protected, mounting read-only
[root@server ~]# mount /dev/sr1 /dataweb/centos/7/os/x86_64/
mount: /dev/sr1 is write-protected, mounting read-only
# 启动nginx服务
[root@server ~]# systemctl restart nginx
制作kickstart应答文件
使用原有系统安装完成后生成的anaconda-ks.cfg文件,复制副本重新修改,生成新的ks文件。
[root@server ~]# mkdir /dataweb/ksdir
# 复制应答模板文件
[root@server ~]# cp anaconda-ks.cfg /dataweb/ksdir/ks7-mini.cfg
[root@server ~]# cp anaconda-ks.cfg /dataweb/ksdir/ks8-mini.cfg
# 给文件赋予读权限
[root@server ~]# chmod +r *
[root@server ~]# python -c 'import crypt;print crypt.crypt("123456")'
$6$lo6Yc9wZr0sQaIAv$Sx2u.hll/zm00Q88dNIEvY9jMSkfvyAq81fUJ0drU.Ty/g6BI7WolMHlJoJufOXYixQt6GSb1T4dkqByHuX7L.
[root@server ~]# cd /dataweb/ksdir
[root@server ksdir]# cat ks7-mini.cfg
#version=DEVEL
# System authorization information
auth --enableshadow --passalgo=sha512
# 安装还是更新系统
install
# 安装源
url --url=http://192.168.1.130/centos/7/os/x86_64
# 使用字符界面安装系统
text
# Run the Setup Agent on first boot
firstboot --disable
# 从sda分区,线上环境注意修改,不同类型磁盘显示不同
ignoredisk --only-use=sda
# 键盘布局
keyboard --vckeymap=us --xlayouts='us'
# 系统语言,关闭selinux和firewall
lang en_US.UTF-8
selinux --disabled
firewall --disabled
# 网络设置
network --bootproto=dhcp --device=eth0 --onboot=on --ipv6=auto --no-activate
network --hostname=localhost.localdomain
bootloader --append="net.ifnames=0" --location=mbr
# root密码设置,采用密钥串形式,此处密码为123456,如果不修改的话默认为当前系统安装时的密码
rootpw --iscrypted $6$lo6Yc9wZr0sQaIAv$Sx2u.hll/zm00Q88dNIEvY9jMSkfvyAq81fUJ0drU.Ty/g6BI7WolMHlJoJufOXYixQt6GSb1T4dkqByHuX7L.
# System services
services --disabled="chronyd"
# 设置时区
timezone Asia/Shanghai --isUtc --nontp
# 清除主引导记录
clearpart --all
# 清除所有分区
zerombr
# 分区信息,以下配置为标准分区
part /boot --asprimary --fstype="xfs" --size=500
part swap --fstype="swap" --size=2048
part / --asprimary --fstype="xfs" --size=4096
# 安装软件包 @为软件包组、@^为环境包组、直接输入软件包名、- 按排列顺序安装某个软件包
%packages
@minimal-environment
net-tools
tree
wget
vim
%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
reboot
ks8-mini.cfg配置文件
[root@server ksdir]# cp ks7-mini.cfg ks8-mini.cfg
[root@server ksdir]# cat ks8-mini.cfg
#version=DEVEL
# System authorization information
auth --enableshadow --passalgo=sha512
# 安装还是更新系统
install
# 安装源,修改为8的安装文件
url --url=http://192.168.1.130/centos/8/os/x86_64
...... 其他配置保持不变 ......
ignoredisk: 在安装过程中控制对磁盘的连接,如果你使用的是自动分区,那么在安装过程中可以通过 ignoredisk --driver=sdc 指定自动分区忽略的磁盘,如果你有多个磁盘,并且只想使用其中一个进行自动分区,并安装操作系统,你可以使用 ignoredisk --only-use=sda 指定只使用 sda 这一个磁盘。线上基本不可能为sda按实际情况修改
autopart: 自动创建根分区( / ),交换分区(swap)和适当的启动分区(/boot),在足够大的驱动器上,还会创建 /home 分区;通过 --type= 指定分区类型,如示例中使用的标准分区。你还可以通过 --fstype= 指定系统文件类型,如 xfs,ext4 等等,默认是 xfs;你还可以通过 --encrypted 选项,对所有分区进行加密。
clearpart: 在分区前,删除现有分区;可以通过 --drives= 指定要删除分区的磁盘,也可以通过 --all 清除所有设备的分区。
graphical: 安装过程以图形化的方式进行,就和手动安装一样;也可以使用 text 命令,以文本的方式显示安装过程。
reboot: 安装完成后重启。
repo: 指定额外的软件包安装源。
url: 通过网络安装时,安装文件的位置。
keyboard: 指定键盘布局;通过 --vckeymap= 指定应使用哪个 VConsole 键盘模式;通过 --xlayouts= 指定键盘的布局。
firstboot: 第一次启动系统时,是否显示 Initial Setup;如果启用,则必须安装 initial-setup 软件包,如果未指定,则默认禁用这个选项;--enable 表示启动 Initial Setup、--disable 表示禁用 Initial Setup;你还可以使用 --reconfig 选项在引导系统时启动重配置(reconfiguration)模式,在这个模式下,你可以重新配置系统语言,键盘鼠标,root 密码,系统安全级别,时区以及网络配置。
lang: 配置系统语言。
network: 网络配置,使用 --bootproto= 指定计算机获取 IP 的方式,是 dchp 还是 static。使用 --device= 指定要配置的设备名称。使用 --activate 激活该设备。如果你的 --bootproto= 使用的是 static,那么你可以使用 ip= 指定 IP 地址,--netmask= 指定子网掩码,--gateway= 指定网关,--nameserver= 指定 DNS。使用 ipv6= 指定 IPv6 配置,使用auto 表示自动配置。使用 --hostname 配置主机名。
rootpw: 指定 root 用户的密码,--iscrypted 表示密码以密文的方式显示,--plaintext 表示以明文的方式显示密码,还可以使用 --lock 锁定 root 用户。
当你使用 --iscrypted 时,可以在一台已经安装好系统的机器上,通过 python 生成密码的密文(如果是 Python 3,则对应的命令应该是 python3的语法。
$ python -c 'import crypt; print crypt.crypt("My Password")'
xconfig: 配置 X Windows 系统,--startxonboot 表示在安装的系统中使用图形界面登录。
services: 配置服务的默认状态,--disabled= 指定默认禁用的服务,使用 --enabled= 指定默认启用的服务。
timezone: 指定时区。
user: 添加额外的用户,通过 --name= 指定用户名,通过 --groups= 指定用户要添加的组(除默认组),通过 --password= 指定该用户的密码,--iscrypted 表示以密文的方式,通过--gecos= 定义用户的 GECOS信息,如,用户的全名等等。
%packages 表示要安装的软件包。
通过 @ 指定软件包组,如:
%packages
@core
@X Window System
@Desktop
%end
通过 @^ 指定环境组,如:
%packages
@^graphical-server-environment
%end
直接输入软件包名,指定独立的软件包,如:
%packages
@core
@desktop
sqlite
curl
%end
通过 - 号排除软件包组中的某个软件包
%packages
@Development Tools
-pkgconf
-pkgconf-m4
-pkgconf-pkg-config
-redhat-rpm-config
%end
%package 要以 %end 结尾。
%addon 配置 kdump。--enable 表示开启,并通过 --reserve-mb= 指定为 kdump 预留的内存大小,auto 表示自动,要以 %end结束。
%anaconda 部分指定 password 策略,以 %end 结束。
你还可以通过 %pre 指定在磁盘分区前要执行的脚本,通过 %post 指定系统安装完成后要执行的脚本。这些模块都需要 %end 结束。
复制dhcpd模板文件到/etc/dhcp/dhcpd.conf,再修改相应选项,或者自行编写最小化模板。
[root@server ~]# cat /etc/dhcp/dhcpd.conf
# 设置租约时间和最大租约时间
default-lease-time 600;
max-lease-time 7200;
# 定义域名
option domain-name "localhost.com";
# 定义地址池的子网、掩码、网关和地址池范围
subnet 192.168.1.0 netmask 255.255.255.0 {
range 192.168.1.10 192.168.1.100;
option routers 192.168.1.1;
# 定义引导服务器,即tftp服务器的引导文件和tftp服务器地址,注意此处的filename是有针对性的,此处的文件只是基于linux -X86的架构有效。
next-server 192.168.1.130;
filename "pxelinux.0";
}
# 启动服务
[root@server ~]# systemctl restart dhcpd
vesamenu.c32
和menu.c32
是syslinux所拥有众多模块中的两个,它们的功能是制定启动器使用什么模式。vesamenu.c32
图形模式,menu.c32
文本模式。此处选择menu.c32
。同时还需要pxelinux.0
文件,它对整个引导器的作用就如同内核对系统的作用,它可以解释default
文件(配置引导菜单的文件)中的每个配置项,并根据配置项做出不同的反应,如等待的时间、启动器背景、启动菜单、内核引导等。
# Centos7拷贝如下文件
[root@server ~]# cd /var/lib/tftpboot
[root@server tftpboot]# mkdir 7 8
[root@server tftpboot]# mkdir pxelinux.cfg
[root@server tftpboot]# cp /usr/share/syslinux/{pxelinux.0,menu.c32} .
[root@server tftpboot]# cp /dataweb/centos/7/os/x86_64/isolinux/{vmlinuz,initrd.img} 7
# Centos8环境拷贝以下文件
[root@server ~]# cd /var/lib/tftpboot/
[root@server tftpboot]# cp /dataweb/centos/8/os/x86_64/isolinux/{ldlinux.c32,libutil.c32,libcom32.c32} .
[root@server tftpboot]# cp /dataweb/centos/8/os/x86_64/isolinux/{vmlinuz,initrd.img} 8
# 目录结构
[root@server lib]# tree tftpboot/
tftpboot/
├── 7
│ ├── initrd.img
│ └── vmlinuz
├── 8
│ ├── initrd.img
│ └── vmlinuz
├── ldlinux.c32
├── libcom32.c32
├── libutil.c32
├── menu.c32
├── pxelinux.0
└── pxelinux.cfg
# 启动服务
[root@server ~]# systemctl restart tftp
其他教程选择复制模板再进行修改,此处自行编写最小化引导启动。
[root@server tftpboot]# vim pxelinux.cfg/default
# 如果将值修改为正文mini标签的话,默认选择mini标签,不会让用户选择
default menu.c32
timeout 600
# 背景标题
menu title ########## GXM-PXE Boot Menu ##########
label mini7
menu label install centos mini 7
kernel 7/vmlinuz
append initrd=7/initrd.img ks=http://192.168.1.130/ksdir/ks7-mini.cfg
label mini8
menu label install centos mini 8
kernel 8/vmlinuz
append initrd=8/initrd.img ks=http://192.168.1.130/ksdir/ks8-mini.cfg
label local
menu default
menu label ^Boot from local drive
localboot 0xffff
新建虚拟机, 测试pxe安装是否成功。
至此,通过PXE实现自动化安装系统成功完成。