所謂的PXE是Preboot Execution Environment的縮寫,字面上的意思是開機前的執行環境。html
要達成PXE必需要有兩個環節:node
(1)一個是客戶端的網卡必需要支持PXE用戶端功能,而且開機時選擇從網卡啓動,這樣系統纔會以網卡進入PXE客戶端的程序;linux
(2)一個是PXE服務器必需要提供至少含有DHCP以及TFTP的服務!ios
且其中:vim
DHCP服務必需要可以提供客戶端的網絡參數,還要告知客戶端TFTP所在的位置;centos
TFTP則提供客戶端的boot loader及kernel file下載路徑。服務器
還要加上NFS/FTP/HTTP(選擇同樣便可)等提供安裝文件(安裝鏡像的解壓文件),纔算是比較完整的PXE服務器。通常TFTP和DHCP服務都由同一臺服務器提供,且大多數時候還提供NFS/FTP/HTTP服務,因此PXE服務器通常是提供3合一的服務。網絡
(1).Client向PXE Server上的DHCP發送IP地址請求消息,DHCP檢測Client是否合法(主要是檢測Client的網卡MAC地址),若是合法則返回Client的IP地址,同時將pxe環境下的Boot loader文件pxelinux.0的位置信息傳送給Client。app
(2).Client向PXE Server上的TFTP請求pxelinux.0,TFTP接收到消息以後再向Client發送pxelinux.0大小信息,試探Client是否滿意,當TFTP收到Client發回的贊成大小信息以後,正式向Client發送pxelinux.0。dom
(3).Client執行接收到的pxelinux.0文件。
(4).Client向TFTP請求pxelinux.cfg文件(其實它是目錄,裏面放置的是是啓動菜單,即grub的配置文件),TFTP將配置文件發回Client,繼而Client根據配置文件執行後續操做。
(5).Client向TFTP發送Linux內核請求信息,TFTP接收到消息以後將內核文件發送給Client。
(6).Client向TFTP發送根文件請求信息,TFTP接收到消息以後返回Linux根文件系統。
(7).Client加載Linux內核(啓動參數已經在4中的配置文件中設置好了)。
(8).Client經過nfs/ftp/http下載系統安裝文件進行安裝。若是在4中的配置文件指定了kickstart路徑,則會根據此文件自動應答安裝系統。
首先安裝dhcp服務端程序。
DHCP主要是提供客戶端網絡參數與TFTP的位置,以及boot loader的文件名。同時,咱們僅針對內網來告知TFTP的相關位置,因此能夠編輯/etc/dhcp/dhcpd.conf在subnet的區塊內加入兩個參數便可。其中PXE上專門爲PXE客戶端下載的boot loader文件名稱爲pxelinux.0。
vim /etc/dhcp/dhcpd.conf ddns-update-style none; default-lease-time 259200; max-lease-time 518400; option routers 172.16.10.10; option domain-name-servers 172.16.10.10; subnet 172.16.10.0 netmask 255.255.255.0 { range 172.16.10.11 172.16.10.100; option subnet-mask 255.255.255.0; next-server 172.16.10.10; # 就是TFTP的位置 filename "pxelinux.0"; # 告知得從TFTP根目錄下載的boot loader文件名 }
重啓dhcp。
service dhcpd restart
從流程圖中能夠看出,boot loader文件pxelinux.0以及內核相關的配置文件(目錄pxelinux.cfg下)主要都是由TFTP來提供的!
TFTP的安裝很簡單,直接使用yum便可。不過要告訴客戶端TFTP的根目錄在哪裏,這樣客戶端才能找到相關文件。另外要注意,TFTP是由xinetd這個super daemon所管理的,所以設定好TFTP以後,要啓動的是xinetd。
默認TFTP服務的根目錄是/var/lib/tftpboot/,爲了少寫些字母,將tftp的根目錄修改成/tftpboot/。修改tftp的配置文件,主要是TFTP的根目錄。
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 #重點在這裏!修改tftp的根目錄 disable = no per_source = 11 cps = 100 2 flags = IPv4 }
建立tftp的根目錄。
啓動TFTP並觀察之:
接下來的文件必需要放置於/tftpboot/目錄下。
若是要使用PXE的開機引導的話,須要使用CentOS提供的syslinux包,從中copy兩個文件到tftp的根目錄/tftpboot下便可。整個過程以下:
yum -y install syslinux cp -a /usr/share/syslinux/{menu.c32,vesamenu.c32,pxelinux.0} /tftpboot/ mkdir /tftpboot/pxelinux.cfg ls -l /tftpboot/ -rw-r--r-- 1 root root 61796 Oct 16 2014 menu.c32 # 提供圖形化菜單功能 -rw-r--r-- 1 root root 26759 Oct 16 2014 pxelinux.0 # boot loader文件 drwxr-xr-x 2 root root 4096 Feb 24 20:02 pxelinux.cfg # 開機的菜單設定在這裏 -rw-r--r-- 1 root root 163728 Oct 16 2014 vesamenu.c32 # 也是提供圖形化菜單功能,但界面和menu.c32不一樣
pxelinux.cfg是個目錄,能夠放置默認的開機選項,也能夠針對不一樣的客戶端主機提供不一樣的開機選項。通常來講,能夠在pxelinux.cfg目錄內創建一個名爲default的文件來提供默認選項。
若是沒有menu.c32或vesamenu.c32時,菜單會以純文字模式一行一行顯示。若是使用menu.c32或vesamenu.c32,就會有相似反白效果出現,此時可使用上下鍵來選擇選項,而不須要看着屏幕去輸入數字鍵來選擇開機選項。通過測試,使用vesamenu.c32比menu.c32更加好看些。
這部分設定完畢後,就是內核相關的設定了。
要安裝Linux系統,必須提供內核文件,這裏以64位版本的CentOS 6.6爲例。
這裏計劃將內核相關文件放在/tftpboot/centos6.6/目錄下。
既然要從安裝鏡像中獲取內核相關文件,首先得要掛載鏡像。
其實僅須要vmlinuz和initrd.img兩個文件便可,不過這裏還將isolinux.cfg這個文件拷貝出來了,這個文件裏提供了開機選項,能夠以它做爲修改開機選項和菜單的模板,這樣修改起來比較容易,也更便捷!
修改開機配置文件isolinux.cfg。因爲拷貝它的時候重命名爲default,因此修改default便可。修改的地方標紅色了。
vim /tftpboot/default default vesamenu.c32 #這是必須項,或者改成menu.c32 #prompt 1 timeout 10 display ./centos6.6/boot.msg #這是爲選項提供一些說明的文件 menu background splash.jpg menu title Welcome to CentOS 6.6! 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 your Linux menu default #設置默認的光標停留在此label上 kernel ./centos6.6/vmlinuz #設置內核文件,注意相對路徑是從tftp的根路徑/tftpboot開始的 append initrd=./centos6.6/initrd.img quiet #設置init ramdom disk文件,並設置啓動時文本方式啓動 label vesa menu label Install system with ^basic video driver kernel vmlinuz append initrd=initrd.img xdriver=vesa nomodeset label rescue menu label ^Rescue installed system kernel vmlinuz append initrd=initrd.img rescue label local menu label Boot from ^local drive localboot 0xffff label memtest86 menu label ^Memory test kernel memtest append -
設置Bios從網卡啓動。
因爲到這裏我尚未提供Linux的安裝文件,因此選擇URL從互聯網來獲取系統安裝。
因爲要從互聯網上獲取系統安裝文件,因此須要設置IP等網絡參數,但要注意,這裏的網絡參數和前面設置的PXE網絡參數是無關的,這裏設置的IP僅是爲了聯上互聯網。因爲已經配置了DHCP,因此這裏選擇DHCP。
設置一個獲取Linux系統的站點。上圖設置的是163的站點。
若是沒什麼問題,到這裏就開始進行安裝直到完成了。如下是進度圖片。
如今在本地服務器上安裝http或ftp或nfs來做爲系統文件的來源。
首先掛載Linux的鏡像光盤(前文已經掛載過了),假設掛載到/mnt目錄上。
mount /dev/cdrom /mnt 注意,要提供的是鏡像中的全部文件,而不是簡單的提供一個鏡像。因此將/mnt中的全部文件複製出來,假設複製到目錄/install目錄下。
mkdir /install
cp -a /mnt/* /install 其實也能夠不用複製出來的,只須要將鏡像掛載到某個目錄下,只要nfs/http/ftp可以找到它就好了。
(1). 使用NFS提供安裝文件
yum -y install rpcbind nfs-utils 啓動rpcbind和nfs。
service rpcbind start
service nfs start 而後導出/install目錄給須要安裝系統的客戶端,這裏導出給整個網段。
exportfs -o ro,async,no_root_squash 192.168.100.0/24:/install
showmount -e
Export list for node1.longshuai.com:
/install 192.168.0.0/24
(2). 使用http提供安裝文件
安裝httpd。
yum -y install httpd
service httpd start 因爲http的DocumentRoot "/var/www/html",因此係統的安裝文件須要在此目錄下或其子目錄才能找到,假設在/var/www/html/centos6.6目錄下,只須要簡單的將鏡像掛載到此目錄便可。
mkdir /var/www/html/centos6.6
mount /dev/cdrom /var/www/html/centos6.6
(3). 使用vsftpd來提供安裝文件
yum -y install vsftpd 因爲這裏僅用來提供下系統的安裝文件,因此就不必對vsftpd多多配置了,使用它最簡單的匿名用戶模式便可,可是匿名用戶的根目錄爲/var/ftp,因此要將鏡像掛載到此目錄或此目錄下的子目錄下,假設放在/var/ftp/centos6.6。
mkdir /var/ftp/centos6.6
mount /dev/cdrom /var/ftp/centos6.6
(4). 測試並填寫安裝文件的路徑地址
到此,就能夠啓動虛擬機來測試了。和前面的同樣,直到下面這裏。
對於ftp和http,直接填寫便可。
ftp://192.168.100.100/centos6.6
http://192.168.100.100/centos6.6
對於NFS寫這樣的路徑,由於在上面NFS的設定上是導出了/install目錄,安裝文件也是複製到此文件中的。
而後就會進入安裝畫面,可是這樣仍是有些地方須要手動指定的。沒法實現非交互時無人值守的方式安裝。
因此下文就介紹kickstart實現無人值守的方式。
所謂的無人值守,就是自動應答,當安裝過程當中須要人機交互提供某些選項的答案時(如如何分區),自動應答文件能夠根據對應項自動提供答案。可是,無人值守並不徹底是無人值守,在設置bios從網卡啓動是必須人爲設置的,且安裝完系統後設置不從網卡啓動也是須要人爲設置的。此處以外,其餘的均可以無人值守。
要配置無人值守的系統安裝,須要提供安裝過程當中須要的各類選擇,這些選擇在kickstart的配置文件中,通常正常安裝完Linux系統在root用戶的家目錄下有一個anaconda-ks.cfg,該文件的配置說明見kickstart文件詳解。如下是該文件中的部份內容。
不難發現,裝系統時不少選項在這裏面都記錄了。
那麼,要使用kickstart來批量部署操做系統,就須要提供該文件。如下是我提供的配置文件/install/ks.cfg(由於我是使用NFS做爲文件提供源的,因此我將其放在nfs的導出目錄中,讓客戶端可以找到)。其中rootpw的加密密碼要使用grub-crypt生成。
vim /install/ks.cfg install text nfs --server=192.168.100.100 --dir=/install #url --url=http://192.168.100.100/centos6.6 bootloader --location=mbr --driveorder=sda --append="crashkernel=auto quiet" lang en_US.UTF-8 keyboard us network --onboot no --device eth0 --bootproto dhcp --noipv6 rootpw --iscrypted $6$x4u9sIfSQsO7ddk5$/.0Xe6tFBY0uUmFFtyvAeY9YVPtcn8zl21fFNgmAoYtepQHRYDthQ4T1ZE12kDfAT6O3oXfRb7uv214t3Bb3K1 firewall --service=ssh authconfig --enableshadow --passalgo=sha512 selinux --disabled timezone Asia/Shanghai reboot #安裝結束後重啓 #make partitions zerombr clearpart --all --initlabel part /boot --fstype=ext4 --asprimary --size=250 part / --fstype=ext4 --asprimary --grow --size=2000 part swap --fstype=swap --size=2000 %packages @base @core @debugging @development @dial-up @hardware-monitoring @performance @server-policy @workstation-policy sgpio device-mapper-persistent-data systemtap-client %post #結束後作的事 cat >>etc/yum.repos.d/base.repo<<eof [base] name=163repo baseurl=http://mirrors.163.com/centos/6/os/x86_64/ gpgcheck=0 enable=1 eof sed "s/ONBOOT.*$/ONBOOT=yes/" /etc/sysconfig/network-scripts/ifcfg-eth0 #設置網卡爲啓動 sed "s/rhgb //" /boot/grub/grub.conf #設置啓動系統時不使用圖形進度條方式 sed "s/HOSTNAME=.*$/HOSTNAME=xuexi.longshuai.com/" /etc/sysconfig/network #設置主機名 %end
而後修改defalut文件,讓客戶端可以找到ks.cfg文件。
vim /tftpboot/pxelinux.cfg/default label linux menu label ^Install your Linux menu default kernel ./centos6.6/vmlinuz append initrd=./centos6.6/initrd.img ks=nfs:192.168.100.100:/install/ks.cfg quiet
若是要使用LVM的分區方式,參考以下:
part /boot --fstype ext4 --size=100 part swap --fstype=swap --size=2048 part pv26 --size=100 --grow volgroup VG00 --pesize=32768 pv26 logvol / --fstype ext4 --name=LVroot --vgname=VG00 --size=29984 logvol /data --fstype ext4 --name=LVdata --vgname=VG00 --size=100 --grow
若是以爲使用的方式手工寫配置文件比較麻煩,也可使用圖形化工具來製做ks.cfg文件。在linux中用yum安裝system-config-kickstart就好了(圖形化依賴於x-window),選項也有些限制(好比分區不能使用lvm)。
而後找臺機器從網卡啓動就進入安裝模式了。
由於在ks.cfg中設置了安裝完成後reboot,因此要手動去修改bios不要再從網卡啓動,不然重啓後又再次從網卡啓動而後又去自動應答裝系統了。固然,能夠將reboot換成shutdown或者poweroff,這樣裝完就只是關機了,等開機前人爲設置不從網卡啓動。