# PXE

PXE

PXE(Preboot Execution Environment):
    DHCP提供IP地址并指定引导文件`pxelinux.0`位置——》TFTP提供引导文件,引导文件指定菜单文件`pxelinux.cfg/default`,菜单文件提供选项,每个选项指定了应答文件的位置(应答文件的配置指定系统安装的步骤)——》FTP或HTTP提供镜像文件和应答文件

服务器默认开机引导顺序(查找系统):硬盘——》光驱——》u盘——》网卡(PXE),匹配即停止
    
PXE服务端:
    禁用selinux和防火墙
    启动dhcpd.service:提供dhcp
    启动tftp.service:提供引导文件、菜单文件、内核文件、驱动程序
    启动httpd.service或vsftpd.service:提供应答文件、镜像文件
    注意:引导文件、内核文件、驱动程序要和镜像文件匹配
    
客户端(选择使用PXE启动)的PXE安装系统过程:
    1. DHCP分配IP,通过dhcpd.conf配置文件,指定到next-server读取filename`引导文件pxelinux.0`
    2. TFTP提供二进制的引导文件pxelinux.0,引导文件中指定了菜单文件`pxelinux.cfg/default`,菜单文件提供选择,每个选择指定了内核文件、镜像文件、应答文件ks.cfg等
    3. FTP或HTTP提供应答文件ks.cfg,根据该应答文件的配置安装系统

