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`