运维手册之 PXE 自动化安装系统
后知后觉 暂无评论

PXEPreboot eXecution Environment,预启动执行环境)提供了一种通过网络接口启动计算机,不依赖本地存储设备(如硬盘)或本地已安装的操作系统。

PXE 常与 kickstart 搭配使用来批量自动化安装系统,实际上 Cobbler 程序就是 PXE 的一种封装。

PXE 特性:

环境

属性
操作系统CentOS Linux release 7.5.1804 (Core)
服务端地址192.168.15.100
光盘镜像CentOS-7-x86_64-DVD-1804.iso

原理

标准的 C/S 结构,只依赖常见的 DHCP TFTP (HTTP) 服务。

架构示意图

部署

需要部署的服务如下,推荐按下述的顺序进行配置。

DHCP 服务

DHCP 服务为 PXE 客户端提供地址,需要注意的是如果网络内存在其他的 DHCP 服务器,需要停用,或者使用独立的子网进行配置,防止地址分配冲突。

安装 DHCP

sudo yum install -y dhcp

配置 DHCP

sudo vim /etc/dhcp/dhcpd.conf

修改或添加以下字段

option space pxelinux;
option pxelinux.magic code 208 = string;
option pxelinux.configfile code 209 = text;
option pxelinux.pathprefix code 210 = text;
option pxelinux.reboottime code 211 = unsigned integer 32;
option architecture-type code 93 = unsigned integer 16;

subnet 192.168.15.0 netmask 255.255.255.0 {
    option routers                  192.168.15.2;
    option subnet-mask              255.255.255.0;
    option domain-name-servers      192.168.15.2;
    option time-offset              -18000;
    range dynamic-bootp 192.168.15.60 192.168.15.100;
    class "pxeclients" {
      match if substring (option vendor-class-identifier, 0, 9) = "PXEClient";
      next-server 192.168.15.100;

      if option architecture-type = 00:07 {
        filename "uefi/shim.efi";
      } else {
        filename "pxelinux/pxelinux.0";
      }
    }
}
小贴士:复制时记得移除注释信息。

参数解析:

参数解析
option routers网关
option subnet-mask子网掩码
option domain-name-serversDNS 搜索域
time-offset美国东部标准时间 (UTC -4)
range dynamic-bootp将要部署的 DHCP 区段
next-server下一跳指为 PXE 服务端地址

配置策略

sudo systemctl enable dhcpd

TFTP 服务

TFTP 简单文件传输服务为 PXE 客户端提供网络启动所需的镜像和虚拟磁盘文件等,保证系统安装所需的临时系统可以正常加载。

安装 TFTP

sudo yum install -y tftp-server tftp

配置 TFTP

默认的存储目录是 /var/lib/tftpboot/,不需要也不推荐进行修改,后期将所需的文件放置在此目录即可。

xinetd 服务

xinetd 扩展网络服务守护服务,它会监听网络请求而自动启动相应的服务程序,而不再需要手动启动服务。

安装 xinetd

sudo yum install -y xinetd

配置 xinetd

参数 disable 默认是 yes,改为 no 即可,其他保持默认。

# sudo vim /etc/xinetd.d/tftp
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
}

配置策略

sudo systemctl enable xinetd

HTTP 服务

安装 httpd

sudo yum install -y httpd

默认的网站存储目录是 /var/www/html,使用 httpd 为 PXE 客户端提供 ks 文件(用于可访问外网环境),或者也可用来提供完整的安装镜像(用于纯内网环境)。

小贴士:如果需要内网提供镜像,只需下载 CentOS 7 DVD 版本镜像,直接挂载在 /var/www/html 即可。

配置策略

sudo systemctl enable httpd

firewalld 服务

如果系统开启了防火墙,那么需要为上述的服务开放防火墙对应的端口,以便 PXE 客户端能正确获取 IP 和获取引导文件。

sudo firewall-cmd --add-service=tftp --permanent
sudo firewall-cmd --add-service=http --permanent
sudo firewall-cmd --reload

也可以直接禁用防火墙

sudo systemctl stop firewalld.service
sudo systemctl disable firewalld.service

PXE 引导系统

接下来准备系统安装时临时系统的文件准备工作,需要将目录分为两部分:

类别目录
UEFI/var/lib/tftpboot/uefi/
Legacy/var/lib/tftpboot/pxelinux/

netboot 文件

如果当前系统是 UEFI 引导的,那么相关的 UEFI 引导文件可直接从系统里复制(如果没有可以手动安装或者下载这两个包进行提取)。

