PXE (preboot execute environment,预启动执行环境) 是由 Intel 公司设计的协议,它可以使计算机通过网络启动。原理简图如下:
首先,dhcpd服务为待装机的主机分配IP地址。
在主机得到IP地址后,会从tftp服务器上请求得到pxelinux.0,default配置文件以及vmlinux initrd。
然后,当主机拥有这些文件后,会向vsftp服务器请求得到系统镜像资源,从而开启装机。
注意,在本图中,ks.cfg文件作为装机的参数配置文件,是由pykickstar制作的。
我们先来看看制作ks.cfg的流程:
(1)yum源配置:
[development] //名字必须是这个
name=centos7u3
baseurl=file:///mnt/centos7u3
enabled=1
gpgcheck=0
(2)开启kickstart进程:
# yum install system-config-kickstart -y
# system-config-kickstart
(3)按照引导操作:
图一:选择语言,时区
图二:设置ftp服务器,这里FTP目录虽然绝对路径是/var/ftp/centos7u3,但是填写只需要centos7u3
图三:
图四:这里的重点是布局,点击添加,相当于手动装机选择挂在点,并配置大小的操作。
后续步骤不再赘述。
(4)PXE配置:
首先我们需要配置服务:dhcp,tftp,vsftp
安装:
# yum install dhcp tftp-server tftp vsftpd lftp syslinux xinetd -y
配置:
1.DHCP:
DHCP:端口67 68
# cp /usr/share/doc/dhcp-4.2.5/dhcpd.conf.example /etc/dhcp/dhcpd.conf
# vim /etc/dhcp/dhcpd.conf
subnet 192.168.10.0 netmask 255.255.255.0 { //网段和子网掩码
range 192.168.10.201 192.168.10.210; //dhcp池分配IP地址范围
next-server 192.168.10.12; //配置PXE主机的IP
filename "pxelinux.0";
}
2.TFTP:
DHCP:端口69
# rpm -ql tftp-server
/etc/xinetd.d/tftp
/var/lib/tftpboot
# vim /etc/xinetd.d/tftp
disable = no
# cp /usr/share/syslinux/pxelinux.0 /var/lib/tftpboot/ //配置上述pxelinux.0文件
# mkdir /var/lib/tftpboot/pxelinux.cfg
# mount /dev/sr0 /mnt
# cp /mnt/isolinux/isolinux.cfg /var/lib/tftpboot/pxelinux.cfg/default //配置上述default配置文件
# vim pxelinux.cfg/default
1 default linux //请修改为linux
2 timeout 60 //建议修改为60
61 label linux
62 menu label ^Install CentOS Linux 7
63 kernel vmlinuz
64 append initrd=initrd.img ks=ftp://192.168.2.241/ks.cfg //请将制作好的ks.cfg文件放置到配置PXE的主机的/var/ftp下面
# cp /mnt/isolinux/* /var/lib/tftpboot/
3. VSFTPD:
# cd /var/ftp
# mkdir centos7u3
将镜像挂载到centos7u3目录
启动服务:
# systemctl start dhcpd
# systemctl start xinetd
# systemctl start vsftpd
关闭防火墙和selinux
上述过程可使用shell脚本实现自动化装机:
#!/bin/bash
# PXE装机脚本
# ========配置yum源============
[ -d /mnt/centos7u3 ] || mkdir /mnt/centos7u3/
rm -rf /etc/yum.repos.d/*
cat > /etc/yum.repos.d/local.repo <<ok
[centos7u3]
name=centos7u3
baseurl=file:///mnt/centos7u3
gpgcheck=0
enabled=1
ok
mount /dev/sr0 /mnt/centos7u3/ &> /dev/null
yum clean all &> /dev/null
# ========安装服务===================
yum install dhcp tftp-server tftp vsftpd lftp syslinux xinetd expect -y &> /dev/null
# ========配置DHCP===================
[ -f /etc/dhcp/dhcpd.conf ] && rm -rf /etc/dhcp/dhcpd.conf
cp /usr/share/doc/dhcp-4.2.5/dhcpd.conf.example /etc/dhcp/dhcpd.conf
# 获取本主机的IP地址
HOST_IP=`ifconfig ens33 | awk '/\<inet\>/{print $2}'`
# 获取本主机的网络位
NETNO=`echo $HOST_IP|awk -F"." '{print $3}'`
read -p "请输入起始主机号" STARTNO
read -p "请输入终止主机号" ENDNO
sed -i '27c\subnet 192.168.'$NETNO'.0 netmask 255.255.255.0 {' /etc/dhcp/dhcpd.conf
sed -i '27a\\trange 192.168.'$NETNO'.'$STARTNO' 192.168.'$NETNO'.'$ENDNO';\n\tnext-server '$HOST_IP';\n\tfilename "pxelinux.0";' /etc/dhcp/dhcpd.conf
# ========配置TFTP===================
sed -i '/\<disable\>/s@\<yes\>@no@' /etc/xinetd.d/tftp
cp /usr/share/syslinux/pxelinux.0 /var/lib/tftpboot/
[ -d /var/lib/tftpboot/pxelinux.cfg ]|| mkdir /var/lib/tftpboot/pxelinux.cfg
umount /dev/sr0 &> /dev/null
mount /dev/sr0 /mnt &> /dev/null
cp /mnt/isolinux/isolinux.cfg /var/lib/tftpboot/pxelinux.cfg/default
sed -i '1c\default linux' /var/lib/tftpboot/pxelinux.cfg/default
sed -i '2c\timeout 60' /var/lib/tftpboot/pxelinux.cfg/default
sed -i '64c\ append initrd=initrd.img ks=ftp://'$HOST_IP'/ks.cfg' /var/lib/tftpboot/pxelinux.cfg/default
cp /mnt/isolinux/* /var/lib/tftpboot/
# =========配置VSFTPD=================
umount /dev/sr0 &> /dev/null
[ -d /var/ftp/centos7u3 ] || mkdir /var/ftp/centos7u3
mount /dev/sr0 /var/ftp/centos7u3 &> /dev/null
# =========写入ks.cfg文件=============
cat > /var/ftp/ks.cfg <<ok
#platform=x86, AMD64, 或 Intel EM64T
#version=DEVEL
# Install OS instead of upgrade
install
# Keyboard layouts
keyboard 'us'
# Root password
rootpw --iscrypted $1$AOxEw/r.$MQjjaq9eRYJumpEj9Me.01
# Use network installation
url --url="ftp://$HOST_IP/centos7u3"
# System language
lang zh_CN
# Firewall configuration
firewall --disabled
# System authorization information
auth --useshadow --passalgo=sha512
# Use text mode install
text
# SELinux configuration
selinux --disabled
# Do not configure the X Window System
skipx
# Reboot after installation
reboot
# System timezone
timezone Asia/Shanghai
# System bootloader configuration
bootloader --location=mbr
# Clear the Master Boot Record
zerombr
# Partition clearing information
clearpart --all --initlabel
# Disk partitioning information
part swap --fstype="swap" --size=1024
part / --fstype="xfs" --size=18888
part /boot --fstype="xfs" --size=250
%packages
@base
-abrt-addon-ccpp
-abrt-addon-python
-abrt-cli
-abrt-console-notification
-bash-completion
-blktrace
-bridge-utils
-bzip2
-chrony
-cryptsetup
-dmraid
-dosfstools
-ethtool
-fprintd-pam
-gnupg2
-hunspell
-hunspell-en
-kpatch
-ledmon
-libaio
-libreport-plugin-mailx
-libstoragemgmt
-lvm2
-man-pages
-man-pages-overrides
-mdadm
-mlocate
-mtr
-nano
-ntpdate
-pinfo
-plymouth
-pm-utils
-rdate
-rfkill
-rng-tools
-rsync
-scl-utils
-setuptool
-smartmontools
-sos
-sssd-client
-strace
-sysstat
-systemtap-runtime
-tcpdump
-tcsh
-teamd
-time
-unzip
-usbutils
-vim-enhanced
-virt-what
-wget
-which
-words
-xfsdump
-xz
-yum-langpacks
-yum-utils
-zip
%end
ok
chmod +x /var/ftp/ks.cfg
# =========启动服务===================
systemctl start dhcpd &> /dev/null
systemctl start xinetd &> /dev/null
systemctl start vsftpd &> /dev/null
# =========关闭firewalld和selinux======
systemctl stop firewalld &> /dev/null
systemctl disable firewalld &> /dev/null
setenforce 0 &> /dev/null
sed -i '7c\SELINUX=disabled' /etc/selinux/config