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 開機.
要怎麼判斷你的作業系統是否支援 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@benjr ~]# cp /mnt/EFI/BOOT/* /tftpboot/
efidefault 預設檔案格式如下,我們移除預設的 Install system with basic video driver 以及 rescue 並新增加了 SLES11 的選單
[root@benjr ~]# cat /tftpboot/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@benjr ~]# 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 的開機畫面:
根据我自己测试。是不能用的,只能进入到grub> ,只有自己编译bootx64.efi或者pxelinux的efi加载才可以。而7的话默认内核已支持可以直接用ipxe加载。
我也遇到了,怎么编译bootx64.efi
我想問你如果用uefi安裝window在uefidefault如何修改。
下面是我用的,這在uefi部會出現,但在legacy會出現。
LABEL window 2012 64_tesyt
LINUX /memdisk
INITRD /11winpe_x64.iso
APPEND iso raw
我想通过WDS部署uefi的linux,你这个可以用吗?
小弟是照大大的架設,可以架起來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
redhat 7 and centos 7 則會出現img 找不到的 fail , 是要指定 inst.repo .詳細步驟請參考 http://benjr.tw/93304
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
我想,问题的关键在于 bootx64.efi 是否支持 tftp ,即,它能否从 tftp 服务器上下载文件。
不知道您说的“停在 GRUB 的畫面就無法繼續下去”具体是怎样一个情形。如果能看到 grub 菜单,说明 bootx64.efi 已经从 tftp server 上取回了 BOOTX64.conf,这样的话事情就好办了,只需要适当修改 BOOTX64.conf 即可。
如果看不到菜单,只见到 grub> ,就不太好办了。。。
應該是只見到grub> 最近才是試過…
從 wireshark 抓封包發現
要將 BOOTX64.conf rename/soft link 成 efidefault 就可以了
給不熟悉架構前提下的勇者們,我建議 BOOTX64.efi 跟 efidefault 都放在 tftpboot 裡,並把 tftp root 指到 tftpboot 這樣比較容易看到 boot menu
之前試不行的主因是 efidefault 檔案設定沒有指定 root (nd) :(nd 表示為 “network drive”):
不行啊,已经改了nd
停在grub的问题我也遇到了。后来换成redhat6.3的版本就好了。 之前用6.0和6.1装都会卡在grub>这个界面。分析应该属于linux的版本问题。
之前試不行的主因是 efidefault 檔案設定沒有指定 root (nd) :(nd 表示為 “network drive”):
新改好的一篇文章,關於 uEFI 與 PXE 請參考 http://benjr.tw/16137
下面是用 #tcpdump 所抓到的資料.
照著大家的建議建立了 efidefault 檔案,但是一直卡在這裡.出現 grub> 接下來就不知道可以做什麼,還是 RHEL 6 其實並不支援 uefi 的 PXE boot.
之前試不行的主因是 efidefault 檔案設定沒有指定 root (nd) :(nd 表示為 “network drive”):