什麼是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,避免干擾。