Ubuntu 26.04 講座 / 追加ディスクの準備とfstab自動マウント
追加ディスクの自動マウントは、実際のファイルシステムのUUID(Universally Unique Identifier、汎用一意識別子)とマウントポイントを結びつけて設定します。ファイルが見えるという事実だけで、意図したディスクに書き込んでいると判断せず、再起動やデバイス不在の条件まで確認する必要があります。
フォーマット前にデバイスと既存データを確認する
lsblk -o NAME,SIZE,TYPE,FSTYPE,LABEL,UUID,MOUNTPOINTS
findmnt -rno SOURCE,TARGET,FSTYPE,OPTIONS
マウントの実習は、すでにファイルシステムがある別の練習用ディスクで始めます。容量・ラベル・UUIDを照合し、ルート・ブート・既存バックアップデバイスを除外します。空の新しいディスクしかない場合は、次の準備手順を先に行い、既存データを復旧する必要があるディスクはフォーマットしません。
新しい空の練習用ディスクをext4で準備する
新しいVDIファイルを接続したことと、ext4ファイルシステムを準備したことは異なります。元データがない新しい8GiB練習用ディスクをVirtualBoxで作成するには、VMを終了し、設定 → ストレージ → ストレージコントローラーのハードディスク追加から新しい仮想ディスクを作成します。既存のディスクやホストの物理ディスクは選択しません。
サーバーコンソールで以下の準備スクリプトを使用します。新しい空のVDI1つだけを対象とし、util-linuxのlsblk・wipefs・fdisk、udevadm、e2fsprogsのmkfs.ext4が必要です。command -vでツールを確認し、ないパッケージは出典を確認してからインストールします。仮想化ツールの新しいディスクの容量・モデル・シリアル番号と/dev/disk/by-idのパスをまず照合し、確信が持てなければ中止します。
fdiskではgでGPTを作成し、nで新しいパーティションを追加します。番号・開始・終了の既定値を使用できますが、pで対象と範囲を再確認した後にのみwで保存します。間違っていればwの前にqでキャンセルします。既にデータのあるディスクを初期化する手順ではなく、既存の署名・パーティション・マウントがある場合、スクリプトは中止します。
すでにファイルシステムがあり保持する資料があるディスクはこの初期化手順をスキップし、後のマウントの練習でデバイス・UUIDを確認します。全文を~/prepare-empty-lab-disk.shとして保存し、bash ~/prepare-empty-lab-disk.sh /dev/disk/by-id/実際の新しいディスクパスで実行します。ディスク確認とファイルシステム作成の前に、それぞれ実際のデバイスパスを再入力する必要があります。mkfsの後にはext4・lab-dataラベル・UUIDが記録され、フォーマットした元のデータは設定復元で戻りません。
set -euo pipefail
if [ "$#" -ne 1 ]; then
printf 'Usage: bash prepare-empty-lab-disk.sh /dev/disk/by-id/ACTUAL_NEW_DISK\n' >&2; exit 2
fi
case "$1" in /dev/disk/by-id/*) ;; *) printf 'Use the verified by-id path.\n' >&2; exit 2 ;; esac
disk=$(readlink -e -- "$1")
test -b "$disk"
if [ "$(lsblk -dnro TYPE "$disk")" != disk ] || [ "$(lsblk -dnro RO "$disk")" != 0 ]; then
printf 'Not a writable whole disk.\n' >&2; exit 1
fi
if [ "$(lsblk -nr -o NAME "$disk" | wc -l)" -ne 1 ]; then
printf 'Partitions or dependent devices already exist; stop.\n' >&2; exit 1
fi
if lsblk -nr -o MOUNTPOINTS "$disk" | grep -q '[^[:space:]]'; then
printf 'A mount is present; stop.\n' >&2; exit 1
fi
signatures=$(sudo wipefs --no-act --noheadings --output TYPE "$disk")
if [ -n "$signatures" ]; then
printf 'Existing signatures: %s; stop.\n' "$signatures" >&2; exit 1
fi
lsblk -o NAME,SIZE,TYPE,MODEL,SERIAL,FSTYPE,MOUNTPOINTS "$disk"
read -r -p "Type the verified empty disk path ($disk): " confirmed
if [ "$confirmed" != "$disk" ]; then exit 1; fi
sudo fdisk "$disk"
sudo udevadm settle
mapfile -t partitions < <(lsblk -nrpo NAME,TYPE "$disk" | awk '$2 == "part" {print $1}')
if [ "${#partitions[@]}" -ne 1 ]; then
printf 'Expected one newly created partition; inspect before formatting.\n' >&2; exit 1
fi
partition=${partitions[0]}
if findmnt -rn --source "$partition" >/dev/null; then
printf 'The partition is mounted; stop.\n' >&2; exit 1
fi
signatures=$(sudo wipefs --no-act --noheadings --output TYPE "$partition")
if [ -n "$signatures" ]; then printf 'Partition already has a signature; stop.\n' >&2; exit 1; fi
lsblk -o NAME,SIZE,TYPE,FSTYPE,MOUNTPOINTS "$disk"
read -r -p "Type the new partition to format as ext4 ($partition): " confirmed
if [ "$confirmed" != "$partition" ]; then exit 1; fi
sudo mkfs.ext4 -L lab-data "$partition"
sudo blkid "$partition"
lsblk -f "$disk"
すでに別の練習用ディスクに ext4 が準備されている場合は、初期化スクリプトを省略して、UUID の確認から進めます。同じ仮想ディスクを複数の VM で同時に使用しません。以下の永続マウント手順は、確認したパーティションの UUID に基づいて実施します。
fdisk マニュアルでパーティション編集およびディスク対象の意味を確認してください。
mke2fs マニュアルは mkfs.ext4 のファイルシステム作成オプションとその影響について説明しています。
fstab のシステムマウントとサービスの依存関係
サーバーでの永続マウントは /etc/fstab の実際の UUID・マウントポイント・ファイルシステム・オプションを関連付けて管理します。ディレクトリ作成や一時的な mount の成功と再起動後のマウントは異なるため、元のバックアップ・確認・再起動を区別して確認します。サービスデータのパスであれば、マウント失敗時にサービスが書き込みを開始できないように依存関係も設計します。
ブート時に必要なサービスデータか、なくてもよい外部デバイスかによって、失敗時のポリシーは異なります。nofailはブートを続行するのに役立ちますが、該当ディスクがない場合にアプリが空のマウントディレクトリに書き込む問題を防ぐことはできません。
バックアップとマウントポイントの準備
(
set -eu
backup=$(sudo mktemp /root/fstab-backup.XXXXXX)
sudo cp -a /etc/fstab "$backup"
printf 'Backup: %s\n' "$backup"
sudo mkdir -p /srv/lab-data
)
マウントポイントがすでに使用中であったり、ファイルが入っていた場合は、まず内容を保存し、別の空のポイントを選択します。ディスクがマウントされると、既存のローカルファイルは隠される場合があります。ディレクトリを作成したからといって、ディスクが接続されたわけではありません。
実際のUUIDで項目を1つ追加する
sudoedit /etc/fstabで開き、既存内容を保持したまま1行を追加します。以下はext4演習ディスクを選択した場合の形式の例です。UUID表示はlsblkで確認した実際の値に置き換え、ファイルシステムが異なる場合はそのまま使用しません。
UUID=REPLACE_WITH_VERIFIED_UUID /srv/lab-data ext4 defaults,nofail,x-systemd.device-timeout=10s 0 2
上記の項目は、デバイスがなくてもブートを続行するための演習例です。サービス必須ディスクにはこれをそのまま記載せず、マウント失敗時にサービスを開始しない依存関係と運用ポリシーを設計します。空白が含まれるパスについては、fstabのエスケープ規則も確認してください。
(
set -eu
sudo findmnt --verify --verbose
sudo systemctl daemon-reload
sudo mount /srv/lab-data
findmnt --mountpoint /srv/lab-data
)
検証エラーをまず解決し、意図した項目のみをマウントします。他のディスクまで一度に処理する mount -a より、実習対象の1つを指定すれば影響を絞ることができます。findmnt の実際のソースとファイルシステムが期待する UUID のデバイスかどうか照合します。
マウント確認の後にのみデータを書き込みます
expected_uuid=REPLACE_WITH_VERIFIED_UUID
actual_uuid=$(findmnt -rn --mountpoint /srv/lab-data -o UUID || true)
if [ "$actual_uuid" != "$expected_uuid" ]; then
printf 'Expected disk is not mounted; stop the write job.\n' >&2
exit 1
fi
printf 'Verified the expected mounted filesystem.\n'
上記のコードは ~/check-lab-mount.sh のような別の Bash スクリプトとして保存し、実際の UUID に置き換えた後、bash ~/check-lab-mount.sh で実行します。失敗した場合、スクリプトは 1 で終了し、後続の書き込み作業もこの成功可否を条件とする必要があります。確認した状態で演習ファイルを書き込み、再起動後に再度読み取ります。デバイス不在のテストでは、VMを安全に停止して実習用ディスクを切り離し、その後で起動して確認するなど、ファイルシステムを使用中に取り外さない手順を取ります。
失敗した場合、コンソールで今回の fstab 項目のみを元の状態と比較して復元し、構文を再度確認します。デバイスが抜けたときにバックアップ・サービス作業がローカルディレクトリに書き込まず中断されるかも確認して、初めて自動マウント運用の検証が完了します。




