### 1、PXE 原理和概念：

1. PXE 严格来说并不是一种安装方式，而是一种引导的方式。进行 PXE 安装的必要条件是要安装的计算机中包含一个 PXE 支持的网卡（ NIC），即网卡中必须要有 PXE Client。PXE （Pre-boot Execution Environment）协议使计算机可以通过网络启动。
   协议分为 client 和 server 端，PXE client 在网卡的 ROM 中，当计算机引导时，BIOS 把 PXE client 调入内存执行，由 PXE client 将放置在远端的文件通过网络下载到本地运行。
   运行 PXE 协议需要设置 DHCP 服务器 和 TFTP 服务器。DHCP 服务器用来给 PXE client（将要安装系统的主机）分配一个 IP 地址，由于是给 PXE client 分配 IP 地址，所以在配置 DHCP 服务器时需要增加相应的 PXE 设置。
   此外，在 PXE client 的 ROM 中，已经存在了 TFTP Client。PXE Client 通过 TFTP 协议到 TFTP Server 上下载所需的文件。

### 2、搭建无人执守安装服务器实验环境

| 实验环境：    |       |                     |                                           |
| ------------- | ----- | ------------------- | ----------------------------------------- |
| 服务端：base1 | ens33 | IP：192.168.245.204 | 网卡模式： LAN1 必须以图形界面启动        |
| 服务端：base1 | ens37 | IP：192.168.3.230   | 网卡模式： 桥接模式（IP与宿主机同一网段） |
| 客户端：base2 | ens33 | IP：192.168.245.206 | 网卡模式： LAN1                           |

