跳到主要內容

Linux操作不求人 - 伍章之陸 - Intel PXE 與利用 tftp + anaconda kickstart來自動部署系統

     現代的個人電腦與筆電爲了節能省碳,往往皆省略了光碟機的設置。雖然說 USB隨身碟亦可應用於安裝作業系統,但若遇到機房的大量機器需安裝之問題,亦不適合此種用光碟片或隨身碟逐臺安裝的方式,或是需準備多片光碟或隨身碟。故爲了大量安裝與部屬 Linux作業系統的機器,我們便可透過具有PXE功能之網路卡(https://en.wikipedia.org/wiki/Preboot_Execution_Environment),其所具備的網路開機的能力,來作透過網路方式來安裝與大量部署 CentOS Linux作業系統。其原理 wikipedia 的PXE說明,都解釋得很清楚,筆者不需要再 " 掉書包 ",在開發者大神面前班門弄斧,我們就直接來做做看。
     首先,我們一樣透過 yum來安裝所需的 tftp伺服器軟體(http://www.jounin.net/tftpd32.html),利用PXE支援 tftp 透過 udp 埠號 69連線,來提供檔案的能力,給利用 PXE開機後安裝作業系統的機器,圖5-60
 





































(圖5-60)


接著修改 tftp 設定檔 /etc/xinetd.d/tftp,如圖5-61,請記得 disable 要改為 no


(圖5-61)

     若要修改 server_args 參數為自訂的 tftp root 路徑,記得要變更 SELinux 的權限設定,如要改為/tftpboot,則使用指令 chcon 來調整,如以下:
$ mkdir /tftpboot
$ chcon  --reference /var/lib/tftpboot  /tftpboot

接著將 xinetd 與 tftp 加入開機啟動,並重啟動 xinetd,如下:
$ chkconfig  --level  235  xinetd on
$ chkconfig  --level  235  tftp  on
$ service xinetd restart

開放防火牆通行
$ iptables -A INPUT -p udp --dport 69 -j ACCEPT
$ service iptables restart 

開放 tcp wrapper 設定,更改 /etc/hosts.allow (以為只有udp,常忘記此設定要改,要注意)
in.tftpd:*  # * 為設定您要開放的IP或網域
xinetd:*    # * 為設定您要開放的IP或網域

其他安全性問題,可參考tftp 說明檔,位置在 /usr/share/doc/tftp-server-0.49/README.security
因 tftp 的啟動為依附在 xinetd 服務內, 故僅需啟動 xinetd 。為了確認服務已經啟動,可以利用以下指令確認 xinetd 的 udp 是否有啟動在 listen ,而 tftp 使用 udp 埠號 69來傳輸
$  netstat -ulnp |  grep xinetd

下一步,我們要利用 syslinux 軟體,幫 PXE 建立開機管理程式與選單。一樣用 yum 指令安裝,如圖5-62





























(圖5-62)

     安裝完 syslinux 軟體後,我們將 PXE boot 所需的參數與選單檔 menu.c32,vesamenu.c32,chain.c32,pxelinux.0 ,從/usr/share/syslinux 複製到 /var/lib/tftpboot 資料夾內( menu.c32 (黑白)與 vesamenu.c32可擇一 ),並且在/ var/lib/tftpboot 內產生 pxelinux.cfg 資料夾,資料夾裡放置如 grub 的選單選項清單檔,檔名設定為 default (for legacy BIOS) , 可用 touch default 來建立。此default 為提供給 PXE 機器當開機選單的設定,如圖5-63。因提供PXE開機選單的機制,需透過 dhcp server 的能力,隨著IP分配並同時分配選單檔 pxelinux.0 給PXE開機之機器,故要記得修改 dhcp 伺服器軟體參數檔 ,CentOS為 /etc/dhcp/dhcpd.conf (dhcp 設定可參考前面篇章http://3cbarbarian.blogspot.tw/2016/09/linux-vii-proxy-dhcpnat-dhcp.html),再將 pxelinux.0 檔案加入 dhcp的服務,如圖5-64,因為實機實作,故筆者已將敏感IP資訊遮起來。圖5-64主要加入tftp主機與主動下載的檔案,為以下兩參數:
next-server  140.x.x.x;   # next-server 為tftp的IP位址
filename "pxelinux.0";  # 為指定 tftp root /var/www/tftp 下方的 pxelinux.0 檔












(圖5-63)

























(圖5-64)

     接下來需要Linux 開機的 vmlinuz initrd.img 此二個開機必要之程式,筆者在前面核心編譯的篇章說明過(http://3cbarbarian.blogspot.tw/2016/07/linux-linux-vii.html)。故我們要利用原版光碟片的 iso 映像檔,來將此二個開機所必要之程式,放入開機核心到 /var/lib/tftpboot。我們可利用wget 下載 iso 映像檔。指令如下
$ cd /var/lib/tftpboot
$ wget  http://ftp.twaren.net/Linux/CentOS/6.8/isos/x86_64/CentOS-6.8-x86_64-bin-DVD1.iso

下載後,再經由下方指令先掛載光碟iso映像檔
$ mkdir /mnt/centos6_disc1
$ mount  -t   iso9660  -o  loop,ro  CentOS-6.8-x86_64-bin-DVD1.iso  /mnt/centos6_disc1
/*  若不加上  -o loop ,則會出現 is not a block device (may try `-o loop' ?) 之訊息,加上 ro(read only) 確保原始映像檔不被修改  */

接著利用指令 make /var/lib/tftpbook/centos6 ,產生要用於PXE開機用的參數資料夾,並複製 iso 內 isolinux 資料夾下的的 vmlinuz 與 initrd.img 兩個檔案至 /var/lib/tftpboot/centos6,指令如下

$ cp  /mnt/centos6_disc1/isolinux/vmlinuz  /var/lib/tftpboot/centos6/
$ cp  /mnt/centos6_disc1/isolinux/initrd  /var/lib/tftpboot/centos6/

     上面步驟完成後,我們要來設定pxe開機要讓使用者看到的選單項目,故我們可參考iso光碟黨內 isolinux 資料夾的 isolinux.cfg 內容,並用於我們的 /var/lib/tftpboot/pxelinux.cfg/default 檔案內容,如圖5-65,有EFI 啟動 PXE 需求的讀者,可以參閱 https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/6/html/Installation_Guide/s1-netboot-pxe-config.html#s1-netboot-pxe-config-bios 之詳細說明。




























(圖5-65)

     圖5-65 之 default 設定為 vesamenu.c32,主要是利用符合 vesa 色彩之選單。timeout 設定為 600,是指定讓選單顯示 60 秒時間就進入預設值。display 為顯示訊息內容,來自 boot.msg。
接著的 menu title 與 menu color 為設定選單的上方名稱與顏色。下方兩個 label 顯示兩個選項可供選擇,內有 menu default 為指定預設開機的選項,筆者為預設選定用本機硬碟開機(localboot 0),而 label mylinux 則利用 kernel 與 initrd 兩參數指向剛剛複製的Linux開機檔,在/var/lib/tftp 下之路徑,./centos6/vmlinuz 與 ./centos6/initrd.img,對詳細選項設定參數有興趣的讀者,可參考 http://www.syslinux.org/wiki/index.php?title=PXELINUX

     接著便要設定讓用PXE安裝作業系統的機器,可以讀到完整光碟檔內容,當然網路上已經有很多CentOS 6 安裝檔案的資源(如高速電腦中心供下載的http://free.nchc.org.tw/centos/6.8/isos/x86_64/ 與 http://ftp.twaren.net/Linux/CentOS/6.8/os/x86_64),選單 append 後方可新增ip=dhcp --url=http://free.nchc.org.tw/centos/6.8/isos/x86_64/ , 可以直接經由網路連結使用,但這些都是在網際網路安裝可能比較緩慢,故我們可以建立一份在自己的網頁伺服器上(可參考前面網頁伺服器篇章http://3cbarbarian.blogspot.tw/2016/09/linux-iii-i-apache-nginx.html),用於分享安裝 CentOS 6 所需的檔案,在Linux下有很多種分式分享檔案內容NFS,CIFS,FTP,HTTP,筆者僅使用HTTP來說明。首先,我們在可以執行HTTP網頁的資料夾(如/var/www/html),建立一個資料夾,並將光碟映像檔掛在至此資料夾,如以下指令
$ cd /var/www/html
$ mkdir pxeos
$ mkdir pxeos/centos6_disc1
$ mkdir pxeos/centos6_disc2
$ mount -t iso9660 -o loop,ro  /var/lib/tftpboot/CentOS-6.8-x86_64-bin-DVD1.iso \
/var/www/html/centos6_disc1
$ mount -t iso9660 -o loop,ro  /var/lib/tftpboot/CentOS-6.8-x86_64-bin-DVD2.iso \
/var/www/html/centos6_disc2
/*  以上因 Centos 6.8 iso DVD 有兩片光碟  */

並可在 /etc/fstab 設定永久掛載,如下
/var/lib/tftpboot/CentOS-6.8-x86_64-bin-DVD1.iso  /var/www/html/centos6_disc1  iso9660 defaults,loop 0 0
/var/lib/tftpboot/CentOS-6.8-x86_64-bin-DVD2.iso  /var/www/html/centos6_disc2  iso9660 defaults,loop 0 0

接著筆者要說明,如果我們需要同時進行很多機器自動安裝系統(如 cluster),這時就需依靠 anaconda kickstart  的能力來進行。我們可以試著用指令 vim  /root/anaconda-ks.cfg ,打開在我們安裝系統過程,anaconda 所產生的 kickstart 設定檔。亦可在多台欲安裝的機器內,先安裝系統在第一台機器上,安裝後可複製 /root/anaconda-ks.cfg 檔來使用在我們要透過 PXE安裝方式之 kickstart 設定檔,並依此檔案內容來修改以應用於其他未安裝的同規格機器。假設我們是要安裝一台全新的單硬碟500G之電腦,我們可將  kickstart 設定檔 可以修改為圖5-66 內容並存為 mycentos-ks.cfg,詳細參數可參考 https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/6/html/Installation_Guide/s1-kickstart2-file.html:





































(圖5-66)

     圖5-66前面可設定 text 或 graphical,主要為較快速的文字安裝介面與較美觀的預設圖形安裝方式。reboot 意旨安裝後自行重開機。url 為筆者安裝來源檔設定為 http:// 的分享方式。lang 與 keyborad 為設定系統語系與鍵盤語言。還有可以設定 network,firewall,selinux,以及timezone。接著是bootloader 為 grub 所要放置的位置。接著的說明,為磁碟分割的方式,請讀者依自己的硬體磁碟大小來製作。筆者已經去除IP敏感資訊,與 rootpw --iscrypted 的加密後金鑰之資訊。且%packages為套件安裝的清單,後面還有很多,故清單太長已省略,在此先說明。磁碟分割的部份用 part 參數,主要分成 /boot/efi,/home,/var,/,swap。若想利用圖形設定來設定如以上的 kickstart 設定檔,有興趣的讀者亦可參考 https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/6/html/Installation_Guide/s1-redhat-config-kickstart-install.html。
設定好後,我們將此設定檔案的路徑加入開機選單,則 /var/lib/tftpboot/pxelinux.cfg/default 檔的 label Linux, 圖5-65內此段落要改為如下:
label  mylinux
   menu  label Boot from PXE ISO Server for CentOS6 Installation
   kernel ./centos6/vmlinuz
   append initrd=./centos6/initrd.img   ks=http://140.x.x.x/centos6_cfg/mycentos-ks.cfg 

/* 140.x.x.x 為筆者省略IP敏感資訊,請讀者輸入自己伺服器的IP位址,且有開一個centos6_cfg資料夾供下載 kickstart 設定檔 mycentos-ks-cfg ,對 kickstart 想多了解的讀者,可以參考 https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/6/html/Installation_Guide/s1-kickstart2-file.html */


最後就是PXE用戶端的設定,欲透過PXE安裝作業系統的機器,主要就是先進 BIOS 調整開機順序(因各家不同,先前篇章有提過),調整 Boot -> Boot Device Priority為可網路開機(Network or Ethernet)。調整後,網路開機如圖5-67,若tftp設定成功,則可以看到開機選單 5-68











(圖5-67)





















(圖5-68)

圖5-68按enter進入安裝(或是可按Tab來再次修改參數),就會開始進入 initrd 的載入部份,接著會執行 anacoda 的安裝,並按照我們的 kickstart 設定檔案(筆者為mycentos-ks.cfg),一步一步的自動安裝,如圖5-69。




















(圖5-69)
CentOS 7 可利用wget http://free.nchc.org.tw/centos/7.5.1804/isos/x86_64/CentOS-7-x86_64-DVD-1804.iso
下載原始檔,並掛載後,一樣把映像檔內的 isolinux/vmlinuzisolinux/initrd.img 複製到
/var/lib/tftpboot/centos7 下,並修改啟動選單,新增以下:
label CentOS 7 x64 Installation
   kernel ./centos7/vmlinuz
   append initrd=./centos7/initrd.img inst.repo=http://${your_ip}/centos/centos7



     利用上述的自動安裝方式,無論是叢集式電腦的作業系統需同時大量安裝,或是電腦教室多部電腦的同時安裝,皆可透過此方式。除可節省光碟機硬體採購與增加安裝的效率,其他亦可應用於大量授權之 MS Windows 7的光碟映像檔與自動安裝方式( https://www.microsoft.com/en-US/download/details.aspx?id=5753,https://technet.microsoft.com/en-us//library/dd349350(WS.10).aspx#Updates ),或是先利用如 nlite (https://www.ntlite.com/download/) 自行製作 MS Windows自動化安裝光碟映像檔,再藉由 PXE 的能力,來架設一個含有各種作業系統的PXE 伺服器,在企業或實驗室內網可用來自動安裝的伺服器,以增進系統建置的效率。


If you have any feedback or question, please go to my forum to discuss.

這個網誌中的熱門文章

Linux操作不求人- 肆章之壹 - 伺服器架設(I) - SSH(SFTP、SCP)、FTP伺服器與遠端連線

@ ssh, sftp      通常安裝好 CentOS6_x64 作業系統後,sshd, ssh daemon 的服務功能是預設開啟的,如筆者的前面篇章所述,預設的 iptables 防火牆設定,亦是開啟讓 ssh 的連線是可通過的,不僅可以連出,也可以被連入。若要確認是否有安裝 sshd 套件以及在啟動時的 runlevel 2 3 5 是否有被載入,可以使用以下指令搜尋: $   rpm  -qa  |   grep  openssh     #  ssh 與 sshd 連線服務皆由 openssh 應用軟體提供。 或使用以下 $   rpm  -qa  |   grep  ssh         #  比用關鍵字 openssh 搜尋更模糊,故符合的條件更多。      如圖4-1可以查詢到有關於 openssh-client 與 openssh-server 的套件, openssh-server 便是提供連入服務的軟體,openssh-client 為提供可以連出的工具。若無以上套件,則使用 yum install openssh ,則可下載安裝。 (圖4-1) 再接著輸入以下指令查詢到 sshd 這個服務,是否有再開機程序內載入,如圖4-2 $ chkconfig | grep ssh   # 查詢 sshd 是否有於 開機 runlevel 啟動 再利用以下指令,來查詢是否防火牆有允許連線 $ iptables  -L  |  grep ssh   # 出現如圖4-2 允許通過之條件 (圖4-2)      接下來,我們要先來調整 sshd 的設定檔,利用 vim  /etc/sshd/sshd_conf ,如圖4-3-1與4-3-2。因為設定檔參數很多,筆者為方便說明,將 /etc/sshd/sshd_conf 檔案內容分成兩張圖。 (圖4-3-1)

Linux 操作不求人系列 - 貳章之壹 - Shell Script 程式設計(I) - BASH

     本章開始進入Shell Scripts的程式設計,因為Linux Shell的種類相當多,故筆者僅挑選預設的Bash Shell 及 學術界常會使用的 C Shell (/bin/tcsh )來說明與對照,在此先說明。至於 Scripts 的概念,在前章就已經說明過,可視為前壹章的各項指令之組合,在令其在執行檔案裡,依序執行,如前章所看到的 /etc/profile 檔案,在其他軟體上,有點類似巨集(macro)的執行檔,或是MS Windows的批次檔(Batch)。先建立此概念後,我們可以先在Terminal的命令提示字元,使用 for 指令,如圖2-1,在 shell scripts 內為了重複做一件事,而僅修改某些變數值,我們會利用所謂的迴圈(loop)方式來完成,而 bash shell 內常用的是 for 或是 tcsh/csh shell 內的 foreach 。 (圖2-1)      圖 2-1第一個指令輸入 for 的宣告,後面接著 seq 為變數名稱,為了逐次接收  in 後面之陣列值(http://www.gnu.org/software/bash/manual/html_node/Arrays.html)(註:若加了  ; 則 do 便可寫在同一行),接著 > 的提示字元的等待輸入,便是還沒遇到 done 指令來結束 do 的動作,控制此提示字元的環境變數為 PS2 。,此例的 seq 值,依序為第一次讀入 first 字串並存入變數 seq 當其值,接著second、third,從 echo $seq 可以看出,接著設定一個變數 file 其值為 my開頭字串,緊接變數值 $seq(first、second、third),再接固定的 script.sh 字串,接著利用echo指令,印出變數值$file,檢查是不是我們預期的字串值(註:如果想要暫停,讓使用者可以看清楚再繼續,可以加上指令sleep 3,表示畫面停止三秒鐘),接著利用 touch 指令產生 $file 字串值的檔案,再將其利用 chmod 指令, u+x 參數為令僅創立此檔的使用者帳號可執行(若要改為同群組可執行,參數需改為 g+x )。故可看到第二個指令輸入 ls ,便列出自動批次