补充:安装包下载和提取步骤说明
下载安装包可以使用命令 sudo yum install --downloadonly [包名],然后在目录 /var/cache/yum/x86_64/7/base/packages/ 里可以看到安装包;
提取安装包可以使用命令 rpm2cpio syslinux-4.05-15.el7.x86_64.rpm | cpio -dimv 会将包内文件提取至当前目录,建议先进入空目录后执行,包名使用绝对路径。
rpm -ql grub2-efi-x64
rpm -ql shim-x64

grubx64.efishim.efi 复制到存储目录

sudo mkdir /var/lib/tftpboot/uefi/
sudo cp /boot/efi/EFI/centos/grubx64.efi /var/lib/tftpboot/uefi/
sudo cp /boot/efi/EFI/centos/shim.efi /var/lib/tftpboot/uefi/

准备引导配置文件

cat <<EOF | sudo tee /var/lib/tftpboot/uefi/grub.cfg
set timeout=10
menuentry 'CentOS Linux (3.10.0) 7 (Core)' {
  linuxefi images/CentOS-7/vmlinuz ip=dhcp ks=http://192.168.15.100/anaconda-ks.cfg
  initrdefi images/CentOS-7/initrd.img
}
EOF
小贴士:ks 配置文件在实际使用前可使用浏览器访问测试一遍,另外如果网络地址有差异,注意替换为实际使用的地址。

配置引导文件权限

sudo chmod 644 /var/lib/tftpboot/uefi/grub.cfg
sudo chmod 755 /var/lib/tftpboot/uefi/{grubx64.efi,shim.efi}

然后准备 Legacy 引导文件

sudo mkdir /var/lib/tftpboot/pxelinux/
cd /var/lib/tftpboot/pxelinux/
sudo wget https://mirrors.tuna.tsinghua.edu.cn/centos/7/os/x86_64/isolinux/boot.msg
sudo wget https://mirrors.tuna.tsinghua.edu.cn/centos/7/os/x86_64/isolinux/initrd.img
sudo wget https://mirrors.tuna.tsinghua.edu.cn/centos/7/os/x86_64/isolinux/memtest
sudo wget https://mirrors.tuna.tsinghua.edu.cn/centos/7/os/x86_64/isolinux/vesamenu.c32
sudo wget https://mirrors.tuna.tsinghua.edu.cn/centos/7/os/x86_64/isolinux/vmlinuz

然后按上述的方法下载安装包 syslinux,解压后复制其中的引导文件。

sudo cp usr/share/syslinux/pxelinux.0 /var/lib/tftpboot/pxelinux/

创建默认引导配置

sudo mkdir /var/lib/tftpboot/pxelinux/pxelinux.cfg

写入配置

cat <<EOF | sudo tee /var/lib/tftpboot/pxelinux/pxelinux.cfg/default
default vesamenu.c32
timeout 60

display boot.msg

menu clear
menu title CentOS 7
menu vshift 8
menu rows 18
menu margin 8
menu helpmsgrow 15
menu tabmsgrow 13
menu color border * #00000000 #00000000 none
menu color sel 0 #ffffffff #00000000 none
menu color title 0 #ff7ba3d0 #00000000 none
menu color tabmsg 0 #ff3a6496 #00000000 none
menu color unsel 0 #84b8ffff #00000000 none
menu color hotsel 0 #84b8ffff #00000000 none
menu color hotkey 0 #ffffffff #00000000 none
menu color help 0 #ffffffff #00000000 none
menu color scrollbar 0 #ffffffff #ff355594 none
menu color timeout 0 #ffffffff #00000000 none
menu color timeout_msg 0 #ffffffff #00000000 none
menu color cmdmark 0 #84b8ffff #00000000 none
menu color cmdline 0 #ffffffff #00000000 none

menu tabmsg Press Tab for full configuration options on menu items.

menu separator # insert an empty line
menu separator # insert an empty line

label linux
  menu label ^Install CentOS 7
  menu default
  kernel vmlinuz
  append initrd=initrd.img ip=dhcp ks=http://192.168.15.100/anaconda-ks.cfg

menu separator

menu begin ^Troubleshooting
  menu title Troubleshooting

label vesa
  menu indent count 5
  menu label Install CentOS 7 in ^basic graphics mode
  text help
    Try this option out if you're having trouble installing
    CentOS 7.
  endtext
  kernel vmlinuz
  append initrd=initrd.img xdriver=vesa nomodeset ip=dhcp ks=http://192.168.15.100/anaconda-ks.cfg

