本文已参与「新人创作礼」活动, 一起开启掘金创作之路。
1.在 CentOS 8 上实现PXE自动化安装 CentOS 6,7,8
1.1 安装前准备
关闭防火墙和SELINUX,DHCP服务器静态IP
网络要求:关闭Vmware软件中的DHCP服务,基于NAT模式
注意:使用 1G 以下内存的主机安装CentOS 7,8 会提示空间不足,建议2G以上
1.2 安装相关软件包并启动
[root@rocky8 ~]# dnf -y install dhcp-server tftp-server httpd syslinux-nonlinux
[root@rocky8 ~]# systemctl enable --now httpd tftp dhcpd
Created symlink /etc/systemd/system/multi-user.target.wants/httpd.service → /usr/lib/systemd/system/httpd.service.
Created symlink /etc/systemd/system/sockets.target.wants/tftp.socket → /usr/lib/systemd/system/tftp.socket.
Created symlink /etc/systemd/system/multi-user.target.wants/dhcpd.service → /usr/lib/systemd/system/dhcpd.service.
Job for dhcpd.service failed because the control process exited with error code. #dhcp服务不能启动,因为没有设置dhcp配置文件
See "systemctl status dhcpd.service" and "journalctl -xe" for details.
1.3 配置DHCP服务
[root@rocky8 ~]# cp /usr/share/doc/dhcp-server/dhcpd.conf.example /etc/dhcp/dhcpd.conf
cp: overwrite '/etc/dhcp/dhcpd.conf'? y
[root@rocky8 ~]# vim /etc/dhcp/dhcpd.conf
option domain-name "example.org"; #设置域名,这里可以不设置
option domain-name-servers 180.76.76.76, 223.6.6.6; #设置DNS
default-lease-time 86400; #设置DHCP租期
max-lease-time 100000; #设置最大DHCP租期
log-facility local7;
subnet 172.31.0.0 netmask 255.255.248.0 { #DHCP获取网络段
range 172.31.7.1 172.31.7.254; #DHCP获取地址范围
option routers 172.31.0.2; #网关
next-server 172.31.1.8; #tftp 服务地址
filename "pxelinux.0"; #pxe获取文件名
}
[root@rocky8 ~]# systemctl start dhcpd
1.4 准备yum 源和相关目录
[root@rocky8 ~]# mkdir -pv /var/www/html/centos/{6,7}/os/x86_64
mkdir: created directory '/var/www/html/centos'
mkdir: created directory '/var/www/html/centos/6'
mkdir: created directory '/var/www/html/centos/6/os'
mkdir: created directory '/var/www/html/centos/6/os/x86_64'
mkdir: created directory '/var/www/html/centos/7'
mkdir: created directory '/var/www/html/centos/7/os'
mkdir: created directory '/var/www/html/centos/7/os/x86_64'
[root@rocky8 ~]# mkdir -pv /var/www/html/rocky/8/os/x86_64
mkdir: created directory '/var/www/html/rocky'
mkdir: created directory '/var/www/html/rocky/8'
mkdir: created directory '/var/www/html/rocky/8/os'
mkdir: created directory '/var/www/html/rocky/8/os/x86_64'
[root@rocky8 ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sr0 11:0 1 3.7G 0 rom
sr1 11:1 1 9.5G 0 rom
sr2 11:2 1 10G 0 rom
nvme0n1 259:0 0 200G 0 disk
├─nvme0n1p1 259:1 0 1G 0 part /boot
├─nvme0n1p2 259:2 0 100G 0 part /
├─nvme0n1p3 259:3 0 50G 0 part /data
├─nvme0n1p4 259:4 0 1K 0 part
└─nvme0n1p5 259:5 0 2G 0 part [SWAP]
[root@rocky8 ~]# mount /dev/sr0 /var/www/html/centos/6/os/x86_64/
mount: /var/www/html/centos/6/os/x86_64: WARNING: device write-protected, mounted read-only.
[root@rocky8 ~]# mount /dev/sr1 /var/www/html/centos/7/os/x86_64/
mount: /var/www/html/centos/7/os/x86_64: WARNING: device write-protected, mounted read-only.
[root@rocky8 ~]# mount /dev/sr2 /var/www/html/rocky/8/os/x86_64/
mount: /var/www/html/rocky/8/os/x86_64: WARNING: device write-protected, mounted read-only.
1.5 准备kickstart文件
[root@rocky8 ~]# mkdir /var/www/html/ks/
[root@rocky8 ~]# ls
anaconda-ks.cfg centos6.cfg centos7.cfg rocky8.cfg
[root@rocky8 ~]# mv centos* rocky8.cfg /var/www/html/ks/
[root@rocky8 ~]# ls /var/www/html/ks/
centos6.cfg centos7.cfg rocky8.cfg
[root@rocky8 ~]# vim /var/www/html/ks/yum6.sh
#!/bin/bash
#
#**********************************************************************************************
#Author: Raymond
#QQ: 88563128
#Date: 2021-11-30
#FileName: yum6.sh
#URL: raymond.blog.csdn.net
#Description: The test script
#Copyright (C): 2021 All rights reserved
#*********************************************************************************************
mkdir /etc/yum.repos.d/backup
mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/backup
cat > /etc/yum.repos.d/base.repo <<EOF
[base]
name=base
baseurl=https://mirrors.cloud.tencent.com/centos/$releasever/os/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-$releasever
[extras]
name=extras
baseurl=https://mirrors.cloud.tencent.com/centos/$releasever/extras/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-$releasever
[updates]
name=updates
baseurl=https://mirrors.cloud.tencent.com/centos/$releasever/updates/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-$releasever
[centosplus]
name=centosplus
baseurl=https://mirrors.cloud.tencent.com/centos/$releasever/centosplus/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-$releasever
EOF
cat > /etc/yum.repos.d/epel.repo <<EOF
[epel]
name=epel
baseurl=https://mirrors.cloud.tencent.com/epel/$releasever/$basearch/
gpgcheck=1
gpgkey=https://mirrors.cloud.tencent.com/epel/RPM-GPG-KEY-EPEL-$releasever
EOF
[root@rocky8 ~]# vim /var/www/html/ks/yum7.sh
#!/bin/bash
#
#**********************************************************************************************
#Author: Raymond
#QQ: 88563128
#Date: 2021-11-30
#FileName: yum7.sh
#URL: raymond.blog.csdn.net
#Description: The test script
#Copyright (C): 2021 All rights reserved
#*********************************************************************************************
mkdir /etc/yum.repos.d/backup
mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/backup
cat > /etc/yum.repos.d/base.repo <<EOF
[base]
name=base
baseurl=https://mirrors.cloud.tencent.com/centos/$releasever/os/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-$releasever
[extras]
name=extras
baseurl=https://mirrors.cloud.tencent.com/centos/$releasever/extras/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-$releasever
[updates]
name=updates
baseurl=https://mirrors.cloud.tencent.com/centos/$releasever/updates/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-$releasever
[centosplus]
name=centosplus
baseurl=https://mirrors.cloud.tencent.com/centos/$releasever/centosplus/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-$releasever
EOF
cat > /etc/yum.repos.d/epel.repo <<EOF
[epel]
name=epel
baseurl=https://mirrors.cloud.tencent.com/epel/$releasever/$basearch/
gpgcheck=1
gpgkey=https://mirrors.cloud.tencent.com/epel/RPM-GPG-KEY-EPEL-$releasever
EOF
[root@rocky8 ~]# vim /var/www/html/ks/yum8.sh
#!/bin/bash
#
#**********************************************************************************************
#Author: Raymond
#QQ: 88563128
#Date: 2021-11-30
#FileName: yum8.sh
#URL: raymond.blog.csdn.net
#Description: The test script
#Copyright (C): 2021 All rights reserved
#*********************************************************************************************
mkdir /etc/yum.repos.d/backup
mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/backup
cat > /etc/yum.repos.d/base.repo <<EOF
[BaseOS]
name=BaseOS
baseurl=https://mirrors.sjtug.sjtu.edu.cn/rocky/$releasever/BaseOS/$basearch/os/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-rockyofficial
[AppStream]
name=AppStream
baseurl=https://mirrors.sjtug.sjtu.edu.cn/rocky/$releasever/AppStream/$basearch/os/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-rockyofficial
[extras]
name=extras
baseurl=https://mirrors.sjtug.sjtu.edu.cn/rocky/$releasever/extras/$basearch/os/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-rockyofficial
enabled=1
[plus]
name=plus
baseurl=https://mirrors.sjtug.sjtu.edu.cn/rocky/$releasever/plus/$basearch/os/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-rockyofficial
[PowerTools]
name=PowerTools
baseurl=https://mirrors.sjtug.sjtu.edu.cn/rocky/$releasever/PowerTools/$basearch/os/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-rockyofficial
EOF
cat > /etc/yum.repos.d/epel.repo <<EOF
[epel]
name=epel
baseurl=https://mirrors.sjtug.sjtu.edu.cn/fedora/epel/$releasever/Everything/$basearch/
gpgcheck=1
gpgkey=https://mirrors.sjtug.sjtu.edu.cn/fedora/epel/RPM-GPG-KEY-EPEL-$releasever
EOF
[root@rocky8 ~]# cat /var/www/html/ks/centos6.cfg
# Kickstart file automatically generated by anaconda.
#version=DEVEL
install
text
reboot
url --url=http://172.31.1.8/centos/6/os/x86_64/
lang en_US.UTF-8
keyboard us
network --onboot yes --device eth0 --bootproto dhcp --noipv6
rootpw --iscrypted $6$eAT2HmLxImeMrIbd$jP8mNSU6/A9/ISOSP6dc72h6mbbfzTsCFMEcfL8c7PNla8L9wGQnW5Nl8wuP5mHFkoxlwIQNt3jjcErIE.w9H/
firewall --disabled
authconfig --enableshadow --passalgo=sha512
selinux --disabled
timezone Asia/Shanghai
bootloader --location=mbr --driveorder=sda --append="crashkernel=auto rhgb quiet"
zerombr
clearpart --all --initlabel
part /boot --fstype="ext4" --size=1024
part swap --fstype="swap" --size=2048
part / --fstype="ext4" --grow --size=1
%packages
@core
@server-policy
@workstation-policy
vim
lrzsz
%end
%post
curl http://172.31.1.8/ks/yum6.sh |bash
%end
[root@rocky8 ~]# cat /var/www/html/ks/centos7.cfg
#platform=x86, AMD64, or Intel EM64T
#version=DEVEL
# Install OS instead of upgrade
install
# Keyboard layouts
keyboard 'us'
# Root password
rootpw --iscrypted $1$r6bueld4$D66DkBZeburidFINHY6Pf1
# System language
lang en_US
# System authorization information
auth --useshadow --passalgo=sha512
# Use text mode install
text
firstboot --disable
# SELinux configuration
selinux --disabled
# Do not configure the X Window System
skipx
# Firewall configuration
firewall --disabled
# Network information
network --bootproto=dhcp --device=eth0
# Reboot after installation
reboot
# System timezone
timezone Asia/Shanghai
# Use network installation
url --url="http://172.31.1.8/centos/7/os/x86_64"
# System bootloader configuration
bootloader --append="net.ifnames=0" --location=mbr
# Clear the Master Boot Record
zerombr
# Partition clearing information
clearpart --all --initlabel
# Disk partitioning information
part /boot --fstype="xfs" --size=1024
part swap --fstype="swap" --size=2048
part / --fstype="xfs" --grow --size=1
%post
curl http://172.31.1.8/ks/yum7.sh |bash
%end
%packages
vim
lrzsz
@core
%end
[root@rocky8 ~]# cat /var/www/html/ks/rocky8.cfg
#version=RHEL8
# Use graphical install
reboot
text
url --url="http://172.31.1.8/rocky/8/os/x86_64"
selinux --disabled
firewall --disabled
%packages
@^minimal-environment
kexec-tools
vim
lrzsz
%end
# Keyboard layouts
keyboard --xlayouts='us'
# System language
lang en_US.UTF-8
# Network information
network --bootproto=dhcp --device=eth0 --ipv6=auto --activate
network --hostname=localhost.localdomain
# Run the Setup Agent on first boot
firstboot --disabled
# System bootloader configuration
bootloader --append="net.ifnames=0" --location=mbr
# Clear the Master Boot Record
zerombr
# Partition clearing information
clearpart --all --initlabel
# Disk partitioning information
part /boot --fstype="xfs" --size=1024
part swap --fstype="swap" --size=2048
part / --fstype="xfs" --grow --size=1
# System timezone
timezone Asia/Shanghai --isUtc --nontp
# Root password
rootpw --iscrypted $6$1p3L2ik4nOlvKZV4$rQdULbSTNv22KpUksNUINmWVOgEpXOPgLbgxiXdI.VnPeure6xrEQXI9QTQ6X1P9LQorkJHH2p7OSRl5LmgIB.
%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
%post
curl http://172.31.1.8/ks/yum8.sh |bash
%end
1.6 准备PXE启动相关文件
[root@rocky8 ~]# mkdir /var/lib/tftpboot/centos{6,7}
[root@rocky8 ~]# mkdir /var/lib/tftpboot/rocky8
#准备CentOS6,7,8各自的内核相关文件
[root@rocky8 ~]# cp /var/www/html/centos/6/os/x86_64/isolinux/{vmlinuz,initrd.img} /var/lib/tftpboot/centos6/
[root@rocky8 ~]# cp /var/www/html/centos/7/os/x86_64/isolinux/{vmlinuz,initrd.img} /var/lib/tftpboot/centos7/
[root@rocky8 ~]# cp /var/www/html/rocky/8/os/x86_64/isolinux/{vmlinuz,initrd.img} /var/lib/tftpboot/rocky8/
[root@rocky8 ~]# cp /usr/share/syslinux/{pxelinux.0,menu.c32} /var/lib/tftpboot/
#以下三个文件是CentOS8安装所必须文件,CentOS6,7则不需要
[root@rocky8 ~]# cp /var/www/html/rocky/8/os/x86_64/isolinux/{ldlinux.c32,libcom32.c32,libutil.c32} /var/lib/tftpboot/
#生成安装菜单文件
[root@rocky8 ~]# mkdir /var/lib/tftpboot/pxelinux.cfg
[root@rocky8 ~]# cp /var/www/html/rocky/8/os/x86_64/isolinux/isolinux.cfg /var/lib/tftpboot/pxelinux.cfg/default
#最终目录结构如下
[root@rocky8 ~]# tree /var/lib/tftpboot
/var/lib/tftpboot
├── centos6
│ ├── initrd.img
│ └── vmlinuz
├── centos7
│ ├── initrd.img
│ └── vmlinuz
├── ldlinux.c32
├── libcom32.c32
├── libutil.c32
├── menu.c32
├── pxelinux.0
├── pxelinux.cfg
│ └── default
└── rocky8
├── initrd.img
└── vmlinuz
4 directories, 12 files
1.7 准备启动菜单文件
[root@rocky8 ~]# vim /var/lib/tftpboot/pxelinux.cfg/default
default menu.c32
timeout 600
menu title CentOS Linux
label linux8
menu label Auto Install Rocky Linux ^8
kernel rocky8/vmlinuz
append initrd=rocky8/initrd.img ks=http://172.31.1.8/ks/rocky8.cfg
label linux7
menu label Auto Install CentOS Linux ^7
kernel centos7/vmlinuz
append initrd=centos7/initrd.img ks=http://172.31.1.8/ks/centos7.cfg
label linux6
menu label Auto Install CentOS Linux ^6
kernel centos6/vmlinuz
append initrd=centos6/initrd.img ks=http://172.31.1.8/ks/centos6.cfg
label manual
menu label ^Manual Install Rocky Linux 8.5
kernel rocky8/vmlinuz
append initrd=rocky8/initrd.img inst.repo=http://172.31.1.8/rocky/8/os/x86_64/
label rescue
menu label ^Rescue a CentOS Linux system 8
kernel rocky8/vmlinuz
append initrd=rocky8/initrd.img inst.repo=http://172.31.1.8/rocky/8/os/x86_64/ rescue
label local
menu default
menu label Boot from ^local drive
localboot 0xffff
menu end
:wq! #需要强制保存
1.8 测试客户端基于PXE实现自动安装
新准备一台主机,设置网卡引导,可看到看启动菜单,并实现自动安装
注意:VMware workstation 对于不同的CentOS 版本,生成的虚拟机的硬件并不兼容
自动安装Rocky 8
安装过程
自动安装CentOS 7
安装过程
自动安装CentOS 6
安装过程