shell,Linux,network

简单实现PXE自动部署系统

PXE简介

  PXE(preboot execute environment,预启动执行环境)是由Intel公司开发的技术,工作于Client/Server的网络模式,支持工作站通过网络从远端服务器下载映像,并由此支持通过网络启动操作系统.在启动过程中,终端要求服务器分配IP地址,再用TFTPtrivial file transfer protocol)或MTFTP(multicast trivial file transfer protocol)协议下载一个启动软件包到本机内存中执行,由这个启动软件包完成终端(客户端)基本软件设置,从而引导预先安装在服务器中的终端操作系统
  PXE可以引导多种操作系统,如: Windows,GNU/Linux系列系统等.简单来讲,配置好一台安装服务器,就可以用PXE进行批量安装系统,可以极大得提高安装部署效率,本文主要详细介绍linux系统的批量安装

PXE工作原理

<center>PXE工作流程</center>

  • Client向PXE Server上的DHCP发送IP地址请求消息,DHCP检测Client是否合法(主要是检 测Client的网卡MAC地址),如果合法则返回Client的IP地址,同时将启动文件pxelinux.0的位置信息一并传送给Client
  • Client向PXE Server上的TFTP发送获取pxelinux.0请求消息,TFTP接收到消息之后再向Client发送pxelinux.0大小信息,试探Client是否满意,当TFTP收到Client发回的同意大小信息之后,正式向Client发送pxelinux.0
  • Client执行接收到的pxelinux.0文件
  • Client向TFTP Server发送针对本机的配置信息文件(在TFTP 服务的pxelinux.cfg目录下),TFTP将配置文件发回Client继而Client根据配置文件执行后续操作
  • Client向TFTP发送Linux内核请求信息,TFTP接收到消息之后将内核文件发送给Client
  • Client向TFTP发送根文件请求信息,TFTP接收到消息之后返回Linux根文件系统
  • Client启动Linux内核
  • Client下载安装源文件,读取自动化安装脚本

安装相关软件包

  • 本次操作在一台已经安装好操作系统的CentOS 7上进行,该主机提供http, tftp, dhcp服务.将该主机IP配置为静态地址: 172.16.1.10
yum install -y httpd tftp-server dhcp syslinux
cat <<EOF | tee /etc/sysconfig/network-scripts/ifcfg-ens32
TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="static"
IPADDR="172.16.1.10"
NETMASK="255.255.255.0"
GATEWAY="172.16.1.1"
DEFROUTE="yes"
NAME="eth0"
DEVICE="eth0"
ONBOOT="yes"
EOF

配置

  • 此次PXE主要提供CentOS 6CentOS 7的自动化部署,yum源使用本地的
  • CentOS 6CentOS 7安装镜像挂载httpd网站目录下,httpd目录结构类似一些镜像站点创建
echo "- - -" > /sys/class/scsi_host/host2/scan
mkdir /var/www/html/centos/{6,7}/os/x86_64 -pv
mount /dev/sr1 /var/www/html/centos/6/os/x86_64/
systemctl enable --now httpd
systemctl disable --now firewalld
  • 准备kickstart file,ks file可以通过system-config-kickstart工具生成,需在对应版本目标版本的操作系统上生成目标文件,运行此工具需要运行X Window环境,过于麻烦,此处使用之前安装操作系统时所生成的anaconda-ks.cfg修改所得
mkdir /var/www/html/ksfile
cat <<EOF | tee /var/www/html/ksfile/ks6_mini.cfg
install
authconfig --enableshadow --passalgo=sha512
url --url="http://172.16.1.10/centos/6/os/x86_64/"
text
lang en_US.UTF-8
keyboard us
network --onboot yes --device eth0 --bootproto dhcp --noipv6 --activate
network --hostname s4lm0x.c0m
rootpw  --iscrypted $6$WorDDf69n1ZFy5vH$8GCBDgDn06EIz./khY1Er0SkSHrUqZYoDwBzQ6NPbZ1hLc1hxQ32SS8JqlOUgmIFkJusJjTmhMxqm4OYprcah.
firewall --disabled
selinux --disabled
reboot
timezone Asia/Shanghai
bootloader --location=mbr --driveorder=sda --append="crashkernel=auto rhgb quiet"
zerombr
clearpart --all --initlabel

part /boot --fstype=ext4 --size=400
part pv.008002 --size=20079

volgroup vg_node02 --pesize=4096 pv.008002
logvol swap --name=LogVol00 --vgname=vg_node02 --size=2048
logvol /home --fstype=ext4 --name=LogVol01 --vgname=vg_node02 --size=5120
logvol / --fstype=ext4 --name=LogVol02 --vgname=vg_node02 --size=10240

%packages
@core
%end
EOF

cat << EOF | tee /var/www/html/ksfile/ks7_mini.cfg
install
keyboard --vckeymap=us --xlayouts='us'
rootpw --iscrypted $6$Nvc.6H8MdduRUQvY$kkrIrxOYHnO.SwNj2bZd7LTOawFdEfqX24jCN8p/4Y1Eq/bMZ.uJpSOmS6870myWYjhQFfRCb.ax6V4UkPIuA1
url --url="http://172.16.1.10/centos/7/os/x86_64/"
lang en_US
user --name=s4lm0x --password=$6$.lQXu5NLYVGZRiKa$UbQwR4nQoGGLbVdSqV5XjTa7oT5gd3ODHLwpjvahb8idx0yQKollfY0iW5QA457c4aQnb.pRZTdUZS85qAfIa0 --iscrypted --gecos="s4lm0x"
auth  --useshadow  --passalgo=sha512
text
firstboot --enable
selinux --disabled
skipx
services --disabled="chronyd"
ignoredisk --only-use=sda
firewall --disabled
network  --bootproto=dhcp --device=ens33 --onboot=on --ipv6=auto --activate
network  --hostname=s4lm0x.com
timezone Asia/Shanghai --nontp
bootloader --append="crashkernel=auto" --location=mbr --boot-drive=sda
zerombr
clearpart --all --initlabel
reboot
part biosboot --fstype="biosboot" --ondisk=sda --size=2
part pv.313 --fstype="lvmpv" --ondisk=sda --size=12296
part /boot --fstype="xfs" --ondisk=sda --size=500
volgroup centos_s4lm0x --pesize=4096 pv.313
logvol /  --fstype="xfs" --size=10240 --name=root --vgname=centos_s4lm0x
logvol swap  --fstype="swap" --size=2048 --name=swap --vgname=centos_s4lm0x

%post

%end

%packages
@^minimal
@core
kexec-tools

%end
EOF
  • dhcp所分配的网断需能与本机正常通信,以便能访问tftp-server获取到系统安装所需的文件
cat <<EOF | tee /etc/dhcp/dhcpd.conf
option domain-name "s4lm0x.com";
option domain-name-servers 114.114.114.114, 8.8.8.8;

default-lease-time 86400;
max-lease-time 72000;
log-facility local7;

subnet 172.16.1.0 netmask 255.255.255.0 {
  range 172.16.1.100 172.16.1.254;
  option routers 172.16.1.1;
  next-server 172.16.1.10;
  filename "pxelinux.0";
}
EOF

systemctl start dhcpd
systemctl enable dhcpd
  • tftp-server主要提供启动文件,kernelinitrd.img文件复制安装镜像中的即可,启动引导文件pxelinux.0机启动菜单使用由syslinux包所提供的
mkdir /var/lib/tftpboot/kernel{6,7}
cp /usr/share/syslinux/pxelinux.0 /var/lib/tftpboot
cp /usr/share/syslinux/menu.c32 /var/lib/tftpboot
cp /var/www/html/centos/6/os/x86_64/isolinux/vmlinuz /var/lib/tftpboot/kernel6/
cp /var/www/html/centos/6/os/x86_64/isolinux/initrd.img /var/lib/tftpboot/kernel6/
cp /var/www/html/centos/7/os/x86_64/isolinux/initrd.img /var/lib/tftpboot/kernel7/
cp /var/www/html/centos/7/os/x86_64/isolinux/vmlinuz /var/lib/tftpboot/kernel7/

mkdir /var/lib/tftpboot/pxelinux.cfg/
cat <<EOF | tee /var/lib/tftpboot/pxelinux.cfg/default
default menu.c32
timeout 50
menu title Auto Install CentOS
label CentOS 6
  menu label Install Mini CentOS ^6
  kernel kernel6/vmlinuz
  append initrd=kernel6/initrd.img ks=http://172.16.1.10/ksfile/ks6_mini.cfg
label CentOS 7
  menu label Install Mini CentOS ^7
  kernel kernel7/vmlinuz
  append initrd=kernel7/initrd.img ks=http://172.16.1.10/ksfile/ks7_mini.cfg
label local
  menu default
  menu label Boot from ^local drive
  localboot 0xffff
menu end
EOF

systemctl enable tftp
systemctl start tftp

如上,启动菜单的默认的选项为本地启动,如果明确的知道就是开机后通过网络引导就是要部署操作系统的,且能明确要部署的操作系统版本,则可将/var/lib/tftpboot/pxelinux.cfg/default文件中的menu default配置选项配置到对应的label

部署系统

  • 至此,简单PXE服务器已经部署完成,目标系统开机后选择网络引导,即可使用本机所提供的服务自动部署操作系统,下面将会常见一台虚拟机进行系统部署测试,虚拟机常见过程不再赘述,开机之后通过网卡引导启动将看到如下界面

<center>
</center>

  • 接下来只用等着系统自动部署完成,虚拟机自动重启即可,操作系统按安装完成后,所有用户的密码为manunkind
微信扫一扫,向我赞赏

微信扫一扫,向我赞赏

微信扫一扫,向我赞赏

支付宝扫一扫,向我赞赏

回复

This is just a placeholder img.