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"; }
在 x86 上,有兩種常見的韌體界面: BIOS 和 UEFI 。 現在多數的個人電腦和伺服器都同時支援這兩種界面,這兩種界面的開機方式和提供的 API 都不相同,有著不同的開機方式和開機檔格式。在開始架設網路開機伺服器之前, 我們必須要先知道想要使用這項服務的機器會用哪種韌體界面。
同時我們也要知道使用網路開機的目的是什麼,是為了自動化安裝作業系統 (例如重灌系上所有工作站),還是想要無硬碟操作電腦以節省維護成本 (例如無硬碟電腦教室)。
使用網路開機功能時,會先透過 DHCP 連上網路並得知存放開機檔的主機和檔案,再使用 TFTP 協定下載開機檔來執行,因此我們至少要有這些東西:
很多時候因為一個能正常使用的環境通常很大,不太可能在開機時把整個系統下載下來, 即使真的下載了,也沒有硬碟可以存放,所以我們通常會讓使用者的機器直接透過網路 掛載遠端的檔案系統,這時候我們就需要:
sudo apt install isc-dhcp-server tftpd-hpa nfs-kernel-server
/srv/tftp
裡。
mirror
)
cd-mirror
)
開一個我們有讀寫權限的資料夾方便之後的操作:
sudo install -u <user> -g <group> -d /srv/tftp/netinst-bios
cd /srv/tftp/netinst-bios
下載並解開官方提供的網路開機用檔案,內含 PXELINUX bootloader:
wget <mirror>/dists/xenial/main/installer-amd64/current/images/netboot/netboot.tar.gz
tar -xf netboot.tar.gz
修改 Ubuntu 自創的 TFTP 設定檔 /etc/default/tftpd-hpa
中指定的路徑:
TFTP_DIRECTORY="/srv/tftp/netinst-bios"
--secure
,TFTP server 會無法存取這個資料夾外面的檔案。
所以不要在這個資料夾裡放指向外面的 symbolic link,如果真的有需要讓 client
使用外面的資料,可以考慮用 bind mount 代替。
修改 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"; }
重開 DHCP server 和 TFTP server:
sudo systemctl restart isc-dhcp-server tftpd-hpa
開一個我們有讀寫權限的資料夾方便之後的操作:
sudo install -u <user> -g <group> -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
同樣我們會需要官方提供的 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-installer/amd64/boot-screens/txt.cfg
編寫 GRUB 版本的設定檔。
雖然 GRUB 有支援讀取 SYSLINUX (PXELINUX) 格式的設定檔,但是實際測試會導致當機,
所以我們還是手動轉換:
menuentry "Install" { linuxefi /ubuntu-installer/amd64/linux initrdefi /ubuntu-installer/amd64/initrd.gz }
修改 /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
開一個我們有讀寫權限的資料夾方便之後的操作:
sudo install -u <user> -g <group> -d /srv/tftp/livecd-bios
cd /srv/tftp/livecd-bios
下載並掛載桌面版本的安裝光碟:
wget <cd-mirror>/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
這次我們仍然需要 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
修改 /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
:
TFTP_DIRECTORY="/srv/tftp/livecd-bios"
修改 /etc/dhcp/dhcpd.conf
:
filename "pxelinux.0";
參考 ubuntu-16.04-desktop-amd64/isolinux/txt.cfg
寫一份簡單的設定檔,補上
netboot=
和 nfsroot=
參數來指定 NFS 主機和要掛載的資料夾:
mkdir pxelinux.cfg && $EDITOR pxelinux.cfg/default
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 ---
重開 DHCP server 和 TFTP server:
sudo systemctl restart isc-dhcp-server tftpd-hpa
更新 NFS server 設定值(NFS server 實作在 kernel 裡,所以不會重開,只會更新設定):
sudo systemctl reload nfs-kernel-server
開一個我們有讀寫權限的資料夾方便之後的操作:
sudo install -u <user> -g <group> -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
我們還是需要 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
修改 /etc/exports
:
/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-16.04-desktop-amd64/boot/grub/grub.cfg
寫一份簡單的設定檔,補上
netboot=
和 nfsroot=
參數來指定 NFS 主機和要掛載的資料夾:
mkdir grub && $EDITOR grub.cfg
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 }
重開 DHCP server 和 TFTP server:
sudo systemctl restart isc-dhcp-server tftpd-hpa
更新 NFS server 設定值:
sudo systemctl reload nfs-kernel-server