前言
在安裝作業系統時最常見的方式就是透過 CD/DVD 開機並透過它為安裝媒體的來源,而這邊所說的 PXE (Preboot eXecution Environment) 則是透過網路卡開機的方式進行開機與安裝作業系統.
一開始可能會覺得怎麼有可能透過這樣的方式來進行安裝作業系統,他是怎麼做到的.先說說 PXE 的歷史,他是由 Intel 所提出,最主要的目的就是希望網卡能像是 其他裝置如:硬碟,光碟,磁碟機一樣可以擔任開機的動作.所以我們主機的 BIOS 必須要支援從網卡開機.
在網卡上有一塊 ROM (firmware) 裡面存放了一些基本的網路協定,透過這些協定使得 PXE 可以進行網路的存取,進一步取得網路上的資源.
- Internet Protocol (IP)
- User Datagram Protocol (UDP)
- Dynamic Host Configuration Protocol (DHCP)
- Trivial File Transfer Protocol (TFTP)
PXE 是作業系統前的一個作業環境,所以他最主要的工作就是將任何的作業系統載入.多數的網卡都支援 PXE 功能,有些甚至還支援到 iSCSI Boot 的功能.
先來說明一下 PXE Boot 步驟
- BIOS 由 PXE boot ROM 開機.
- PXE boot ROM 的第一步就是透過 DHCP 取得 IP.
- 在獲得 DHCP 分配的 IP 以及其他選項參數,裡面包括 pxelinux.0 ( 這個檔案由 Syslinux 套件提供) 是 PXE 開機的前導程式.
- 接下來 PXE 會透過 TFTP 協定 (PXE ROM 只能使用該協定) 去下載該檔案 pxelinux.0
- 當 PXE 成功下載到 pxelinux.0 檔案, 主控權就交給 pxelinux.0 前導程式,前導程式啟動之後會去讀取位於 /tftpboot/linux-install/pxelinux.cfg/ 目錄下的 PXE 開機設定檔.
- 如果 PXE ROM 無法完成上序的步驟,有些 BIOS 就會依序啟動其他可以開啟的裝置.
參考網站 http://pxe.dev.aboveaverageurl.com/index.php/PXE_Booting
PXE 環境需求
PXE 環境需求為一台具有以下服務的系統,作業系統我選擇的是 Red Hat Enterprise Linux 3 版本,以及一台具有網路開機 PXE 功能的機台.
PXE 最主要透過兩個 Protocol 來進行網路資源的存取,DHCP 和 TFTP, 透過 DHCP 讓 PXE 獲得 IP 以及得知開機前導程式 (bootstrap program) pxelinux.0 的網路位置,而 TFTP 則是讓 PXE 可以下載該前導程式. 其他具有 DHCP 和 tftp 服務的 Linux 皆可以擔任此項工作.
- DHCP Server
編輯 DHCP 設定檔[root@benjr ~]# vi /etc/dhcpd.conf # ddns-update-style interim ddns-update-style none; ignore client-updates; allow booting; allow bootp; class "pxeclients" { match if substring(option vendor-class-identifier, 0, 9) = "PXEClient"; next-server 192.10.0.1; filename "linux-install/pxelinux.0"; } subnet 192.10.0.0 netmask 255.255.255.0 { range 192.10.0.150 192.10.0.180; option broadcast-address 192.10.0.255; option routers 192.10.0.1; option subnet-mask 255.255.255.0; option domain-name-servers 192.10.0.1; }
- match if substring(option vendor-class-identifier, 0, 9) =PXEClient
這一個選項會檢查是否為實體的網路卡,如果你是準備給 virtual machine 時可以移除這一個選項. - next-server
就是你的 tftp server 所在的位置 (DHCP TFTP 可以在同一台伺服器上).我這邊的例子使用 192.10.0.1 至於其他有關於 DHCP 的設定說明起自行參考 DHCP 的官方網站 http://www.isc.org - filename “linux-install/pxelinux.0”
在整個 DHCP 設定檔中,最重要的就是 filename “linux-install/pxelinux.0” 整個網路開機顯示畫面,流程控制都由 pxelinux.0 來管理,關於更多有關於 pxelinux.0 ,請參考 PXELinux 的官方網頁 http://syslinux.zytor.com/wiki/index.php/PXELINUX - option domain-name-servers 192.10.0.1
為非必要選項,如果你有設定就不用再指定 DNS 位址.但是相對應的 DNS(Bind Server)也要設定.
並確定 DHCP 的服務已經開啟
[root@benjr ~]# chkconfig dhcpd on [root@benjr ~]# service dhcpd start
- match if substring(option vendor-class-identifier, 0, 9) =PXEClient
- TFTP Server 的設定
編輯 tftp 設定檔[root@benjr ~]# vi /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 per_source = 11 CPUS = 100 2 flags = IPv4
將 disable 設定成為 no 即可將 server 開啟.或者你可以用下面的指令將 tftp 功能開啟
[root@benjr ~]# chkconfig tftp on
啟動 tftp 服務
[root@benjr ~]# service xinetd restart
在使用時最常遇到的錯誤大概都是在 DHCP tftp 設定路徑上面的錯誤,關於如何除錯 TFTP 請參考 tftp 常見的錯誤訊息 https://benjr.tw/94695
- PXE 設定檔
PXE 由開機前導程式 pxelinux.0 啟動之後會去讀取 PXE 開機的設定檔 /tftpboot/linux-install/pxelinux.cfg/ 目錄下的檔案.系統會找是不是有跟他相對應的 1.UUID 2.MAC address 3.IP address 如果都沒有才從讀取 default 這個檔案. 通常我沒有要針對不同的系統設定不同的設定檔,所以通常直接編輯 /tftpboot/linux-install/pxelinux.cfg/default (這個檔案定義了與 PXE 的 Clients 如何透過鍵盤來選擇對應的動作)編輯 /tftpboot/linux-install/pxelinux.cfg/default
[root@benjr ~]# vi /tftpboot/linux-install/pxelinux.cfg/default default 0 timeout 2000 F1 msgs/boot.msg F2 msgs/expert.msg prompt 1 display msgs/boot.msg label 0 localboot 1 label 1 kernel as3u2/vmlinuz append initrd=as3u2/initrd.img ramdisk_size=65536
設定檔說明:
- default 0
如果使用者不選擇安裝哪一種 OS 這邊就可以設定預設安裝哪一個 OS,default 0 的意是就是使用 label 0 的設定. - timeout 2000
預設安裝生效時間為 2000(200秒). - F1 msgs/boot.msg
- F2 msgs/expert.msg
這邊是用來定義功能鍵 F1 至 F12 所對應要顯示的文字檔案 F1 – boot.msg , F2 – expert.msg. - prompt 1
效果不明???? - display msgs/boot.msg
boot.msg 這個檔案就是PXE 開機所顯示的第一個提示訊息.後面會在編譯. - label 0
localboot 1
label 後面接的字串就是使用者可以透過鍵盤來指定 PXE 後續要做的動作 (label 0 就是按鍵 0 ). localboot 1 定義了使用系統上的硬碟來直接開機. - label 1
kernel as3u2/vmlinuz
append initrd=as3u2/initrd.img ramdisk_size=65536
這裡定義安裝作業系統時所需的 Kernel 與 initrd ,後面會將作業系統開機所需檔案放置到指定的位置上.
編輯 /tftpboot/linux-install/msgs/boot.msg
這個檔案就是 PXE Clients 經由 PXE 開機時所看到的提示訊息.[root@benjr ~]#vi /tftpboot/linux-install/msgs/boot.msg
如果你的系統有多個網路布,還需要在 /etc/rc.d/rc.local 必須加入下面這一行
[root@benjr ~]# vi /etc/rc.d/rc.local route add -host 255.255.255.255 eth0
- default 0
- FTP , NFS , HTTP
後續的安裝則需要透過 FTP , NFS , HTTP .有提供此服務的 Linux 皆可以擔任此項工作.RedHat Linux 透過 PXE 來安裝作業系統時可以透過 3 種網路媒體 FTP, NFS , HTTP 來做安裝的來源.這邊簡單介紹一下怎麼針對這 3 種安裝媒體來做設定.
複製 RedHat 光碟所有的內容 (這邊我是用 RedHat Enterprise Linux Advanced server 3.0 Update 2 為範例),檔案放置在 FTP 的預設路徑 /var/ftp[root@benjr ~]# mkdir /var/ftp/as3u2 [root@benjr ~]# cp -rf /mnt/cdrom/* /var/ftp/as3u2/
由 FTP (vsftp) 來安裝
請確定 ftp 的服務已經開啟,ftp 預設路徑為 /var/ftp ,所以沒有其他設定.[root@benjr ~]# chkconfig vsftpd on [root@benjr ~]# service vsftpd restart
由 NFS 來安裝
編輯 /etc/exports 並將 /var/ftp/as3u2 目錄分享(因為我們將把光碟內的檔案放在此目錄下,此為FTP預設的分享目錄)[root@benjr ~]# vi /etc/exports /var/ftp/ 192.10.0.*(ro,all_squash)
並確定 NFS 的服務已經開啟
[root@benjr ~]# chkconfig nfs on [root@benjr ~]# service nfs start
由 HTTP 來安裝
編輯 /etc/httpd/conf/httpd.conf 並將 DocumentRoot 設為 /var/ftp (因為我們將把光碟內的檔案放在此目錄下,此為 FTP 預設的分享目錄)[root@benjr ~]# vi /etc/httpd/conf/httpd.conf DocumentRoot /var/ftp
並確定 HTTP 的服務已經開啟
[root@benjr ~]# chkconfig httpd on [root@benjr ~]# service httpd restart
- 所需的 Kernel 與 initrd
還記得剛剛編輯 /tftpboot/linux-install/pxelinux.cfg/default 最後有設定 as3u2 vmlinuz 與 initrd ,因為 PXE 開機後所需的檔案是透過 tftp 協定傳送,檔案需儲存在 /tftpboot/linux-install/,所以需要將開機 RedHat Enterprise Linux Advanced server 3.0 Update 2 所需的 kernel 和 initrd 檔案複製到 “/tftpboot/linux-install/as3u2 目錄下[root@benjr ~]# mkdir /tftpboot/linux-install/as3u2 [root@benjr ~]# cp /var/ftp/as3u2/image/pxeboot/vmlinuz /tftpboot/linux-install/as3u2 [root@benjr ~]# cp /var/ftp/as3u2/image/pxeboot/initrd.img /tftpboot/linux-install/as3u2
The PXE clients
- 將具有 PXE 功能網路卡的 client 開機.
- 請先確定 PXE 功能已經在 BIOS 下開啟,並設為第一開機順位,並從 PXE 開機
- 選擇你想要安裝的作業系統,如果你有參數可以在這邊加入.
Begin Downloading linux kernel image and initrd image ..
此時就開始安裝作業係統 - 你可以選擇 FTP , NFS 或 HTTP 等方式來安裝
- 至於 server IP 就是 192.10.0.1,我將光碟內容都放在 192.10.0.1:/var/ftp/ 目錄下
至於目錄根據不同的方式有所不同
使用 FTP 方式的目錄:/as3u2
使用 NFS 方式的目錄:/var/ftp/as3u2 (只有透過NFS才會有圖形界面的安裝)
使用 HTTP 方式的目錄 : /as3u2 - 接下來的安裝過程就和一般光碟安裝一樣.
其他 Linux Distribution
其他 Linux Distribution , Turbo Linux , SuSE Linux Enterprise Server , Ubuntu , VMware , XenServer , RedHat , FreeBSD , Windows 請參考 https://benjr.tw/15426
PXE 延伸閱讀
UEFI 與 IPV6 PXE boot 請參考 – https://benjr.tw/16137
34 thoughts on “Linux – Legacy PXE NetBoot”