24,914 瀏覽數

Legacy – PXE Boot

前言

在安裝作業系統時最常見的方式就是透過 CD/DVD 開機並透過他為安裝媒體來安裝作業系統,而這邊所說的 PXE (Preboot eXecution Environment) 則是透過網路的方式進行開機並透過網路來安裝作業系統.

一開始可能會覺得怎麼有可能透過這樣的方式來進行安裝作業系統,他是怎麼做到的.先說說 PXE 的歷史,他是由 Intel 所提出,最主要的目的就是希望網卡能像是 其他裝置如:硬碟,光碟,磁碟機一樣可以擔任開機的動作.所以我們主機的 BIOS 必須要支援從網卡開機.

在網卡上有一塊 ROM (firmware) 裡面存放了一些基本的網路協定如: Internet Protocol (IP), User Datagram Protocol (UDP), Dynamic Host Configuration Protocol (DHCP) 以及 Trivial File Transfer Protocol (TFTP)  透過這一些協定使得 PXE 可以進行網路的存取進一步取得網路上的資源.

pxe_boot06

圖片出自於 http://download.intel.com/design/archives/wfm/downloads/pxespec.pdf

而 PXE 是指在作業系統前的一個作業環境,所以他最主要的工作就是將任何的作業系統載入的動作.目前多是數的網卡都支援 PXE 功能,有些甚至還支援到 iSCSI Boot 的功能.目前 PXE 已經是一個成熟的標準協定.

詳細的技術可以參考 Intel 網站的 PXE 規格書.
http://download.intel.com/design/archives/wfm/downloads/pxespec.pdf
先來說明一下 PXE Boot 步驟

  1. BIOS 由 PXE boot ROM 開機.
  2. PXE boot ROM 的第一步就是透過 DHCP 取得 IP.
  3. 在獲得 DHCP 分配的 IP 以及其他選項參數,裡面包括 pxelinux.0( 這個檔案由 Syslinux 套件提供) 是 PXE 開機的前導程式.
  4. 接下來 PXE 會透過 TFTP 協定 (PXE ROM 只能使用該協定) 去下載該檔案 pxelinux.0
  5. 當 PXE 成功下載到 pxelinux.0 檔案, 主控權就交給 pxelinux.0 前導程式,前導程式啟動之後會去讀取位於 /tftpboot/linux-install/pxelinux.cfg/ 目錄下的 PXE 開機設定檔.
  6. 如果 PXE ROM 無法完成上序的步驟,有些 BIOS 就會依序啟動其他可以開啟的裝置.

參考網站 :http://pxe.dev.aboveaverageurl.com/index.php/PXE_Booting

PXE 環境需求

PXE 環境需求為一台具有以下服務的系統,作業系統我選擇的是 Red Hat Enterprise Linux 3 版本,以及一台具有網路開機 PXE 功能的機台.

  1. DHCP, TFTP
    PXE 最主要透過兩個 Protocol 來進行網路資源的存取,DHCP 和 TFTP, 透過 DHCP 讓 PXE 獲得 IP 以及得知開機前導程式 (bootstrap program) pxelinux.0 的網路位置,而 TFTP 則是讓 PXE 可以下載該前導程式. 其他具有 DHCP 和 tftp 服務的 Linux 皆可以擔任此項工作.
  2. FTP , NFS , HTTP
    後續的安裝則需要透過 FTP , NFS , HTTP .有提供此服務的 Linux 皆可以擔任此項工作.

pxe_boot04

DHCP Server

編輯 /etc/dhcpd.conf

[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;
}

這個項目 option domain-name-servers 192.10.0.1 為非必要選項,如果你有設定就不用再指定 DNS 位址.但是相對應的 DNS(Bind Server)也要設定.
match if substring(option vendor-class-identifier, 0, 9) =PXEClient 這一個選項會檢查是否為實體的網路卡,如果你是準備給 virtual machine 時可以移除這一個選項.

並確定 DHCP 的服務已經開啟

[root@benjr ~]# chkconfig dhcpd on
[root@benjr ~]# service dhcpd start

其中的 next-server 就是你的 tftp server 所在的位置 (DHCP TFTP 可以在同一台伺服器上).我這邊的例子使用 192.10.0.1 至於其他有關於 DHCP 的設定說明起自行參考 DHCP 的官方網站 http://www.isc.org.

在整個 DHCP 設定檔中,最重要的就是 filename “linux-install/pxelinux.0″ 整個網路開機顯示畫面,流程控制都由 pxelinux.0 來管理,關於更多有關於 pxelinux.0 ,請參考 PXELinux 的官方網頁 http://syslinux.zytor.com/wiki/index.php/PXELINUX

TFTP Server 的設定

編輯 /etc/xinetd.d/tftp” 並將 server 開啟

