我们大家对pxe应该都有一定的了解,下面看一下官方的解释:
PXE(preboot execute environment,预启动执行环境)是由Intel公司开发的最新技术,工作于Client/Server的网络模式,支持工作站通过网络从远端服务器下载映像,并由此支持通过网络启动操作系统,在启动过程中,终端要求服务器分配IP地址,再用TFTP(trivial file transfer protocol)或MTFTP(multicast trivial file transfer protocol)协议下载一个启动软件包到本机内存中执行,由这个启动软件包完成终端(客户端)基本软件设置,从而引导预先安装在服务器中的终端操作系统。PXE可以引导多种操作系统。
我们平时可以用一台虚拟机来实现pxe的整个功能,然后把这台机器作为服务器,其他客服端通过访问我们,实现自动安装linux操作系统。
- 需要用到的软件有dhcp,TFTP,nfs(或者ftp,http),平时我们需要自己一步一步的安装这些软件,然后对他们进行配置,才能形成一个完整的pxe,在这里,我就不对这些步骤做具体阐述,我把整个过程写成了一个shell脚本,运行完这个脚本以后,pxe就形成了。
pxe的大致流程如图:
- 我大概描述一个实现PXE的过程:先看图
- 1、我们是把dhcp服务器、tftp服务器和共享服务(nfs)都放到了同一台虚拟机。
- 2、所以,我们实现要做的就是安装所需要服务的软件,然后就是准备操作系统的完整镜像,将其共享。
- 3、基本就差不多了吧,我直接在我的代码里面注释吧。我的是安装RHEL7.4
[root@server-10 /test]# cat pxe.sh
#!/bin/bash
# 描述:pxe自动化部署
# 相关软件:需要安装dhcp,tftp,tftp-server,nfs-utils
#交互式页面,先输入服务器的ip,以及本机的/dev/sr0所在位置
read -p "Please enter your Ip:" ip #服务器ip
read -p "Please enter your ISO file path:" iso #镜像文件的挂载目录
tftp=/var/lib/tftpboot/ #tftp的主工作目录,也是这个实验最重要的目录,经常用到,所以定义成变量
# 安装相关软件,syslinux是用来提供pxelinux.0的,rpcbind是帮助nfs请求端口信息的
yum install -y dhcp tftp tftp-server syslinux nfs-utils rpcbind >/dev/null 2>/var/log/pxe.error
#安装信息直接扔到垃圾桶,错误信息保留
#配置dhcp的配置文件
cat >/etc/dhcp/dhcpd.conf <<EOF
ddns-update-style interim;
ignore client-updates;
subnet 192.168.72.0 netmask 255.255.255.0 {
range 192.168.72.20 192.168.72.30;
next-server $ip; #为tftp服务器的地址,这里我们是公用一台
filename "pxelinux.0"; #不用写绝对路径,写相对路径就可以,相对的就是/var/lib/tftpboot/这个主工作目录
}
EOF
#准备好需要的环境,内核、镜像等,最好自己先清理/var/lib/tftpboot/,确保里面没有以前残留的,本来想在脚本直接用rm -rf /var/lib/tftpboot/* ,但是。这样确实很不安全,在实际工作中,要是这个目录下有你需要的东西,执行完这个,那你可能就要gg了,所以,还是自己手动操作吧!
cp /usr/share/syslinux/pxelinux.0 $tftp
cp $iso/isolinux/vmlinuz $tftp
cp $iso/isolinux/initrd.img $tftp
mkdir $tftp/pxelinux.cfg/
# nfs服务,并让他立即生效
ip1=`echo $ip | awk -F '.' '{print $1"."$2"."$3}'`.0 #找到ip的网段
cat >/etc/exports << EOF
$iso $ip1/255.255.255.0(ro)
EOF
exportfs -rv >/dev/null 2>/var/log/pxe.error #让修改立即生效
#自定义页面
cat >$tftp/boot.msg <<EOF
############################################################
# #
# ----1-To Install RHEL7.4 Type 1 Press Enter ------- #
# #
# ----2-To Install RHEL6.5 Type 2 Press Enter ------ #
# #
# ----3-To Install RHEL7.4 Type 3 Press Enter ------- #
# #
############################################################
EOF
cat >$tftp/pxelinux.cfg/default <<EOF
default 1
timeout 600
display boot.msg
prompt 1
label 1
kernel vmlinuz #内核名字必须和主工作目录里面的一样,镜像也是
append initrd=initrd.img method=nfs://$ip/iso #nfs共享的路径
label 2 #如果要弄其他系统,可以多加几个label
kernel vmlinuz6-2
append initrd=initrd6-2.img
EOF
#启动服务
systemctl restart dhcpd
systemctl restart tftp
systemctl restart rpcbind
systemctl restart nfs
echo "OK" #这句话并也没有什么用,只是个人觉得脚本执行完得输出一些东西而已!
总结:好了,这就是我的脚本啦,我自己暂时只安装了红帽7 ,如果想安装更多的系统,直接在/var/lib/tftp/pxelinux.cfg/default里面加label就可以了,但前提是,要先准备好镜像文件,可以共享,也可以直接拷贝镜像,也可以用脚本实现呀!