BIOSは成功しましたが、UEFIの方がうまくいかないので、参考にとどめてください。
ヘッドノード(Ubuntu 26.04 Desktop)上で、公式リポジトリから Ubuntu 26.04 のベースイメージをダウンロードします。 通常は https://cdimage.ubuntu.com/ の ubuntu-base/releases/ 内にあります。
$ sudo mkdir -p /srv/nfs/compute-root
$ cd /tmp $ wget http://cdimage.ubuntu.com/ubuntu-base/releases/26.04/release/ubuntu-base-26.04-base-amd64.tar.gz
$ sudo tar -zxf ubuntu-base-26.04-base-amd64.tar.gz -C /srv/nfs/compute-root
展開したイメージ内に chroot で入り、必要なパッケージ(特にカーネル)をインストールします。 Ubuntu Baseは最小限の構成なので、カーネルすら入っていません。
$ sudo mount --bind /dev /srv/nfs/compute-root/dev $ sudo mount --bind /proc /srv/nfs/compute-root/proc $ sudo mount --bind /sys /srv/nfs/compute-root/sys
$ sudo cp /etc/resolv.conf /srv/nfs/compute-root/etc/resolv.conf
$ sudo chroot /srv/nfs/compute-root
ここからchroot内部の操作
$ cat <<EOF > /etc/apt/sources.list deb http://archive.ubuntu.com/ubuntu/ plucky main restricted universe multiverse deb http://archive.ubuntu.com/ubuntu/ plucky-updates main restricted universe multiverse deb http://security.ubuntu.com/ubuntu/ plucky-security main restricted universe multiverse EOF $ apt update
$ apt install -y linux-image-generic initramfs-tools openssh-server systemd-sysv
$ passwd
$ echo "BOOT=nfs" >> /etc/initramfs-tools/initramfs.conf $ update-initramfs -u -k all
$ cat <<EOF > /etc/fstab /dev/nfs / nfs defaults,noatime 0 0 tmpfs /tmp tmpfs defaults 0 0 tmpfs /var/log tmpfs defaults 0 0 tmpfs /var/tmp tmpfs defaults 0 0 EOF
$ exit
$ sudo umount /srv/nfs/compute-root/dev $ sudo umount /srv/nfs/compute-root/proc $ sudo umount /srv/nfs/compute-root/sys $ sudo rm /srv/nfs/compute-root/etc/resolv.conf
計算ノードが起動した後に、先ほど作ったOSイメージをネットワーク経由で読み書きできるようにします。
/etc/exports に設定を追加します。
$ sudo nano /etc/exports
/srv/nfs/compute-root 192.168.0.0/24(rw,no_root_squash,no_subtree_check,async)
NFSサービスを再起動して反映します。
$ sudo systemctl restart nfs-kernel-server $ sudo exportfs -a
$ sudo cp /srv/nfs/compute-root/boot/vmlinuz-* /srv/tftp/vmlinuz $ sudo cp /srv/nfs/compute-root/boot/initrd.img-* /srv/tftp/initrd.img
$ sudo chmod 644 /srv/tftp/vmlinuz $ sudo chmod 644 /srv/tftp/initrd.img
$ sudo apt install -y pxelinux syslinux-common
$ sudo mkdir -p /srv/tftp $ sudo cp /usr/lib/PXELINUX/pxelinux.0 /srv/tftp/ $ sudo cp /usr/lib/syslinux/modules/bios/ldlinux.c32 /srv/tftp/ $ sudo chmod 644 /srv/tftp/pxelinux.0 $ sudo chmod 644 /srv/tftp/ldlinux.c32
$ sudo mkdir -p /srv/tftp/pxelinux.cfg $ sudo nano /srv/tftp/pxelinux.cfg/default
DEFAULT ubuntu-diskless
LABEL ubuntu-diskless
KERNEL vmlinuz
APPEND initrd=initrd.img root=/dev/nfs nfsroot=192.168.0.1:/srv/nfs/compute-root rw ip=dhcp netboot=nfs splashtype=none
注意:自分の環境では未成功です。参考にとどめておいてください
$ sudo apt update $ sudo apt install -y grub-efi-amd64-signed shim-signed
$ sudo cp /usr/lib/shim/shimx64.efi.signed /srv/tftp/bootx64.efi $ sudo cp /usr/lib/grub/x86_64-efi-signed/grubx64.efi.signed /srv/tftp/grubx64.efi $ sudo chmod 644 /srv/tftp/bootx64.efi $ sudo chmod 644 /srv/tftp/grubx64.efi
$ sudo mkdir -p /srv/tftp/grub $ sudo nano /srv/tftp/grub/grub.cfg
set default="0"
set timeout=5
menuentry "Ubuntu 26.04 Compute Node (Diskless UEFI)" {
linux /vmlinuz root=/dev/nfs nfsroot=192.168.0.1:/srv/nfs/compute-root rw ip=dhcp netboot=nfs splashtype=none
initrd /initrd.img
}
もしこの設定でPXEブートに失敗する場合は、grubnetx64.efi を使います。 (コピーしてきたbootx64.efi, grubx64.efi は削除して構いません)
$ sudo cp /usr/lib/grub/x86_64-efi-signed/grubnetx64.efi.signed /srv/tftp/grubnetx64.efi $ sudo chmod 644 /srv/tftp/grubnetx64.efi
軽量で設定が簡単な dnsmasq を使って、DHCPとTFTPを同時に立ち上げます。
$ sudo apt install -y dnsmasq $ sudo nano /etc/dnsmasq.conf
DHCPサーバーの設定についてはDnsmasqの基本設定を参考にしてください。
# # (DHCPサーバーの設定は略) # # クライアントのアーキテクチャ(PXEの識別子)を定義 dhcp-match=set:bios,option:client-arch,0 dhcp-match=set:efi64,option:client-arch,7 dhcp-match=set:efi64,option:client-arch,9 # BIOSマシンには pxelinux.0 を送る dhcp-boot=tag:bios,pxelinux.0 # UEFI(64bit)マシンには bootx64.efi (Shim) を送る dhcp-boot=tag:efi64,bootx64.efi dhcp-boot=tag:efi64,grubnetx64.efi # grubnetx64.efiを使用する場合はこちら # TFTPサーバーの有効化 enable-tftp tftp-root=/srv/tftp
dnsmasq を再起動します:
$ sudo systemctl restart dnsmasq
設定を保存して再起動すると、DHCPからIPを取得し、ヘッドノードからカーネルをダウンロードしてディスクレスでUbuntu Serverが起動します。
うまくPXEブートできない場合
$ sudo tail -f /var/log/syslog | grep dnsmasq
で監視できますので、どのようなエラーメッセージが出ている確認して修正します。
「Ubuntu Base」は、コンテナ(Dockerなど)や最小限の組み込みシステム向けに提供されている「最小限の骨組みだけ」のOSです。
通常のUbuntu Serverに入っているような標準コマンド、ネットワーク管理ツール(netplanやsystemd-networkd)、高度なシェル(bashの補完機能)、パッケージ管理の基本ツールすら、最初は一切入っていません。
ここから使い慣れた「普通のUbuntu Server」にするには、ヘッドノード側からchroot環境に入り、Ubuntuの標準サーバー環境を構成するパッケージ群(メタパッケージ)を一括インストールします。
$ sudo mount --bind /dev /srv/nfs/compute-root/dev $ sudo mount --bind /proc /srv/nfs/compute-root/proc $ sudo mount --bind /sys /srv/nfs/compute-root/sys $ sudo cp /etc/resolv.conf /srv/nfs/compute-root/etc/resolv.conf
$ sudo chroot /srv/nfs/compute-root
$ apt update $ apt install -y ubuntu-server
$ apt install -y nano vim netplan.io iputils-ping curl wget build-essential
$ exit $ sudo umount /srv/nfs/compute-root/dev $ sudo umount /srv/nfs/compute-root/proc $ sudo umount /srv/nfs/compute-root/sys $ sudo rm /srv/nfs/compute-root/etc/resolv.conf
PXEブートのやりかた
ディスクレス