[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 即可.或者你可以用下面的指令將 tftp 功能開啟

[root@benjr ~]# chkconfig tftp on

啟動 tftp servicee

[root@benjr ~]# service xinetd restart

在使用時最常遇到的錯誤大概都是在 DHCP tftp 設定路徑上面的錯誤,關於如何除錯 TFTP 請參考 tftp 常見的錯誤訊息 http://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

設定檔說明:

  1. default 0
    如果使用者不選擇安裝哪一種 OS 這邊就可以設定預設安裝哪一個 OS,default 0 的意是就是使用 label 0 的設定.
  2. timeout 2000
    預設安裝生效時間為 2000ms(200秒).
  3. F1 msgs/boot.msg
  4. F2 msgs/expert.msg
    這邊是用來定義功能鍵 F1 至 F12 所對應要顯示的文字檔案 F1 – boot.msg , F2 – expert.msg.
  5. prompt 1
    效果不明????
  6. display msgs/boot.msg
    boot.msg 這個檔案就是PXE 開機所顯示的第一個提示訊息.後面會在編譯.
  7. label 0
    localboot 1
    label 後面接的字串就是使用者可以透過鍵盤來指定 PXE 後續要做的動作 (label 0 就是按鍵 0 ). localboot 1 定義了使用系統上的硬碟來直接開機.
  8. 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

安裝媒體 (FTP, NFS, HTTP)

RedHat Linux 透過 PXE 來安裝作業系統時可以透過 3 種網路媒體 FTP, NFS , HTTP 來做安裝的來源.這邊簡單較紹一下怎麼針對這 3 種安裝媒體來做設定.
pxe_boot07
複製 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/ ( 1CD )
[root@benjr ~]# cp -rf /mnt/cdrom/* /var/ftp/as3u2/ ( 2CD )
[root@benjr ~]# cp -rf /mnt/cdrom/* /var/ftp/as3u2/ ( 3CD )
[root@benjr ~]# cp -rf /mnt/cdrom/* /var/ftp/as3u2/ ( 4CD )

PS: When the system asks for replace file? please answers No

  • 由 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

  1. 將具有 PXE 功能網路卡的 client 開機.
  2. 請先確定 PXE 功能已經在 BIOS 下開啟,並設為第一開機順位,並從 PXE 開機
    pxe_boot05
  3. 選擇你想要安裝的作業系統,如果你有參數可以在這邊加入.
    pxe_boot02
    Begin Downloading linux kernel image and initrd image ..
    此時就開始安裝作業係統
  4. 你可以選擇 FTP , NFS 或 HTTP 等方式來安裝
  5. 至於 server IP 就是 192.10.0.1,我將光碟內容都放在 192.10.0.1:/var/ftp/ 目錄下
    至於目錄根據不同的方式有所不同
    使用 FTP 方式的目錄:/as3u2
    使用 NFS 方式的目錄:/var/ftp/as3u2 (只有透過NFS才會有圖形界面的安裝)
    使用 HTTP 方式的目錄 : /as3u2
  6. 接下來的安裝過程就和一般光碟安裝一樣.

其他 Linux Distribution

  • SuSE Linux
    步驟同 RedHat Linux 但 kernel 和 initrd.img 的位址在 SuSE 的第一片 CDROM /boot/loader/ 目錄中
    /boot/loader/linux 是 kernel
    /boot/loader/initrd 是 initrd.img
    SuSE 有一點要注意的是要加 vga 的參數

    [root@benjr ~]# vi /tftpboot/linux-install/pxelinux.cfg/default
    ...
    kernel sles9/linux
    append initrd=sles9/initrd ramdisk_size=65536 vga=0x317 splash=silent showpts
    

    這樣安裝時才有 GUI 的模式,下面是常用的 VGA 顯示模式
    1024x768x8bpp vga=773 1024x768x16bpp vga=791
    1280x1024x8bpp vga=775 1280x1024x16bpp vga=794
    note:如果你使用的是 SuSE Linux Enterprise Server 9 CDs 時還要修改一個檔 “var/ftp/sles9/media.1/media" 才能使用網路安裝.

    [root@benjr ~]# vi /var/ftp/sles9/media.1/media
    SuSE Linux AG
    20040702201519
    1
    MEDIA1 SUSE LINUX ENTERPRISE Server 9 CD1
    
  • Turbo Linux
    步驟同 RedHat Linux 但 kernel 和 initrd.img 的位址在 /images/network.img 檔案中,因為 network.img 是 image 檔所以必須用 mount -o loop 才能看到 kernel 和 initrd.img 檔案

    [root@benjr ~]# mount -o loop /images/network.img /mnt
    

    在 /mnt 目錄下可以看到 vmlinuz(Linux kernel) 和 initrd.img(initrd image).Turbo 有一點要注意的是要加 ramdisk_size 的參數.因為你在安裝時如果採用 FTP, turbo linux 會因為 ramdisk size 大小問題而無法載入.

    Turbo 7 Linux 的 ramdisk_size 要定設為 16384
    Turbo 8 Linux 的 ramdisk_size 要定設為 21000

    [root@benjr ~]# vi /tftpboot/linux-install/pxelinux.cfg/default
    ...
    kernel turbo7/vmlinuz
    append initrd=turbo7/initrd.img ramdisk_size=16384
    label 4
    kernel turbo8/vmlinuz
    append initrd=turbo8/initrd.img ramdisk_size=21000
    
  • ubuntu 10.04
    步驟同 RedHat Linux 但 kernel 和 initrd.img 的位址在 ubuntu CDROM 目錄 /install/netboot/ubuntu-installer/i386 中
    linux 是 kernel
    initrd.gz 是 initrd.img

    [root@benjr ~]# vi /tftpboot/linux-install/pxelinux.cfg/default
    ...
    label 5
    kernel ubuntu10/linux
    append vga=normal initrd=ubuntu10/initrd.gz ramdisk_size=16432 --
    

    使用 PXE 安裝時 ubuntu 系統預設使用的是 http 的傳輸方式,如果你有連上 Internet 時直接使用他指定的 http 服務器即可,不過我們還是透過內部網路會快一些,此時選擇 enter information manually:
    即可指定你的 http 服務器.
    ubuntu archive mirror hostname:
    這邊可以指定你的 http 服務器的 IP 或是 hostname
    ubuntu01
    ubuntu archive mirror directory:
    ubuntu02
    這邊可以指定你的 http 服務器的 Root directory + unbuntu 光碟內容
    ubuntu03

  • ubuntu 11.04
    目前試了 ubuntu 11.04 並按照之前的步驟加入 ubuntu11.04 到 /tftpboot/linux-install/pxelinux.cfg/default

     
    kernel ubuntu11.04/linux
    append vga=normal initrd=ubuntu11.04/initrd.lz ramdisk_size=16432 --
    

    但得到兩個錯誤訊息

    • No init found. Try passing init= bootarg
      似乎 ubuntu11.04 不支援這樣的 PXE 安裝方式,必須透過 LiveCD on PXE 才可以安裝 ,關於 LiveCD on PXE 請參考 http://benjr.tw/1138
    • fatal: error inserting vesafb
      移除參數 vga=normal 就可以解決這個問題.

    note:Ubuntu 在 10.4 版已前使用的 initrd.gz 10.10 (9.10) 版已經使用了 initrd.lz 格式. lz 的使用方式請參考 http://benjr.tw/1179

  • ubuntu 12.04
    ubuntu 12.04 的方式不太一樣,請參考 http://benjr.tw/977

29 個網友的想法 “Legacy – PXE Boot

  1. 自動參照通知: iPXE – Benjr.tw

  2. 自動參照通知: FreeBSD Pxeboot & install – Benjr.tw

  3. 自動參照通知: IPV6 PXE boot – Benjr.tw

  4. 自動參照通知: 就是要上網 – 透過手機分享多人上網 – Benjr.tw

  5. 自動參照通知: Pre-boot from Intel Ethernet | Benjr.tw

  6. 自動參照通知: RHEL 7 – PXE Boot | Benjr.tw

  7. 自動參照通知: KVM -Virtual Machine Creation | Benjr.tw

  8. 自動參照通知: ubuntu uefi pxe | Benjr.tw

  9. 自動參照通知: Ubuntu + TFTP | Benjr.tw

  10. 自動參照通知: DOS + PXE | Benjr.tw

  11. 自動參照通知: EFI + Legacy PXE Boot | Benjr.tw

  12. 自動參照通知: SuSE 11 – UEFI PXE Boot | Benjr.tw

  13. 自動參照通知: uEFI PXE Boot | Benjr.tw

  14. 自動參照通知: RHEL 6 – UEFI PXE Boot | Benjr.tw

  15. 自動參照通知: Wordpress 單篇文章分頁閱讀 | Benjr.tw

  16. 自動參照通知: RHEL6 – 文字安裝模式 | Benjr.tw

  17. 自動參照通知: VMware esxi 無 Video (螢幕)輸出的安裝方式 | Benjr.tw

  18. 自動參照通知: RHEV3 – PXE 安裝 | Benjr.tw

  19. 自動參照通知: XEN – RHEL5 | Benjr.tw

  20. 自動參照通知: KVM – RHEL5 update4 | Benjr.tw

  21. 自動參照通知: XenServer – RHEL (Red Hat Enterprise Linux) 的圖形安裝介面 | Benjr.tw

  22. 自動參照通知: XenServer – Other install media | Benjr.tw

  23. 自動參照通知: VMware – PXE | Benjr.tw

  24. 自動參照通知: WinPE + RIS / WDS | Benjr.tw

  25. 自動參照通知: Install Ubuntu 12.10 with PXE | Benjr.tw

  26. 自動參照通知: DOS | Benjr.tw

  27. 自動參照通知: Installation via Serial Port Console | Benjr.tw

  28. 自動參照通知: DOS PXEboot | Benjr.tw

  29. 自動參照通知: PXE Server | Benjr.tw

發表迴響