跳到主要內容

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操作不求人 - 伍章之伍 - make 巨集式編譯器

make是Linux下安裝軟體與程式一個相當重要的工具,如前章節所提的安裝軟體三劍客。 configure, make , make install。當我們完成自己所撰寫的C 或 fortran程式,通常會使用編譯器指令 gcc -cgfortran -c 來編譯成連結檔或物件檔函式庫(Library),如 .a (https://en.wikipedia.org/wiki/Static_library) .o .so等附檔名,而此函式庫又可以讓其他程式利用其中的函式與類別。何時要用到動態或靜態函式庫,stackoverflow有專業的回答(https://stackoverflow.com/questions/140061/when-to-use-dynamic-vs-static-libraries)。

假設我們要寫一個簡單的 C 程式,檔名為 hellomake.c,用 make 來編譯我們的程式,程式如下:
#include<stdio.h>
void main ( void )
{
   print ("This is my first c file."\n);
}

---------------------------------------------------
儲存離開後,利用autoscan 指令,便會產生如圖5-70的兩個檔 autoscan.log 與 configure.scan,而 configure.scan 便是需要產生標準的 GNU makefile 的關鍵檔。我們可以把他改成 configure.in 或 configure.ac,並利用 vim configure 來修改參數,如圖5-71,改為圖5-71右邊的參數











(圖5-70)





(圖5-71)


修改完 configure.in 內的參數後,再執行 aclocal 與 autoconf ,就會產生 autom4te.cache 的資料夾與 configure 的執行檔,此執行檔就是先前章節所要編譯原始碼前,會執行的 ./configure ,並會產生適合您的機器環境之 GNU Makefile,如圖5-72


(圖5-72)
接著編輯 Makefile.am 檔的內容,加入如下內容
AUTOMAKE_OPTION=foreign b…

Linux操作不求人 - 肆章之貳 - 伺服器架設(II) - 郵件伺服器 - postfix 與 dovecot

CentOS6_x64 在預設狀態下,通常已經有開啟發 email 的伺服器軟體 postfix,但僅限制在本機(localhost / 127.0.0.1 ) 使用,且僅是讓系統可以傳送錯誤訊息給 root。故我們要經由設定,讓電腦主機內的使用者帳號,皆可以收發 email,而我們用的送信軟體為 postfix,負責 smtp 的部分( https://en.wikipedia.org/wiki/Simple_Mail_Transfer_Protocol ) ,收信軟體則為 dovecot,負責 pop 或 imap ( https://en.wikipedia.org/wiki/Post_Office_Protocol,https://en.wikipedia.org/wiki/Internet_Message_Access_Protocol )的部分,收發信機制的運作機制,可參考wikipedia,https://en.wikipedia.org/wiki/Email,筆者不再贅述,直接說明架設伺服器軟體的操作。先利用 rpm -qa | grep postfix 與 rpm -qa | grep dovecot 來查詢是否已經有安裝,若無,則利用 yum install postfix 與 yum install dovecot 來安裝。除此之外,再利用 chkconfig | grep postfix 與  chkconfig | grep dovecot 來確認是否有在開機時啟動,若想自動化開機啟動,再請設定 chkconfig --level 235 postfix on 與  chkconfig  --level 235 dovecot on 來載入。 如圖4-10與圖4-11:
































(圖4-10)
















(圖4-11)

     接著我們利用 vim 來修改 postfix 設定檔  /etc/postfix/main.cf 。相同地,我們先閱讀設定檔內容前面的說明,postfix 的作者相當細心,每個設定前的說明很詳細,故設定檔很長,請讀者要有耐心閱讀,如圖4-12-1 至 圖4-12-7。往後篇章若設定檔內容太長,筆者便不再列出,會直接說明新增與修改處,在此先說明。




























































































(圖4-12-1)




























































































(圖4-12-2)





























































































(圖4-12-3)





























































































(圖4-12-4…

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)






































(圖4-3-2)
     首先,筆者強烈建議設定前,先閱讀 /etc/ssh/sshd_config 檔案內容前幾行的說明,如之前我們做任何的服務設定前,務必閱讀說明文字。說明告訴我們,若要更動預設參數設定,可以移除符號 # ,並更改後面的參數值。而我們要改動的參數主要為以下幾項: Port   22 /*  一般 ssh 預設的 port 為 22,所以〝你知道、我知道、獨眼龍也知道〞,故建議可以更換預設 p…