PXE

简介

预启动执行环境(Preboot eXecute Environment,PXE),
该技术基于C/S构架,提供了一种使用网络接口(Network Interface)启动计算机的机制。这种机制让计算机的启动可以不依赖本地数据存储设备(如硬盘)或本地已安装的操作系统。PXE技术通常用于自动部署操作系统,通过读取Kickstart文件中的配置可以实现无人值守安装。

组件

PXE技术依赖于DHCP、TFTP、File Server

  • DHCP服务用于在新主机上线时提供IP地址,更重要的是指定提供PXE启动文件的服务器IP地址。
  • TFTP服务用于提供PXE启动文件。
  • File Server则用来提供Kickstart配置文件和Linux的安装源文件。

    配置实例

实验环境

CentOS 7 Server 1台

  • 内网IP:192.168.213.5/24
  • 外网IP:192.168.1.134/24
  • 域:jaydenz.org
  • 防火墙:开启
  • SELinux:开启

支持PXE技术的Client 2台

实验步骤

Server端:

  1. 安装相关服务

    1
    yum -y install dhcp tftp-server syslinux vsftpd
  2. 配置DHCP服务

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    vi /etc/dhcp/dhcp.conf

    ddns-update-style interim; #设置dhcp互动更新模式
    ignore client-updates; #ddns忽略客户端更新authoritative;
    allow booting;
    allow bootp;
    allow unknown-clients;
    #设定DHCP-Server生效的网段
    subnet 192.168.213.0 netmask 255.255.255.0 {
    range 192.168.213.40 192.168.213.200; #设定地址池范围
    ##地址池选项
    option domain-name-servers 114.114.114.114; #设定DNS服务器IP
    option domain-name "jaydenz.org"; #设定域
    option routers 192.168.213.5; #设定路由器IP
    option broadcast-address 192.168.213.255;
    ##租约时间设定
    default-lease-time 86400;
    max-lease-time 86400;
    ##设置PXE服务
    next-server 192.168.213.5; #DHCP server ip
    filename "pxelinux.0"; #指定pxe文件,默认在TFTP服务器共享目录
    ##设置一份地址白名单,用于排除该地址
    host MacbookPro {
    hardware ethernet 00:0C:29:05:A7:CB;
    fixed-address 192.168.213.110;
    }
    }

    subnet 192.168.1.0 netmask 255.255.255.224 { #建立一个空的配置关闭对外网的地址分配功能

    }
  3. 修改TFTP服务启动脚本

    1
    2
    3
    vi /usr/lib/systemd/system/tftp.service

    ExecStart=/usr/sbin/in.tftpd -s /tftpboot ##修改tftp工作目录
  4. 建立tftpboot目录

    1
    mkdir /tftpboot
  5. 修改SELinux设置

    1
    2
    semanage fcontext -a -t public_content_t "/tftpboot(/.*)?"
    restorecon -F -R -v /tftpboot
  6. 复制syslinux文件到启动目录

    1
    2
    cd /usr/share/syslinux/
    cp pxelinux.0 menu.c32 memdisk mboot.c32 chain.c32 /tftpboot/
  7. 修改目录权限

    1
    2
    3
    chmod 644 -R /tftpboot
    chmod 755 /tftpboot
    restorecon -F -R -v /tftpboot
  8. 建立提供Linux开机的核心目录

    1
    2
    3
    mkdir /tftpboot/pxelinux.cfg
    mkdir -p /tftpboot/netboot/
    restorecon -R -F -v /tftpboot/
  9. 复制安装光盘文件到FTP分享目录

    1
    2
    mount CentOS-7-x86_64-Minimal-1708.iso /mnt/cdrom
    cp -R /mnt/cdrom/* /var/ftp/pub
  10. 复制PXE启动文件到tftp服务器分享目录

    1
    2
    3
    cd /var/ftp/pub/images/pxeboot
    cp vmlinuz initrd.img /tftpboot/netboot/
    restorecon -R -F -v /tftpboot/netboot/
  11. 在FTP服务的目录下建立一个Kickstart文件

    1
    2
    3
    touch /var/ftp/pub/ks.cfg
    chmod 644 /var/ftp/pub/ks.cfg
    restorecon -R -F -v /var/ftp/pub/
  12. 设置PXE启动菜单

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    vim /tftpboot/pxelinux.cfg/default

    default menu.c32
    prompt 0
    timeout 30
    MENU TITLE jaydenz.org PXE Menu
    LABEL CentOS7_x64
    MENU LABEL CentOS 7.4 X86_64
    KERNEL /netboot/vmlinuz
    APPEND initrd=/netboot/initrd.img inst.repo=ftp://192.168.213.5/pub ks=ftp://192.168.213.5/pub/ks.cfg
  13. 设定防火墙

    1
    2
    3
    4
    firewall-cmd --permanent --add-service=ftp
    firewall-cmd --permanent --add-service=tftp
    firewall-cmd --permanent --add-service=dhcp
    firewall-cmd --reload
  14. 启动各项服务

    1
    2
    3
    4
    5
    6
    7
    systemctl daemon-reload
    systemctl enable vsftpd
    systemctl start vsftpd
    systemctl enable tftp
    systemctl start tftp
    systemctl enable dhcpd
    systemctl start dhcpd

Client端配置

Client端建议将PXE网卡启动顺序放在第二位,也就是硬盘之后,这样当安装程序完成后重启时不会再次进入PXE。

Kickstart

Kickstart是redhat开发的开源工具,它可以将操作系统安装步骤记录到一个纯文本文件当中,安装程序通过读取该文件可以实现操作系统自动化安装。

CentOS 7 Kickstar文件实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
#platform=x86, AMD64, or Intel EM64T
#version=CentOS7
#本配置文件用于自动安装CentOS 7.4 x64位系统

#####Kickstart安装参数#####
#设置安装界面类型,参数为text | graphical | cmdline,默认为graphical
graphical
#全新安装或是升级
install
#设定安装文件来源
##使用NFS
#nfs --server=192.168.1.128 --dir=/CentOS/CentOS7x64
##使用HTTP/HTTPS、FTP、file
url --url=ftp://192.168.213.1/CentOS/CentOS7x64

#限制安装程序操作的磁盘
##--drives=sda,hda,...:使安装程序忽略指定的磁盘。
##--only-use:指定安装程序要使用的磁盘列表,忽略其他所有磁盘。
#ignoredisk --only-use=sda


#第一次启动是否运行配置向导,图像化界面建议开启
firstboot --disable
#安装后自动重启。注意,安装后应设置为从先硬盘启动,否则会重复安装
reboot
#设置系统验证信息
auth --useshadow --passalgo=sha512

#####操作系统配置#####
#设定键盘布局
keyboard us
#设定系统语言
lang en_US
#设定系统时区
timezone Asia/Shanghai
#主机名设置
network --hostname=localhost.localdomain
#配置网络地址获取方式
network --bootproto=dhcp --onboot=yes

#####用户和组相关配置#####
#设置root密码,加密密码可以使用openssl生成
rootpw --iscrypted $1$y10oqPAp$qCWLZ7KzL/QgFYlg3C2R10 #采用加密记录
#rootpw --plaintext 123456 #采用明文记录

#####系统安全相关选项#####
#防火墙配置
##--enabled:启用防火墙
##--disabled:禁用防火墙
##--trust=:允许所有流量通过该防火墙进出指定设备。要列出一个以上的设备,请使用 --trust ens33 --trust ens37
##可以使用以下服务中的一个或多个来替换,从而允许指定的服务通过防火墙。
##--ssh
##--smtp
##--http
##--ftp
##--port=:使用 端口:协议 格式指定允许通过防火墙的端口。例如,如果想允许 IMAP 通过您的防火墙,可以指定 imap:tcp。还可以具体指定端口号码,要允许 UDP 分组在端口 1234 通过防火墙,输入 1234:udp。要指定多个端口,用逗号将它们隔开。

firewall --disabled

#SELinux选项
selinux --disabled

#是否配置X图形界面
skipx


#####磁盘于引导选项#####
#bootloader指定指定如何安装引导装载程序
##--location=:指定引导记录的写入位置。
#mbr:默认参数,具体要看驱动器是MBR还GPT,会自动决定,在大多数情况下不需要指定这个选项。
#partition:在包含内核的分区的第一个扇区中安装引导装载程序。
#none:不安装引导装载程序。
##--append=:指定内核参数。要指定多个参数,使用空格分隔它们。例如:bootloader --location=mbr --append="hdd=ide-scsi ide=nodma"
bootloader --location=mbr

#clearpart用于指定如何清除原有分区
##--all:清除所有分区
##--drivers=:用于指定从哪个驱动器清除分区,例子:clearpart --drives=hda,hdb --all,清除主 IDE 控制器中前两个驱动器上所有分区
##--list= - 指定要清理的分区。这个选项覆盖--all和--linux选项,并可跨不同驱动器中使用。例如:clearpart --list=sda2,sda3,sdb1
##--linux - 删除所有 Linux 分区。
##--none(默认)- 不删除任何分区。
clearpart --all

#磁盘分区设定
part / --fstype="xfs" --size=10000
part /boot --fstype="xfs" --size=200
#part /boot/efi --fstype=efi --size=200 #UEFI引导安装时需要,传统LEGACY引导时可屏蔽此选项
part swap --fstype="swap" --size=4000

#如果是要LVM分区,则考虑以下分区
#part /boot --fstype ext4 --size=100
#part swap --fstype=swap --size=2048
#part pv26 --size=100 --grow
#volgroup VG00 --pesize=32768 pv26
#logvol / --fstype ext4 --name=LVroot --vgname=VG00 --size=29984
#logvol /data --fstype ext4 --name=LVdata --vgname=VG00 --size=100 --grow

#####软件包选项#####
#%packages设定所需要安装的软件包,支持传递参数,--ignoremissing:忽略所有在这个安装源中缺少的软件包、组及环境,
%packages --ignoremissing
#@表示一组软件包,常见安装类型如下:
##@X Window System
##@Desktop
##@Sound and Video
##@network-server
##@performance
##@system-admin-tools
@core
@base
#指定独立的软件包名可以安装单独的软件包,也可以在软件包名称中使用星号(*)作为通配符。
tree
tuned
tuned-utils
ypbind
nfs-utils
vim-enhanced
wget
openssh-server

#-表示从默认软件包中移除的软件包
-lvm2
-nano
%end #%packages结尾

#####安装脚本(非必需)#####
%pre #安装前脚本

%end #安装前脚本结尾

%post #安装后脚本

%end #安装后脚本结尾

常见问题

在安装CentOS7时如果一直显示Downloading package metadata或者其他无法获取软件源的问题

  1. 进入入FTP上安装源的repodata目录,打开repomd.xml
  2. 找到xml文件中 location href= 标签指定的文件名
  3. 将repodata目录中一堆字符组成的文件按照xml文件定义的文件名补齐
  4. 重启Client即可进行安装

首次启动 DHCP 服务器时,如果没有 dhcpd.leases 文件就会失败。如果没有该文件,可使用命令 touch /var/lib/dhcpd/dhcpd.leases 生成该文件。

附录

PXE官方配置文档:https://access.redhat.com/documentation/zh-cn/red_hat_enterprise_linux/7/html/installation_guide/chap-installation-server-setup

Kickstart官方语法指导:https://access.redhat.com/documentation/zh-cn/red_hat_enterprise_linux/7/html/installation_guide/sect-kickstart-syntax