欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

简易自动化:使用PXE与Kickstart部署Linux 8系统

最编程 2024-08-01 20:19:46
...

一、PXE+Kickstart自动化部署原理

1、什么是PXE?

PXE,Preboot eXecution Environment,即全程预启动执行环境,也被称为预执行环境。提供了一种使用网络接口启动计算机的机制。这种机制让计算机的启动可以不依赖本地数据存储设备(如硬盘)或本地已安装的操作系统。  
PXE是由 Intel 公司开发的网络引导技术,工作在 Client/Server 模式,允许客户机通过网络从远程服务器下载引导镜像,并加载安装文件或者整个操作系统。 
PXE严格来说并不是一种安装方式,而是一种引导的方式。进行PXE引导的必要条件是要引导的计算机中包含一个PXE支持的网卡,即网卡中必须要有PXE Client(主板支持网络引导)。

2、要件功能

Kickstart : KickStart是一种无人职守安装方式。KickStart的工作原理是通过记录典型的安装过程中所需人工干预填写的各种参数,并生成一个名为 ks.cfg的文件;在其后的安装过程中(不只局限于生成KickStart安装文件的机器)当出现要求填写参数的情况时,安装程序会首先去查找 KickStart生成的文件,当找到合适的参数时,就采用找到的参数,当没有找到合适的参数时,才需要安装者手工干预。这样,如果KickStart文件涵盖了安装过程中出现的所有需要填写的参数时,安装者完全可以只告诉安装程序从何处取ks.cfg文件,然后去忙自己的事情。等安装完毕,安装程序会根据ks.cfg中设置的重启选项来重启系统,并结束安装。

DHCP: 用来给客户端PXE Client(将要安装系统的主机)分配IP 地址。

Httpd:超文本传输协议,这里的角色仅提供安装系统所需的软件包。也可以用vsftp、nfs等软件包下载功能。

Tftp: 服务器用来存放PXE的相关文件,比如:系统引导文件;

3、PXE+Kickstart自动化部署流程

①PXE客户机发出DHCP请求,向DHCP服务器申请IP地址。
②DHCP服务器响应PXE客户机的请求,自动从IP地址池中分配一个IP地址给PXE客户机,并且告知PXE客户机:TFTP服务器的IP地址和PXE引导程序文件pxelinux.0,默认在TFTP共享目录/var/lib/tftpboot/下。

③PXE客户机向TFTP服务器发起获取pxelinux.0引导程序文件的请求。
④TFTP服务器响应PXE客户机的请求,将其共享的pxelinux.0文件传输给PXE客户机。

③PXE客户机向TFTP服务器发起获取ldlinux.c32和pxelinux.cfg/defaulf 的pxe引导配置文件的请求。
④TFTP服务器响应PXE客户机的请求,将ldlinux.c32和pxelinux.cfg/defaulf 文件传输给PXE客户机。

PXE客户端展示pxelinux.cfg/defaulf 文件中的引导项,由用户指定选择其中一个引导项,或则等待默认时间后根据配置文件中的默认引导项(本地磁盘引导)自动引导。

③PXE客户机根据default文件配置向TFTP服务器发起获取对应引导项的vmlinuz压缩的虚拟机linux内核文件的请求。
④TFTP服务器响应PXE客户机的请求,将其共享的vmlinuz文件传输给PXE客户机。

③PXE客户机根据default文件配置向TFTP服务器发起获取对应引导项的initrd.img 临时文件系统文件的请求。
④TFTP服务器响应PXE客户机的请求,将其共享的initrd.img文件传输给PXE客户机。

●PXE客户机启动内核。

⑤PXE客户机根据default文件向http,ftp,nfs等网络共享服务器发起获取对应ks.cfg文件。
⑥PXE客户机读取ks.cfg,ks.cfg文件记录安装过程中所需人工干预填写的各种参数。包括键盘布局,系统语言,磁盘分区,网络配置,时区,root用户密码,安装的软件包,通过网络安装时,安装文件的位置,安装完成后自动重启等等。

通过http,ftp,nfs等网络共享服务器下载指定软件包进行安装,完成自动化的安装操作系统。
重启服务器,并从默认的本地磁盘引导启动。