虚拟机使用pxe安装系统:
    1. 创建虚拟机,centos使用pxe安装需要内存2G以上(否则报错"/dev/root dose not exist"2. 网卡选择dhcp的网段,开机

禁用防火墙

# 禁用selinux和防火墙
PXE服务端(192.168.88.240):
[root@pxe ~]# setenforce 0
[root@pxe ~]# sed -Ei 's,^SELINUX=.*,SELINUX=disabled,' /etc/sysconfig/selinux
[root@pxe ~]# yum remove -y firewalld

vsftpd.service 21 挂载镜像

应答文件和YUM仓库均可以使用httpd或vsftpd提供,下面示例,httpd提供应答文件,vsftpd提供YUM仓库
# vsftpd.service(21,默认共享目录`/var/ftp/`)

PXE服务端(192.168.88.240):
[root@pxe ~]# yum install -y vsftpd
[root@pxe ~]# sed -Ei 's,^anonymous_enable=.*,anonymous_enable=YES,' /etc/vsftpd/vsftpd.conf
[root@pxe ~]# systemctl enable vsftpd.service --now
[root@pxe ~]# ss -ntulp | grep vsftpd
    tcp   LISTEN 0      32                  *:21              *:*    users:(("vsftpd",pid=4341,fd=3)) 

# 准备镜像文件,放在物理机的image目录下,虚拟机设置启动共享文件夹
[root@pxe ~]# echo ".host:/  /mnt/hgfs  fuse.vmhgfs-fuse  allow_other,defaults 0 0" >> /etc/fstab && mount -a
[root@pxe centos]# ls /mnt/hgfs/image/
    CentOS-7.9-2009.iso
    Rocky-8.6-x86_64-dvd.iso

# 挂载镜像文件,准备YUM仓库
[root@pxe ~]# mkdir /etc/yum.repos.d/bak
[root@pxe ~]# mv /etc/yum.repos.d/*.repo bak

## centos
[root@pxe ~]# blkid /mnt/hgfs/image/CentOS-7.9-2009.iso
	/mnt/hgfs/image/CentOS-7.9-2009.iso: BLOCK_SIZE="2048" UUID="2020-11-02-15-15-23-00" LABEL="CentOS 7 x86_64" TYPE="iso9660" PTUUID="6b8b4567" PTTYPE="dos"
[root@pxe ~]# mkdir /var/ftp/centos
[root@pxe ~]# echo "/mnt/hgfs/image/CentOS-7.9-2009.iso /var/ftp/centos iso9660 defaults 0 0" >> /etc/fstab
[root@pxe ~]# mount -a
[root@pxe ~]# ls -l /var/ftp/centos
    total 1668
    -rw-r--r--  1 root root      14 1030 2020 CentOS_BuildTag
    drwxr-xr-x  3 root root    2048 1027 2020 EFI
    -rw-rw-r-- 17 root root     227 830 2017 EULA
    -rw-rw-r-- 17 root root   18009 1210 2015 GPL
    drwxr-xr-x  3 root root    2048 1027 2020 images
    drwxr-xr-x  2 root root    2048 1027 2020 isolinux          # 存放内核文件和简易驱动程序
    drwxr-xr-x  2 root root    2048 1027 2020 LiveOS
    drwxr-xr-x  2 root root 1669120 1029 2020 Packages          # 存放软件包
    drwxr-xr-x  2 root root    4096 1030 2020 repodata
    -rw-rw-r-- 17 root root    1690 1210 2015 RPM-GPG-KEY-CentOS-7
    -rw-rw-r-- 15 root root    1690 1210 2015 RPM-GPG-KEY-CentOS-Testing-7
    -r--r--r--  1 root root    2883 112 2020 TRANS.TBL
[root@pxe ~]# cat > /etc/yum.repos.d/centos.repo << EOF
[centos]
name=centos
baseurl=file:///var/ftp/centos
enabled=1
gpgcheck=0
EOF
[root@pxe ~]# yum repoinfo

## rocky
[root@pxe ~]# blkid /mnt/hgfs/image/Rocky-8.6-x86_64-dvd.iso 
	/mnt/hgfs/image/Rocky-8.6-x86_64-dvd.iso: BLOCK_SIZE="2048" UUID="2022-05-15-21-06-44-00" LABEL="Rocky-8-6-x86_64-dvd" TYPE="iso9660" PTUUID="6b8b4567" PTTYPE="dos"
[root@pxe ~]# mkdir /var/ftp/rocky
[root@pxe ~]# echo "/mnt/hgfs/image/Rocky-8.6-x86_64-dvd.iso /var/ftp/rocky iso9660 defaults 0 0" >> /etc/fstab
[root@pxe ~]# mount -a
[root@pxe ~]# ls -l /var/ftp/rocky
    total 14
    dr-xr-xr-x 4 root root 2048 May 16  2022 AppStream
    dr-xr-xr-x 4 root root 2048 May 16  2022 BaseOS
    dr-xr-xr-x 3 root root 2048 May 16  2022 EFI
    -r--r--r-- 1 root root 2204 Mar 30  2022 LICENSE
    -r--r--r-- 1 root root  883 May 16  2022 TRANS.TBL
    dr-xr-xr-x 3 root root 2048 May 16  2022 images
    dr-xr-xr-x 2 root root 2048 May 16  2022 isolinux               # 存放内核文件和简易驱动程序
    -r--r--r-- 1 root root   86 May 16  2022 media.repo
[root@pxe ~]# cat > /etc/yum.repos.d/rocky.repo << EOF
[appstream]
name=appsteram
baseurl=file:///var/ftp/rocky/AppStream
enabled=1
gpgcheck=0
[baseos]
name=baseos
baseurl=file:///var/ftp/rocky/BaseOS
enabled=1
gpgcheck=0
EOF
[root@pxe ~]# yum repoinfo

dhcpd.service 67

# dhcpd.service(67,/etc/dhcp/dhcpd.conf)
# 配置文件示例/usr/share/doc/dhcp-server/dhcpd.conf.example

PXE服务端(192.168.88.240):
[root@pxe ~]# yum install -y dhcp-server
[root@pxe ~]# cat > /etc/dhcp/dhcpd.conf << EOF
default-lease-time 600;                      # 默认租约时长
max-lease-time 7200;
subnet 192.168.88.0 netmask 255.255.255.0 {  # 声明subnet网段
  range 192.168.88.231 192.168.88.235;       # 声明分配的IP范围
  option routers 192.168.88.254;
  option domain-name-servers 192.168.88.1;   # 声明dns
  next-server 192.168.88.240;                # 指定下一跳地址
  filename "centos/pxelinux.0";              # 指定下一跳地址的文件,相对路径从tftp根目录起
}
subnet 192.168.99.0 netmask 255.255.255.0 {
  range 192.168.99.231 192.168.99.235;
  option routers 192.168.99.254;
  option domain-name-servers 192.168.99.1;
  next-server 192.168.99.240;
  filename "rocky/pxelinux.0";
}
#host test01 {
#  hardware ethernet 08:00:07:26:c0:a5;      # 网卡mac地址,如果是重装系统,mac地址可以ping ip后arp -n获取
#  fixed-address 192.168.88.231;             # 分配特定ip
#}
#host test02 {
#  hardware ethernet 08:00:07:26:c0:b4;
#  fixed-address 192.168.88.232;
#}
#host test03 {
#  hardware ethernet 08:00:07:26:c0:c3;
#  fixed-address 192.168.99.231;
#}
EOF
    
[root@pxe ~]# systemctl enable dhcpd.service
[root@pxe ~]# systemctl restart dhcpd.service
[root@pxe ~]# ss -ntulp | grep dhcpd
    udp   UNCONN 0      0            0.0.0.0:67        0.0.0.0:*    users:(("dhcpd",pid=1217,fd=7)

tftp.service 69

# tftp.service(69,默认共享目录`/var/lib/tftpboot/`)

PXE服务端(192.168.88.240):
[root@pxe ~]# yum install -y tftp-server
[root@pxe ~]# cat > /etc/xinetd.d/tftp << EOF
service tftp
{
    socket_type             = dgram
    protocol                = udp                    # tftp使用udp协议
    wait                    = no                     # no表示同时接受多台客户端连接,yes表示同时接受一台客户端连接
    user                    = root
    server                  = /usr/sbin/in.tftpd
    server_args             = -s /var/lib/tftpboot   # tftp的共享根目录
    disable                 = no                     # 是否禁用tftp服务
    per_source              = 11
    cps                     = 100 2
    flags                   = IPv4
}
EOF

[root@pxe ~]# systemctl enable tftp.service
[root@pxe ~]# systemctl restart tftp.service
[root@pxe ~]# ss -ntulp | grep tftp
    udp   UNCONN 0    0    *:69    *:*    users:(("in.tftpd",pid=1351,fd=0),("systemd",pid=1,fd=32))
[root@pxe ~]# ls /var/lib/tftpboot/         # 准备引导文件、菜单文件、内核文件等
[root@pxe ~]# mkdir /var/lib/tftpboot/centos
[root@pxe ~]# mkdir /var/lib/tftpboot/rocky

引导文件 pxelinux.0

# 二进制引导文件`pxelinux.0`,指引读取菜单文件`pxelinux.cfg/default`
# 注意:pxe提供哪个系统就安装哪个系统的syslinux

PXE服务端(192.168.88.240):
[root@pxe ~]# yum provides */pxelinux.0      # 查找提供引导文件的软件并安装

## centos
[root@pxe ~]# yum install -y syslinux-4.05-15.el7.x86_64            # 从centos的仓库中下载
[root@pxe ~]# cp /usr/share/syslinux/pxelinux.0 /var/lib/tftpboot/centos/
[root@pxe ~]# yum remove -y syslinux

## rocky
[root@pxe ~]# yum install -y syslinux-nonlinux-6.04-5.el8.noarch    # 从rocky的仓库中下载
[root@pxe ~]# cp /usr/share/syslinux/pxelinux.0 /var/lib/tftpboot/rocky/
[root@pxe ~]# yum remove -y syslinux

菜单文件 pxelinux.cfg/default

# 菜单文件`pxelinux.cfg/default`

PXE服务端(192.168.88.240):

## centos
[root@pxe ~]# mkdir /var/lib/tftpboot/centos/pxelinux.cfg
[root@pxe ~]# cat > /var/lib/tftpboot/centos/pxelinux.cfg/default << EOF
default centos           # 默认加载启动项'centos'
prompt 0                 # 是否等待用户选择,1是,0否
#timeout 40              # 40/10秒
#MENU TITLE CentOS
#MENU BACKGROUND xx.png
LABEL centos             # label定义启动项
  MENU LABEL ^Install CentOS 7.9     # ^后的字母是该选项的键盘快捷键
#  MENU default          # timeout读秒结束之后的默认选择
  KERNEL vmlinuz
  APPEND initrd=initrd.img ks=http://192.168.88.240/centos/ks.cfg
EOF

## rocky ??
[root@pxe ~]# mkdir /var/lib/tftpboot/rocky/pxelinux.cfg
[root@pxe ~]# cat > /var/lib/tftpboot/rocky/pxelinux.cfg/default << EOF
default rocky            # 默认加载启动项'rocky'
prompt 0                 # 是否等待用户选择,1是,0否
#timeout 40              # 40/10秒
#MENU TITLE Rocky
LABEL rocky              # label定义启动项
  MENU LABEL ^Install Rocky 8.6   
#  MENU default          # timeout读秒结束之后的默认选择
  KERNEL vmlinuz
  APPEND initrd=initrd.img inst.repo=ftp://192.168.88.240/rocky ks=http://192.168.99.240/rocky/ks.cfg
EOF

内核文件 vmlinuz 和驱动程序 initrd.img

# 内核文件 `vmlinuz` 和驱动程序 `initrd.img`
cp 光盘镜像文件挂载点/isolinux/vmlinuz /var/lib/tftpboot/centos
cp 光盘镜像文件挂载点/isolinux/initrd.img /var/lib/tftpboot/centos

PXE服务端(192.168.88.240):

## centos
[root@pxe ~]# mkdir /var/lib/tftpboot/centos
[root@pxe ~]# cp /var/ftp/centos/isolinux/vmlinuz /var/lib/tftpboot/centos
[root@pxe ~]# cp /var/ftp/centos/isolinux/initrd.img /var/lib/tftpboot/centos

## rocky
[root@pxe ~]# mkdir /var/lib/tftpboot/rocky
[root@pxe ~]# cp /var/ftp/rocky/isolinux/vmlinuz /var/lib/tftpboot/rocky
[root@pxe ~]# cp /var/ftp/rocky/isolinux/initrd.img /var/lib/tftpboot/rocky
[root@pxe ~]# cp /var/ftp/rocky/isolinux/ldlinux.c32 /var/lib/tftpboot/rocky/

[root@pxe ~]# tree /var/lib/tftpboot/
    /var/lib/tftpboot/
    |-- centos
    |   |-- initrd.img
    |   |-- pxelinux.0
    |   |-- pxelinux.cfg
    |   |   `-- default
    |   `-- vmlinuz
    `-- rocky
        |-- initrd.img
        |-- pxelinux.0
        |-- pxelinux.cfg
        |   `-- default
        `-- vmlinuz

	4 directories, 8 files

httpd.service 80

# httpd.service(80,默认共享目录`/var/www/html`)

PXE服务端(192.168.88.240):
[root@pxe ~]# yum install -y httpd
[root@pxe ~]# systemctl enable httpd.service
[root@pxe ~]# systemctl restart httpd.service
[root@pxe ~]# ss -tnulp | grep httpd
	tcp   LISTEN 0      128                *:80              *:*    users:(("httpd",pid=14171,fd=4),("httpd",pid=14170,fd=4),("httpd",pid=14169,fd=4),("httpd",pid=14167,fd=4))

# 应答文件
## 方式一:图形化界面(system-config-kickstart)配置生成
[root@pxe ~]# yum install -y system-config-kickstart        // 实现无人值守安装的图形软件
[root@pxe ~]# system-config-kickstart
    注意:system-config-kickstart只识别仓库ID为`[development]`的YUM仓库,否则"软件包选择"加载识别失败
    + 基本配置:选择时区,设置root密码,勾选"安装后重启",勾选"在文本模式中执行安装"
    + 安装方法:"执行全新安装""FTP"方式,"FTP服务器"`192.168.88.240`"FTP目录"`centos`
    + 引导装载程序选项:"安装新引导装载程序"
    + 分区信息:"清除主引导记录""删除所有现存分区""初始化磁盘标签",分区选项"挂载点"`/`"使用磁盘上全部未用空间""格式化分区"
    + 网络配置:添加"eth0""DHCP"。实际上,该网卡最终不会叫eth0
    + 防火墙:禁用SELinux,禁用防火墙
    + 软件包选择:"系统""基本"(最小化安装)
    保存文件为/root/ks.cfg
[root@pxe ~]# mkdir /var/www/html/centos/
[root@pxe ~]# cp /root/ks.cfg /var/www/html/centos/

## 方式二:直接编写
### centos
[root@pxe ~]# mkdir /var/www/html/centos/
[root@pxe ~]# vim /var/www/html/centos/ks.cfg
### rocky
[root@pxe ~]# mkdir /var/www/html/rocky/
[root@pxe ~]# vim /var/www/html/rocky/ks.cfg

应答文件 ks.cfg

参考文档:
https://blog.csdn.net/yanghua1012/article/details/80426659
https://docs.redhat.com/zh_hans/documentation/red_hat_enterprise_linux/9/html/boot_options_for_rhel_installer/index
https://fedoraproject.org/wiki/Anaconda/Kickstart/zh-cn
cat > /var/www/html/centos/ks.cfg << EOF
install               # install表示全新安装系统
url --url=ftp://192.168.88.240/centos/   # 镜像文件位置,如果是光驱则cdrom
lang en_US.UTF-8
keyboard us
timezone --isUtc --nontp Asia/Shanghai
firewall --disabled
selinux --disabled
auth --enableshadow -enablemd5
rootpw a
user --name=test --password=a --plaintext
network --hostname vm_centos
network --device=eth0 --netmask=255.255.255.0 --gateway=192.168.88.254 --onboot=yes
bootloader  --location=mbr  --append="rhgb quiet net.ifnames=0 biosdevname=0 ipv6.disable=1" --driveorder=sda
#graphical            # graphical图形化模式下安装(缺省),text文本模式下安装
reboot                # 安装后重启
#halt                 # 安装后关机
clearpart --drives=sda --all --initlabel
part /boot --fstype="xfs" --size=1024 --ondisk=sda
part pv.01 --size=1024 --grow --ondisk=sda
volgroup sysvg pv.01
logvol swap --fstype="swap" --size=2048 --vgname=sysvg --name=swap
logvol / --fstype="xfs" --size=1024 --grow --vgname=sysvg --name=root

%packages
@^minimal
rsync
lrzsz
tree
vim
tar
bash-completion
%end

%post
rm -rf /etc/yum.repos.d/
mkdir /etc/yum.repos.d/
echo '[centos]
name=centos
baseurl=ftp://192.168.88.240/centos
enabled=1
gpgcheck=0' > /etc/yum.repos.d/centos.repo
%end
EOF
cat > /var/www/html/rocky/ks.cfg << EOF
install               # install表示全新安装系统
url --url=ftp://192.168.99.240/rocky/   # 镜像文件位置,如果是光驱则cdrom
lang en_US.UTF-8
keyboard us
timezone --isUtc --nontp Asia/Shanghai
firewall --disabled
selinux --disabled
auth --enableshadow -enablemd5
rootpw a
user --name=test --password=a --plaintext
network --hostname vm_rocky
network --device=eth0 --netmask=255.255.255.0 --gateway=192.168.99.254 --onboot=yes
bootloader  --location=mbr  --append="rhgb quiet net.ifnames=0 biosdevname=0 ipv6.disable=1" --driveorder=sda
clearpart --drives=sda --all --initlabel
part /boot --fstype="xfs" --size=1024 --ondisk=sda
part pv.01 --size=1024 --grow --ondisk=sda
volgroup sysvg pv.01
logvol swap --fstype="swap" --size=2048 --vgname=sysvg --name=swap
logvol / --fstype="xfs" --size=1024 --grow --vgname=sysvg --name=root

%packages
@^minimal
rsync
lrzsz
tree
vim
tar
bash-completion
%end

%post
rm -rf /etc/yum.repos.d/
mkdir /etc/yum.repos.d/
echo '[appstream]
name=appstream
baseurl=ftp://192.168.99.240/rocky/AppStream
enabled=1
gpgcheck=0
[baseos]
name=baseos
baseurl=ftp://192.168.99.240/rocky/BaseOS
enabled=1
gpgcheck=0' > /etc/yum.repos.d/rocky.repo
%end
reboot
EOF
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值