PXE简介
预启动执行环境(Preboot eXecution Environment,PXE,也被称为预执行环境)提供了一种使用网络接口(Network Interface)启动计算机的机制。这种机制让计算机的启动可以不依赖本地数据存储设备(如硬盘)或本地已安装的操作系统。
原理图
图片是网络上找的,侵删
流程
第一步:客户端广播,寻找DHCP服务器,DHCP服务器响应,并提供ip地址和bootstrap文件(即pxelinux.0)位置
第二步:客户端有了ip地址之后,向TFTP请求pxelinux.0文件(这个文件的位置是DHCP服务器告诉客户端的),TFTP响应请求并返回pxelinux.0给客户端
第三步:客户端执行pxelinux.0文件
第四步:客户端向TFTP请求pxelinux.cfg文件,TFTP响应并返回pxelinux.cfg给客户端
第五步:客户端读pxelinux.cfg这个文件
第六步:客户端向TFTP请求压缩格式的内核文件vmlinuz,TFTP响应并返回vmlinuz给客户端
第七步:客户端向TFTP请求initrd.img文件(临时根文件系统),TFTP响应并返回initrd.img文件
第八步:客户端加载内核,挂载临时根文件系统,启动系统安装流程
第九步:客户端请求Kickstart文件(http,nfs,cdrom等方式都可以,具体看设置)
第十步:客户端读取Kickstart文件自动安装系统
环境
DHCP服务器
ip:192.168.253.129
系统:CentOS6
TFTP服务器
ip:192.168.253.129
系统:CentOS6
HTTPD服务器
ip:192.168.253.129
DHCP
简介
DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)是一个局域网的网络协议,使用UDP协议工作, 主要有两个用途:给内部网络或网络服务供应商自动分配IP地址,给用户或者内部网络管理员作为对所有计算机作中央管理的手段,DHCP有3个端口,其中UDP67和UDP68为正常的DHCP服务端口,分别作为DHCP Server和DHCP Client的服务端口;546号端口用于DHCPv6 Client,而不用于DHCPv4,是为DHCP failover服务,这是需要特别开启的服务,DHCP failover是用来做“双机热备”的。
DHCP原理
- DHCP Client以广播的方式发出DHCP Discover报文。
- 所有的DHCP Server都能够接收到DHCP Client发送的DHCP Discover报文,所有的DHCP Server都会给出响应,向DHCP Client发送一个DHCP Offer报文。
DHCP Offer报文中“Your(Client) IP Address”字段就是DHCP Server能够提供给DHCP Client使用的IP地址,且DHCP Server会将自己的IP地址放在“option”字段中以便DHCP Client区分不同的DHCP Server。DHCP Server在发出此报文后会存在一个已分配IP地址的纪录。
DHCP Client只能处理其中的一个DHCP Offer报文,一般的原则是DHCP Client处理最先收到的DHCP Offer报文。 - DHCP Client会发出一个广播的DHCP Request报文,在选项字段中会加入选中的DHCP Server的IP地址和需要的IP地址。
- DHCP Server收到DHCP Request报文后,判断选项字段中的IP地址是否与自己的地址相同。如果不相同,DHCP Server不做任何处理只清除相应IP地址分配记录;如果相同,DHCP Server就会向DHCP Client响应一个DHCP ACK报文,并在选项字段中增加IP地址的使用租期信息。
- DHCP Client接收到DHCP ACK报文后,检查DHCP Server分配的IP地址是否能够使用。如果可以使用,则DHCP Client成功获得IP地址并根据IP地址使用租期自动启动续延过程;如果DHCP Client发现分配的IP地址已经被使用,则DHCP Client向DHCPServer发出DHCP Decline报文,通知DHCP Server禁用这个IP地址,然后DHCP Client开始新的地址申请过程。
- DHCP Client在成功获取IP地址后,随时可以通过发送DHCP Release报文释放自己的IP地址,DHCP Server收到DHCP Release报文后,会回收相应的IP地址并重新分配
安装
安装dhcp程序包
yum install -y dhcp
复制DCHP模版文件
/bin/cp /usr/share/doc/dhcp*/dhcpd.conf.sample /etc/dhcp/dhcpd.conf
修改模版文件/etc/dhcp/dhcpd.conf
[root@localhost ~]# grep -vE "#|^$" /etc/dhcp/dhcpd.conf
option domain-name "ice.com";
option domain-name-servers 192.168.253.2;
default-lease-time 600;
max-lease-time 7200;
log-facility local7;
subnet 192.168.253.0 netmask 255.255.255.0 { #负责的网段
range 192.168.253.200 192.168.253.205; #分配的地址范围
option routers 192.168.253.2; #告知客户端网关地址
}
next-server 192.168.253.129; #tftp服务器地址
filename="pxelinux.0"; #向tftp请求的文件
接下来可以测试一下看是否配置成功了
启动DHCP
/etc/init.d/dhcpd start
为了不影响实验,先把vmware的dhcp关了
另外开一台虚拟机测试,从下图可以看到DHCP工作的几个步骤。
TFTP
简介
简单文件传输协议也称小型文件传输协议(Trivial File Transfer Protocol, TFTP),是一种于1981年在RFC 783中定义的简化的文件传输协议(FTP)。
小型文件传输协议非常简单,通过少量存储器就能轻松实现——这在当时是很重要的考虑因素。所以TFTP被用于引导计算机,例如没有大容量存储器的路由器。现在它仍然被用于在一个网络上主机之间传输小文件,例如从一台网络主机或服务器引导一个远程X Window System终端或其他的瘦客户端。TFTP 用 UDP 端口号 69 进行文件传输活动。
流程
- 初始化主机A送一个读请求(RRQ)或写请求(WRQ)包给主机B,包含了文件名和传输模式。
- B向A发一个ACK包应答,同时也通知了A其余送往B包应该发送的端口号。
- 源主机向目的主机送编过号的数据包,除了最后一个都应该包含一个全尺寸的数据块。目的主机用编号的ACK包应答所有的数据包。
- 最终的数据包必须包含少于最大尺寸的数据块以表明这是最后一个包。如果被传输文件正好是尺寸块的整数倍,源主机最后送的数据包就是0字节的。
安装
安装tftp服务和syslinux(包含我们需要的pxelinux.0等文件)
yum -y install syslinux tftp-server tftp
复制相关文件到tftp共享目录下(需要先挂载光盘)
CentOS6与CentOS7目录结构有一些不一样
这是CentOS6的情况
cp /usr/share/syslinux/pxelinux.0 /var/lib/tftpboot/
cp /media/images/pxeboot/{vmlinuz,initrd.img} /var/lib/tftpboot/
cp /media/isolinux/{boot.msg,vesamenu.c32,splash.jpg} /var/lib/tftpboot/
mkdir /var/lib/tftpboot/pxelinux.cfg/
cp /media/isolinux/isolinux.cfg /var/lib/tftpboot/pxelinux.cfg/default
修改配置文件/var/lib/tftpboot/pxelinux.cfg/default
default vesamenu.c32
#prompt 1
timeout 600
display boot.msg
menu background splash.jpg
menu title Welcome to CentOS 6.9!
menu color border 0 #ffffffff #00000000
menu color sel 7 #ffffffff #ff000000
menu color title 0 #ffffffff #00000000
menu color tabmsg 0 #ffffffff #00000000
menu color unsel 0 #ffffffff #00000000
menu color hotsel 0 #ff000000 #ffffffff
menu color hotkey 7 #ffffffff #ff000000
menu color scrollbar 0 #ffffffff #00000000
label linux
menu label ^Install or upgrade an existing system
menu default
kernel vmlinuz
append initrd=initrd.img ip=192.168.253.200 netmask=255.255.255.0 gateway=192.168.253.2 ks=http://192.168.253.129/ks.cfg #这里指定ks文件位置
启动tftp顺便测试一下
chkconfig tftp on
service xinetd restart
说明tftp没有问题
如果是CentOS7
cp /usr/share/syslinux/pxelinux.0 /var/lib/tftpboot/
cp /media/images/pxeboot/{vmlinuz,initrd.img} /var/lib/tftpboot/
cp /usr/share/syslinux/{chain.c32,mboot.c32,menu.c32,memdisk} /var/lib/tftpboot/
mkdir /var/lib/tftpboot/pxelinux.cfg/
修改配置文件/var/lib/tftpboot/pxelinux.cfg/default
default menu.c32
prompt 5
timeout 30
MENU TITLE CentOS 7 PXE Menu
LABEL linux
MENU LABEL Install CentOS 7 x86_64
KERNEL vmlinuz
APPEND initrd=initrd.img ip=192.168.253.200 netmask=255.255.255.0 gateway=192.168.253.2 ks=http://192.168.253.129/ks.cfg #这里的ks文件根据具体情况自定义
httpd
这里使用http方式发送ks文件所以需要个httpd服务
安装
yum install httpd -y
编写ks文件/var/www/html/ks.cfg
[root@localhost ~]# cat /var/www/html/ks.cfg
#platform=x86, AMD64, or Intel EM64T
#version=DEVEL
# Firewall configuration
firewall --disabled
# Install OS instead of upgrade
install
# Use network installation
url --url="https://mirrors.aliyun.com/centos/6/os/x86_64/"
# Root password
rootpw --iscrypted $1$.EaLyDeQ$FujxZcce.b3ZpI1MI9JWR0
# System authorization information
auth --useshadow --passalgo=sha512
# Use graphical install
graphical
# System keyboard
keyboard us
# System language
lang en_US
# SELinux configuration
selinux --disabled
# Do not configure the X Window System
skipx
# Installation logging level
logging --level=info
# Reboot after installation
reboot
# System timezone
timezone Asia/Shanghai
# Network information
network --bootproto=static --device=eth0 --gateway=192.168.253.2 --ip=192.168.253.181 --nameserver=192.168.253.2 --netmask=255.255.255.0 --onboot=on
# System bootloader configuration
bootloader --location=mbr
# Clear the Master Boot Record
zerombr
# Partition clearing information
clearpart --all --initlabel
# Disk partitioning information
part /boot --fstype="ext4" --size=150
part swap --fstype="swap" --size=2048
part / --fstype="ext4" --grow --size=1
%packages
@base
@development
%end
启动httpd服务
/etc/init.d/httpd start
测试一下
接下来就简单了,创建一台虚拟机,不需要导入镜像直接开机,然后就可以喝茶看报纸等安装完成了