PXE+Kickstart自动化部署流程图

二、构建自动化部署服务

1、环境准备

虚拟化环境:VMware® Workstation 15 Pro
PXE Server配置:2C 2G
PXE Server OS:AlmaLinux release 8.6 (Sky Tiger)

2、DHCP服务部署

# dnf install -y dhcpd
# cp -p /etc/dhcp/dhcpd.conf /etc/dhcp/dhcpd.conf.org
# vi /etc/dhcp/dhcpd.conf
# egrep -v "^#|^$" /etc/dhcp/dhcpd.conf
option domain-name "localhost";                #定义域名
option domain-name-servers 172.26.37.2;        #定义DNS
default-lease-time 600;                        #定义租约时间
max-lease-time 7200;                           #定义最大租约时间
log-facility local7;                           #定义日志级别
subnet 172.26.37.0 netmask 255.255.255.0 {
    range 172.26.37.145 172.26.37.155;
    next-server 172.26.37.144;
    filename "pxelinux.0";
}                                              #定义地址池的子网,掩码,地址池范围,dns,网关;定义了引导服务器tftp的地址,以及引导程序文件名。这里的pxelinux.0文件必须在tftp根目录上。
# systemctl start dhcpd.service
# systemctl status dhcpd.service
# systemctl enable dhcpd.service
# ss -tnlup |grep :67
udp   UNCONN 0      0            0.0.0.0:67        0.0.0.0:*    users:(("dhcpd",pid=5095,fd=10))

3.tftp服务部署

# dnf install -y tftp tftp-server xinetd
# systemctl restart xinetd
# systemctl enable xinetd
# systemctl status xinetd
# systemctl restart tftp
# systemctl enable tftp
# systemctl status tftp
# ss -tnlup |grep :69
udp   UNCONN 0      0                  *:69              *:*    users:(("systemd",pid=1,fd=90))

4.准备tftp共享文件

# dnf install -y syslinux
拷贝pxeLinux.0文件到tftp共享目录
# cp -rp /usr/share/syslinux/pxelinux.0 /var/lib/tftpboot/
# mkdir /mnt/{rocky,almalinux,rhel}
# mount /dev/sr1 /mnt/rocky
# mount /dev/sr2 /mnt/almalinux
# mount /dev/sr3 /mnt/rhel
# mount -l
/dev/sr1 on /mnt/rocky type iso9660 (ro,relatime,nojoliet,check=s,map=n,blocksize=2048) [Rocky-8-5-x86_64-dvd]
/dev/sr2 on /mnt/almalinux type iso9660 (ro,relatime,nojoliet,check=s,map=n,blocksize=2048) [AlmaLinux-8-6-x86_64-dvd]
/dev/sr3 on /mnt/rhel type iso9660 (ro,relatime,nojoliet,check=s,map=n,blocksize=2048) [RHEL-8-0-0-BaseOS-x86_64]
创建存放vmlinux及initrd.img文件路径
# mkdir /var/lib/tftpboot/{Almalinux,rhel,rocky}
拷贝各系统的vmlinux和initrd.img文件到指定目录
# cp -rp /mnt/rhel/isolinux/{vmlinuz,initrd.img} /var/lib/tftpboot/rhel
# cp -rp /mnt/almalinux/isolinux/{vmlinuz,initrd.img} /var/lib/tftpboot/Almalinux
# cp -rp /mnt/rocky/isolinux/{vmlinuz,initrd.img} /var/lib/tftpboot/rocky
拷贝通用的.c32文件,一种轻量的引导加载文件。
# cp -rp /mnt/rhel/isolinux/*.c32 /var/lib/tftpboot/
创建/var/lib/tftpboot/pxelinux.cfg文件夹
# mkdir /var/lib/tftpboot/pxelinux.cfg/
将/mnt/rhel/isolinux/isolinux.cfg引导文件模板拷贝到tftp的pxelinux.cfg目录,并改名为default
# cp /mnt/rhel/isolinux/isolinux.cfg /var/lib/tftpboot/pxelinux.cfg/default
# ll /var/lib/tftpboot/
drwxr-xr-x 2 root root     39 Dec 24 17:25 Almalinux
-r--r--r-- 1 root root 116064 Aug 13  2018 ldlinux.c32
-r--r--r-- 1 root root 180668 Aug 13  2018 libcom32.c32
-r--r--r-- 1 root root  22836 Aug 13  2018 libutil.c32
-rw-r--r-- 1 root root  42376 Oct  8 21:26 pxelinux.0
drwxr-xr-x 2 root root     21 Dec 24 17:27 pxelinux.cfg
drwxr-xr-x 2 root root     39 Dec 24 17:24 rhel
drwxr-xr-x 2 root root     39 Dec 24 17:25 rocky
-r--r--r-- 1 root root  26788 Aug 13  2018 vesamenu.c32
修改default文件
# vi  /var/lib/tftpboot/pxelinux.cfg/default
# cat /var/lib/tftpboot/pxelinux.cfg/default |grep -v ^#|grep -v ^$
default vesamenu.c32
timeout 600
display boot.msg
menu clear
menu background splash.png
menu title Install Linux OS 
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 local
  menu default
  menu label ^Boot from local drive
  localboot 0xffff
