PXE + Kickstart 操作系统自动安装
Posted 王万林 Ben
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PXE + Kickstart 操作系统自动安装相关的知识,希望对你有一定的参考价值。
PXE + Kickstart 操作系统自动安装
流程
实验
项目 | 说明 |
---|---|
Vmware Workstation | 虚拟机平台 |
Linux镜像 | CentOS 7.9 |
DHCP | 给虚拟机分配IP地址 |
TFTP | 存放PXE启动的相关文件 |
HTTP | 以HTTP的方式,提供挂载后的CentOS 7.9 ISO文件夹与kickstart文件 |
kickstart文件 | 定义操作系统安装详情 |
本次实验将DHCP,TFTP,HTTP三个服务安装在同一台服务器上。
环境准备
在vmware workstation中编辑虚拟网卡,如下图:将其DHCP功能去掉,PXE客户端启动后将不从该网卡的DHCP获取,而从我们搭建的DHCP服务器获取。
服务器准备
在vmware workstation中,使用NAT方式,手动安装一台CentOS 7.9,关闭firewalld与selinux,
# systemctl stop firewalld
# systemctl disable firewalld
# setenforce 0
# sed -i 's#=Enforce#=Disable#g' /etc/selinux/config
#
其余过程省略。
DHCP
# yum install -y dhcp
# cp /usr/share/doc/dhcp-4.2.5/dhcpd.conf.sample /etc/dhcp/dhcpd.conf
# cat >> /etc/dhcp/dhcpd.conf << EOF
subnet 172.16.200.0 netmask 255.255.255.0
# range dynamic-bootp 172.16.200.11 172.16.200.20;
# DHCP分配的IP范围
range 172.16.200.11 172.16.200.20;
# DNS地址
option domain-name-servers 8.8.8.8;
# 路由器
option routers 172.16.200.2;
# 广播地址
option broadcast-address 172.16.200.255;
default-lease-time 600;
max-lease-time 7200;
# tftp服务器
next-server 172.16.200.128;
filename "pxelinux.0";
EOF
# systemctl start dhcpd
# systemctl enable dhcpd
#
httpd
# yum install -y httpd
# mv /etc/httpd/conf.d/welcome.conf /etc/httpd/conf.d/welcome.conf_bak20211127 #不显示默认欢迎页,直接显示目录结构
# mkdir -p /var/www/html/iso/CentOS-7.9 # 用于挂载ISO文件
# mount -o loop /root/CentOS-7-x86_64-Everything-2009.iso /var/www/html/iso/CentOS-7.9 #挂载
# systemctl start httpd
# systemctl enable httpd
# mkdir /var/www/html/ks #创建用于存放ks的文件夹
# cat >> /var/www/html/ks/anaconda-ks.cfg << EOF
#version=DEVEL
# System authorization information
auth --enableshadow --passalgo=sha512
# Use CDROM installation media
# repo
#repo --name=EPEL --baseurl=http://download.fedoraproject.org/pub/epel/7/x86_64
repo --name=EPEL --baseurl=https://mirrors.tuna.tsinghua.edu.cn/epel/7/x86_64
#cdrom
url --url="http://172.16.200.128/iso/CentOS-7.9"
# Use graphical install
graphical
# Run the Setup Agent on first boot
firstboot --enable
# Keyboard layouts
keyboard --vckeymap=us --xlayouts='us'
# System language
lang en_US.UTF-8
# Network information
network --bootproto=dhcp --device=eth0 --onboot=on --ipv6=auto --no-activate
network --hostname=localhost.localdomain
# Reboot after installation
reboot
# Root password
rootpw --iscrypted $6$oXrbP8nt5o2eq7Q8$jqOBtb..rAusqF/b0Doy2JKugnF6gLF6aVLMiMARu8ut0MomyTnyVPaysOkZHqeMhK6WIJJC4DTh/oszv5Tbf.
# System services
services --disabled="chronyd"
# System timezone
timezone Asia/Shanghai --isUtc --nontp
# System bootloader configuration
bootloader --location=mbr --boot-drive=sda
# Partition clearing information
clearpart --none --initlabel
# Disk partitioning information
part pv.01 --fstype="lvmpv" --ondisk=sda --size=321816
part /boot --fstype="xfs" --ondisk=sda --size=488
volgroup centos --pesize=4096 pv.01
logvol swap --fstype="swap" --size=131072 --name=swap --vgname=centos
logvol /var --fstype="xfs" --size=95367 --name=var --vgname=centos
logvol / --fstype="xfs" --size=95367 --name=root --vgname=centos
#part pv.02 --fstype="lvmpv" --ondisk=nvme0n1
#volgroup ssd --pesize=4096 pv.02
#logvol /tmp --fstype="xfs" --size=102400 --name=tmp --vgname=ssd
#logvol /lhome --fstype="xfs" --grow --size=1 --name=root --vgname=ssd
%packages
@^minimal
@core
@development
net-tools
wget
#@Xfce
%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
%post --nochroot --log=/mnt/sysimage/root/ks-post.log
which wget >> /mnt/sysimage/root/which_wget.log
which curl >> /mnt/sysimage/root/which_curl.log
# modify network
wget http://172.16.200.128/scripts/nic_settings.sh -P /mnt/sysimage/root/
wget http://172.16.200.128/scripts/hw_addr2ip_netmask_mappings.txt -P /mnt/sysimage/root/
#curl -o /root/nic_settings.sh http://172.16.200.128/scripts/nic_settings.sh
#curl -o /root/hw_addr2ip_netmask_mappings.txt http://172.16.200.128/scripts/hw_addr2ip_netmask_mappings.txt
echo "cd /root" >> /mnt/sysimage/etc/rc.local
echo "bash ./nic_settings.sh &" >> /mnt/sysimage/etc/rc.local
chmod +x /mnt/sysimage/etc/rc.d/rc.local
%end
EOF
#
tftp
# yum install -y tftp tftp-server xinetd
# cat > /etc/xinetd.d/tftp << EOF
service tftp
socket_type = dgram
protocol = udp
wait = yes
user = root
server = /usr/sbin/in.tftpd
# 表示服务器默认的目录是/var/lib/tftpboot
server_args = -s /var/lib/tftpboot
disable = no
per_source = 11
cps = 100 2
flags = IPv4
EOF
# systemctl start xinetd
# systemctl enable xinetd
#
准备需要使用的文件
# yum install syslinux
# cp /usr/share/syslinux/pxelinux.0 /var/lib/tftpboot/
# cp /var/www/html/iso/CentOS-7.9/images/pxeboot/initrd.img /var/lib/tftpboot/
# cp /var/www/html/iso/CentOS-7.9/images/pxeboot/vmlinuz /var/lib/tftpboot/
# cp /var/www/html/iso/CentOS-7.9/isolinux/isolinux.cfg /var/lib/tftpboot/pxelinux.cfg/default
修改/var/lib/tftpboot/pxelinux.cfg/default文件
# vi /var/lib/tftpboot/pxelinux.cfg/default
default linux
timeout 60
label linux
menu label ^Install CentOS 7
kernel vmlinuz
append initrd=initrd.img inst.repo=http://172.16.200.128/iso/CentOS-7.9 inst.ks=http://172.16.200.128/ks/anaconda-ks.cfg net.ifnames=0 biosdevname=0 ksdevice=eth0
#
其中,ksdevice=eth0,将网卡名字命名为eth0。
自动化安装
在vmware workstation中创建另一台虚拟机,网络同样使用NAT,磁盘400GB,并启动。随后开始自动化安装过程:
PXE+kickstart自动安装录屏
花絮
10:44 11/28/2021
https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/installation_guide/chap-anaconda-boot-options#tabl-boot-options-network-formats
vmlinuz initrd=initrd.img inst.repo=http://172.16.200.128/iso/CentOS-7.9 inst.ks=http://172.16.200.128/ks/anaconda-ks.cfg net.ifnames=0 biosdevname=0 ksdevice=eth0 ip=172.16.200.21:172.16.200.2:255.255.255.0:host200021:eth0:none
work的。
命令行非交互式设置IP:
# cat > /var/www/html/scripts/nic_settings.sh << EOF
#!/bin/bash -f
# Author: wanlinwang
# Date: 11/28 2021
# Desciption: for CentOS 7.9 initialization.
sleep 5
hw_addr=`ip -br link| awk 'if($1=="eth0") print $3'`
echo $hw_addr >> /root/nic_settings.log
connection_name=`nmcli -t -f NAME,DEVICE con show | awk -F: 'if($NF=="eth0")print $1'`
echo $connection_name >> /root/nic_settings.log
# Get ip/netmask info by hw_addr from mappings file.
ip_netmask=`grep -i $hw_addr ./hw_addr2ip_netmask_mappings.txt| awk 'print $2'`
echo $ip_netmask >> /root/nic_settings.log
# Example: nmcli con mod 'System eth0' ipv4.method manual ipv4.addr '172.16.200.17/24'
nmcli con mod "$connection_name" ipv4.method manual ipv4.addr $ip_netmask
# Hostname settings according to IP addr.
hostname=`echo $ip_netmask | awk -F/ 'print $1' | awk -F. 'printf "xj%03i%03i", $3, $4'`
hostnamectl set-hostname $hostname
# restart network
systemctl restart network
EOF
#
# cat > /var/www/html/scripts/hw_addr2ip_netmask_mappings.txt << EOF
#00:0C:29:B6:FB:6F 172.16.200.21/24
00:0C:29:B6:FB:6F 172.16.200.21/24
EOF
参考资料
https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/installation_guide/sect-kickstart-syntax#sect-kickstart-postinstall //postinstall资料,postinstall是在chroot环境下的,很多命令不生效。可以指明nochroot。
https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/installation_guide/sect-kickstart-syntax#sect-kickstart-preinstall //preinstall资料,可以在这个环节,放入检测磁盘个数的脚本,然后生成kickstart片段,然后include进来。
以上是关于PXE + Kickstart 操作系统自动安装的主要内容,如果未能解决你的问题,请参考以下文章
解决PXE安装Linux系统时kickstart自动识别硬盘问题