====== 概要 ======
* Ubuntu 26.04
BIOSは成功しましたが、UEFIの方がうまくいかないので、参考にとどめてください。
====== 手順 ======
===== Ubuntu Baseのダウンロードと展開 =====
ヘッドノード(Ubuntu 26.04 Desktop)上で、公式リポジトリから Ubuntu 26.04 のベースイメージをダウンロードします。
通常は https://cdimage.ubuntu.com/ の ubuntu-base/releases/ 内にあります。
- ディスクレス用OSの配置先を作成
$ sudo mkdir -p /srv/nfs/compute-root
- Ubuntu Baseのダウンロード(※URLは2026年現在の最新リポジトリ構造に基づきます)
$ cd /tmp
$ wget http://cdimage.ubuntu.com/ubuntu-base/releases/26.04/release/ubuntu-base-26.04-base-amd64.tar.gz
- 展開(パーミッションを保持するため必ず sudo で実行)
$ sudo tar -zxf ubuntu-base-26.04-base-amd64.tar.gz -C /srv/nfs/compute-root
===== クライアントOSの基本設定 (chroot) =====
展開したイメージ内に 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
- 名前解決(DNS)ができるようにDNS設定をコピー
$ sudo cp /etc/resolv.conf /srv/nfs/compute-root/etc/resolv.conf
- chroot環境に入る
$ sudo chroot /srv/nfs/compute-root
ここからchroot内部の操作
- パッケージソースリストの作成(入っていない、または不十分な場合があるため)
$ cat < /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
- カーネル、initramfs-tools、ネットワークブートに必要なパッケージをインストール
$ apt install -y linux-image-generic initramfs-tools openssh-server systemd-sysv
- ルートパスワードの設定
$ passwd
- initramfsをネットワークブート(NFS)対応にする設定
$ echo "BOOT=nfs" >> /etc/initramfs-tools/initramfs.conf
$ update-initramfs -u -k all
- fstabの設定
$ cat < /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
- chrootから抜ける
$ 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
===== NFSサーバーの設定 =====
計算ノードが起動した後に、先ほど作った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
===== ブートローダーのインストール =====
- 作ったカーネルとinitrd(初期RAMディスク)をコピー
$ 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
==== BIOSを使う場合 ====
- BIOSによるPXEブートのブートローダーをインストール
$ sudo apt install -y pxelinux syslinux-common
- TFTPの公開ディレクトリを作成し、PXE用のブートローダーをコピー
$ 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
- PXEブートメニュー(設定ファイル)を作成
$ 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
==== UEFを使う場合 ====
**注意:自分の環境では未成功です。参考にとどめておいてください**
- UEFIネットワークブート用のGRUBパッケージをインストール
$ sudo apt update
$ sudo apt install -y grub-efi-amd64-signed shim-signed
- TFTPの公開ディレクトリに必要なファイルをコピー
$ 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
* 実行権限付きの744という説もあります。
* [[https://np2lkoo.hatenablog.com/entry/2020/08/16/090150|PXEでディスクレスLinux (CentOS)クライアントをBootする(UEFI編) - クーの自由研究]]
- GRUB用設定ファイルの作成(BIOSのときは pxelinux.cfg/default を使いましたが、GRUBでは grub.cfg というファイルを使用します)
$ 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
===== DHCP / TFTP サーバー(dnsmasq)の設定 =====
軽量で設定が簡単な 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
===== 計算ノードの起動確認 =====
- 計算ノードのディスプレイとキーボードを繋ぎ、電源を入れます。
- BIOS/UEFI設定画面を開き、以下を確認・変更します。
* Secure Boot: Disabled(SecurityまたはBootのタブから)
* Network Stack / PXE Boot: Enabled
* Boot Priority: Network Boot (PXE) を最優先にする。
* Boot Mode: BIOS (Legacy または CSM) , UEFIのどちらかを確認
設定を保存して再起動すると、DHCPからIPを取得し、ヘッドノードからカーネルをダウンロードしてディスクレスでUbuntu Serverが起動します。
うまくPXEブートできない場合
$ sudo tail -f /var/log/syslog | grep dnsmasq
で監視できますので、どのようなエラーメッセージが出ている確認して修正します。
===== Ubuntu serverのインストール =====
「Ubuntu Base」は、コンテナ(Dockerなど)や最小限の組み込みシステム向けに提供されている「最小限の骨組みだけ」のOSです。
通常のUbuntu Serverに入っているような標準コマンド、ネットワーク管理ツール(netplanやsystemd-networkd)、高度なシェル(bashの補完機能)、パッケージ管理の基本ツールすら、最初は一切入っていません。
ここから使い慣れた「普通のUbuntu Server」にするには、ヘッドノード側からchroot環境に入り、Ubuntuの標準サーバー環境を構成するパッケージ群(メタパッケージ)を一括インストールします。
- 仮想ファイルシステムのマウントと一時的なDNS設定(パッケージダウンロード用)のコピー
$ 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
- chroot環境へ入る
$ sudo chroot /srv/nfs/compute-root
- Ubuntu Serverの標準環境(最小構成)を一括インストール ※少し容量が大きいので数分かかります
$ apt update
$ apt install -y ubuntu-server
- テキストエディタやネットワークツールの確認
$ apt install -y nano vim netplan.io iputils-ping curl wget build-essential
- chroot環境を抜けて、マウントの解除と後片付け
$ 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ブートのやりかた
* http://lab.astamuse.co.jp/entry/2018/10/24/160000
* https://blog.dshimizu.jp/article/901
* https://qiita.com/hino9966/items/7c7043094a0ad3928e78
ディスクレス
* https://www.hiroom2.com/2017/07/02/ubuntu-1604-pxeboot-thin-client-nfs-ja/
* https://adsaria.hatenadiary.org/entry/20090206/1233905956
* https://sites.google.com/a/g.wakayama-u.jp/yasue/linux/networkboot-with-linuxmint17
* https://blog.michinari-nukazawa.com/2015/09/pxe-boot-ubuntu-1404-on-pxe-pdhcp.html