对于单台服务器上的os安装,我们可以手动进行。那若是一个集群中的大量节点服务器需要安装os,手动安装显然是费时费力。作为系统运维工程师,自动化运维是我们必不可少的技能。下来就跟随作者去探索下PXE是如何通过网络来实现批量系统安装的吧。
PXE简介
PXE(preboot execute environment,预启动执行环境)是由Intel公司开发的最新技术,工作于Client/Server的网络模式,支持工作站通过网络从远端服务器下载镜像,并由此支持通过网络启动操作系统,在启动过程中,终端要求服务器分配IP地址,再用TFTP(trivial file transfer protocol)或MTFTP(multicast trivial file transfer protocol)协议下载一个启动软件包到本机内存中执行,由这个启动软件包完成终端(客户端)基本软件设置,从而引导预先安装在服务器中的终端操作系统。PXE可以引导多种操作系统。严格来说,PXE 并不是一种安装方式,而是一种引导方式。进行PXE安装的必要条件是在要安装的计算机中必须包含一个PXE支持的网卡(NIC),即网卡中必须要有 PXE Client。PXE协议可以使计算机通过网络启动。此协议分为 Client端和 Server 端,而PXE Client则在网卡的 ROM 中。当计算机引导时,BIOS 把 PXE Client调入内存中执行,然后由PXE Client将放置在远端的文件通过网络下载到本地运行。运行 PXE 协议需要设置 DHCP 服务器和 TFTP 服务器。DHCP 服务器会给 PXE Client(将要安装系统的主机)分配一个 IP 地址,由于是给 PXE Client 分配 IP 地址,所以在配置 DHCP 服务器时需要增加相应的 PXE 设置。此外,在 PXE Client 的 ROM 中,已经存在了 TFTP Client,那么它就可以通过 TFTP 协议到 TFTP Server 上下载所需的文件了。
PXE的工作流程
PXE Client 从自己的PXE网卡启动,向本网络中的DHCP服务器索取IP;
DHCP 服务器返回分配给客户机的IP*以及PXE文件的放置位置(该文件一般是放在一台TFTP服务器上) ;
PXE Client 向本网络中的TFTP服务器索取pxelinux.0 文件;
PXE Client 取得pxelinux.0 文件后执行该文件;vmlinuz是可引导的、压缩的内核,initrd.img文件是设备(/dev/ram0)的映像文件;
根据pxelinux.0 的执行结果,通过TFTP服务器加载内核和文件系统 ;
进入安装画面, 此时可以通过选择HTTP、FTP、NFS 方式之一进行安装;
达成PXE必须要有两个环节
其一客户端的网卡必须要支持PXE用户端功能,并且开机时选择从网卡启动,这样系统才会通过网卡进入PXE客户端的程序;
其二PXE服务器必须要提供至少含有DHCP以及TFTP的服务,其中:
DHCP服务必须要能够提供客户端的网络参数,还要告知客户端TFTP所在的位置;
TFTP则提供客户端的boot loader及kernel file下载路径。
还要加上NFS/FTP/HTTP(选择一样即可)等提供安装文件(安装镜像的解压文件),才算是比较完整的PXE服务器。一般TFTP和DHCP服务都由同一台服务器提供,且大多数时候还提供NFS/FTP/HTTP服务,所以PXE服务器一般是提供3合一的服务。
什么是Kickstart
Kickstart是一种无人值守的安装方式。它的工作原理是在安装过程中记录典型的需要人工干预填写的各种参数,并生成一个名为ks.cfg的文件。如果在安装过程中(不只局限于生成Kickstart安装文件的机器)出现要填写参数的情况,安装程序首先会去查找Kickstart生成的文件,如果找到合适的参数,就采用所找到的参数;如果没有找到合适的参数,便需要安装者手工干预了。所以,如果Kickstart文件涵盖了安装过程中可能出现的所有需要填写的参数,那么安装者完全可以只告诉安装程序从何处取ks.cfg文件,然后就去忙自己的事情。等安装完毕,安装程序会根据ks.cfg中的设置重启系统,并结束安装。
满足Kickstart安装系统的需求
网卡必须支持PXE引导;
客户端需要有与Kickstart通信的IP地址,这里一般都是通过DHCP自动分配IP地址来实现;
提供引导所需的文件,内核文件,内核镜像文件等,此时一般通过tftp-server等实现;
kickstart文件,它主要实现自动化安装的过程,比如配置主机名、添加用户等安装系统后的相关操作;
提供安装源,一般就是NFS/ftp/httpd等。
环境介绍及初绍化
环境介绍
操作系统:CentOS Linux release 7.4.1708 (Core)。
网卡地址:192.168.221.129。
光盘镜像:CentOS-7-x86_64-DVD-1708.iso。
安装工具:kickstart + dhcp + tftp-server + tftp + httpd。
准备工作
# cat /etc/redhat-release
CentOS Linux release 7.4.1708 (Core)
# sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
# setenforce 0
# getenforce
Permissive 或者 Disabled
# systemctl stop firewalld.service
# systemctl disable firewalld.service
# yum install -y httpd dhcp tftp-server tftp syslinux
配置
修改dhcp配置
# vim /etc/dhcp/dhcpd.conf
option domain-name "pxe.com";
option domain-name-servers ns1.pxe.com, pxe.com;
default-lease-time 600;
max-lease-time 7200;
log-facility local7;
subnet 192.168.221.0 netmask 255.255.255.0 { //服务端IP网段及掩码
option routers 192.168.221.2; //网关
option subnet-mask 255.255.255.0; //掩码
option domain-name-servers 192.168.221.129;
range dynamic-bootp 192.168.221.130 192.168.10.230; //dhcp分发的地址范围
default-lease-time 21600; //设置默认的IP租用期限
max-lease-time 43200; //设置最大的IP租用期限
next-server 192.168.221.129; //TFTP服务器地址
filename "pxelinux.0"; //指定引导文件位置,这里是TFTP根目录下的pxelinux.0
}
# systemctl start dhcpd.service
# systemctl enable dhcpd.service
# netstat -tunpl |grep dhcpd
Httpd服务配置
# mkdir -pv /var/www/html/centos7
# mount --bind /media/cdrom/ /var/www/html/centos7/
# systemctl start httpd.service
# systemctl enable httpd.service
# netstat -tunpl |grep httpd
tftp服务配置
# vim /etc/xinetd.d/tftp
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 //认disable是yes的,把它改为no即可
per_source = 11
cps = 100 2
flags = IPv4
}
# systemctl start tftp.socket
# systemctl enable tftp.socket
# systemctl start tftp.service
# systemctl enable tftp.service
# netstat -tunpl |grep 69
添加引导文件
# cp /usr/share/syslinux/pxelinux.0 /var/lib/tftpboot/
# cp /media/cdrom/images/pxeboot/{vmlinuz,initrd.img} /var/lib/tftpboot/
# cp /media/cdrom/isolinux/{vesamenu.c32,boot.msg,splash.png} /var/lib/tftpboot/
# cp /usr/share/syslinux/{chain.c32,mboot.c32,menu.c32,memdisk} /var/lib/tftpboot/
# mkdir /var/lib/tftpboot/pxelinux.cfg/
# cp /media/cdrom/isolinux/isolinux.cfg /var/lib/tftpboot/pxelinux.cfg/default
# vim /var/lib/tftpboot/pxelinux.cfg/default
default vesamenu.c32
timeout 60
display boot.msg
menu clear
menu background splash.png
menu title HQHY PXE BootMenu:Installcentos6.2 or 7.4
menu vshift 8
menu rows 18
menu margin 8
#menu hidden
menu helpmsgrow 15
menu tabmsgrow 13
label linux 1
menu label ^Install CentOS 7.4
menu default
kernel centos7.4/vmlinuz net.ifnames=0 biosdevname=0
append initrd=centos7.4/initrd.img inst.repo=http://192.168.221.129/centos7.4 inst.ks=http://192.168.221.129/ks74.cfg
# vim /var/www/html/ks74.cfg
install
url --url="http://192.168.221.129/centos7.4"
lang en_US.UTF-8
keyboard us
skipx
text
reboot
rootpw --iscrypted $1$PChLniYo$DG6raNbcIO5AIPRiP/js20
user --name=qihoo --groups=wheel --password=$6$IK2rvMJD$TGIckBiHXQk8U9vAlfKy4KnxEgB0uQf5TR2aQVM4PhdmivzyhxWXSNxU2wo0wTdnFUOtGq6b59tjQmrNcglnm0 --iscrypted --uid=1111
timezone Asia/Shanghai
firewall --enabled --port=22:tcp
authconfig --enableshadow --enablemd5
selinux --permissive
clearpart --all --initlabel
%include /tmp/part
%packages
@core
@base
@mail-server
-dovecot
-system-config-httpd
-system-config-printer-gui
-system-config-nfs
-system-config-samba
-ivtv-firmware
-iwl1000-firmware
-iwl100-firmware
-iwl105-firmware
-iwl135-firmware
-iwl2000-firmware
-iwl2030-firmware
-iwl3160-firmware
-iwl3945-firmware
-iwl4965-firmware
-iwl5000-firmware
-iwl5150-firmware
-iwl6000-firmware
-iwl6000g2a-firmware
-iwl6000g2b-firmware
-iwl6050-firmware
-iwl7260-firmware
-kernel-tools
-libertas-sd8686-firmware
-libertas-sd8787-firmware
-libertas-usb8388-firmware
-microcode_ctl
-NetworkManager
-NetworkManager-tui
-ql2100-firmware
-ql2200-firmware
-ql23xx-firmware
-abrt-addon-ccpp
-abrt-addon-python
-abrt-cli
-abrt-console-notification
-words
-pinfo
-plymouth
@Development tools
ncurses-devel
ntp
telnet
net-snmp
sysstat
iptraf
device-mapper-multipath
psmisc
mcelog
%end
%pre
#!/bin/bash
set $(list-harddrives)
let numd=$#/2
d1=$1
disk_size=`echo $2 |cut -d "." -f 1`
pv=`pvs | grep $d1 | awk '{print $1}'`
if ["X$pv" != "X"]; then
vg=`pvs | grep $d1 | awk '{print $2}'`
if ["X$vg" != "X"]; then
for lv in `ls /dev/$vg/*`
do
echo "y" | lvremove $lv
done
fi
if [$? -eq 0]; then
echo "y" | vgremove $vg
fi
if [$? -eq 0]; then
echo "y" | pvremove $pv
fi
fi
ps=`lsblk -l |grep $d1 | awk '{if ( $1 ~ /[0-9]$/) print $1 }' | sed "s/$d1//g"`
if [ "X$ps" != "x" ]; then
for i in $ps
do
/usr/sbin/parted /dev/$d1 rm Si
done
fi
list-harddrives |grep md127
if [ $? -eq 0 ]
then
d1=sda
fi
dd if=/dev/zero of=/dev/$d1 bs=512 count=1
/usr/sbin/parted -s /dev/Sd1 mklabel msdos
echo "bootloader --location=mbr --driveorder=$d1" > /tmp/part
if [ ${disk_size} -gt 2050000 ]; then
/usr/sbin/parted -s /dev/$d1 mklabel gpt
echo "part biosboot --fstype=biosboot --size=1 --ondisk=$d1" >> /tmp/part
else
echo "clearpart --drives=$d1 --all --initlabel" >> /tmp/part
fi
echo "ignoredisk --only-use=$d1" >>/tmp/part
echo "part /boot --fstype xfs --size=500 --ondisk=$d1 --asprimary" >> /tmp/part
echo "part pv.7 --fstype="lvmpv" --size=100 --ondisk=$d1 --grow" >> /tmp/part
echo "volgroup VolGroup00 --pesize=32768 pv.7" >> /tmp/part
echo "logvol swap --fstype swap --name=Vol_swap --vgname=VolGroup00 --size=4000" >> /tmp/part
echo "logvol / --fstype xfs --name=Vol_sys --vgname=VolGroup00 --size=10000" >> /tmp/part
echo 'qihoo ALL = (ALL) ALL' >> /etc/sudoers
cd /root/
wget http://192.168.221.129/chushihua/centos7.4_init-1.1.3.tar.gz
%end
关注我们
界世的你当不
只做你的肩膀
无
360官方技术公众号
技术干货|一手资讯|精彩活动
空·