PXE实现批量无人值守安装CentOS7

通过传统的方式安装和部署计算机操作系统时,都需要人工干预的方式完成安装。如果需要大批量部署则需要耗费大量的时间,同时传统的安装方式每台计算机都需要光驱设备及安装光盘和优盘等介质,会额外增加部署成本。因此,许多系统管理员都希望能够通过一种网络化的无人值守的自动安装方式将操作系统部署到目标计算机中。

一、涉及相关服务与技术介绍

1、PXE协议

PXE 是由 Intel 设计的协议,计算机可以通过 PXE 协议从网络引导启动。PXE 协议在启动过程分为 client 和 server 端,PXE 协议运行过程主要解决两个问题:首先解决 IP 地址的问题,然后解决如何传输操作系统启动文件和安装文件的问题。对于第一个问题,可以通过 DHCP Server 解决,通常情况下 DHCP 服务器主要用于分配 IP 地址给客户端。但在 PXE 环境下,DHCP 服务器需要额外加载 PXE 的相关配置。针对第二个问题,在启动初期因为 PXE client 中有相应的 TFTP 客户端,可以通过 TFTP 协议到 TFTP 服务器中下载相关文件启动计算机。后期在安装过程中,则通过 FTP 或 NFS 协议提供大量的操作系统安装文件的下载。

2、Kickstart

通过传统的方式安装和部署计算机时,都会要求通过交互的方式,回答各类问题,以完成安装和部署任务,过程繁琐,且无法实现自动化。红帽公司开发了 Kickstart 的安装方法,通过 ks 文件可以解决所有普通安装方式中需要回答的问题。可以通过 system-config-kickstart 工具定制 ks 文件,也可以通过相关语法来手工编写安装脚本。

3、CentOS 7

本次实验中所使用和安装的操作系统为CentOS 7,理论上 CentOS 6也是适用的。

4、DHCP

动态主机配置协议,主要用于给 DHCP 客户端自动分配 IP 地址,便于用户管理网络内部的计算机。针对 PXE 环境下,DHCP 服务器除分配 IP 地址外,还需要额外配置”next-server”选项定义 TFTP 服务器的地址,设置”filename”选项定义启动文件的名称。并且启动”booting”与”bootp”的支持。

5、TFTP与HTTP

简单文件传输协议(TFTP)主要用于为客户机与服务器之间进行简单文件传输的协议。在 PXE 早期启动过程中,主要通过 TFTP 协议传输”pxelinux.0”。超文本传输协议(英文:HyperText Transfer Protocol,缩写:HTTP)是一种用于分布式、协作式和超媒体信息系统的应用层协议[1]。HTTP是万维网的数据通信的基础。在后期安装过程,主要通过 HTTP 协议传输 Linux 操作系统的安装包。

二、准备待装机器和安装服务器

角色 ip
dhcp服务器 192.168.4.2
tftpd服务器 192.168.4.50
nginx服务器 192.168.4.50

三、安装和配置dhcp服务器

在dhcp服务器上安装dhcp服务

1
yum -y install dhcp

编辑/etc/dhcp/dhcpd.conf

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
# DHCP Server Configuration file.
# see /usr/share/doc/dhcp*/dhcpd.conf.sample
#
### iPXE-specific options
#
# http://www.ipxe.org/howto/dhcpd
#
option space ipxe;
option ipxe-encap-opts code 175 = encapsulate ipxe;
option ipxe.priority code 1 = signed integer 8;
option ipxe.keep-san code 8 = unsigned integer 8;
option ipxe.skip-san-boot code 9 = unsigned integer 8;
option ipxe.syslogs code 85 = string;
option ipxe.cert code 91 = string;
option ipxe.privkey code 92 = string;
option ipxe.crosscert code 93 = string;
option ipxe.no-pxedhcp code 176 = unsigned integer 8;
option ipxe.bus-id code 177 = string;
option ipxe.bios-drive code 189 = unsigned integer 8;
option ipxe.username code 190 = string;
option ipxe.password code 191 = string;
option ipxe.reverse-username code 192 = string;
option ipxe.reverse-password code 193 = string;
option ipxe.version code 235 = string;
option iscsi-initiator-iqn code 203 = string;
# Feature indicators
option ipxe.pxeext code 16 = unsigned integer 8;
option ipxe.iscsi code 17 = unsigned integer 8;
option ipxe.aoe code 18 = unsigned integer 8;
option ipxe.http code 19 = unsigned integer 8;
option ipxe.https code 20 = unsigned integer 8;
option ipxe.tftp code 21 = unsigned integer 8;
option ipxe.ftp code 22 = unsigned integer 8;
option ipxe.dns code 23 = unsigned integer 8;
option ipxe.bzimage code 24 = unsigned integer 8;
option ipxe.multiboot code 25 = unsigned integer 8;
option ipxe.slam code 26 = unsigned integer 8;
option ipxe.srp code 27 = unsigned integer 8;
option ipxe.nbi code 32 = unsigned integer 8;
option ipxe.pxe code 33 = unsigned integer 8;
option ipxe.elf code 34 = unsigned integer 8;
option ipxe.comboot code 35 = unsigned integer 8;
option ipxe.efi code 36 = unsigned integer 8;
option ipxe.fcoe code 37 = unsigned integer 8;
# speed-up for no proxydhcp user
option ipxe.no-pxedhcp 1;
# common settings
authoritative;
ddns-update-style interim;
ignore client-updates;
allow booting;
allow bootp;
set vendorclass = option vendor-class-identifier;
subnet 192.168.4.0 netmask 255.255.255.0 {
option routers 192.168.4.1; #网关
option subnet-mask 255.255.255.0; #子网掩码
option domain-name-servers 223.5.5.5; #dns服务器
default-lease-time 21600;
max-lease-time 43200;
range dynamic-bootp 192.168.4.47 192.168.4.49; #地址池范围
next-server 192.168.4.50; #tftpd服务器地址, 用于加载pxe配置和引导启动内核
if exists user-class and option user-class = "iPXE" {
filename "pxelinux.0";
} else {
filename "undionly.kpxe";
}
}

