Skip to Content

PXELinux

Red Hat Linux 下建立 PXE Server
Step 1 : 前言
Step 2 : 環境需求
Step 3 : tftp server 的設定
Step 4 : 安裝媒體(FTP,NFS,HTTP)
Step 5 : PXE 設定檔
Step 6 : DHCP Server
Step 7 : The PXE clients
Step 8 : 其他 Linux Distribution

Step 1 : 前言

在安裝作業系統時最常見的方式就是透過 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 可以進行網路的存取進一步取得網路上的資源.
圖片出自於 :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. 該 PXE 獲得 DHCP 的請求 IP 以及其他選項參數, 其中的 "filename" 參數將是未來掌握 PXE 開機的關鍵點.
  4. PXE client 會透過 TFTP 協定(PXE ROM 只能使用該協定)去下載該檔案 pxelinux.0.
  5. 當 PXE client 成功下載到檔案(pxelinux.0), 他就會顯示 PXE 安裝提示顯示畫面.接下來依據系統提示就可以開始安裝作業系統.
  6. 如果 PXE ROM 無法完成上序的步驟,有些 BIOS 就會依序啟動其他可以開啟的裝置.

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

Step 2 : 環境需求

PXE 最主要透過兩個 Protocol 來進行網路資源的存取,DHCP 和 TFTP, 透過 DHCP 讓 PXE 得知網路啟動的服務位於何處,而 TFTP 則是讓 PXE 可以下載適當的啟動程式 (bootstrap program) 以及其他服務.所以這邊我們一樣需要這兩項服務.

1.一台具有 DHCP 與 tftp server (eg: IP 192.10.0.1)
2.一台具有 PXE(Preboot eXecution Environment) 網路開機功能的機台.

 

作業系統我選擇的是 Red Hat Enterprise Linux 3 版本,基本上具有 DHCP 和 tftp 服務的 Linux 皆可以擔任此項工作.

 

Step 3 : tftp server 的設定
1. 編輯 “/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

2.啟動 tftp servicee

[root@benjr ~]# service xinetd restart


Step 4 : 安裝媒體(FTP,NFS,HTTP)
RedHat Linux 透過 PXE 來安裝作業系統時可以透過 3 種網路媒體 FTP, NFS , HTTP 來做安裝的來源.這邊簡單較紹一下怎麼針對這 3 種安裝媒體來做設定. 

複製 RedHat 光碟所有的內容 (這邊我是用 RedHat Enterprise Linux Advanced server 3.0 Update 2 為範例)
[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 來安裝
  • 請確定 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" 並將 Document 設為 /var/ftp(因為我們將把光碟內的檔案放在此目錄下,此為FTP預設的分享目錄)

    [root@benjr ~]# vi /etc/httpd/conf/httpd.conf
    Document Root "/var/ftp"

    並確定 HTTP 的服務已經開啟

    [root@benjr ~]# chkconfig httpd on
    [root@benjr ~]# service httpd restart


Step 5 : PXE 設定檔
1.將開機所需的 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

2.編輯 /tftpboot/linux-install/pxelinux.cfg/default (這個檔案定義了與PXE的Clients可以經由按鍵來選擇安裝的系統)

[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
預設安裝生效時間為2000ms(200秒).
F1 msgs/boot.msg
F2 msgs/expert.msg
這邊是用來定義F1至F12功能鍵所要顯示的內容.
prompt 1
效果不明????
display msgs/boot.msg
一開機進入PXE所顯示的第一個提示訊息.
label 0
localboot 1
這裡定義了使用機器系統上的硬碟來直接開機.
label 1
kernel as3u2/vmlinuz
append initrd=as3u2/initrd.img ramdisk_size=65536
這就是要安裝OS的定義.

3.編輯 /tftpboot/linux-install/msgs/boot.msg (這個檔案就是Clients經由PXE開機時所看到的提示訊息)

[root@benjr ~]# vi /tftpboot/linux-install/msgs/boot.msg
1. Install RHAS3-QU2

4.編輯 /etc/rc.d/rc.local 必須加入下面這一行

[root@benjr ~]# vi /etc/rc.d/rc.local
route add -host 255.255.255.255 eth0

Step 6 : 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 ~]# vi /etc/dhcpd.conf
# ddns-update-style interim;
ddns-update-style none;
ignore client-updates;
allow booting;
allow bootp;

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;
next-server 192.10.0.1;
filename "linux-install/pxelinux.0";
}