注： 这里不能使用 nat 或仅主机模式，因为这两种模式中，都会自动分配 IP 地址。所以我们使用 LAN 模式，模拟出来一个纯粹的局域网。
实验拓扑图：
![image-20220217102804418](https://s2.loli.net/2022/02/17/sPRztT41XuyiJea.png)

#### 1.base1 关机后，新加一块网卡，配置成桥接模式，IP 地址是 192.168.3.230，用于后期 Xshell 远程连接base1 进行配置。

![file://c:\users\admini~1\appdata\local\temp\tmp8rumrv\1.png](https://s2.loli.net/2022/02/17/nDf3lcdGXPq9HuZ.png)

<img src="https://s2.loli.net/2022/02/17/nQ3gofwY1vhxcEb.png" alt="image-20220217112642287" style="zoom: 80%;" />



#### 2.把base1、base2 主机的添加LAN1 虚拟网络环境，并把ens33 网卡修改为LAN1

​           ![file://c:\users\admini~1\appdata\local\temp\tmpvxgqfn\1.png](https://s2.loli.net/2022/02/18/7ySobWLxzdpnDl2.png)


![file://c:\users\admini~1\appdata\local\temp\tmp8rumrv\4.png](https://s2.loli.net/2022/02/17/DibK2gBk5tdo4G3.png)




#### 3..新添加网卡并不会立即显示，需要修改配置文件

![image-20220217100855230](https://s2.loli.net/2022/02/17/Og1qHuprPnvL6t7.png)

#### 4.由于是用桥椄模式添加的网卡，所以配置网卡需要与宿主机同一网段，如下图：

​           ![file://c:\users\admini~1\appdata\local\temp\tmp8rumrv\1.png](https://s2.loli.net/2022/02/17/PKDSpElWsrjiBHv.png)  

![file://c:\users\admini~1\appdata\local\temp\tmp8rumrv\1.png](https://s2.loli.net/2022/02/17/xdqtDkj84NEfrIb.png)

配置base1 ens37 网卡
[root@base1 ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens37 
TYPE=Ethernet 
PROXY_METHOD=none 
BROWSER_ONLY=no
<font color='red'>BOOTPROTO=static </font>
DEFROUTE=yes 
NAME=ens37
DEVICE=ens37
ONBOOT=yes
<font color='red'>IPADDR=192.168.3.230</font>
<font color='red'>NETMASK=255.255.255.0</font> 
<font color='red'>GATEWAY=192.168.3.1 </font>

#### 5.重启网络

[root@base1 ~]# systemctl restart network

#### 6.关闭防火墙和selinux

[root@base1 ~]# systemctl stop firewalld ; systemctl disable firewalld 

[root@base1 ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config

### 3、实验拓扑图和运行原理如下图：

![file://c:\users\admini~1\appdata\local\temp\tmp8rumrv\5.png](https://s2.loli.net/2022/02/17/wTFyjDLCBRI8qKa.png)
搭建 PXE + KickStart 步骤：
• DHCP 服务器用来给客户机分配 IP；
• TFTP 服务器用来存放 PXE 的相关文件，比如：系统引导文件；
• FTP 服务器用来存放系统安装文件；
• KickStart 所生成的ks.cfg 配置文件；
• 带有一个 PXE 支持网卡的将安装的主机；

### 4、 搭建 PXE 环境服务

#### 4.1安装dhcp，修改配置文件及开启服务

[root@base1~]# yum install dhcp -y 

配置DHCP 服务器：

```
[root@base1 yum.repos.d]# cp /usr/share/doc/dhcp-4.2.5/dhcpd.conf.example  /etc/dhcp/dhcpd.conf
cp：是否覆盖"/etc/dhcp/dhcpd.conf"？ y
```

[root@base1 ~]# vim /etc/dhcp/dhcpd.conf	#只保留一个subnet {。。。} ，取掉其它 subnet，改成如下内容：

```
subnet 192.168.245.0 netmask 255.255.255.0 {
range 192.168.245.100  192.168.245.230;
option domain-name-servers 192.168.245.2;
option domain-name "internal.example.org";
option routers 192.168.245.2;
default-lease-time 600;
max-lease-time 7200;
next-server 192.168.245.204;
filename "pxelinux.0";
}

```

注
\# subnet 192.168.245.0 netmask 255.255.255.0 服务端IP 网段及掩码。
\# range 192.168.245.100  192.168.245.200; dhcp 分发的地址范围，最好将本机 IP 包含在内。
\# option domain-name-servers 192.168.245.2;	指定默认DNS 地址。
\# option domain-name "internal.example.org";  指定默认域名。
\# option routers 192.168.245.2;	#指定默认网关。
\# default-lease-time 600;max-lease-time 7200; IP 地址租约时间。
<font color='red'>\# next-server 192.168.245.204; TFTP 服务器地址。</font>
<font color='red'>\# filename "pxelinux.0"; 指定引导文件位置，这里是 TFTP 根目录下的pxelinux.0。</font>
[root@base1 ~]# systemctl start dhcpd

#### 4.2.base2 下测试DHCP 获取地址

[root@base2 ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33 

TYPE=Ethernet
PROXY_METHOD=none 
BROWSER_ONLY=no
<font color='red'>BOOTPROTO=dhcp</font>   #改none 为dhcp 自动获取地址
NAME=ens33
DEVICE=ens33
ONBOOT=yes
#IPADDR=192.168.1.64	
#GATEWAY=192.168.1.1 
#DNS1=114.114.114.114 

[root@base2 ~]# systemctl restart network
[root@base2 ~]# ifconfig	#可以看到获得IP，说明DHCP 服务搭建成功。





### 5、安装TFTP 修改 tftp 配置文件并开启服务

vsftpd是一款功能丰富的文件传输服务程序，允许用户以匿名开放模式、本地用户模式、虚拟用户模式来进行访问认证。但是，当前的客户端主机还没有安装操作系统，该如何进行登录认证呢？而TFTP作为一种基于UDP协议的简单文件传输协议，不需要进行用户认证即可获取到所需的文件资源。因此接下来配置TFTP服务程序，为客户端主机提供引导及驱动文件。当客户端主机有了基本的驱动程序之后，再通过vsftpd服务程序将完整的光盘镜像文件传输过去。  

TFTP是一种非常精简的文件传输服务程序，它的运行和关闭是由xinetd网络守护进程服务来管理的。xinetd服务程序会同时监听系统的多个端口，然后根据用户请求的端口号调取相应的服务程序来响应用户的请求。需要开启TFTP服务程序，只需在xinetd服务程序的配置文件中把disable参数改成no就可以了。保存配置文件并退出，然后重启xinetd服务程序，并将其加入到开机启动项中（在RHEL 7系统中，已经默认启用了xinetd服务程序，因此在将其添加到开机启动项中的时候没有输出信息属于正常情况）。

[root@base1 ~]# yum install tftp tftp-server xinetd -y
注：tftp：tftp 客户端 ； tftp-server :tftp 服务器

#### 5.1.配置 tftp 服务器：

[root@base1 ~]# vim /etc/xinetd.d/tftp 修改配置文件里面的14 行。
改成以下内容：
 改：
14 disable	= yes

为：
14 disable	= no

注：
disable = no #不关闭 tftp 服务，就是开启tftp 服务
<font color='red'>server_args = -s /var/lib/tftpboot</font> #这是 tftp 服务器运行时的参数。-s /var/lib/tftpboot 表示服务器默认的目录是/var/lib/tftpboot,当你执行 put a.txt 时，文件会被放到服务器的/var/lib/tftpboot/a.txt，你也可以加其它服务器运行参数到这，具体可以执行 man tftpd 命令查阅。

接着重新启动xinetd 服务，然后查看服务端口是否打开。
[root@base1~]# systemctl restart xinetd 
[root@ base1 ~]# yum -y install lsof
[root@base1 ~]# lsof -i :69		#查看 69 端口正在被哪个进程使用。
COMMAND   PID USER	FD	TYPE DEVICE SIZE/OFF NODE NAME
xinetd   3582 root	5u   IPv4   21718	0t0 UDP *:tftp

[root@base1 ~]# netstat -antup | grep 69	#这种方法，只能看到 xinetd 进程
udp	0	0 0.0.0.0:69	0.0.0.0:*		3582/xinetd

在base2 上测试 tftp。

[root@base1 tftpboot]# touch a.txt			**#在base1上创建文件**
[root@base2 ~]# rpm -ivh /mnt/Packages/tftp-5.2-13.el7.x86_64.rpm 
[root@base2 ~]# tftp 192.168.1.63
tftp> get a.txt
tftp> quit
[root@base2 ~]# ll 		
a.txt

#### 5.2.将 PXE 启动所需的相关文件复制到 tftp 家目录下

SYSLinux是一个用于提供引导加载的服务程序。与其说SYSLinux是一个服务程序，不如说更需要里面的引导文件，在安装好SYSLinux服务程序软件包后，/usr/share/syslinux目录中会出现很多引导文件。
1.安装软件syslinux
[root@base1 Packages]# yum -y install  syslinux
我们首先需要把SYSLinux提供的引导文件复制到TFTP服务程序的默认目录中，也就是前文提到的文件pxelinux.0，这样客户端主机就能够顺利地获取到引导文件了。另外在RHEL 7系统光盘镜像中也有一些我们需要调取的引导文件。确认光盘镜像已经被挂载到/media/cdrom目录后，使用复制命令将光盘镜像中自带的一些引导文件也复制到TFTP服务程序的默认目录中。

2.准备 tftp 需要共享出去的文件
[root@base1 ~]# cd /var/lib/tftpboot
[root@base1 tftpboot]# mkdir ./pxelinux.cfg
[root@base1 tftpboot]# cp /usr/share/syslinux/pxelinux.0 ./  #系统引导文件
[root@base1 tftpboot]# cp /mnt/images/pxeboot/vmlinuz ./ 	#内核文件
[root@base1 tftpboot]# cp /mnt/images/pxeboot/initrd.img ./  #内核初始化镜像文件。
[root@base1 tftpboot]# cp /mnt/isolinux/isolinux.cfg    ./pxelinux.cfg/default	#引导菜单：isolinux.cfg -- 开机后选择启动项的菜单文件。如下图

![file://c:\users\admini~1.des\appdata\local\temp\tmpskzb75\35.png](https://note-1308251438.cos.ap-guangzhou.myqcloud.com/typora/202208111146352.png)

[root@base1 tftpboot]# chmod 644 ./pxelinux.cfg/default	#赋予 default 文件644 权限。



4.修改default，指定安装操作系统的方式和 ks.cfg 文件路径
[root@base1 ~]# vim /var/lib/tftpboot/pxelinux.cfg/default 

然后修改/tftpboot/pxelinux.cfg/default 的配置文件。
改 ： 1 default vesamenu.c32 
为 ： 1 default linux
\#修改第 1 行，后面的 linux 意思是寻找配置文件中第 61 行的 label linux 

改：
64 append initrd=initrd.img inst.stage2=hd:LABEL=CentOS\x207\x20x86_64 quiet 

为：
64 append initrd=initrd.img inst.repo=ftp://192.168.245.204/pub inst.ks=ftp://192.168.245.204/ks.cfg
![image-20220811115321811](https://note-1308251438.cos.ap-guangzhou.myqcloud.com/typora/202208111153862.png)

注：指定通过网络启动系统时，通过 FTP 服务器访问kickstart 文件。
注：
第 1 行：default linux 表示指定默认入口名称；
第 61 到 64 行：表示定义的引导入口，要开始自动安装，安装程序必须能访问 kickstart 文件。
有多种方法可访问 kickstart 文件，其中最常用的一种方法是通过网络服务器进行，例如：ftp 服务器、WEB 服务器或 NFS 服务器，这种方法非常易于部署，并且也使管理更改变得十分简单。

扩 展 ： 使 安 装 程 序 指 向 kickstart 文 件 的 常 见 书 写 格 式 ： 
ks=ftp://server/dir/file	如 ：ks=ftp://192.168.1.63/ks.cfg 
ks[=h](http://server/dir/file)t[tp://server/dir/file](http://server/dir/file)	如 ：ks[=h](http://192.168.1.63/ks.cfg)t[tp://192.168.1.63/ks.cfg](http://192.168.1.63/ks.cfg)
ks=nfs:server:/dir/file	如：ks=nfs:192.168.1.63:/var/ftp/pub/ks.cfg



### 6、安装ftp 服务以及开启服务，设置为开机自动启动。

[root@base1 ~]# yum install vsftpd -y
[root@base1 ~]# mount /dev/cdrom   /var/ftp/pub/	#把光盘镜像挂载到pub 下
[root@base1 ~]# systemctl start vsftpd
[root@base1~]# systemctl enable vsftpd 
在宿主机我的电脑上测试：

![image-20220217174730933](https://s2.loli.net/2022/02/17/QhFS75LTy93BfCH.png)



### 7、KickStart 概述

KickStart 是一种无人职守安装方式。KickStart 的工作原理是通过记录典型的安装过程中所需人工干预填写的各种参数，并生成一个名为 ks.cfg 的文件；在其后的安装过程中（不只局限于生成 KickStart 安装文件的机器）当出现要求填写参数的情况时，安装程序会首先去查找 KickStart 生成的文件，当找到合适的参数时，就采用找到的参数，当没有找到合适的参数时，才需要安装者手工干预。

简单来说，如果生产环境中有100台服务器，它们需要安装相同的系统环境，那么在安装过程中单击的按钮和填写的信息也应该都是相同的。那么，为什么不创建一个类似于备忘录的需求清单呢？这样，在无人值守安装系统时，可以从这个需求清单中找到相应的选项值，从而免去了手动输入之苦。其实在root管理员的家目录中有一个名为anaconda-ks.cfg的文件，它就是系统默认自带的应答文件。

如果觉得系统默认自带的应答文件参数较少，不能满足生产环境的需求，则可以通过Yum软件仓库来安装system-config-kickstart软件包。这是一款图形化的Kickstart应答文件生成工具，可以根据自己的需求生成自定义的应答文件，然后将生成的文件放到/var/ftp/pub目录中并将名字修改为ks.cfg即可。

[root@base1 Packages]# yum -y install system-config-kickstart

[root@base1 Packages]#  system-config-kickstart

![](https://s2.loli.net/2022/02/17/FhpfLRUxVIHZ8Ck.png)

需要安装图形化界面

[root@base1 ~]# yum groupinstall  'Server with GUI' -y

接下来我们制作kickstart 的无人值守安装文件。

#### 7.1.在创建配置文件之前，需配置本地源

否则下面在选择软件包安装这一步不能选择，提示被禁止。


![file://c:\users\admini~1\appdata\local\temp\tmp8rumrv\12.png](https://s2.loli.net/2022/02/17/r62FMQWf7NG9UE3.png)

[root@base1 ~]# cd /etc/yum.repos.d/ 
[root@base1 yum.repos.d]# mkdir bak 
[root@base1 yum.repos.d]# mv *.repo bak/ 
[root@base1 yum.repos.d]# umount /dev/sr0
[root@ base1 yum.repos.d]# mount /dev/cdrom /var/ftp/pub/ 
[root@base1 yum.repos.d]# vim local.repo
<font color='red'>[development]</font>	（名称必须是development，否则出现上述错误） 
name=my-centos7-dvd
baseurl=file:///var/ftp/pub 
enabled=1
gpgcheck=0
[root@base1 yum.repos.d]# yum makecache fast	#快速建立yum 缓存。
如果不新建缓存，还使用原来带着外网源的 yum 缓存，那么执行 system-config-kickstart 就会报错的。

#### 7.2.创建ks 应答文件

[root@base1 yum.repos.d]# yum install -y gdm	#安装gdm，gdb 是Linux 环境下的代码调试工具。
[root@base1 ~]# system-config-kickstart	#使用弹出来的界面，设置自己后期无人执守安装需要配置的参数：
注意： system-config-kickstart 需要在图形界面下执行，如在字符界面上执行会无法弹出选择框， 但在生产环境中通常安装的都是字符界面，即使远程登录同样如此，此时需要生成 ks 文件时，可以在本地物理/虚拟主机上安装有图形界面的系统中执行 system-config-kickstart 并完成ks 文件，而后上传到生产环境中。

![file://c:\users\admini~1\appdata\local\temp\tmp8rumrv\13.png](https://s2.loli.net/2022/02/17/g9Vn1EIl4DpXaOb.png)
我们设置下默认安装的语言，时区，根口令，然后勾选下面的安装后重新引导。然后选择安装方法。    注：对于“安装后重启”这一项，建议不勾选。因为系统在重启的过程中，如果第一引导顺序还是网卡，那么会再次重新安装系统。
情况 2：如果被安装的服务器原来就没有系统，就可以把“安装后重启”这个对勾打上了，因为安装系统时默认是磁盘作为第一引导，而磁盘中没有系统，就直接跳过了磁盘引导，使用网卡引导，当系统安装好后，再重启时，自动使用磁盘做引导，正好可以进入新安装的系统。

#### 7.3.我们配置ftp 服务器的安装方法。选择执行全新安装。

![file://c:\users\admini~1\appdata\local\temp\tmp8rumrv\14.png](https://s2.loli.net/2022/02/17/jMGLshOvmdWbQgV.png)



#### 7.4.然后点击引导装载程序选项，配置grub 相关选项。

![file://c:\users\admini~1\appdata\local\temp\tmp8rumrv\15.png](https://s2.loli.net/2022/02/17/L73pUyCoRcwbEXI.png)

设置分区大小
boot 200M ， 根 10G

![file://c:\users\admini~1\appdata\local\temp\tmp8rumrv\16.png](https://s2.loli.net/2022/02/17/9ahmg2uZ7Arcz8d.png)

####  7.5.配置网络，默认没有网络设置，点击添加网络，设备名称为 ens33，网络类型为dhcp


![file://c:\users\admini~1\appdata\local\temp\tmp8rumrv\18.png](https://s2.loli.net/2022/02/17/YSsNPTzeZCcVuU3.png)

#### 7.6.验证，默认就可以了。

![file://c:\users\admini~1\appdata\local\temp\tmp8rumrv\19.png](https://s2.loli.net/2022/02/17/qpCXcHIz7OeYLd2.png)

#### 7.7.防火墙和Selinux 根据自己需求选择开启或者禁用。我选择关闭Selinux，关闭防火墙。

![image-20220217154007324](https://s2.loli.net/2022/02/17/ylwmRItHfU9ZYGj.png)

#### 7.8安装图形环境

![image-20220217154127838](https://s2.loli.net/2022/02/17/aN3urdSKyExz8Xo.png)

####  7.9.自定义软件包。默认可能没有勾选桌面。根据自己需求勾选。 我们为了快速度演示安装，不选择安装桌面。

![file://c:\users\admini~1\appdata\local\temp\tmp8rumrv\22.png](https://s2.loli.net/2022/02/17/lSJb3r2nKdzNhTt.png)

#### 7.10.预安装脚本，这一块我们先不做配置

![file://c:\users\admini~1\appdata\local\temp\tmp8rumrv\23.png](https://s2.loli.net/2022/02/17/57pOPkhcYj6gAX9.png)

#### 7.11.安装后执行脚本

例：配置客户机在完成安装后自动设置 YUM 仓库。


![file://c:\users\admini~1\appdata\local\temp\tmp8rumrv\24.png](https://s2.loli.net/2022/02/17/OpSXTMN5c4PI67D.png)

写入以下脚本内容：
rm -rf /etc/yum.repos.d/* echo '[centos7-source] 
name= centos7 
baseurl=file:///mnt 
enabled=1
gpgcheck=0' >/etc/yum.repos.d/centos7.repo
![file://c:\users\admini~1\appdata\local\temp\tmp8rumrv\25.png](https://s2.loli.net/2022/02/17/TPmtbQaiA6X7pkz.png)

#### 7.12.保存配置文件

到此所有关于安装的配置已经配置完毕，点击左上角的文件选择保存，选择下保存到/root 下


​           ![file://c:\users\admini~1\appdata\local\temp\tmpvxgqfn\1.png](https://s2.loli.net/2022/02/18/ixbvacRP5MDjYWS.png)

#### 7.13.复制ks 文件到/var/ftp 目录下

[root@base1 ~]# cp /root/ks.cfg /var/ftp/	#复制ks.cfg 文件到/var/ftp 目录下注：ks.cfg 就是无人值守安装时要用的 Kickstart 文件。
**<font color='red'>要对应：/var/lib/tftpboot/pxelinux.cfg/default 文件中设置过ks=ftp://192.168.245.204/ks.cfg</font>**

配 置 基 于 ftp 的 yum 源 ， 用 于 客 户 端 安 装 时 ， 读 取 软 件 包 用 ： 
[root@base1~]#mount /dev/cdrom /var/ftp/pub	#挂载系统光盘到重启下 FTP 服务
[root@base1 ~]# systemctl restart vsftpd

 注意：
关闭防火墙和selinux，如果没有关闭的话，tftp 服务会有问题。
[root@base1 ~]# systemctl enable dhcpd #启动DHCP，设置为开机启动

#### 7.14.开始测试      #注意客户端至少需要2G内存

修改base2 BIOS 启动顺序为网络优先，加电后开始启动。
           ![file://c:\users\admini~1\appdata\local\temp\tmpvxgqfn\1.png](https://s2.loli.net/2022/02/18/Det3b6yJPdN9Vz1.png)

​           ![file://c:\users\admini~1\appdata\local\temp\tmpvxgqfn\1.png](https://s2.loli.net/2022/02/18/HwqoPWyhbipF7vg.png)

按F10 保存，启动系统，开始无人执守安装
或在重启base2 虚拟机时，在启动系统界面，快速按下 F12，直接使用网卡引导系统。

##### 7.15.到此安装成功了，手动点 reboot 重启，然后修改BIOS 引导顺序为磁盘第一引导。  ![file://c:\users\admini~1\appdata\local\temp\tmpvxgqfn\1.png](https://s2.loli.net/2022/02/18/S4KT5ra67EmyIV1.png)

​           ![file://c:\users\admini~1\appdata\local\temp\tmpvxgqfn\1.png](https://s2.loli.net/2022/02/18/aRs8C1WyH7G3odm.png)

按F10 保存退出。等系统重启成功后，查看安装后脚本执行情况：
发现正常。

