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+Kickstart 自动安装CentOS系统

PXE+Kickstart无人值守自动安装系统

解决PXE安装Linux系统时kickstart自动识别硬盘问题

RedHat7搭建无人值守自动安装Linux操作系统(PXE+Kickstart)

KickStart+PXE实现自动化部署安装

pxe+kickstart自动安装系统