Linux的PXE與UEFI PXE遠程安裝系統
原文鏈接:http://control.blog.sina.com.cn/admin/article/article_add.php
在Linux中有多種的安裝方式:HD、USB、CDROM、PXE及遠程管理卡等。在我們的系統運維的生涯中,經常要安裝操作系統,然而我們維護的機器不是一兩台而已,一般的企業服務器數量都在幾十、幾百、幾千、甚至上萬台。這么多的機器,如果人工的一台一台去安裝,那我們這些運維人員,可能要把大部分時間都花費在了安裝系統上,所以,我們一般都會建立一個PXE服務器,通過網絡來批量部署系統。
隨着計算機產品的更新換代以及IT企業的發展,一個公司的計算機型號種類越來越多,硬盤也不一樣,那么我們維護的手段也需要與時俱進。本文主要介紹硬件環境差異比較大的情況下,如何搭建一機多用的PXE服務器,下面以CentOS-6.4-x86_64版本為例,進行服務器的配置。
一、普通機器的PXE系統部署
實現自動獲取IP網絡安裝linux是這樣的:客啟端PXE網卡啟動-->通過Bootp協議廣播dhcp請求-->DHCP服務器-->獲取IP,TFTP服務器地址-->從TFTP上下載 pxelinux.0以及系統內核文件vmlinuz、initrd.img-->啟動系統-->(到指定url去下載ks.cfg文件-->根據ks.cfg文件去NFS/HTTP/FTP服務器自動下載軟件包)安裝系統-->完成安裝。
主要使用的使用到的服務,FTP server用來發布linux系統的安裝樹(也可以使用NFS、HTTP或HTTPS),DHCP server為客戶端分配ip並提供TFTP服務器地址及PXE啟動文件位置,TFTP server為客戶端提供引導文件。三個服務可以安裝在同一台服務器上,也可以安裝在三台服務器上。
1、安裝配置FTP server
- [root@pxe
~]# yum install vsftpd - [root@pxe
~]# chkconfig vsftpd on - [root@pxe
~]# service vsftpd start
vsftpd的默認配置文件在/etc/vsftpd/vsftpd.conf,共享目錄在/var/ftp/pub/下,不用做什么修改就可以直接使用了。安裝好后要把系統盤鏡像的全部文件復制到這里,或掛載到這個目錄下,我就是把光盤鏡像掛載到了這里,因為還有個ks.cfg文件要發到這里,所以我在這里有建立了mirror目錄,將系統鏡像掛載到了/var/ftp/pub/mirror/下。
2、安裝配置DHCP server
- [root@pxe
~]# yum install dhcp
編輯配置文件,這里是很重要的。
- [root@pxe
~]# vim /etc/dhcp/dhcpd.conf - default-lease-time
600; - max-lease-time
7200; - ddns-update-style
none; - subnet
10.12.190.0 netmask 255.255.255.0 { - range
dynamic-bootp 10.12.190.100 10.12.190.120; - option
routers 10.12.190.254; - option
subnet-mask 255.255.255.0; - filename
"pxelinux.0"; //如果不是在TFTP根目錄下,要寫上目錄 - next-server
10.12.190.140; //tftp服務器地址 - }
3、安裝配置TFTP server
①安裝TFTP,然后編輯配置文件,開啟開啟服務,默認的數據目錄/var/lib/tftpboot
- [root@pxe
~]# yum install tftp-server - [root@pxe
~]# vim /etc/xinetd.d/tftp - service
tftp - {
- socket_type
dgram= - protocol
udp= - wait
yes= - user
root= - server
= /usr/sbin/in.tftpd - server_args
= -s /tftpboot //這個可以自己修改 - disable
no= //將yes改成no是啟用 - per_source
11= - cps
100= 2 - flags
IPv4= - }
- [root@pxe
~]# service xinetd restart
②將pxelinux.0拷貝到tftpboot目錄下
- [root@pxe
~]# cp /usr/share/syslinux/pxelinux.0 /tftpboot //如果找不到這個文件,要安裝syslinux軟件包
③將啟動文件從光盤中找到,並復制到該目錄下:
- [root@pxe
~]# ll /tftpboot/
總用量 36084:
- -rwxrw-rw-
1 root root 32491856 3月 2 2013 initrd.img //這是一個初始化文件,一個最小的系統鏡像 - -rwxrw-rw-
1 root root 26828 12月 9 22:57 pxelinux.0 //這文件是為legcay啟動,它是legcay的啟動鏡像, - drwxrwxrwx
2 root root 4096 1月 28 12:14 pxelinux.cfg //該文件夾下放的是啟動菜單,手動創建 - -rwxrw-rw-
1 root root 151230 3月 5 2013 splash.jpg //背景圖片,可以不要 - -rwxrw-rw-
1 root root 162860 3月 5 2013 vesamenu.c32 //legacy BIOS引導菜單工具,可以從光盤或 /usr/share/syslinux/ 中找到 - -rwxrw-rw-
1 root root 4043888 3月 5 2013 vmlinuz //內核文件
④在pxelinux.cfg目錄下,建立默認文件,該文件可以使用光盤中的isolinux.cfg文件來當模板,這個啟動菜單很重要
- [root@pxe
~]# vim /tftpboot/pxelinux.cfg/default - default
vesamenu.c32 - timeout
30 - menu
background splash.jpg - menu
title Welcome to PXE CentOS-6.4-x86_64! - 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 CentOS-6.4-x86_64 an existing system from to Network - kernel
vmlinuz - append
initrdinitrd=initrd.img ksdevice=eth0 repo=ftp://10.12.190.187/pub/mirror ip=dhcp - label
linux - menu
label ^ Install CentOS-6.4-x86_64 use kisckstart file - menu
default - kernel
vmlinuz - append
initrdinitrd=initrd.img ip=10.12.190.183 netmask=255.255.255.0 gateway=10.12.13.254 dns=202.106.0.20 ksdevice=eth0 ks=ftp://10.12.190.187/pub/ks.cfg - label
rescue - menu
label ^Rescue installed system - kernel
vmlinuz - append
initrdinitrd=initrd.img rescue ksdevice=eth0repo=ftp://10.12.190.187/pub/mirror ip=dhcp - label
local - menu
label Boot from ^local drive - localboot
0xffff
以上參數可以接在kernel后邊,也可以接在initrd.img后邊,都不影響。
ksdevice= 是為了指定使用哪塊網卡,因為機器有多塊網卡,無人值守會卡在這里。
repo= 是指定安裝鏡像的url,如果沒有,就會提示要一下畫面,那就需要手工處理了。
ip= 可以指定網卡自動獲取ip,還是使用固定ip,如果使用固定ip,系統將把這個ip寫入到配置文件中去。
ks= 是指定ks.cfg文件的url,ks.cfg是個應答文件,可以替我們處理所有安裝時,所有需要手工設置的內容,該文件可以直接編輯系統中的/home/anaconda-ks.cfg文件,或者在圖形化下使用system-config-kickstart包來編輯一個,非常好用。
有的時候,可能需要手工來處里某一台機器,還要跑到那台機器前嗎?當然不需要,安裝的時候也可以使用vnc來遠程操作的。機器不一樣,用途也不一樣,有的時候不能完全自動,也需要我們手工做些改動。
⑤允許遠程訪問安裝系統
在另一個系統上顯示圖形或字符安裝界面,這時就可以使用vnc服務,這是操作系統本身就支持的功能,vnc選項啟動VNC服務,vncpassword選項用來設置一個遠程訪問的密碼,VNC密碼必須至少6個字符,不設置密碼去掉vncpassword選項也可以。使用方法很簡單,可以寫在PXE的引導菜單中,添加在kernel或initrd.img后邊,或是在出現菜單畫面時,按Tab鍵,編輯某一行,在最后邊加入vnc vncpassword=123456字段,或是按Esa鍵,在命令行里直接輸入linux vnc vncpassword=123456就可以了,U盤安裝,光盤裝都有效。
假設遠程機器ip是10.12.190.181.,被安裝機器的ip是10.12.190.101
(1)正向連接方式:
- linux
vnc ip=10.12.190.101netmask=255.255.255.0 gateway=10.12.190.254 vncpassword=123456
指定被安裝機器的ip是10.12.190.181 網關是10.12.190.254 掩碼是24, vnc連接的密碼是123456
由遠程vnc客戶端,連入被安裝機器進行安裝,之后的操作就和平時一樣了。在安裝系統上將顯示如下信息:
vnc連接地址為10.12.190.101:1
(2)反向連接方式:
在遠程啟動vnc的被動連接:vncviewer.exe -listen,當客戶端安裝過程啟動后,遠程端的vnc會自動連接
- linux
vnc vncconnect=10.12.190.181vncpassword=123456
vnc會自動反向聯接10.12.190.181,如果遠程機器開啟vnc監聽,在10次超時15秒后,會變成主動方式連接,在安裝系統上將顯示如下信息:
以上2種方式,如果IP是DHCP自動獲取的話,使用反向連接方式比較好,這樣,無需知道安裝系統的客戶端獲取的IP是多少,也可以建立連接。
⑥另一種安裝菜單的寫法:
- label
linux - menu
label ^ Install or upgrade CentOS-6.4-x86_64 an existing system from to Network - kernel
/vmlinuz ksdevice=eth0 repo=ftp://10.12.190.187/pub/mirror ip=dhcp - initrd
/initrd.img - label
linux - menu
label ^ Install CentOS-6.4-x86_64 use kisckstart file - menu
default - kernel
/vmlinuz ip=10.12.190.183 netmask=255.255.255.0 gateway=10.12.13.254 dns=202.106.0.20 ksdevice=eth0 ks=ftp://10.12.190.187/pub/ks.cfg - initrd
/initrd.img
以上就是普通PXE安裝系統的所有操作方法,現在就可以使用了。
二、UEFI PXE的系統部署
對於使用UEFI來啟動的機器來說,上述方法已經完全無效了,根本無法順利的安裝系統了,如果想順利的安裝系統,必須首先加載UEFI驅動才可以。UEFI PXE和上邊的方法區別就在於TFTPserver所提供的系統啟動必須文件,和DHCP server的設置, 所使用到的服務還是這幾個。
1、TFTP server的配置
配置文件與上邊一樣,只是目錄中的文件要更換一下,這次要從系統盤中提取三個文件。
將光盤中的efiboot.img掛在到系統中:
- [root@pxe
~]# mount -o loop efiboot.img /mnt - [root@pxe
~]# ll /mnt/EFI/BOOT/ - total
250 - -rwxr-xr-x
1 root root 411 Mar 5 2013 BOOTX64.conf //為grub的配置文件,用於顯示引導菜單 - -rwxr-xr-x
1 root root 251274 Mar 5 2013 BOOTX64.efi //UEFI的啟動鏡像 - -rwxr-xr-x
1 root root 1341 Mar 5 2013 splash.xpm.gz //UEFI啟動菜單工具 - [root@pxe
~]# cp /mnt/EFI/BOOT/* /tftpboot/
BOOTX64.efi就是我們開機所需要的,這三個文件也可也直接使用光盤中EFI目錄下的文件。
2、DHCP server配置
DHCP重點是要修改一下/etc/dhcp/dhcpd.conf文件,把開機前引導改成BOOTX64.efi,之前我們指定的是pxelinux.0這個文件。
- [root@pxe
~]# vim /etc/dhcp/dhcpd.conf - default-lease-time
600; - max-lease-time
7200; - ddns-update-style
none; - subnet
10.12.190.0 netmask 255.255.255.0 { - range
dynamic-bootp 10.12.190.100 10.12.190.120; - option
routers 10.12.190.254; - option
subnet-mask 255.255.255.0; - filename
"BOOTX64.efi"; - next-server
10.12.190.140; - }
3、創建開機啟動菜單
- [root@pxe
~]# vim /tftpboot/efidefault - default=0
- timeout=15
- splashimage=(nd)/splash.xpm.gz
- title
Install CentOS-6.4-x86_64 (UEFI) - root
(nd) - kernel
/vmlinuz method=ftp://10.12.190.187/pub/mirror/ ip=10.12.16.100 netmask=255.255.255.0 gateway=10.12.16.1 lang=en_US keymap=us ksdevice=eth0 vnc vncpassword=123456 - initrd
/initrd.img - title
Install CentOS-6.4-x86_64 use Kickstart File - root
(nd) - kernel
/vmlinuz ks=ftp://10.12.190.187/pub/ks.cfg ksdevice=eth0 ip=dhcp - initrd
/initrd.img - title
Rescue installed system - root
(nd) - kernel
/vmlinuz rescue method=ftp://10.12.190.187/pub/mirror - initrd
/initrd.img
注意這個菜單只能這樣編寫,選項參數都要加在kernel行后邊,不然無法加載,使用的參數和普通的PXE是一樣的,編輯好之后就可以使用了。
選擇一個菜單后,等待的時間比較長,當你看到這是小企鵝時,UEFI驅動已經加載上了,說明你TFTP server和DHCP server設置都沒有問題。
如果你看到上面的錯誤信息,說明是的你的菜單寫得有問題,initrd /initrd.img要另起一行,不能與kernel同行。
UEFI安裝系統時,也可以使用vnc遠程安裝,但硬盤的分區表必須是GPT格式的,如果你的硬盤不是這種格式的,那就需要多一步操作了,使用parted命令去修改。遺憾的是vnc沒有提供Ctrl+Alt+F1~F6快捷鍵,讓你切換到一個字符終端去操作。不過也不是沒有辦法,我們可以在救援模式下連上vnc,這樣輸入命令操作就行了。
parted命令的使用,請參考此文檔。
三、混合模式
一般情況下,我們的機房里,2種類型的服務都會有,可能還會有安騰架構的機器,不會是統一型號的。這樣的話,每次都要去修改DHCP server服務,比較麻煩,將這些不同的機器划分不同的vlan里,每個vlan里都做個DHCP服務器,這樣有點太浪費資源了。所以就要用個更好的方法,一台服務器同時提供多種系統安裝,而要安裝系統的客戶端機器,會自己從服務器下載屬於自己的引導文件。
1、TFTP server配置
在/tftpboot/目錄下,不同平台需要的文件是不一樣的,可以直接把它們全都放在TFTP的根目錄下,但這樣管理不太方便,所以我將普通PXE的引導文件放在/tftpboot/Legacy/下,將UEFI的引導文件放在/tftpboot/UEFI下,其他平台的也這樣操作就可以了。
2、DHCP server配置
想要實現混合模式,最關鍵的就是DHCP的配置文件了
- [root@pxe
~]# vim /etc/dhcp/dhcpd.conf - default-lease-time
600; - max-lease-time
7200; - ddns-update-style
none; - option
space PXE; - option
PXE.mtftp-ip code 1 = ip-address; - option
PXE.mtftp-cport code 2 = unsignedinteger 16; - option
PXE.mtftp-sport code 3 = unsignedinteger 16; - option
PXE.mtftp-tmout code 4 = unsignedinteger 8; - option
PXE.mtftp-delay code 5 = unsignedinteger 8; - option
arch code 93 = unsignedinteger 16; - subnet
10.12.190.0 netmask 255.255.255.0 { - option
routers 10.12.190.254; - range
10.12.190.10 10.12.190.20; - class
"pxeclients" { - match
if substring (option vendor-class-identifier, 0, 9) = "PXEClient"; - next-server
10.12.190.181; - if
option arch = 00:02{ - filename
"ia64/elilo.efi"; - }
else if option arch = 00:06{ - filename
"X86PC/bootia32.efi"; - }
else if option arch = 00:07{ - filename
"UEFI/BOOTX64.efi"; - }
else { - filename
"Legacy/pxelinux.0"; - }
- }
- }
這里不再詳細解釋每行的含義,具體可以參考相關資料。這里很重要的一點是根據客戶端信息進行判斷來指定服務器為客戶端提供哪些信息。
啟動文件名稱(如果客戶端使用EFI,啟動名稱為bootia32.efi和boottx64.efi,如果客戶端使用Legacy BIOS啟動,名稱為pxelinux.0),其它服務部分沒有什么變化,FTP服務不需要做什么更改。
至此,我們就大功告成了,所有的准備工作就都完成了,現在就可以使用這個多平台的PXE進行批量部署了。