並確定 DHCP 的服務已經開啟

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

其中的 next-server 就是你的tftp server所在的位置.我這邊的例子使用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

Step 7 : The PXE clients
1. 將具有 PXE 功能網路卡的 client 開機.

2.請先確定 PXE 功能已經在 BIOS 下開啟,並設為第一開機順位,並從 PXE 開機

3. 選擇你想要安裝的作業系統,如果你有參數可以在這邊加入.

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. 接下來的安裝過程就和一般光碟安裝一樣.

Step 8 : 其他 Linux Distribution

  1. SuSE powered by UnitedLinux
  2. 步驟同 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
    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
    label 2
    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
  3. Turbo Linux
  4. 步驟同 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
    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
    label 2
    kernel sles9/linux
    append initrd=sles9/initrd ramdisk_size=65536 vga=0x317 splash=silent showpts
    label 3
    kernel turbo7/vmlinuz
    append initrd=turbo7/initrd.img ramdisk_size=16384
    label 4
    kernel turbo8/vmlinuz
    append initrd=turbo8/initrd.img ramdisk_size=21000

    加入下面的訊息來讓使用者(PXE的Clients)知道有什麼作業系統可以安裝

    [root@benjr ~]# vi /tftpboot/linux-install/msgs/boot.msg
    1. Install RHAS3-QU2
    2. Install SLES 9
    3. Install Turbo 7
    4. Install Turbo 8
  5. ubuntu
  6. 步驟同 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
    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
    label 2
    kernel sles9/linux
    append initrd=sles9/initrd ramdisk_size=65536 vga=0x317 splash=silent showpts
    label 3
    kernel turbo7/vmlinuz
    append initrd=turbo7/initrd.img ramdisk_size=16384
    label 4
    kernel turbo8/vmlinuz
    append initrd=turbo8/initrd.img ramdisk_size=21000
    label 5
    kernel ubuntu10/linux
    append vga=normal initrd=ubuntu10/initrd.gz ramdisk_size=16432 --

    加入下面的訊息來讓使用者 (PXE的Clients) 知道有什麼作業系統可以安裝

    [root@benjr ~]# vi /tftpboot/linux-install/msgs/boot.msg
    1. Install RHAS3-QU2
    2. Install SLES 9
    3. Install Turbo 7
    4. Install Turbo 8
    5. Install ubuntu 10

    使用 PXE 安裝時 ubuntu 系統預設使用的是 http 的傳輸方式,如果你有連上 Internet 時直接使用他指定的 http 服務器即可,不過我們還是透過內部網路會快一些,此時選擇

    1. enter information manually:
    2. 即可指定你的 http 服務器.

    3. ubuntu archive mirror hostname:
    4. 這邊可以指定你的 http 服務器的 IP 或是 hostname

    5. ubuntu archive mirror directory:
    6. 這邊可以指定你的 http 服務器的 Root directory + unbuntu 光碟內容


回應

錯誤訊息

最近新設定一台 PXE 但使用 PXE 開機卻出現下面的錯誤訊息!

PXE-T01: file not found
PXE-E3B-TFTP Error file not found
PXE-M0F exiting Intel boot agent

使用 tcpdump 則是出現這樣的訊息

IP tftp: 28 RRQ "/pxelinux.0" octet tsize 0

查了半天才看出原來 /etc/xinetd.d/tftp 和 /etc/dhcpd.conf 目錄設定錯誤

  • /etc/xinetd.d/tftp
  • server_args = -s /tftpboot

  • /etc/dhcpd.conf
  • filename "linux-install/pxelinux.0";

dhcpd.conf 所指定的檔案目錄是以 tftp 為基準點,所以寫成 "filename "linux-install/pxelinux.0";" 是指向 "/tftpboot/linux-install/pxelinux.0";"

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.gz ramdisk_size=16432 --

但得到兩個錯誤訊息

  • No init found. Try passing init= bootarg
  • 似乎 ubuntu11.04 不支援這樣的 PXE 安裝方式,必須透過 LiveCD on PXE 才可以安裝 ,關於 LiveCD on PXE 請參考 http://benjr.tw/node/289

  • fatal: error inserting vesafb
  • 移除參數 vga=normal 就可以解決這個問題.

ubuntu 10.10 Server

增加了 ubuntu 10.10 Server 版的 PXE 安裝方式.