什么是PXE
预启动执行环境(PXE)是由Intel公司开发的最新技术,工做于Client/Server的网络模式,支持工做站经过网络从远端服务器下载映像,并由此支持经过网络启动操做系统,在启动过程当中,终端要求服务器分配IP地址,再用TFTP(trivial file transfer protocol)或MTFTP(multicast trivial file transfer protocol)协议下载一个启动软件包到本机内存中执行,由这个启动软件包完成终端(客户端)基本软件设置,从而引导预先安装在服务器中的终端操做系统。PXE能够引导多种操做系统,如:Windows95/98/2000/windows2003/windows2008/winXP/win7/win8,linux系列系统等。html
PXE原理
PXE是在没有软驱、硬盘、CD-ROM的状况下引导计算机的一种方式,也就是BIOS将使用PXE协议从网络引导。整个安装的过程是这样的:PXE网卡启动 => DHCP得到IP地址 => 从TFTP上下载 pxelinux.0、vmlinuz、initr.img 等 => 引导系统进入安装步骤 => 经过PEX linux 下载ks.cfg文件并跟据ks.cfg自动化安装系统 => 完成。python
TFTP服务
TFTP是用来下载远程文件的最简单网络协议,它其于UDP协议而实现。linux
什么是kickstart
KickStart是一种无人职守安装方式。KickStart的工做原理是经过记录典型的安装过程当中所需人工干预填写的各类参数,并生成一个名为ks.cfg的文件;在其后的安装过程当中(不仅局限于生成KickStart安装文件的机器)当出现要求填写参数的状况时,安装程序会首先去查找KickStart生成的文件,当找到合适的参数时,就采用找到的参数,当没有找到合适的参数时,才须要安装者手工干预。这样,若是KickStart文件涵盖了安装过程当中出现的全部须要填写的参数时,安装者彻底能够只告诉安装程序从何处取ks.cfg文件,而后去忙本身的事情。等安装完毕,安装程序会根据ks.cfg中设置的重启选项来重启系统,并结束安装。redis
什么是PXE+Kickstart+TFTP?shell
1.PXE Client向DHCP发送请求:
PXE Client从本身的PXE网卡启动,经过PXE BootROM(自启动芯片)会以UDP(简单用户数据报协议)发送一个广播请求,向本网络中的DHCP服务器索取IP。vim
2.DHCP服务器提供信息:
DHCP服务器收到客户端的请求,验证是否来至合法的PXE Client的请求,验证经过它将给客户端一个“提供”响应,这个“提供”响应中包含了为客户端分配的IP地址、pxelinux启动程序(TFTP)位置,以及配置文件所在位置。windows
3.PXE客户端请求下载启动文件:
客户端收到服务器的“回应”后,会回应一个帧,以请求传送启动所需文件。这些启动文件包括:pxelinux.0、pxelinux.cfg/default、vmlinuz、initrd.img等文件。服务器
4.Boot Server响应客户端请求并传送文件:
当服务器收到客户端的请求后,他们之间以后将有更多的信息在客户端与服务器之间做应答, 用以决定启动参数。BootROM由TFTP通信协议从Boot Server下载启动安装程序所必须的文件(pxelinux.0、pxelinux.cfg/default)。default文件下载完成后,会根据该文件中定义的引导顺序,启动Linux安装程序的引导内核。网络
5.请求下载自动应答文件:
客户端经过pxelinux.cfg/default文件成功的引导Linux安装内核后,安装程序首先必须肯定你经过什么安装介质来安装linux,若是是经过网络安装(NFS, FTP, HTTP),则会在这个时候初始化网络,并定位安装源位置。接着会读取default文件中指定的自动应答文件ks.cfg所在位置,根据该位置请求下载该文件。
这里有个问题,在第2步和第5步初始化2次网络了,这是因为PXE获取的是安装用的内核以及安装程序等,而安装程序要获取的是安装系统所需的二进制包以及配置文件。所以PXE模块和安装程序是相对独立的,PXE的网络配置并不能传递给安装程序,从而进行两次获取IP地址过程,但IP地址在DHCP的租期内是同样的。app
6.客户端安装操做系统:
将ks.cfg文件下载回来后,经过该文件找到OS Server,并按照该文件的配置请求下载安装过程须要的软件包。
OS Server和客户端创建链接后,将开始传输软件包,客户端将开始安装操做系统。安装完成后,将提示从新引导计算机。
环境:
selinux关闭,防火墙关闭
Server:192.168.2.100
Step 1 配置dnf源
[root@localhost ~]# cat server.repo [serverApp] name=app enabled=1 gpgcheck=0 baseurl=file:///mnt/AppStream [serverOS] name=os enabled=1 gpgcheck=0 baseurl=file:///mnt/BaseOS
Step 2 安装软件包
[root@localhost ~]# dnf install dhcp-server tftp-server httpd syslinux -y
Step 3 搭建并启动DHCP
[root@localhost ~]# vim /etc/dhcp/dhcpd.conf subnet 192.168.2.0 netmask 255.255.255.0 { option routers 192.168.2.100; range 192.168.2.10 192.168.2.20; next-server 192.168.2.100; filename "pxelinux.0"; } [root@localhost ~]# systemctl start dhcpd [root@localhost ~]# systemctl status dhcpd [root@localhost ~]# netstat -antlup | grep :67 udp 0 0 0.0.0.0:67 0.0.0.0:* 31465/dhcpd udp 0 0 0.0.0.0:67 0.0.0.0:* 1345/dnsmasq
Step 4 生成须要的文件并启动tftp服务
[root@localhost ~]# cp /usr/share/syslinux/pxelinux.0 /var/lib/tftpboot/ [root@localhost ~]# cp /mnt/isolinux/{vmlinuz,ldlinux.c32,initrd.img} /var/lib/tftpboot/ [root@localhost ~]# mkdir /var/lib/tftpboot/pxelinux.cfg [root@localhost ~]# vim /var/lib/tftpboot/pxelinux.cfg/default #生成default文件 default linux timeout 3 label linux kernel vmlinuz append initrd=initrd.img ip=dhcp method=http://192.168.2.100/RHEL ks=http://192.168.2.100/ks.cfg [root@localhost mnt]# systemctl start tftp #启动tftp服务 [root@localhost mnt]# systemctl status tftp [root@localhost mnt]# netstat -antulp | grep :69 udp6 0 0 :::69 :::* 1/systemd
Step5 搭建并启动http服务
[root@localhost ~]# mkdir /var/www/html/RHEL #创建软件包存放目录 [root@localhost ~]# mount /dev/cdrom /var/www/html/RHEL #将光盘挂载到对应目录中
Step6 生成ks.cfg文件
因为CentOS8.0中没有system-config-kickstart包,因此没法经过工具生成ks文件,须要手动生成,例子中root用户和新建的hello用户的密码都为‘`123qwe’
若是须要本身额外指定密码,请使用其它工具进行转换,例如doveadm命令
cp /root/anaconda-ks.cfg /var/www/html/ks.cfg #生成ks.cfg文件 [root@localhost ~]# vim /var/www/html/ks.cfg #version=RHEL8 ignoredisk --only-use=sda autopart --type=lvm # Partition clearing information clearpart --all #删除全部分区 # Use graphical install graphical url --url="http://192.168.2.100/RHEL/" #指定安装URL # Keyboard layouts keyboard --vckeymap=cn --xlayouts='cn' # System language lang zh_CN.UTF-8 # Network information network --bootproto=dhcp --device=ens33 --ipv6=auto --activate network --hostname=localhost.localdomain # Root password “`123qwe” #root用户的密码"`123qwe" rootpw --iscrypted $6$lYV8xqOfEWbJZ/8Y$YXDve/YNwljyh6BnrMHkKm.18kyUqZkHBpA4DHA/nEhXckJfNPLpclgNcQUS64XQSDZRAdlWzjPsI8sCe1dPo0 # X Window System configuration information xconfig --startxonboot # Run the Setup Agent on first boot #firstboot disable #初次启动设置 firstboot --disable # System services services --enabled="chronyd" # System timezone timezone America/New_York --isUtc #Reboot after installation #安装完成后自动重启 reboot # License agreement #赞成受权协议 eula --agreed #Add a new user named hello password “`123qwe” group whell #普通用户名字为hello密码"`123qwe" user --groups=wheel --name=hello --password=$6$GnUoYHa8rYy7XfrK$0OSNtZwn7.mq4mTeEXQvebx8AEKMV7/PYBS0qfLXUUMJFQozCVMGZY3c0gYcfaKhkCDVQAcxCpi01A5f6a9XC. --iscrypted --gecos="hello" %packages @^graphical-server-environment %end %addon com_redhat_kdump --disable --reserve-mb='auto' %end %anaconda pwpolicy root --minlen=6 --minquality=1 --notstrict --nochanges --notempty pwpolicy user --minlen=6 --minquality=1 --notstrict --nochanges --emptyok pwpolicy luks --minlen=6 --minquality=1 --notstrict --nochanges --notempty %end
Step7 修改文件权限,启动http服务
[root@localhost ~]# chmod a+r /var/www/html/ks.cfg [root@localhost ~]# systemctl start httpd [root@localhost ~]# systemctl start httpd [root@localhost ~]# systemctl status httpd [root@localhost ~]# netstat -antlp | grep :80 tcp6 0 0 :::80 :::* LISTEN 33976/httpd
Step8 测试
选择网络启动
获取IP和相关文件
开启安装进程
安装完成后自动重启
kickstart+uefi
环境:
selinux关闭,防火墙关闭
Server:192.168.2.100
Step 1 配置dnf源
[root@localhost ~]# cat server.repo [serverApp] name=app enabled=1 gpgcheck=0 baseurl=file:///mnt/AppStream [serverOS] name=os enabled=1 gpgcheck=0 baseurl=file:///mnt/BaseOS
Step 2 安装软件包
[root@localhost ~]# dnf install dhcp-server tftp-server httpd -y
Step 3 搭建并启动DHCP
[root@localhost ~]# vim /etc/dhcp/dhcpd.conf subnet 192.168.2.0 netmask 255.255.255.0 { option routers 192.168.2.100; range 192.168.2.10 192.168.2.20; next-server 192.168.2.100; filename "BOOTX64.EFI";#注意差别,使用的不是pxelinux.0 } [root@localhost ~]# systemctl start dhcpd [root@localhost ~]# systemctl status dhcpd [root@localhost ~]# netstat -antlup | grep :67 udp 0 0 0.0.0.0:67 0.0.0.0:* 31465/dhcpd udp 0 0 0.0.0.0:67 0.0.0.0:* 1345/dnsmasq
Step 4 生成须要的文件并启动tftp服务
[root@localhost ~]# cd /mnt/EFI/BOOT/ [root@localhost BOOT]# cp BOOTX64.EFI grub.cfg grubx64.efi /var/lib/tftpboot/ [root@localhost ~]# cp /mnt/isolinux/{vmlinuz,initrd.img} /var/lib/tftpboot/ [root@localhost ~]# vim /var/lib/tftpboot/grub.cfg set default="0" set timeout=3 menuentry 'Install CentOS Linux 8.0.1905' { linuxefi /vmlinuz ip=dhcp ks=http://192.168.2.100/ks.cfg initrdefi /initrd.img } [root@localhost mnt]# systemctl start tftp #启动tftp服务 [root@localhost mnt]# systemctl status tftp [root@localhost mnt]# netstat -antulp | grep :69 udp6 0 0 :::69 :::* 1/systemd
Step5 搭建并启动http服务
[root@localhost ~]# mkdir /var/www/html/RHEL #创建软件包存放目录 [root@localhost ~]# mount /dev/cdrom /var/www/html/RHEL #将光盘挂载到对应目录中
Step6 生成ks.cfg文件
因为CentOS8.0中没有system-config-kickstart包,因此没法经过工具生成ks文件,须要手动生成,例子中root用户和新建的hello用户的密码都为‘`123qwe’
也可访问https://access.redhat.com/labs/kickstartconfig/ 来帮助咱们生成ks文件(你可能须要注册,软件包选择有些烦)
若是须要本身额外指定密码,请使用其它工具进行转换,例如doveadm命令,可是系统没有这个工具,因此推荐使用python来实现
[root@localhost ~]# python3 -c 'import crypt,getpass;pw="gongjunhe";print(crypt.crypt(pw))'
cp /root/anaconda-ks.cfg /var/www/html/ks.cfg #生成ks.cfg文件 [root@localhost ~]# vim /var/www/html/ks.cfg #version=RHEL8 ignoredisk --only-use=nvme0n1 ###注意这是与BIOS方式差别的位置,注意设备类型,可在BIOS中查看到 autopart --type=lvm #使用lvm # Partition clearing information clearpart --all #删除全部分区 # Use graphical install graphical #使用图形界面安装 url --url="http://192.168.2.100/RHEL/" #指定安装URL # Keyboard layouts keyboard --vckeymap=cn --xlayouts='cn' #指定键盘布局 # System language lang zh_CN.UTF-8 #定义语言环境 # Network information network --bootproto=dhcp --device=ens33 --ipv6=auto --activate #ip获取方式 network --hostname=localhost.localdomain #定义主机名称 # Root password “`123qwe” #root用户的密码"`123qwe" rootpw --iscrypted $6$lYV8xqOfEWbJZ/8Y$YXDve/YNwljyh6BnrMHkKm.18kyUqZkHBpA4DHA/nEhXckJfNPLpclgNcQUS64XQSDZRAdlWzjPsI8sCe1dPo0 # X Window System configuration information xconfig --startxonboot #图形窗口配置 # Run the Setup Agent on first boot #firstboot disable #初次启动设置 firstboot --disable # System services services --enabled="chronyd" #设置systemd运行的默认服务器几何 # System timezone timezone America/New_York --isUtc #时区 #Reboot after installation #安装完成后自动重启 reboot # License agreement #赞成受权协议 eula --agreed #Add a new user named hello password “`123qwe” group whell #普通用户名字为hello密码"`123qwe" user --groups=wheel --name=hello --password=$6$GnUoYHa8rYy7XfrK$0OSNtZwn7.mq4mTeEXQvebx8AEKMV7/PYBS0qfLXUUMJFQozCVMGZY3c0gYcfaKhkCDVQAcxCpi01A5f6a9XC. --iscrypted --gecos="hello" %packages #定义安装的软件包 @^graphical-server-environment %end %addon com_redhat_kdump --disable --reserve-mb='auto' #额外设置,这里是关闭kdump功能 %end %anaconda # 额外的规则设置,这里主要针对的是用户的密码规则的定义 pwpolicy root --minlen=6 --minquality=1 --notstrict --nochanges --notempty pwpolicy user --minlen=6 --minquality=1 --notstrict --nochanges --emptyok pwpolicy luks --minlen=6 --minquality=1 --notstrict --nochanges --notempty %end
Step7 修改文件权限,启动http服务
[root@localhost ~]# chmod a+r /var/www/html/ks.cfg#若是是拷贝的anaconda-ks.cfg文件,注意修改权限 #不然安装过程当中会出现faild .... ks.cfg的报错提示,由于anaconda-ks.cfg的文件权限是600,除了root别人没法读取 [root@localhost ~]# systemctl start httpd [root@localhost ~]# systemctl start httpd [root@localhost ~]# systemctl status httpd [root@localhost ~]# netstat -antlp | grep :80 tcp6 0 0 :::80 :::* LISTEN 33976/httpd
Step8 测试
新建虚拟机测试,根据软件版本不一样,建议在新建虚拟机时选择自定义,在自定义中的过程当中选择虚拟机固件时,选择UEFI类型的,同时主机调整服务端和客户端的网路链接设置,我这里面,ks服务器和测试机的网络链接选择的是vmnet4,避免干扰。