label Almalinux_linux
  menu label ^Install Almalinux 8.6 (auto)
  kernel Almalinux/vmlinuz
  append initrd=Almalinux/initrd.img ks=http://172.26.37.144/Almalinux_ks.cfg quiet
label rocky
  menu label ^Install Rocky 8.5 (auto)
  kernel rocky/vmlinuz
  append initrd=rocky/initrd.img ks=http://172.26.37.144/rocky_ks.cfg quiet
label rhel
  menu label ^Install RHEL 8.0 (auto)
  kernel rhel/vmlinuz
  append initrd=rhel/initrd.img ks=http://172.26.37.144/rhel_ks.cfg quiet
menu end

5.安装HTTP服务

# yum install -y httpd
# vi /etc/httpd/conf/httpd.conf 
# egrep -v "^#|^$|^    #" /etc/httpd/conf/httpd.conf
ServerRoot "/etc/httpd"
Listen 80
Include conf.modules.d/*.conf
User apache
Group apache
ServerAdmin root@localhost
ServerName 172.26.37.144:80
<Directory />
    AllowOverride none
    Require all denied
</Directory>
DocumentRoot "/var/www/html"
<Directory "/var/www">
    AllowOverride None
    Require all granted
</Directory>
<Directory "/var/www/html">
    Options Indexes FollowSymLinks
    AllowOverride None
    Require all granted
</Directory>
<IfModule dir_module>
    DirectoryIndex index.html
</IfModule>
<Files ".ht*">
    Require all denied
</Files>
ErrorLog "logs/error_log"
LogLevel warn
<IfModule log_config_module>
    LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
    LogFormat "%h %l %u %t \"%r\" %>s %b" common
    <IfModule logio_module>
      # You need to enable mod_logio.c to use %I and %O
      LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
    </IfModule>
    CustomLog "logs/access_log" combined
</IfModule>
<IfModule alias_module>
    ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
</IfModule>
<Directory "/var/www/cgi-bin">
    AllowOverride None
    Options None
    Require all granted
</Directory>
<IfModule mime_module>
    TypesConfig /etc/mime.types
    AddType application/x-compress .Z
    AddType application/x-gzip .gz .tgz
    AddType text/html .shtml
    AddOutputFilter INCLUDES .shtml
</IfModule>
AddDefaultCharset UTF-8
<IfModule mime_magic_module>
    MIMEMagicFile conf/magic
</IfModule>
EnableSendfile on
IncludeOptional conf.d/*.conf

# systemctl restart httpd.service 
# systemctl enable httpd.service 
# systemctl status httpd.service

6.准备共享ks应答文件和软件包

制作ks文件的方法
方法一:在图形化的linux系统上安装system-config-kickstart软件,并在图形化桌面打开工具配置ks文件。
方法二:基于已经安装好的服务器中/root/anaconda-ks.cfg文件进行修改。
方法三:阅读kickstart配置文件手册,自己编写

# vi /var/www/html/Almalinux_ks.cfg
# cat /var/www/html/Almalinux_ks.cfg |grep -v ^# |grep -v ^$
install   
reboot                                               #安装完成后自动重启
graphical                                            #使用图形化安装
%packages
@^server-product-environment
@gnome-desktop
kexec-tools
%end
url --url="http://172.26.37.144/almalinux"            #下载安装路径
keyboard --xlayouts='us'                              #配置键盘布局
lang en_US.UTF-8                                      #配置系统语言
network  --bootproto=dhcp --device=ens33 --ipv6=auto --activate   #配置网络
network  --hostname=localhost.localdomain                         #配置网络
firstboot --enable
bootloader --location=mbr
zerombr
clearpart --all --initlabel
part /home --fstype="xfs" --size=4096
part /boot --fstype="xfs" --size=1024
part / --fstype="xfs" --grow --size=1
timezone Asia/Shanghai --isUtc                                   #配置系统时区
rootpw --iscrypted $6$rJmBvJqGh2Iq4nKK$/0Znefo5lu5JxEX1ZGDcf9zzS3k2b/bQLvZawg6oJtzMrxBZN.9Ybei573QHhILQcWbScP79bQOq4xMrui.VR0                                              #root用户密码
%addon com_redhat_kdump --enable --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

# vi /var/www/html/rhel_ks.cfg
# cat  /var/www/html/rhel_ks.cfg|grep -v ^# |grep -v ^$^C
install
reboot
graphical
%packages
@^server-product-environment
@gnome-desktop
kexec-tools
%end
url --url="http://172.26.37.144/rhel"
keyboard --xlayouts='us'
lang en_US.UTF-8
network  --bootproto=dhcp --device=ens33 --ipv6=auto --activate
network  --hostname=localhost.localdomain
firstboot --enable
bootloader --location=mbr
zerombr
clearpart --all --initlabel
part /home --fstype="xfs" --size=4096
part /boot --fstype="xfs" --size=1024
part / --fstype="xfs" --grow --size=1
timezone Asia/Shanghai --isUtc 
rootpw --iscrypted $6$rJmBvJqGh2Iq4nKK$/0Znefo5lu5JxEX1ZGDcf9zzS3k2b/bQLvZawg6oJtzMrxBZN.9Ybei573QHhILQcWbScP79bQOq4xMrui.VR0
%addon com_redhat_kdump --enable --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

# vi /var/www/html/rocky_ks.cfg 
# cat  /var/www/html/rocky_ks.cfg|grep -v ^# |grep -v ^$^C
install
reboot
graphical
%packages
@^server-product-environment
@gnome-desktop
kexec-tools
%end
url --url="http://172.26.37.144/rocky"
keyboard --xlayouts='us'
lang en_US.UTF-8
network  --bootproto=dhcp --device=ens33 --ipv6=auto --activate
network  --hostname=localhost.localdomain
firstboot --enable
bootloader --location=mbr
zerombr
clearpart --all --initlabel
part /home --fstype="xfs" --size=4096
part /boot --fstype="xfs" --size=1024
part / --fstype="xfs" --grow --size=1
timezone Asia/Shanghai --isUtc 
rootpw --iscrypted $6$rJmBvJqGh2Iq4nKK$/0Znefo5lu5JxEX1ZGDcf9zzS3k2b/bQLvZawg6oJtzMrxBZN.9Ybei573QHhILQcWbScP79bQOq4xMrui.VR0
%addon com_redhat_kdump --enable --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

准备共享软件包

# cp -rp  /mnt/rhel /var/www/html/
# cp -rp  /mnt/almalinux /var/www/html/
# cp -rp  /mnt/rhel /var/www/html/

三、自动化部署服务器

1.自动化部署AlmaLinux 8.6

在VMware Workstation上新建虚拟机




配置自动化装机的虚机资源,内存至少2G以上

启动虚机,进入安装界面,选择Install AlmaLinux 8.6(auto),开始自动部署

可以提前打开dhcp、tftp、http服务的日志,跟踪自动化装机过程,加深对自动化部署过程的理解。



自动安装完成,登录服务器确认。


参考URL

https://www.vercot.com/~serva/advanced/PxeErrorCodes.html
https://www.jianshu.com/p/4913fc4a3b21
http://www.manongjc.com/detail/41-kmeupunmxijwexh.html
https://blog.****.net/mpu_nice/article/details/107922312