label rescue
  menu indent count 5
  menu label ^Rescue a CentOS system
  text help
    If the system will not boot, this lets you access files
    and edit config files to try to get it booting again.
  endtext
  kernel vmlinuz
  append initrd=initrd.img rescue quiet

label memtest
  menu label Run a ^memory test
  text help
    If your system is having issues, a problem with your
    system's memory may be the cause. Use this utility to
    see if the memory is working correctly.
  endtext
  kernel memtest

menu separator

label local
  menu label Boot from ^local drive
  localboot 0xffff

menu separator
menu separator

label returntomain
  menu label Return to ^main menu
  menu exit

menu end
EOF

kickstart 配置

准备自动化部署文件,如果不熟悉语法可以重新安装一个系统,然后从系统 /root/anaconda-ks.cfg 处复制即可获取安装配置模板。

或者直接使用下面的模板,已经配置了软件网络安装源,只要机器有外网或者支持 NAT 网络可以直接从网络安装系统,并且安装系统后自动重启,并创建管理员账户,密码可以根据需要自行修改。

cat <<EOF | sudo tee /var/www/html/anaconda-ks.cfg
#version=DEVEL
auth --enableshadow --passalgo=sha512
#graphical
text
reboot
firstboot --enable
ignoredisk --only-use=sda
keyboard --vckeymap=us --xlayouts='us'
lang en_US.UTF-8

network  --bootproto=dhcp --device=ens33 --ipv6=auto --activate
network  --hostname=localhost.localdomain

url --url="https://mirrors.tuna.tsinghua.edu.cn/centos/7/os/x86_64"
rootpw --lock
services --enabled="chronyd"
timezone Asia/Shanghai --isUtc
user --groups=wheel --name=kane --password=$6$sidR6Za.DSGSPQk7$NxHM9VvYAgjcMYlYBcvLkAdfdPRkJ72N8i3w16Ft0NNC22lOPS8dUhWEJMOHGNJyePOSuAEX3Smq5GaLVfTuh. --iscrypted --gecos="kane"
bootloader --location=mbr --boot-drive=sda
autopart
clearpart --none --initlabel

%packages
@^minimal
@core
chrony
%end

%addon com_redhat_kdump --disable --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
EOF
小贴士:配置文件的密码部分有变量符,因此需要手动粘贴进去,否则会导致无法登录。

引导镜像

PXE 安装系统时需要使用临时引导文件,这几个文件可以从安装镜像内提取,也可以从网络镜像源中下载。

sudo mkdir -p /var/lib/tftpboot/images/CentOS-7/
cd /var/lib/tftpboot/images/CentOS-7/
sudo wget https://mirrors.tuna.tsinghua.edu.cn/centos/7/os/x86_64/isolinux/initrd.img
sudo wget https://mirrors.tuna.tsinghua.edu.cn/centos/7/os/x86_64/isolinux/vmlinuz

检查

上述所有引导所需文件准备妥当后,可以按下述命令进行检查数量和结构($ 后为检查命令):

$ ls /var/www/html/                      ## 一个文件
anaconda-ks.cfg
$ ls /var/lib/tftpboot/images/CentOS-7/  ## 两个文件
initrd.img  vmlinuz
$ ls /var/lib/tftpboot/uefi/             ## 三个文件
grub.cfg  grubx64.efi  shim.efi
$ ls /var/lib/tftpboot/pxelinux/         ## 六个文件一个目录
boot.msg  initrd.img  memtest  pxelinux.0  pxelinux.cfg  vesamenu.c32  vmlinuz

检查无误后即可进行下面的步骤。

sudo systemctl start dhcpd.service xinetd.service httpd.service

启动所有服务,测试虚拟机安装。


测试

以虚拟机为例,创建新机器进行自动化安装测试,需要注意的是在 macOS 上虚拟磁盘默认是 NVMe 协议,需要手动改为 SATA 否则会识别不到自动安装的硬盘,同时记得切换网络至用户创建的子网上,删除创建虚拟机时选择的 CD 光盘。

自动选择(!AVIF)

看到此界面后完全不需要操作,等待时间后会自动开始安装,为方便截图,执行上述操作时手动打断了倒计时。


附录

参考链接

本文撰写于一年前,如出现图片失效或有任何问题,请在下方留言。博主看到后将及时修正,谢谢!
禁用 / 当前已拒绝评论,仅可查看「历史评论」。