其中的192.168.4.0网段为待装机器的网段, 可根据实际情况修改, next-server和filename字段最为重要!!!

三、准备anaconda-ks.cfg文件

kickstart 文件可以通过 system-config-kickstart 可视化工具来进行配置,生成 anaconda-ks.cfg 文件;也可以通过已经安装好的操作系统的模板文件 anaconda-ks.cfg 来稍加修改即可。下边的 anaconda-ks.cfg 文件是做实验时的样本,内容如下:

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
#version=DEVEL
# System authorization information
auth --enableshadow --passalgo=sha512
# Install OS instead of upgrade
install
# Use text install
text
# SELinux configuration
selinux --disabled
# Do not configure the X Window System
skipx
# Run the Setup Agent on first boot
firstboot --enable
ignoredisk --only-use=sda
# Keyboard layouts
keyboard --vckeymap=cn --xlayouts='cn'
# System language
lang zh_CN.UTF-8
# Network information
network --bootproto=dhcp --device=em1 --ipv6=auto --activate
network --bootproto=dhcp --device=em2 --onboot=off --ipv6=auto
network --bootproto=dhcp --device=em3 --onboot=off --ipv6=auto
network --bootproto=dhcp --device=em4 --onboot=off --ipv6=auto
network --hostname=test46
# Use network installation
url --url="http://192.168.4.50/centos7"
#config repo
repo --name=base --install --baseurl=http://mirrors.aliyun.com/centos/7/os/x86_64/
repo --name=updates --install --baseurl=http://mirrors.aliyun.com/centos/7/updates/x86_64/
# Root password
rootpw --iscrypted $6$HGiWX03pY7Ypzijn$MATc4EzJ1SUkzCYV1soX0ETYhXQf4V0Vh3Xb7BPAFp4nYTMAEvtKjjsTOi76mn1CHhmwmhVBEa9Di6GRvXSIW.
# System services
services --enabled="chronyd"
# System timezone
timezone Asia/Shanghai --isUtc
# System bootloader configuration
bootloader --location=mbr --boot-drive=sda
# Partition clearing information
clearpart --none --initlabel
# Disk partitioning information
part /boot --fstype="xfs" --ondisk=RAID1 --size=200
part / --fstype="xfs" --ondisk=RAID1 --size=51200
part /mnt --fstype="xfs" --mkfsoptions="-n ftype=1" --ondisk=RAID1 --size=1092663
%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

上述配置文件中的相关参数需要根据实际机器的配置更改!

四、准备安装镜像源

本次以nginx为例, 也可以选用其他web服务器

下载Centos7的安装镜像到/usr/local/nginx/html目录

1
wget https://mirrors.aliyun.com/centos/7.5.1804/isos/x86_64/CentOS-7-x86_64-Minimal-1804.iso

解开iso, 得到安装目录

1
2
3
4
5
6
7
8
9
10
11
12
-rw-rw-r-- 1 root root 14 2018-05-02 19:28 CentOS_BuildTag
drwxr-xr-x 3 root root 2.0K 2018-05-04 04:34 EFI
-rw-rw-r-- 1 root root 227 2017-08-30 22:33 EULA
-rw-rw-r-- 1 root root 18K 2015-12-10 06:35 GPL
drwxr-xr-x 3 root root 2.0K 2018-05-04 04:45 images
drwxr-xr-x 2 root root 2.0K 2018-05-04 04:34 isolinux
drwxr-xr-x 2 root root 2.0K 2018-05-04 04:34 LiveOS
drwxrwxr-x 2 root root 70K 2018-05-04 05:03 Packages
drwxrwxr-x 2 root root 4.0K 2018-05-04 05:06 repodata
-rw-rw-r-- 1 root root 1.7K 2015-12-10 06:35 RPM-GPG-KEY-CentOS-7
-rw-rw-r-- 1 root root 1.7K 2015-12-10 06:35 RPM-GPG-KEY-CentOS-Testing-7
-r--r--r-- 1 root root 2.9K 2018-05-04 05:07 TRANS.TBL

将上一步的anaconda-ks.cfg复制到镜像安装目录, 启动nginx

五、安装和配置tftpd服务器

在tftpd服务器上安装tftpd服务, 安装步骤请参考 linux-Centos 7下tftp-server服务的安装与配置
tftpd服务安装完成后将以下文件放入/var/lib/tftpboot中,

1
2
3
4
5
6
7
8
boot.msg
initrd.img
pxelinux.0
pxelinux.cfg
splash.png
undionly.kpxe
vesamenu.c32
vmlinuz

pxelinux.cfg文件夹中的default文件定义了ipxe-boot的引导菜单和安装所需的anaconda-ks.cfg源

以上文件已经打包, 点我下载

六、开始安装

启动dhcpd和xinetd服务, 开启机器进入bios配置pxe启动即可进入安装, pxelinux.cfg文件夹中的default文件开启了vnc, 可以用vnc客户端连接服务器查看安装进度.

坚持原创技术分享,您的支持将鼓励我继续创作!