在 x86 上,有兩種常見的韌體界面: BIOSUEFI 。 現在多數的個人電腦和伺服器都同時支援這兩種界面,這兩種界面的開機方式和提供的 API 都不相同,有著不同的開機方式和開機檔格式。在開始架設網路開機伺服器之前, 我們必須要先知道想要使用這項服務的機器會用哪種韌體界面。

同時我們也要知道使用網路開機的目的是什麼,是為了自動化安裝作業系統 (例如重灌系上所有工作站),還是想要無硬碟操作電腦以節省維護成本 (例如無硬碟電腦教室)。

PXE Server 上需要有些什麼

使用網路開機功能時,會先透過 DHCP 連上網路並得知存放開機檔的主機和檔案,再使用 TFTP 協定下載開機檔來執行,因此我們至少要有這些東西:

很多時候因為一個能正常使用的環境通常很大,不太可能在開機時把整個系統下載下來, 即使真的下載了,也沒有硬碟可以存放,所以我們通常會讓使用者的機器直接透過網路 掛載遠端的檔案系統,這時候我們就需要:

準備好我們需要的東西

Ubuntu BIOS 網路安裝 (1)

開一個我們有讀寫權限的資料夾方便之後的操作:

下載並解開官方提供的網路開機用檔案,內含 PXELINUX bootloader:

Ubuntu BIOS 網路安裝 (2)

修改 Ubuntu 自創的 TFTP 設定檔 /etc/default/tftpd-hpa 中指定的路徑:

Ubuntu BIOS 網路安裝 (3)

修改 DHCP server 設定檔 /etc/dhcp/dhcpd.conf

option domain-name "csie.ntu.edu.tw";
option domain-name-servers 10.213.242.1;
subnet 10.213.242.0 netmask 255.255.255.0 {
    range 10.213.242.40 10.213.242.254;
    option routers 10.213.242.1;
    next-server 10.213.242.2;
    filename "pxelinux.0";
}

Ubuntu BIOS 網路安裝 (4)

重開 DHCP server 和 TFTP server:

Ubuntu UEFI 網路安裝 (1)

開一個我們有讀寫權限的資料夾方便之後的操作:

我們在 UEFI 模式下使用的 bootloader 是 GRUB (前面在 BIOS 模式是用 PXELINUX)。 由於 Ubuntu 提供的 GRUB 在 UEFI 模式下會驗證簽章,所以我們必須使用 Ubuntu 簽章過的 shim 和 GRUB:

Ubuntu UEFI 網路安裝 (2)

同樣我們會需要官方提供的 netboot.tar.gz 檔案:

接者把 UEFI 版本的 shim 和 GRUB 複製進去:

Ubuntu UEFI 網路安裝 (3)

參考 ubuntu-installer/amd64/boot-screens/txt.cfg 編寫 GRUB 版本的設定檔。 雖然 GRUB 有支援讀取 SYSLINUX (PXELINUX) 格式的設定檔,但是實際測試會導致當機, 所以我們還是手動轉換:

menuentry "Install" {
    linuxefi /ubuntu-installer/amd64/linux
    initrdefi /ubuntu-installer/amd64/initrd.gz
}

Ubuntu UEFI 網路安裝 (4)

修改 /etc/default/tftpd-hpa

修改 /etc/dhcp/dhcpd.conf

重開 DHCP server 和 TFTP server:

Ubuntu BIOS LiveCD (1)

開一個我們有讀寫權限的資料夾方便之後的操作:

下載並掛載桌面版本的安裝光碟:

Ubuntu BIOS LiveCD (2)

這次我們仍然需要 PXELINUX,但我們只需要部份檔案,不需要解開整個 `netboot.tar.gz`:

由於我們的設定檔會指向 /casper 資料夾,所以可以建個連結到外面來:

Ubuntu BIOS LiveCD (3)

修改 /etc/exports ,這是 NFS server 的設定檔,讓 client 可以用唯讀模式掛載:

/srv/tftp/livecd-bios/ubuntu-16.04-desktop-amd64 10.213.242.0/24(ro,no_subtree_check)

修改 /etc/default/tftpd-hpa

修改 /etc/dhcp/dhcpd.conf

Ubuntu BIOS LiveCD (4)

參考 ubuntu-16.04-desktop-amd64/isolinux/txt.cfg 寫一份簡單的設定檔,補上 netboot=nfsroot= 參數來指定 NFS 主機和要掛載的資料夾:

path /ubuntu-16.04-desktop-amd64/isolinux
default vesamenu.c32
label live
menu label Try Ubuntu without installing
  kernel /casper/vmlinuz.efi
  append  netboot=nfs nfsroot=10.213.242.2:/srv/tftp/livecd-bios/ubuntu-16.04-desktop-amd64 file=/cdrom/preseed/ubuntu.seed boot=casper initrd=/casper/initrd.lz quiet splash ---

Ubuntu BIOS LiveCD (5)

重開 DHCP server 和 TFTP server:

更新 NFS server 設定值(NFS server 實作在 kernel 裡,所以不會重開,只會更新設定):

Ubuntu UEFI LiveCD (1)

開一個我們有讀寫權限的資料夾方便之後的操作:

同樣我們要掛載安裝光碟:

Ubuntu UEFI LiveCD (2)

我們還是需要 UEFI 版本的 shim 和 GRUB:

同樣我們會使用 /casper 資料夾:

Ubuntu UEFI LiveCD (3)

修改 /etc/exports

/srv/tftp/livecd-uefi/ubuntu-16.04-desktop-amd64 10.213.242.0/24(ro,no_subtree_check)

修改 /etc/default/tftpd-hpa

修改 /etc/dhcp/dhcpd.conf

Ubuntu UEFI LiveCD (4)

參考 ubuntu-16.04-desktop-amd64/boot/grub/grub.cfg 寫一份簡單的設定檔,補上 netboot=nfsroot= 參數來指定 NFS 主機和要掛載的資料夾:

menuentry "Try Ubuntu without installing" {
    set gfxpayload=keep
    linuxefi /casper/vmlinuz.efi netboot=nfs nfsroot=10.213.242.2:/srv/tftp/livecd-uefi/ubuntu-16.04-desktop-amd64 file=/cdrom/preseed/ubuntu.seed boot=casper quiet splash ---
    initrdefi /casper/initrd.lz
}

Ubuntu UEFI LiveCD (5)

重開 DHCP server 和 TFTP server:

更新 NFS server 設定值: