12,014 瀏覽數

RHEL 6 – UEFI PXE Boot

Red Hat Linux 6 下建立 UEFI PXE Server

Step 1 : 前言
Step 2 : 環境需求
Step 3 : tftp server 的設定
Step 4 : 安裝媒體(FTP,NFS,HTTP)
Step 5 : DHCP Server 
Step 6 : The PXE clients 

Step 1 : 前言

什麼是 uEFI!! 什麼是 PXE!! 可以參考下列聯結~

  • uEFI
    Extensible Firmware Interface (EFI) 的功能就類似傳統 BIOS ,他是 OS 與硬體之間溝通介面. 不過相較於傳統的 BIOS EFI 他的架構更模組化,功能更強大.EFI 的架構是由 Intel 提出的, 目前是交由 Unified EFI Forum 來管理.也就是我們現在所稱的 Unified Extensible Firmware Interface (UEFI)
  • PXE
    PXE (Preboot eXecution Environment) 是透過網路來安裝作業系統,在網卡上有一塊 ROM(firmware) 裡面存放了一些基本的網路協定如:Internet Protocol (IP), User Datagram Protocol (UDP), Dynamic Host Configuration Protocol (DHCP) 以及 Trivial File Transfer Protocol (TFTP) 透過這一些協定使得 PXE 可以進行網路的存取進一步安裝作業系統.

建議先設定好你的 PXE 環境再來升級到 uEFI 的環境.

EFI OS

IA64 的 RHEL 是有支援 EFI PXE Boot 的功能,但是我們常用的 RHEL 3 / 4 / 5 – x86 / x64 的系統並不支援 EFI boot ,不過新版的 RHEL6 和 SLES11 SP1 x64 (目前都看到的只有 x64 的系統有支援 EFI, i386/x86 的光碟找不到支援 EFI 開機的檔案) 都將支援 EFI 開機.

rhel6_efi
要怎麼判斷你的作業系統是否支援 EFI Boot 的方式最直接的方式是直接看光碟中是否包含 EFI Boot image 比如 RHEL 6 的光碟中就有一個資料夾為 /EFI/BOOT 這就是支援了 EFI Boot 的証明.

Step 2 : 環境需求
Step 3 : tftp server 的設定
Step 4 : 安裝媒體(FTP,NFS,HTTP)
Step 2 , 3 , 4 請自行參考 PXELinux

Step 5 : DHCP Server
以前在設定 PXE 時在 /etc/dhcpd.conf 設定中我們指定了 pxelinux.0 這個檔案當作 PXELinux 的前導程式.但他不是 EFI 的 Application 所以我們需要找到 EFI 的 PXE 開機的前導程式.

在 RHEL 6 光碟中  /EFI/BOOT 目錄中.

[root@benjr ~]# ll /mnt/EFI/BOOT/
total 232
-rwxr-xr-x 1 root root 429 Sep 22 18:03 BOOTX64.conf
-rwxr-xr-x 1 root root 232971 Sep 22 18:03 BOOTX64.efi
-rwxr-xr-x 1 root root 1341 Sep 22 18:03 splash.xpm.gz
[root@benjr images]# file /mnt/efi/boot/BOOTX64.efi
/mnt/efi/boot/bootx64.efi: PE32+ executable (EFI application)

BOOTX64.efi 是我們開機所需要的 PE32+ executable EFI application ,而設定檔 BOOTX64.conf 在從 PXE 開機時需要修改成 efidefault ,這兩個檔案皆需要複製到 /tftpboot 目錄下(請依據你的 tftpboot 目錄存放,有可能是在 /var/lib/tftpboot).

[root@PXE linux-install]# cp /mnt/EFI/BOOT/* /tftpboot/

efidefault 預設檔案格式如下,我們移除預設的 Install system with basic video driver 以及 rescue 並新增加了 SLES11 的選單

[root@localhost linux-install]# cat efidefault
#debug --graphics
default=0
#splashimage=/EFI/BOOT/splash.xpm.gz
timeout 5000
#hiddenmenu
title Red Hat Enterprise Linux 6.3
        root (nd)
        kernel /rhel6.3-64/vmlinuz
        initrd /rhel6.3-64/initrd.img
title sles 11.2 uefi
        root (nd)
        kernel /sles11-sp2-64-uefi/linux
        initrd /sles11-sp2-64-uefi/initrd

