Ubuntu 16.04 PXE Server
=======================
:backend: slidy
:icons:
++++++++++++++++++++++++++++++++++++++++++++++
++++++++++++++++++++++++++++++++++++++++++++++
在 x86 上,有兩種常見的韌體界面: *BIOS* 和 *UEFI* 。
現在多數的個人電腦和伺服器都同時支援這兩種界面,這兩種界面的開機方式和提供的
API 都不相同,有著不同的開機方式和開機檔格式。在開始架設網路開機伺服器之前,
我們必須要先知道想要使用這項服務的機器會用哪種韌體界面。
同時我們也要知道使用網路開機的目的是什麼,是為了自動化安裝作業系統
(例如重灌系上所有工作站),還是想要無硬碟操作電腦以節省維護成本
(例如無硬碟電腦教室)。
PXE Server 上需要有些什麼
-------------------------
使用網路開機功能時,會先透過 DHCP 連上網路並得知存放開機檔的主機和檔案,再使用
TFTP 協定下載開機檔來執行,因此我們至少要有這些東西:
- DHCP server
- TFTP server
很多時候因為一個能正常使用的環境通常很大,不太可能在開機時把整個系統下載下來,
即使真的下載了,也沒有硬碟可以存放,所以我們通常會讓使用者的機器直接透過網路
掛載遠端的檔案系統,這時候我們就需要:
- NFS server
準備好我們需要的東西
--------------------
- `sudo apt install isc-dhcp-server tftpd-hpa nfs-kernel-server`
- 伺服器上開機檔都放在 `/srv/tftp` 裡。
- 一般檔案的 mirror,例如 http://mirror.csie.ntu.edu.tw/ubuntu 。(`mirror`)
- 安裝媒體的 mirror,例如 http://free.nchc.org.tw/ubuntu-cd 。(`cd-mirror`)
- 版本這裡假設是 16.04,也就是 xenial。
- 網路環境相關資訊,這裡假設:
* 分配到的 IPv4 address 是 10.213.242.0/24
* Gateway 和 DNS server 都是 10.213.242.1。
* DHCP、TFTP、NFS server 都是 10.213.242.2。
Ubuntu BIOS 網路安裝 (1)
------------------------
開一個我們有讀寫權限的資料夾方便之後的操作:
- `sudo install -u -g -d /srv/tftp/netinst-bios`
- `cd /srv/tftp/netinst-bios`
下載並解開官方提供的網路開機用檔案,內含 PXELINUX bootloader:
- `wget /dists/xenial/main/installer-amd64/current/images/netboot/netboot.tar.gz`
- `tar -xf netboot.tar.gz`
Ubuntu BIOS 網路安裝 (2)
------------------------
修改 Ubuntu 自創的 TFTP 設定檔 `/etc/default/tftpd-hpa` 中指定的路徑:
- `TFTP_DIRECTORY="/srv/tftp/netinst-bios"`
- 注意如果有指定 `--secure` ,TFTP server 會無法存取這個資料夾外面的檔案。
所以不要在這個資料夾裡放指向外面的 symbolic link,如果真的有需要讓 client
使用外面的資料,可以考慮用 bind mount 代替。
Ubuntu BIOS 網路安裝 (3)
------------------------
修改 DHCP server 設定檔 `/etc/dhcp/dhcpd.conf` :
[source,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:
- `sudo systemctl restart isc-dhcp-server tftpd-hpa`
Ubuntu UEFI 網路安裝 (1)
------------------------
開一個我們有讀寫權限的資料夾方便之後的操作:
- `sudo install -u -g -d /srv/tftp/netinst-uefi`
- `cd /srv/tftp/netinst-uefi`
我們在 UEFI 模式下使用的 bootloader 是 GRUB (前面在 BIOS 模式是用 PXELINUX)。
由於 Ubuntu 提供的 GRUB 在 UEFI 模式下會驗證簽章,所以我們必須使用 Ubuntu
簽章過的 shim 和 GRUB:
- `sudo apt install shim-signed grub-efi-amd64-signed`
Ubuntu UEFI 網路安裝 (2)
------------------------
同樣我們會需要官方提供的 `netboot.tar.gz` 檔案:
- `tar -xf netboot.tar.gz`
接者把 UEFI 版本的 shim 和 GRUB 複製進去:
- `cp /usr/lib/shim/shim.efi.signed shimx64.efi`
- `cp /usr/lib/grub/x86_64-efi-signed/grubnetx64.efi.signed grubx64.efi`
Ubuntu UEFI 網路安裝 (3)
------------------------
參考 `ubuntu-installer/amd64/boot-screens/txt.cfg` 編寫 GRUB 版本的設定檔。
雖然 GRUB 有支援讀取 SYSLINUX (PXELINUX) 格式的設定檔,但是實際測試會導致當機,
所以我們還是手動轉換:
[source,sh]
---------------------------------------------------------------------------
menuentry "Install" {
linuxefi /ubuntu-installer/amd64/linux
initrdefi /ubuntu-installer/amd64/initrd.gz
}
---------------------------------------------------------------------------
Ubuntu UEFI 網路安裝 (4)
------------------------
修改 `/etc/default/tftpd-hpa` :
- `TFTP_DIRECTORY="/srv/tftp/netinst-uefi"`
修改 `/etc/dhcp/dhcpd.conf` :
- `filename "shimx64.efi";`
重開 DHCP server 和 TFTP server:
- `sudo systemctl restart isc-dhcp-server tftpd-hpa`
Ubuntu BIOS LiveCD (1)
----------------------
開一個我們有讀寫權限的資料夾方便之後的操作:
- `sudo install -u -g -d /srv/tftp/livecd-bios`
- `cd /srv/tftp/livecd-bios`
下載並掛載桌面版本的安裝光碟:
- `wget /xenial/ubuntu-16.04-desktop-amd64.iso`
- `mkdir ubuntu-16.04-desktop-amd64`
- `sudo mount ubuntu-16.04-desktop-amd64.iso ubuntu-16.04-desktop-amd64`
Ubuntu BIOS LiveCD (2)
----------------------
這次我們仍然需要 PXELINUX,但我們只需要部份檔案,不需要解開整個 `netboot.tar.gz`:
- `tar --strip-components=3 -xf netboot.tar.gz ./ubuntu-installer/amd64/pxelinux.0`
- `tar --strip-components=4 -xf netboot.tar.gz ./ubuntu-installer/amd64/boot-screens/ldlinux.c32`
由於我們的設定檔會指向 `/casper` 資料夾,所以可以建個連結到外面來:
- `ln -s ubuntu-16.04-desktop-amd64/casper`
Ubuntu BIOS LiveCD (3)
----------------------
修改 `/etc/exports` ,這是 NFS server 的設定檔,讓 client 可以用唯讀模式掛載:
[source,sh]
---------------------------------------------------------------------------
/srv/tftp/livecd-bios/ubuntu-16.04-desktop-amd64 10.213.242.0/24(ro,no_subtree_check)
---------------------------------------------------------------------------
修改 `/etc/default/tftpd-hpa` :
- `TFTP_DIRECTORY="/srv/tftp/livecd-bios"`
修改 `/etc/dhcp/dhcpd.conf` :
- `filename "pxelinux.0";`
Ubuntu BIOS LiveCD (4)
----------------------
參考 `ubuntu-16.04-desktop-amd64/isolinux/txt.cfg` 寫一份簡單的設定檔,補上
`netboot=` 和 `nfsroot=` 參數來指定 NFS 主機和要掛載的資料夾:
- `mkdir pxelinux.cfg && $EDITOR pxelinux.cfg/default`
[source,sh]
---------------------------------------------------------------------------
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:
- `sudo systemctl restart isc-dhcp-server tftpd-hpa`
更新 NFS server 設定值(NFS server 實作在 kernel 裡,所以不會重開,只會更新設定):
- `sudo systemctl reload nfs-kernel-server`
Ubuntu UEFI LiveCD (1)
----------------------
開一個我們有讀寫權限的資料夾方便之後的操作:
- `sudo install -u -g -d /srv/tftp/livecd-uefi`
- `cd /srv/tftp/livecd-uefi`
同樣我們要掛載安裝光碟:
- `mkdir ubuntu-16.04-desktop-amd64`
- `sudo mount ubuntu-16.04-desktop-amd64.iso ubuntu-16.04-desktop-amd64`
Ubuntu UEFI LiveCD (2)
----------------------
我們還是需要 UEFI 版本的 shim 和 GRUB:
- `cp /usr/lib/shim/shim.efi.signed shimx64.efi`
- `cp /usr/lib/grub/x86_64-efi-signed/grubnetx64.efi.signed grubx64.efi`
同樣我們會使用 `/casper` 資料夾:
- `ln -s ubuntu-16.04-desktop-amd64/casper`
Ubuntu UEFI LiveCD (3)
----------------------
修改 `/etc/exports` :
[source,sh]
---------------------------------------------------------------------------
/srv/tftp/livecd-uefi/ubuntu-16.04-desktop-amd64 10.213.242.0/24(ro,no_subtree_check)
---------------------------------------------------------------------------
修改 `/etc/default/tftpd-hpa` :
- `TFTP_DIRECTORY="/srv/tftp/livecd-uefi"`
修改 `/etc/dhcp/dhcpd.conf` :
- `filename "shimx64.efi";`
Ubuntu UEFI LiveCD (4)
----------------------
參考 `ubuntu-16.04-desktop-amd64/boot/grub/grub.cfg` 寫一份簡單的設定檔,補上
`netboot=` 和 `nfsroot=` 參數來指定 NFS 主機和要掛載的資料夾:
- `mkdir grub && $EDITOR grub.cfg`
[source,sh]
---------------------------------------------------------------------------
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:
- `sudo systemctl restart isc-dhcp-server tftpd-hpa`
更新 NFS server 設定值:
- `sudo systemctl reload nfs-kernel-server`