PXE(preboot execute environment),预启动执行环境,简单说是一种系统引导启动的方式。当计算机引导时,BIOS会自动查询引导方式,在没有安装过操作系统的计算机上,就会把 PXE Client 调入内存中执行,尝试PXE引导,然后由 PXE Client 将放置在远端的文件通过网络下载到本地运行。因此有人也称之为远程引导技术,非常适用于无人值守自动安装需求;当然在已安装过操作系统的计算机上,也可以人为设定为PXE引导重新安装。
PXE引导过程:被安装的计算机网卡发出DHCP请求,从PXE服务端获取动态IP地址(同时还提供了启动文件的TFTP路径);计算机通过TFTP路径,获取到引导文件、内核和根文件等文件,进行预启动;然后通过网络服务(一般是httpd服务或者vsftp),获取系统镜像和安装配置文件进行自动安装,这里的安装配置文件使用ks文件。
本次所采用PXEserver和PXEclient均为centos7.6系统。
由PXE引导过程可知,在PXE服务端,需要安装DHCP服务、TFTP服务、HTTP服务,还要准备好相应的各种引导文件、安装文件、配置文件。
一、安装配置DHCP服务。
#yum install dhcp
DHCP的配置文件为:/etc/dhcp/dhcpd.conf
DHCPDARGS=macbr0; #指定dhcp服务端口
default-lease-time 600; #默认dhcp租约
max-lease-time 7200; #最大dhcp租期
subnet 192.168.200.0 netmask 255.255.255.0 { #dhcp子网
range 192.168.200.20 192.168.200.200; #dhcp地址池范围
option routers 192.168.200.1; #dhcp网关
next-server 192.168.200.1; #宣告TFTP服务器地址
filename="pxelinux.0"; #宣告PXE引导文件
}
#systemctl start dhcpd
此时,将PXE客户端连接到网络中,应该可以动态获取到192.168.200.0/24网段的IP地址。
二、安装配置TFTP服务。
#yum install xinetd tftp-server #xinetd是守护进程
/etc/xinetd.d/tftp #tftp配置文件路径
/var/lib/tftpboot #默认的tftp服务目录
vi /etc/xinetd.d/tftp
# default: off
# description: The tftp server serves files using the trivial file transfer
# protocol. The tftp protocol is often used to boot diskless
# workstations, download configuration files to network-aware printers,
# and to start the installation process for some operating systems.
service tftp
{
socket_type = dgram
protocol = udp
wait = yes
user = root
server = /usr/sbin/in.tftpd
server_args = -s /var/lib/tftpboot #tftp服务目录
disable = no #no表示TFTP处于启用状态
per_source = 11
cps = 100 2
flags = IPv4
}
systemctl start tftp #启动服务,注意需要放开防火墙端口
接下来,准备bootstarp,内核引导文件等文件。
使用 syslinux 提供的bootstarp
#yum -y install syslinux
pxelinux.0 文件存储目录:/usr/share/syslinux
复制pxelinux.0到 /var/lib/tftpboot 目录:
cp /usr/share/syslinux/pxelinux.0 /var/lib/tftpboot/
挂载光盘,部分文件一定是在挂载后才能正常用:
mount /dev/cdrom /media/
配置内核引导文件,并置于pxelinux.cfg文件夹下:
mkdir /var/lib/tftpboot/pxelinux.cfg
cp /media/isolinux/isolinux.cfg /var/lib/tftpboot/pxelinux.cfg/default
配置linux内核引导文件:vi /var/lib/tftpboot/pxelinux.cfg/default
default vesamenu.c32 # 默认启动界面,该文件需要拷贝到tftp存储目录中
timeout 300 # 倒计时 300就是30 秒,改数字为秒数的10倍
display boot.msg #将额外信息写入到boot.msg文件中,目录中要有该文件
menu background splash.png #背景图片
menu title CentOS 7 #菜单题头
label linux #选项标签
menu label ^Install Education #标签名称
menu default #默认项目,超时后自动安装项
kernel vmlinuz # 内核 vmlinuz,该文件需要拷贝到tftp存储目录中
append initrd=initrd.img ks=http://192.168.200.1/ks.cfg ksdevice=link net.ifnames=0 quiet
#宣告核心文件、ks文件,设置启动项
menu end
拷贝引导文件中提到的文件到相应目录:
cp /media/images/pxeboot/{initrd.img,vmlinuz} /var/lib/tftpboot/
cp /media/isolinux/{boot.msg,vesamenu.c32,splash.jpg} /var/lib/tftpboot/
三、安装配置HTTP服务。
#yum -y install httpd
httpd的配置文件目录为:/etc/httpd/conf/httpd.conf httpd的服务目录等项
在此设置。
拷贝模板到httpd服务目录,并重命名为ks.cfg
cp /root/anaconda-ks.cfg /var/www/html/ks.cfg
分配权限,为pxe client引导安装使用
chmod +r /var/www/html/ks.cfg
拷贝安装系统,一定是拷贝镜像文件挂载后的目录
cp /media/* /var/www/html/install/
四、配置ks文件,设置安装选项
#platform=x86, AMD64, 或 Intel EM64T
#version=DEVEL
# Install OS instead of upgrade
install #安装还是更新,这里是安装
# Keyboard layouts
keyboard 'us' #设定键盘模式,美式
# Root password #root密码设定,这里采用加密后的密码
rootpw --iscrypted n7WGn3Y3$MZDNdjv2YSaCaDKb23gCm1
# Use network installation #宣告安装镜像目录
url --url="http://192.168.200.1:8080/install"
# System language #系统语言,英文
lang en_US
# System authorization information #密码认证模式
auth --useshadow --passalgo=sha512
# Use text mode install #图形化安装或者文本安装,文本安装
text
# SELinux configuration #selinux设置,禁用
selinux --disabled
# Do not configure the X Window System #是否安装图形界面,跳过
skipx
# Firewall configuration #防火墙配置,禁用
firewall --disabled
# Network information #网络服务选项
network --bootproto=dhcp --device=link --noipv6
# Reboot after installation #安装后是否重启内核,重启
reboot
# System timezone #设置时区
timezone Asia/Shanghai --isUtc
# System bootloader configuration #系统引导设置
bootloader --append=" crashkernel=auto" --location=mbr
# Partition clearing information #清除分区信息
clearpart --all --initlabel
# Disk partitioning information #硬盘分区配置
part biosboot --fstype="biosboot" --size=1
part /boot --fstype="ext4" --size=1024
part pv.157 --fstype="lvmpv" --grow --size=1
volgroup centos pv.157
logvol swap --fstype="swap" --size=4096 --name=swap --vgname=centos
logvol / --fstype="ext4" --size=204800 --name=root --vgname=centos
logvol /cores --fstype="ext4" --grow --size=1 --name=cores --vgname=centos
%packages #选择需要安装的软件包,默认包含core、base
%end
%post #后执行脚本,设置安装后的操作,接下来会用到
%end
如果你打算生产一种商品,只为计算机安装一个基本操作系统是远远不够的。一般都是要拷贝一定数量的资源文件、安装一些特定的服务,这就用到%post后执行脚本。
%post后执行脚本的使用基本上和进入操作系统后执行脚本一样,拷贝文件和安装服务;但是仍然会有些进程没有启动,导致你的%post后执行脚本不成功。
在这里,我给需要的同行提个建议:我们只在%post脚本中编辑启动项文件/etc/rc.local,在启动项中调用一个shell脚本来执行拷贝文件和安装服务、设置服务、启动服务的工作,这样就和真的在操作系统中操作一样了,同时还实现了自动化生产。最后把启动项改为需要的正常启动的配置,若不然就成了循环生产了。
%post示例如下:
%post
yum -y install expect
/usr/bin/expect <<-EOF
set timeout -1
spawn scp -r [email protected]:/home/123.sh /
#123.sh就是我们这次设定的shell脚本
expect {
"yes/no" {send "yes\r";exp_continue}
"password" {send "123456\r"}
}
expect "*#"
EOF
chmod u+x /etc/rc.d/rc.local
echo "#!/bin/bash
touch /var/lock/subsys/local
cd
chmod u+x /123.sh
nohup /123.sh > /root/nohup &" > /etc/rc.local
reboot
%end