設定檔的幾個重點:
timeout 5000
如果在設定時間內沒有做選擇,系統會依據 default=0 進入預設的選項,所以我把時間設定長一點 5000 單位為秒.
root (nd)
inform GRUB that the boot files must be loaded from the network (nd stands for “network drive"):
指定 Kernel , initrd 為網路的裝置

至於 kernel , initrd 的路徑是依據 tftp(/tftpboot) + DHCP filename(linux-install) 的路徑為起頭.
kernel /rhel6.3-64/vmlinuz
initrd /rhel6.3-64/initrd.img

雖然檔案位於 /tftpboot/linux-install/rhel6.3-64 但我們設定時只需要指定 /rhel6.3-64 即可.

接下來的重點是修改 DHCP 的設定檔 /etc/dhcp/dhcpd.conf 把開機前導改成為 BOOTX64.efi

[root@PXE linux-install]# cat /etc/dhcp/dhcpd.conf
ddns-update-style none;
ignore client-updates;
allow booting;
allow bootp;
subnet 192.6.0.0 netmask 255.255.255.0 {
range 192.6.0.50 192.6.0.250;
option routers 192.6.0.254;
option subnet-mask 255.255.255.0;
next-server 192.6.0.1;
filename “linux-install/BOOTX64.efi";
}

在整個 DHCP 設定檔中,最重要的就是 filename “linux-install/BOOTX64.efi" 整個網路開機顯示畫面,流程控制都由 BOOTX64.efi 來管理.接下來就是將具有 UEFI PXE 功能網路卡的設定為第一順位的開機次序.
不過試到目前為止有部分的系統還是不行,UEFI PXE Boot 系統會停在 GRUB 的畫面就無法繼續下去了.

透過 tcpdump 得到的結果 “/pxelinux.0″ octet tsize 0 似乎讀取不到 efidefault 檔案

因為試過 RHEL 6 其結果是不行的, 所以試試 SLES11 的 EFI 的前導程式.

之前試不行的主因是 efidefault 檔案設定沒有指定 root (nd) :(nd 表示為 “network drive"):

Step 6 : The PXE clients

將具有 UEFI PXE 功能網路卡的 client 開機. 試到目前為止還是不行,UEFI PXE Boot 系統會停在 GRUB 的畫面就無法繼續下去了.
UEFI 透過 PXE 的開機畫面:
uefi_boot02
uefi_boot01

17 個網友的想法 “RHEL 6 – UEFI PXE Boot

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

  2. 我想問你如果用uefi安裝window在uefidefault如何修改。
    下面是我用的,這在uefi部會出現,但在legacy會出現。

    LABEL window 2012 64_tesyt
    LINUX /memdisk
    INITRD /11winpe_x64.iso
    APPEND iso raw

  3. 小弟是照大大的架設,可以架起來IPV4跟IPV6 PXE server,IPV4使用redhat 6.5,6.6,7 and CentOS 6.5,6.,6,7 and SLES 11.3,12 都能正常使用,但是IPV6除了SLES11.3,12 無法使用,小弟是把DHCP ipv4 and ipv6 分成兩個孔 eth0 and eth1配發IP才能正常使用,如果只用eth0同時配發ipv4 and ipv6的話則redhat 7 and centos 7 則會出現img 找不到的fail , SLES11.3,12無法安裝的原因查到在於client無法DHCP ipv6 IP
    以下是efidefault設定檔關於SLES內容
    title SLES11.3×64
    root (nd)
    kernel /SLES11.3×64/linux install=http://[2001::1]/SLES11.3×64/ ip=dhcp6 keymap=us lang=en_US
    initrd /SLES11.3×64/initrd

      • eth0發ipv4 and ipv6 安裝redhat 7 and centos7已經都能用了,只剩suse11.3 and 12
        以下是設定檔:
        title SLES11.3×64
        root (nd)
        kernel /SLES11.3×64/linux install=http://[2001::1]/SLES11.3×64/ ipv6=1 keymap=us lang=en_US
        initrd /SLES11.3×64/initrd

  4. 自動參照通知: ubuntu Legacy + uefi pxe | Benjr.tw

  5. 我想,问题的关键在于 bootx64.efi 是否支持 tftp ,即,它能否从 tftp 服务器上下载文件。

    不知道您说的“停在 GRUB 的畫面就無法繼續下去”具体是怎样一个情形。如果能看到 grub 菜单,说明 bootx64.efi 已经从 tftp server 上取回了 BOOTX64.conf,这样的话事情就好办了,只需要适当修改 BOOTX64.conf 即可。

    如果看不到菜单,只见到 grub> ,就不太好办了。。。

      • 從 wireshark 抓封包發現
        要將 BOOTX64.conf rename/soft link 成 efidefault 就可以了
        給不熟悉架構前提下的勇者們,我建議 BOOTX64.efi 跟 efidefault 都放在 tftpboot 裡,並把 tftp root 指到 tftpboot 這樣比較容易看到 boot menu

      • 之前試不行的主因是 efidefault 檔案設定沒有指定 root (nd) :(nd 表示為 “network drive"):

  6. 停在grub的问题我也遇到了。后来换成redhat6.3的版本就好了。 之前用6.0和6.1装都会卡在grub>这个界面。分析应该属于linux的版本问题。

    • 之前試不行的主因是 efidefault 檔案設定沒有指定 root (nd) :(nd 表示為 “network drive"):

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

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

  9. 下面是用 #tcpdump 所抓到的資料.

    16:18:55.317779 IP 192.8.1.30.timbuktu-srv1 > 192.8.1.1.tftp: 66 RRQ "/CAC30A0A-0011-11DE-AAC5-C467E31F9B77" octet tsize 0 blksize 512
    16:18:55.318328 IP 192.8.1.1.54880 > 192.8.1.30.timbuktu-srv1: UDP, length 19
    16:18:55.581209 IP 192.8.1.30.timbuktu-srv2 > 192.8.1.1.tftp: 50 RRQ "/01-00-21-5E-67-17-5E" octet tsize 0 blksize 512
    16:18:55.581696 IP 192.8.1.1.55290 > 192.8.1.30.timbuktu-srv2: UDP, length 19
    16:18:55.844580 IP 192.8.1.30.timbuktu-srv3 > 192.8.1.1.tftp: 38 RRQ "/C008011E" octet tsize 0 blksize 512
    16:18:55.845072 IP 192.8.1.1.34708 > 192.8.1.30.timbuktu-srv3: UDP, length 19
    16:18:56.107954 IP 192.8.1.30.timbuktu-srv4 > 192.8.1.1.tftp: 37 RRQ "/C008011" octet tsize 0 blksize 512
    16:18:56.108499 IP 192.8.1.1.35885 > 192.8.1.30.timbuktu-srv4: UDP, length 19
    16:18:56.371376 IP 192.8.1.30.gandalf-lm > 192.8.1.1.tftp: 36 RRQ "/C00801" octet tsize 0 blksize 512
    16:18:56.371863 IP 192.8.1.1.46006 > 192.8.1.30.gandalf-lm: UDP, length 19
    16:18:56.634749 IP 192.8.1.30.autodesk-lm > 192.8.1.1.tftp: 35 RRQ "/C0080" octet tsize 0 blksize 512
    16:18:56.635234 IP 192.8.1.1.59513 > 192.8.1.30.autodesk-lm: UDP, length 19
    16:18:56.898119 IP 192.8.1.30.essbase > 192.8.1.1.tftp: 34 RRQ "/C008" octet tsize 0 blksize 512
    16:18:56.898607 IP 192.8.1.1.35712 > 192.8.1.30.essbase: UDP, length 19
    16:18:57.161488 IP 192.8.1.30.hybrid > 192.8.1.1.tftp: 33 RRQ "/C00" octet tsize 0 blksize 512
    16:18:57.161988 IP 192.8.1.1.59153 > 192.8.1.30.hybrid: UDP, length 19
    16:18:57.424863 IP 192.8.1.30.zion-lm > 192.8.1.1.tftp: 32 RRQ "/C0" octet tsize 0 blksize 512
    16:18:57.425384 IP 192.8.1.1.36759 > 192.8.1.30.zion-lm: UDP, length 19
    16:18:57.688264 IP 192.8.1.30.sais > 192.8.1.1.tftp: 31 RRQ "/C" octet tsize 0 blksize 512
    16:18:57.688734 IP 192.8.1.1.52577 > 192.8.1.30.sais: UDP, length 19
    16:18:57.951623 IP 192.8.1.30.mloadd > 192.8.1.1.tftp: 40 RRQ "/efidefault" octet tsize 0 blksize 512
    16:18:57.952124 IP 192.8.1.1.48228 > 192.8.1.30.mloadd: UDP, length 24
    16:18:57.952219 IP 192.8.1.30.mloadd > 192.8.1.1.48228: UDP, length 30
    16:18:59.757904 ARP, Request who-has 192.8.1.30 tell 192.8.1.1, length 28
    16:18:59.795458 ARP, Reply 192.8.1.30 is-at 00:21:5e:67:17:5e (oui Unknown), length 46
    

    照著大家的建議建立了 efidefault 檔案,但是一直卡在這裡.出現 grub> 接下來就不知道可以做什麼,還是 RHEL 6 其實並不支援 uefi 的 PXE boot.

    • 之前試不行的主因是 efidefault 檔案設定沒有指定 root (nd) :(nd 表示為 “network drive"):

發表迴響