User Tools

Site Tools


自作クラスタ計算機:pxeブート

概要

  • Ubuntu 26.04

BIOSは成功しましたが、UEFIの方がうまくいかないので、参考にとどめてください。

手順

Ubuntu Baseのダウンロードと展開

ヘッドノード(Ubuntu 26.04 Desktop)上で、公式リポジトリから Ubuntu 26.04 のベースイメージをダウンロードします。 通常は https://cdimage.ubuntu.com/ の ubuntu-base/releases/ 内にあります。

  1. ディスクレス用OSの配置先を作成
    $ sudo mkdir -p /srv/nfs/compute-root
  2. 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
  3. 展開(パーミッションを保持するため必ず sudo で実行)
    $ sudo tar -zxf ubuntu-base-26.04-base-amd64.tar.gz -C /srv/nfs/compute-root

クライアントOSの基本設定 (chroot)

展開したイメージ内に chroot で入り、必要なパッケージ(特にカーネル)をインストールします。 Ubuntu Baseは最小限の構成なので、カーネルすら入っていません。

  1. 必要な仮想ファイルシステムをマウント
    $ 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
  2. 名前解決(DNS)ができるようにDNS設定をコピー
    $ sudo cp /etc/resolv.conf /srv/nfs/compute-root/etc/resolv.conf
  3. chroot環境に入る
    $ sudo chroot /srv/nfs/compute-root

ここからchroot内部の操作

  1. パッケージソースリストの作成(入っていない、または不十分な場合があるため)
    $ 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
  2. カーネル、initramfs-tools、ネットワークブートに必要なパッケージをインストール
    $ apt install -y linux-image-generic initramfs-tools openssh-server systemd-sysv
  3. ルートパスワードの設定
    $ passwd
  4. initramfsをネットワークブート(NFS)対応にする設定
    $ echo "BOOT=nfs" >> /etc/initramfs-tools/initramfs.conf
    $ update-initramfs -u -k all
  5. fstabの設定
    $ 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
  6. chrootから抜ける
    $ exit
  7. マウント解除
    $ 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
/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

ブートローダーのインストール

  1. 作ったカーネルと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
  2. 読み取り権限を与える
    $ sudo chmod 644 /srv/tftp/vmlinuz
    $ sudo chmod 644 /srv/tftp/initrd.img

BIOSを使う場合

  1. BIOSによるPXEブートのブートローダーをインストール
    $ sudo apt install -y pxelinux syslinux-common
  2. 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
  3. PXEブートメニュー(設定ファイル)を作成
    $ sudo mkdir -p /srv/tftp/pxelinux.cfg
    $ sudo nano /srv/tftp/pxelinux.cfg/default
    /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を使う場合

注意:自分の環境では未成功です。参考にとどめておいてください

  1. UEFIネットワークブート用のGRUBパッケージをインストール
    $ sudo apt update
    $ sudo apt install -y grub-efi-amd64-signed shim-signed
  2. 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 
  3. GRUB用設定ファイルの作成(BIOSのときは pxelinux.cfg/default を使いましたが、GRUBでは grub.cfg というファイルを使用します)
    $ sudo mkdir -p /srv/tftp/grub
    $ sudo nano /srv/tftp/grub/grub.cfg
    /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の基本設定を参考にしてください。

/etc/dnsmasq.conf
# 
# (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

計算ノードの起動確認

  1. 計算ノードのディスプレイとキーボードを繋ぎ、電源を入れます。
  1. 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の標準サーバー環境を構成するパッケージ群(メタパッケージ)を一括インストールします。

  1. 仮想ファイルシステムのマウントと一時的な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
  2. chroot環境へ入る
    $ sudo chroot /srv/nfs/compute-root
  3. Ubuntu Serverの標準環境(最小構成)を一括インストール ※少し容量が大きいので数分かかります
    $ apt update
    $ apt install -y ubuntu-server
  4. テキストエディタやネットワークツールの確認
    $ apt install -y nano vim netplan.io iputils-ping curl wget build-essential
  5. 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ブート.txt · Last modified: 2026/07/09 00:59 by koudai