AlmaLinux 10 総合ガイド 第4章: ストレージとファイルシステム

AlmaLinux 10 総合ガイド
第4章: ストレージとファイルシステム

【この章で学ぶこと】 ディスク、パーティション、ファイルシステムの管理
【なぜ重要か】 ディスク容量不足はサービス停止の主要原因
【前提知識】 第3章完了、ファイルとディレクトリの理解
【所要時間】 約2.5時間

サーバーを運用していると、「ディスク容量が足りない」という問題に必ず直面します。ログファイルが膨れ上がったり、データベースが成長したり、バックアップファイルが蓄積したり。この章では、ディスクとファイルシステムを正しく理解し、管理する方法を学びます。

🚨 この章の操作は危険を伴います: パーティション操作やファイルシステム作成は、データを完全に消去する可能性があります。本ガイドの学習用VPS環境で練習し、本番環境では十分なバックアップを取ってから作業してください。VPSはOSの再インストールが容易なため、万が一失敗しても復旧できます。

4.1 ストレージの基礎知識

まず、ディスクからファイルが読み書きできるようになるまでの仕組みを理解しましょう。

4.1.1 ブロックデバイスとは

Linuxでは、ハードディスクやSSDなどの記憶装置をブロックデバイスと呼びます。「ブロック」とは、データを読み書きする最小単位(通常512バイトまたは4096バイト)のことで、ブロックデバイスはこのブロック単位でデータにアクセスします。

ブロックデバイスは /dev ディレクトリ以下にファイルとして表示されます。これはLinuxの「すべてはファイル」という設計思想に基づいています。

4.1.2 ディスク、パーティション、ファイルシステムの関係

新しいディスクを使えるようにするには、以下の手順を踏みます。

物理ディスク(/dev/sdb)
    ↓
パーティション作成(/dev/sdb1, /dev/sdb2...)
    ↓
ファイルシステム作成(XFS, ext4等でフォーマット)
    ↓
マウント(/mnt/data 等のディレクトリに接続)
    ↓
ファイルの読み書きが可能に

それぞれの役割を説明します。

  • 物理ディスク: 実際のハードウェア。SSD、HDD、NVMeドライブなど
  • パーティション: ディスクを論理的に分割した領域。1台のディスクを複数の独立した領域として扱える
  • ファイルシステム: パーティション上にデータを整理・管理する仕組み。ファイル名、ディレクトリ構造、パーミッションなどを管理
  • マウント: ファイルシステムをディレクトリツリーに接続し、アクセス可能にする操作

4.1.3 デバイス名の規則(/dev/sda, /dev/nvme0n1等)

Linuxでは、ディスクの種類や接続方法によってデバイス名が異なります。

デバイス名パターン 説明
/dev/sdX SATA/SAS/USB接続のディスク /dev/sda, /dev/sdb
/dev/sdXN 上記ディスクのパーティション /dev/sda1, /dev/sdb2
/dev/nvmeXnY NVMe SSD /dev/nvme0n1
/dev/nvmeXnYpZ NVMe SSDのパーティション /dev/nvme0n1p1
/dev/vdX 仮想環境のディスク(virtio) /dev/vda, /dev/vdb
/dev/xvdX Xen仮想環境のディスク /dev/xvda

命名規則のポイントは以下の通りです。

  • アルファベット(a, b, c…)は検出順序を表す(sda = 1番目、sdb = 2番目)
  • 数字(1, 2, 3…)はパーティション番号を表す
  • ディスクの追加・削除でデバイス名が変わる可能性がある(後述のUUIDが重要な理由)

4.1.4 MBRとGPTの違い

パーティションテーブルには、主に2つの形式があります。

項目 MBR(Master Boot Record) GPT(GUID Partition Table)
最大ディスクサイズ 2TB 約9.4ZB(事実上無制限)
最大パーティション数 4(プライマリ) 128
ブートモード BIOS(レガシー) UEFI推奨(BIOSも可)
冗長性 なし ヘッダーのバックアップあり
推奨用途 古いシステムとの互換性 現代のシステム(推奨)

AlmaLinux 10では、UEFIブートでもレガシーBIOSブートでもGPTがデフォルトで使用されます。2TB以上のディスクを扱う場合はGPTが必須ですが、それより小さいディスクでもGPTの使用が推奨されています。

💡 Tips: 新規にパーティションを作成する場合は、特別な理由がない限りGPTを選択してください。MBRは古いシステムとの互換性のためにのみ使用します。

4.2 ディスクとパーティションの確認

まず、システムに接続されているディスクとパーティションの状態を確認する方法を学びます。

4.2.1 lsblk でブロックデバイス一覧

lsblk(list block devices)は、ブロックデバイスの一覧を階層構造で表示するコマンドです。

[実行ユーザー: 一般ユーザー]

$ lsblk
NAME        MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
sda           8:0    0   50G  0 disk 
├─sda1        8:1    0    1G  0 part /boot
└─sda2        8:2    0   49G  0 part 
  ├─al-root 253:0    0   45G  0 lvm  /
  └─al-swap 253:1    0    4G  0 lvm  [SWAP]
sdb           8:16   0   20G  0 disk 
sr0          11:0    1 1024M  0 rom

出力の読み方を説明します。

  • NAME: デバイス名(ツリー構造でパーティションの親子関係を表示)
  • MAJ:MIN: メジャー番号:マイナー番号(カーネル内部での識別子)
  • RM: リムーバブル(取り外し可能)かどうか(1=はい、0=いいえ)
  • SIZE: デバイスのサイズ
  • RO: 読み取り専用かどうか(1=はい、0=いいえ)
  • TYPE: デバイスの種類(disk=ディスク、part=パーティション、lvm=LVM論理ボリューム、rom=光学ドライブ)
  • MOUNTPOINTS: マウントポイント(マウントされている場所)

上記の例では、50GBのディスク(sda)に2つのパーティションがあり、2番目のパーティション(sda2)はLVMで管理され、ルートファイルシステムとスワップに使われています。sdbは20GBの未使用ディスクです。

4.2.2 fdisk -l でパーティションテーブル確認

fdisk -l は、より詳細なパーティション情報を表示します。

[実行ユーザー: 一般ユーザー(sudo使用)]

$ sudo fdisk -l /dev/sda
Disk /dev/sda: 50 GiB, 53687091200 bytes, 104857600 sectors
Disk model: VBOX HARDDISK   
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 8A3F5E2B-1234-5678-9ABC-DEF012345678

Device       Start       End   Sectors Size Type
/dev/sda1     2048   2099199   2097152   1G Linux filesystem
/dev/sda2  2099200 104857566 102758367  49G Linux LVM

重要な情報を確認しましょう。

  • Disk: ディスクの総容量
  • Disklabel type: パーティションテーブルの種類(gpt または dos)
  • Device: 各パーティションの開始/終了セクター、サイズ、タイプ

4.2.3 parted コマンドの基本

parted は、GPTパーティションを扱うための推奨ツールです。

[実行ユーザー: 一般ユーザー(sudo使用)]

$ sudo parted /dev/sda print
Model: ATA VBOX HARDDISK (scsi)
Disk /dev/sda: 53.7GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags: 

Number  Start   End     Size    File system  Name  Flags
 1      1049kB  1075MB  1074MB  xfs
 2      1075MB  53.7GB  52.6GB               lvm

サイズがバイト単位で表示され、ファイルシステムの種類も確認できます。

4.2.4 ディスク情報の読み方

複数のコマンドを使い分けることで、ディスクの状態を正確に把握できます。

確認したい情報 推奨コマンド
ディスクとパーティションの構成 lsblk
詳細なパーティション情報 sudo fdisk -l
GPTパーティションの詳細 sudo parted /dev/sdX print
UUIDの確認 blkid

4.3 パーティションの作成

新しいディスクにパーティションを作成する方法を学びます。

🚨 重要: パーティション操作は既存データを破壊する可能性があります。学習用VPSに追加ディスクがある場合はそちらで練習してください。システムディスクしかない場合は、コマンドの意味を理解することを優先し、実際の操作は慎重に行ってください。本番環境では必ずバックアップを取り、対象デバイスを十分に確認してから実行してください。

4.3.1 なぜパーティションを分けるのか

1つのディスクを複数のパーティションに分ける理由は以下の通りです。

  • 障害の隔離: あるパーティションが満杯になっても、他のパーティションは影響を受けない
  • バックアップの効率化: 重要なデータのみを選択的にバックアップできる
  • セキュリティ: パーティションごとに異なるマウントオプション(noexec等)を設定できる
  • マルチブート: 複数のOSを同じディスクにインストールできる

一般的なサーバーでは、以下のようなパーティション構成が推奨されます。

  • /boot – ブートローダーとカーネル(1GB程度)
  • / – ルートファイルシステム
  • /var – ログファイルやデータベース(ログで溢れてもシステムに影響しない)
  • /home – ユーザーデータ
  • swap – スワップ領域

4.3.2 fdisk でのパーティション作成手順

まず、fdisk を使った対話式のパーティション作成を学びます。以下は、新しいディスク /dev/sdb にパーティションを作成する例です。

🚨 警告: 対象デバイスを間違えると、システムディスクのデータが消失します。必ず lsblk で対象ディスクを確認してから実行してください。

[実行ユーザー: 一般ユーザー(sudo使用)]

# まず対象ディスクを確認
$ lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
sda      8:0    0   50G  0 disk 
├─sda1   8:1    0    1G  0 part /boot
└─sda2   8:2    0   49G  0 part 
  ├─al-root 253:0    0   45G  0 lvm  /
  └─al-swap 253:1    0    4G  0 lvm  [SWAP]
sdb      8:16   0   20G  0 disk     # ← このディスクにパーティションを作成

# fdiskを起動
$ sudo fdisk /dev/sdb

Welcome to fdisk (util-linux 2.40).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

Device does not contain a recognized partition table.
Created a new DOS disklabel with disk identifier 0x12345678.

Command (m for help): g    # ← GPTパーティションテーブルを作成
Created a new GPT disklabel (GUID: XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX).

Command (m for help): n    # ← 新しいパーティションを作成
Partition number (1-128, default 1): 
First sector (2048-41943006, default 2048): 
Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-41943006, default 41940991): +10G

Created a new partition 1 of type 'Linux filesystem' and of size 10 GiB.

Command (m for help): p    # ← パーティションテーブルを表示して確認
Disk /dev/sdb: 20 GiB, 21474836480 bytes, 41943040 sectors
Disk model: VBOX HARDDISK   
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX

Device     Start      End  Sectors Size Type
/dev/sdb1   2048 20973567 20971520  10G Linux filesystem

Command (m for help): w    # ← 変更をディスクに書き込む
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.

fdiskの主要コマンドをまとめます。

コマンド 説明
m ヘルプを表示
g 新しいGPTパーティションテーブルを作成
o 新しいMBR(DOS)パーティションテーブルを作成
n 新しいパーティションを作成
d パーティションを削除
p パーティションテーブルを表示
t パーティションタイプを変更
w 変更を書き込んで終了
q 変更を保存せずに終了

4.3.3 parted でのGPTパーティション作成

parted を使うと、コマンドラインから直接パーティションを作成できます。GPTパーティションを扱う場合に推奨されるツールです。

[実行ユーザー: 一般ユーザー(sudo使用)]

# パーティションテーブルをGPTで初期化
$ sudo parted /dev/sdb mklabel gpt

# 10GBのパーティションを作成
$ sudo parted /dev/sdb mkpart primary 0% 10GB

# 結果を確認
$ sudo parted /dev/sdb print
Model: ATA VBOX HARDDISK (scsi)
Disk /dev/sdb: 21.5GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags: 

Number  Start   End     Size    File system  Name     Flags
 1      1049kB  10.0GB  9999MB               primary

💡 Tips: partedでは、サイズを「0%」「50%」「100%」のようにパーセンテージで指定することもできます。これにより、ディスク全体を使うパーティションを簡単に作成できます。

4.3.4 パーティションタイプの選択

GPTでは、パーティションの用途に応じてタイプを設定します。主なタイプは以下の通りです。

タイプ 用途
Linux filesystem 一般的なLinuxファイルシステム用
Linux swap スワップ領域用
Linux LVM LVM物理ボリューム用
EFI System UEFIブート用(/boot/efi)

4.3.5 変更の確認と保存

パーティション作成後は、カーネルにパーティションテーブルの変更を通知する必要があります。

[実行ユーザー: 一般ユーザー(sudo使用)]

# パーティションテーブルを再読み込み
$ sudo partprobe /dev/sdb

# 新しいパーティションが認識されたことを確認
$ lsblk /dev/sdb
NAME   MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
sdb      8:16   0  20G  0 disk 
└─sdb1   8:17   0  10G  0 part

4.4 ファイルシステムの作成

パーティションを作成したら、次はファイルシステムを作成(フォーマット)します。

4.4.1 XFSとext4の違い

AlmaLinux 10では、XFSがデフォルトのファイルシステムです。ext4も広く使われています。

項目 XFS ext4
最大ファイルサイズ 8EiB 16TiB
最大ボリュームサイズ 8EiB 1EiB
オンラインサイズ変更 拡張のみ可能 拡張・縮小可能
大容量ファイルの性能 優れている 良好
小容量ファイルの性能 良好 優れている
推奨用途 大容量ストレージ、データベース 汎用、小規模システム

💡 選択の指針: 迷ったらXFSを選択してください。AlmaLinuxのデフォルトであり、エンタープライズ環境で広く検証されています。縮小が必要な場合や、非常に小さなファイルが大量にある場合はext4を検討してください。

4.4.2 mkfs.xfs でXFSファイルシステム作成

🚨 警告: mkfsコマンドは、パーティション上の既存データを完全に消去します。対象デバイスを十分に確認してから実行してください。

[実行ユーザー: 一般ユーザー(sudo使用)]

# XFSファイルシステムを作成
$ sudo mkfs.xfs /dev/sdb1
meta-data=/dev/sdb1              isize=512    agcount=4, agsize=655360 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=1, sparse=1, rmapbt=1
         =                       reflink=1    bigtime=1 inobtcount=1 nrext64=1
data     =                       bsize=4096   blocks=2621440, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0, ftype=1
log      =internal log           bsize=4096   blocks=16384, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0

4.4.3 mkfs.ext4 でext4ファイルシステム作成

[実行ユーザー: 一般ユーザー(sudo使用)]

# ext4ファイルシステムを作成
$ sudo mkfs.ext4 /dev/sdb1
mke2fs 1.47.0 (5-Feb-2023)
Creating filesystem with 2621440 4k blocks and 655360 inodes
Filesystem UUID: a1b2c3d4-e5f6-7890-abcd-ef1234567890
Superblock backups stored on blocks: 
	32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632

Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (16384 blocks): done
Writing superblocks and filesystem accounting information: done

4.4.4 ファイルシステムオプションの指定

mkfsコマンドでは、様々なオプションを指定できます。

# ラベル付きでXFSを作成
$ sudo mkfs.xfs -L mydata /dev/sdb1

# ラベル付きでext4を作成(予約領域を1%に削減)
$ sudo mkfs.ext4 -L mydata -m 1 /dev/sdb1

よく使うオプションは以下の通りです。

オプション XFS ext4 説明
ラベル設定 -L -L ファイルシステムに名前を付ける
強制実行 -f -F 既存のファイルシステムを上書き
予約領域 -m % root用に予約する領域の割合

4.4.5 ファイルシステム作成時の注意事項

  • 必ず正しいデバイスを指定していることを確認する(lsblkで確認)
  • 既存データがある場合は、バックアップを取ってから実行する
  • mkfsは取り消しできない操作である
  • 実行前に mount コマンドで対象パーティションがマウントされていないことを確認する

4.5 マウントの理解と実践

ファイルシステムを作成したら、マウントしてアクセス可能にします。

4.5.1 マウントとは何か

マウントとは、ファイルシステムをディレクトリツリーの特定の場所(マウントポイント)に接続する操作です。Linuxでは、すべてのファイルシステムは単一のディレクトリツリー(/ を頂点とする)に接続されます。

/                      ← ルートファイルシステム(/dev/sda2)
├── boot/              ← /dev/sda1 がマウントされている
├── home/              
├── var/               
│   └── log/           
├── mnt/               
│   └── data/          ← /dev/sdb1 をここにマウントできる
└── tmp/

4.5.2 マウントポイントの作成

マウントポイントは、空のディレクトリです。事前に作成しておく必要があります。

[実行ユーザー: 一般ユーザー(sudo使用)]

# マウントポイントを作成
$ sudo mkdir -p /mnt/data

# 権限を確認
$ ls -la /mnt/
total 0
drwxr-xr-x.  3 root root  18 Jan 15 10:00 .
dr-xr-xr-x. 18 root root 235 Jan 15 09:00 ..
drwxr-xr-x.  2 root root   6 Jan 15 10:00 data

4.5.3 mount コマンドで手動マウント

[実行ユーザー: 一般ユーザー(sudo使用)]

# ファイルシステムをマウント
$ sudo mount /dev/sdb1 /mnt/data

# マウントされたことを確認
$ df -h /mnt/data
Filesystem      Size  Used Avail Use% Mounted on
/dev/sdb1        10G   94M  9.9G   1% /mnt/data

# ファイルを作成してテスト
$ sudo touch /mnt/data/test.txt
$ ls /mnt/data/
test.txt

4.5.4 umount でアンマウント

ファイルシステムを安全に取り外すには、umount コマンドを使います。

[実行ユーザー: 一般ユーザー(sudo使用)]

# アンマウント
$ sudo umount /mnt/data

# または、デバイス名でも可能
$ sudo umount /dev/sdb1

アンマウントできない場合は、そのファイルシステムを使用しているプロセスがあります。

# 使用中のプロセスを確認
$ sudo lsof +D /mnt/data

# または fuser コマンドで確認
$ sudo fuser -mv /mnt/data

4.5.5 現在のマウント状態確認

[実行ユーザー: 一般ユーザー]

# 現在のマウント状態を表示
$ mount | grep -E '^/dev'
/dev/mapper/al-root on / type xfs (rw,relatime,seclabel,attr2,inode64,logbufs=8,logbsize=32k,noquota)
/dev/sda1 on /boot type xfs (rw,relatime,seclabel,attr2,inode64,logbufs=8,logbsize=32k,noquota)
/dev/sdb1 on /mnt/data type xfs (rw,relatime,seclabel,attr2,inode64,logbufs=8,logbsize=32k,noquota)

# df コマンドでも確認可能
$ df -hT
Filesystem          Type      Size  Used Avail Use% Mounted on
/dev/mapper/al-root xfs        45G  2.1G   43G   5% /
/dev/sda1           xfs       1.0G  202M  823M  20% /boot
/dev/sdb1           xfs        10G   94M  9.9G   1% /mnt/data

4.5.6 マウントオプション(ro, rw, noexec等)

マウント時にオプションを指定することで、ファイルシステムの動作を制御できます。

オプション 説明
rw 読み書き可能(デフォルト)
ro 読み取り専用
noexec 実行ファイルの実行を禁止
nosuid setuidビットを無効化
nodev デバイスファイルを無効化
noatime アクセス時刻の更新を無効化(性能向上)
# 読み取り専用でマウント
$ sudo mount -o ro /dev/sdb1 /mnt/data

# 複数オプションを指定(カンマ区切り)
$ sudo mount -o noexec,nosuid,nodev /dev/sdb1 /mnt/data

4.6 /etc/fstab による自動マウント

手動でマウントしたファイルシステムは、システムを再起動すると解除されます。起動時に自動マウントするには、/etc/fstab に設定を記述します。

4.6.1 /etc/fstab とは何か

/etc/fstab(file systems table)は、起動時にマウントするファイルシステムの一覧を記述するファイルです。systemdはこのファイルを読み取り、記載されたファイルシステムを自動的にマウントします。

4.6.2 fstab の書式(6つのフィールド)

fstabの各行は、6つのフィールドで構成されます。

# デバイス               マウントポイント  タイプ  オプション      dump  fsck
UUID=a1b2c3d4-...       /mnt/data         xfs     defaults        0     0
フィールド 説明
1. デバイス マウントするデバイス(UUID推奨) UUID=…, /dev/sdb1
2. マウントポイント マウント先ディレクトリ /mnt/data
3. ファイルシステムタイプ ファイルシステムの種類 xfs, ext4, swap
4. オプション マウントオプション defaults, ro, noexec
5. dump バックアップ対象(通常0) 0
6. fsck順序 起動時チェック順序 0, 1, 2

fsck順序の意味:

  • 0 = チェックしない
  • 1 = 最初にチェック(ルートファイルシステム)
  • 2 = ルートの後にチェック(その他のファイルシステム)

4.6.3 UUID の確認方法(blkid コマンド)

UUID(Universally Unique Identifier)は、ファイルシステムに割り当てられた一意の識別子です。

[実行ユーザー: 一般ユーザー(sudo使用)]

$ sudo blkid
/dev/sda1: UUID="12345678-1234-1234-1234-123456789abc" TYPE="xfs" PARTUUID="abcd1234-01"
/dev/sda2: UUID="87654321-4321-4321-4321-cba987654321" TYPE="LVM2_member" PARTUUID="abcd1234-02"
/dev/sdb1: UUID="a1b2c3d4-e5f6-7890-abcd-ef1234567890" TYPE="xfs" PARTLABEL="primary" PARTUUID="11111111-2222-3333-4444-555555555555"
/dev/mapper/al-root: UUID="aaaabbbb-cccc-dddd-eeee-ffffffffffff" TYPE="xfs"
/dev/mapper/al-swap: UUID="11112222-3333-4444-5555-666677778888" TYPE="swap"

# 特定のデバイスのUUIDのみ表示
$ sudo blkid /dev/sdb1
/dev/sdb1: UUID="a1b2c3d4-e5f6-7890-abcd-ef1234567890" TYPE="xfs" PARTLABEL="primary" PARTUUID="11111111-2222-3333-4444-555555555555"

4.6.4 UUID を使ったマウント設定(推奨)

デバイス名(/dev/sdb1 など)ではなく、UUIDを使うことを強く推奨します。理由は以下の通りです。

  • デバイス名は、ディスクの追加・削除で変わる可能性がある
  • UUIDはファイルシステム作成時に決まり、変更されない
  • 間違ったデバイスをマウントするリスクを軽減できる

4.6.5 fstab エントリの作成

🚨 重要: fstabの編集ミスは、システムが起動しなくなる原因となります。編集前に必ずバックアップを取り、編集後は mount -a でテストしてください。

[実行ユーザー: 一般ユーザー(sudo使用)]

# まず、fstabのバックアップを取る
$ sudo cp /etc/fstab /etc/fstab.backup

# UUIDを確認
$ sudo blkid /dev/sdb1
/dev/sdb1: UUID="a1b2c3d4-e5f6-7890-abcd-ef1234567890" TYPE="xfs"

# fstabに追記(viやnanoで編集)
$ sudo vim /etc/fstab

以下の行を追加します。

# /dev/sdb1 - データ用パーティション
UUID=a1b2c3d4-e5f6-7890-abcd-ef1234567890    /mnt/data    xfs    defaults    0 0

4.6.6 mount -a で設定テスト

fstabを編集したら、必ずテストします。

[実行ユーザー: 一般ユーザー(sudo使用)]

# fstabに記載されたすべてのファイルシステムをマウント
$ sudo mount -a

# エラーがなければ成功。確認する
$ df -h /mnt/data
Filesystem      Size  Used Avail Use% Mounted on
/dev/sdb1        10G   94M  9.9G   1% /mnt/data

エラーが発生した場合は、fstabの記述を見直してください。よくある間違いは以下の通りです。

  • UUIDのタイプミス
  • マウントポイントが存在しない
  • ファイルシステムタイプが間違っている
  • フィールド間の区切りがタブでなくスペース(どちらでも動作するが、タブ推奨)

4.6.7 よくあるトラブル: fstab設定ミスでの起動失敗

fstabに間違いがあると、システムが起動しなくなることがあります。その場合の対処法を説明します。

症状: 起動時に「Give root password for maintenance」というメッセージが表示される

対処法:

  1. rootパスワードを入力してメンテナンスモードに入る
  2. ルートファイルシステムを読み書き可能で再マウント
# ルートを読み書き可能にする
# mount -o remount,rw /

# バックアップからfstabを復元
# cp /etc/fstab.backup /etc/fstab

# または、問題のある行をコメントアウト
# vim /etc/fstab

# 再起動
# reboot

💡 予防策: fstabを編集する前には必ずバックアップを取る習慣をつけましょう。また、nofailオプションを追加すると、そのファイルシステムがマウントできなくても起動を続行します(ただし、重要なファイルシステムには使用しない)。

4.7 ディスク使用量の管理

サーバー運用において、ディスク使用量の監視は非常に重要です。ディスクが満杯になると、ログが書き込めなくなりサービスが停止します。

4.7.1 df コマンドでディスク使用状況確認(-h, -T オプション)

df(disk free)は、ファイルシステムの使用状況を表示します。

[実行ユーザー: 一般ユーザー]

# 人間が読みやすい形式で表示(-h: human-readable)
$ df -h
Filesystem           Size  Used Avail Use% Mounted on
/dev/mapper/al-root   45G  2.1G   43G   5% /
/dev/sda1            1.0G  202M  823M  20% /boot
/dev/sdb1             10G   94M  9.9G   1% /mnt/data
tmpfs                1.9G     0  1.9G   0% /dev/shm

# ファイルシステムタイプも表示(-T)
$ df -hT
Filesystem          Type      Size  Used Avail Use% Mounted on
/dev/mapper/al-root xfs        45G  2.1G   43G   5% /
/dev/sda1           xfs       1.0G  202M  823M  20% /boot
/dev/sdb1           xfs        10G   94M  9.9G   1% /mnt/data
tmpfs               tmpfs     1.9G     0  1.9G   0% /dev/shm

注目すべきは Use% 列です。一般的に以下の基準で監視します。

  • 80%以下: 正常
  • 80-90%: 警告(対策を検討)
  • 90%以上: 危険(早急に対応が必要)

4.7.2 du コマンドでディレクトリ使用量確認

du(disk usage)は、ディレクトリやファイルのディスク使用量を表示します。

[実行ユーザー: 一般ユーザー(sudo使用)]

# 特定ディレクトリの合計サイズ(-s: summary、-h: human-readable)
$ sudo du -sh /var/log
156M    /var/log

# サブディレクトリごとのサイズを表示
$ sudo du -sh /var/log/*
32K     /var/log/audit
4.0K    /var/log/boot.log
48M     /var/log/journal
84K     /var/log/messages
8.0K    /var/log/secure

4.7.3 大きなファイル・ディレクトリの特定

ディスク容量が不足している場合、何が容量を消費しているかを特定する必要があります。

[実行ユーザー: 一般ユーザー(sudo使用)]

# /var 以下で容量を多く使っているディレクトリ上位10件
$ sudo du -h /var --max-depth=2 | sort -rh | head -10
2.1G    /var
1.2G    /var/cache
890M    /var/cache/dnf
156M    /var/log
48M     /var/log/journal
44M     /var/lib
32K     /var/log/audit

# 100MB以上のファイルを検索
$ sudo find / -type f -size +100M -exec ls -lh {} \; 2>/dev/null
-rw-r--r--. 1 root root 150M Jan 15 10:00 /var/cache/dnf/packages.db

4.7.4 ディスク容量不足時の対処手順

ディスク容量が不足した場合の基本的な対処手順です。

  1. 状況確認: df -h でどのファイルシステムが満杯か確認
  2. 原因特定: du で大きなファイル・ディレクトリを特定
  3. 不要ファイル削除: 古いログ、キャッシュ、一時ファイルを削除
  4. 再確認: df -h で空き容量を確認

4.7.5 実践例: /var/log 配下の古いログ削除

ログファイルが肥大化している場合の対処例です。

[実行ユーザー: 一般ユーザー(sudo使用)]

# 現在のログサイズを確認
$ sudo du -sh /var/log
156M    /var/log

# 7日以上前のログファイルを確認(削除前に必ず確認)
$ sudo find /var/log -type f -name "*.log" -mtime +7
/var/log/messages-20250108
/var/log/secure-20250108

# 確認後、古いログを削除(慎重に!)
$ sudo find /var/log -type f -name "*-20*" -mtime +7 -delete

# パッケージマネージャーのキャッシュを削除
$ sudo dnf5 clean all
48 files removed. 12.3 MiB freed.

# 削除後のサイズを確認
$ sudo du -sh /var/log
98M     /var/log

🚨 注意: ログファイルの削除は慎重に行ってください。トラブルシューティングに必要なログを消してしまう可能性があります。定期的なログローテーション設定(第9章で解説)で自動管理することを推奨します。

4.8 LVM(論理ボリューム管理)の基礎

LVM(Logical Volume Manager)は、物理ディスクを柔軟に管理するための仕組みです。

4.8.1 LVM とは何か – なぜ使うのか

LVMを使う主な利点は以下の通りです。

  • 柔軟なサイズ変更: ファイルシステムを停止せずに拡張できる
  • 複数ディスクの統合: 複数の物理ディスクを1つの論理ボリュームとして使える
  • スナップショット: ある時点のデータを保存し、後で復元できる
  • シンプロビジョニング: 実際に使用する分だけディスク領域を割り当てる

AlmaLinux 10のデフォルトインストールでは、ルートファイルシステムにLVMが使用されています。

4.8.2 物理ボリューム(PV)、ボリュームグループ(VG)、論理ボリューム(LV)

LVMは3つの層で構成されています。

┌─────────────────────────────────────────────────────────┐
│              論理ボリューム(LV)                         │
│         /dev/vg_data/lv_home    /dev/vg_data/lv_var     │
├─────────────────────────────────────────────────────────┤
│              ボリュームグループ(VG)                     │
│                      vg_data                            │
├─────────────────────────────────────────────────────────┤
│              物理ボリューム(PV)                         │
│           /dev/sdb1           /dev/sdc1                 │
├─────────────────────────────────────────────────────────┤
│              物理ディスク                                │
│           /dev/sdb            /dev/sdc                  │
└─────────────────────────────────────────────────────────┘
  • 物理ボリューム(PV): LVMで使用するパーティションまたはディスク全体
  • ボリュームグループ(VG): 複数のPVをまとめたストレージプール
  • 論理ボリューム(LV): VGから切り出した仮想的なパーティション(ファイルシステムを作成する対象)

4.8.3 LVM の作成手順

新しいディスク(/dev/sdc)を使ってLVMを構築する例を示します。

🚨 注意: 以下の操作は練習用ディスクで行ってください。誤って重要なディスクを指定するとデータが消失します。

[実行ユーザー: 一般ユーザー(sudo使用)]

# 1. 物理ボリュームの作成
$ sudo pvcreate /dev/sdc
  Physical volume "/dev/sdc" successfully created.

# 2. ボリュームグループの作成
$ sudo vgcreate vg_data /dev/sdc
  Volume group "vg_data" successfully created

# 3. 論理ボリュームの作成(10GBのボリューム)
$ sudo lvcreate -L 10G -n lv_storage vg_data
  Logical volume "lv_storage" created.

# 4. ファイルシステムの作成
$ sudo mkfs.xfs /dev/vg_data/lv_storage

# 5. マウントポイントの作成とマウント
$ sudo mkdir /mnt/storage
$ sudo mount /dev/vg_data/lv_storage /mnt/storage

# 6. 確認
$ df -h /mnt/storage
Filesystem                    Size  Used Avail Use% Mounted on
/dev/mapper/vg_data-lv_storage  10G   94M  9.9G   1% /mnt/storage

4.8.4 LVM のサイズ変更(拡張)

LVMの大きな利点は、オンラインでの拡張が可能なことです。

[実行ユーザー: 一般ユーザー(sudo使用)]

# VGの空き容量を確認
$ sudo vgs
  VG      #PV #LV #SN Attr   VSize   VFree
  vg_data   1   1   0 wz--n-  20.00g  10.00g

# 論理ボリュームを5GB拡張
$ sudo lvextend -L +5G /dev/vg_data/lv_storage
  Size of logical volume vg_data/lv_storage changed from 10.00 GiB (2560 extents) to 15.00 GiB (3840 extents).
  Logical volume vg_data/lv_storage successfully resized.

# XFSファイルシステムを拡張
$ sudo xfs_growfs /mnt/storage
meta-data=/dev/mapper/vg_data-lv_storage isize=512    agcount=4, agsize=655360 blks
(中略)
data blocks changed from 2621440 to 3932160

# 確認
$ df -h /mnt/storage
Filesystem                    Size  Used Avail Use% Mounted on
/dev/mapper/vg_data-lv_storage  15G   94M   15G   1% /mnt/storage

💡 Tips: ext4ファイルシステムの場合は、xfs_growfs の代わりに resize2fs コマンドを使用します。

4.8.5 LVM の状態確認コマンド(pvs, vgs, lvs)

[実行ユーザー: 一般ユーザー(sudo使用)]

# 物理ボリュームの状態
$ sudo pvs
  PV         VG      Fmt  Attr PSize   PFree
  /dev/sdc   vg_data lvm2 a--   20.00g  5.00g

# ボリュームグループの状態
$ sudo vgs
  VG      #PV #LV #SN Attr   VSize   VFree
  vg_data   1   1   0 wz--n-  20.00g  5.00g

# 論理ボリュームの状態
$ sudo lvs
  LV         VG      Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  lv_storage vg_data -wi-ao---- 15.00g

# より詳細な情報を表示
$ sudo pvdisplay
$ sudo vgdisplay
$ sudo lvdisplay

4.8.6 LVM を使うべきケース

LVMは以下のような場合に特に有用です。

  • 将来的にストレージを拡張する可能性がある場合
  • 複数のディスクを柔軟に管理したい場合
  • スナップショット機能を使いたい場合
  • シンプロビジョニングを使いたい場合

一方、以下の場合は通常のパーティションでも十分です。

  • 単純な構成で、拡張の予定がない場合
  • リソースが限られた小規模システム
  • 学習目的の検証環境

4.9 スワップ領域の管理

スワップは、物理メモリ(RAM)が不足したときに使用される補助的なメモリ領域です。

4.9.1 スワップとは何か

スワップ領域は、物理メモリが不足したときに、使用頻度の低いメモリ内容を一時的に退避させるディスク領域です。

スワップの役割:

  • メモリ不足時の緊急対応: OOM(Out of Memory)キラーによるプロセス強制終了を防ぐ
  • ハイバネーション: システムの状態をディスクに保存してシャットダウン
  • メモリ効率の向上: 使用頻度の低いページをディスクに退避し、RAMを有効活用

💡 スワップサイズの目安:

  • RAM 4GB以下: RAMの2倍
  • RAM 4-16GB: RAMと同量
  • RAM 16GB以上: 最低4-8GB(用途による)

ただし、これは一般的な目安です。データベースサーバーなど特定の用途では異なる設定が推奨される場合があります。

4.9.2 スワップ領域の確認(free -h, swapon -s)

[実行ユーザー: 一般ユーザー]

# メモリとスワップの使用状況
$ free -h
               total        used        free      shared  buff/cache   available
Mem:           3.8Gi       512Mi       2.9Gi        12Mi       584Mi       3.2Gi
Swap:          4.0Gi          0B       4.0Gi

# スワップデバイスの詳細
$ swapon -s
Filename                Type            Size            Used            Priority
/dev/dm-1               partition       4194300         0               -2

# または swapon --show
$ swapon --show
NAME      TYPE      SIZE USED PRIO
/dev/dm-1 partition   4G   0B   -2

4.9.3 スワップファイルの作成

スワップパーティションの代わりに、スワップファイルを使用することもできます。

[実行ユーザー: 一般ユーザー(sudo使用)]

# 2GBのスワップファイルを作成
$ sudo dd if=/dev/zero of=/swapfile bs=1M count=2048 status=progress
2147483648 bytes (2.1 GB, 2.0 GiB) copied, 10 s, 215 MB/s
2048+0 records in
2048+0 records out
2147483648 bytes (2.1 GB, 2.0 GiB) copied, 10.0123 s, 214 MB/s

# パーミッションを設定(重要:セキュリティのため)
$ sudo chmod 600 /swapfile

# スワップとして初期化
$ sudo mkswap /swapfile
Setting up swapspace version 1, size = 2 GiB (2147479552 bytes)
no label, UUID=aaaabbbb-cccc-dddd-eeee-ffffffffffff

# スワップを有効化
$ sudo swapon /swapfile

# 確認
$ swapon --show
NAME      TYPE      SIZE USED PRIO
/dev/dm-1 partition   4G   0B   -2
/swapfile file        2G   0B   -3

4.9.4 スワップの有効化と /etc/fstab 設定

再起動後もスワップを有効にするには、fstabに追記します。

[実行ユーザー: 一般ユーザー(sudo使用)]

# /etc/fstabに追記
$ echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

# 確認
$ tail -1 /etc/fstab
/swapfile none swap sw 0 0

【コラム3】ディスク容量100%でサービス停止、深夜対応した話

ある夜中の3時、枕元のスマートフォンが鳴りました。監視アラートです。

「あるWebサービスが応答しなくなった」

急いでサーバーにログインしようとしましたが、SSHすら接続できません。なんとかコンソール経由でログインすると、驚くべきメッセージが目に飛び込んできました。

-bash: cannot create temp file for here document: No space left on device

ディスクが満杯です。df -hを実行すると、/varパーティションが100%使用になっていました。

$ df -h /var
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda3        50G   50G     0 100% /var

原因を調べると、アプリケーションのログファイルが異常に肥大化していました。とあるバグにより、同じエラーメッセージが1秒間に数百回も出力され続けていたのです。

応急処置として、古いログファイルを削除して空き容量を確保。サービスを再起動して復旧しました。

$ sudo rm /var/log/application/app.log-2025010*
$ sudo systemctl restart application

その後、以下の対策を実施しました。

  • ディスク使用率80%でアラートを出す監視設定
  • ログローテーションの設定(古いログを自動削除)
  • アプリケーションのバグ修正

教訓:

  • ディスク容量の監視は最重要。「まだ大丈夫」は危険
  • ログローテーションは必ず設定する(第9章で詳しく解説)
  • /varを別パーティションにしておくと、ログが溢れてもシステム全体には影響しない

この経験以来、新しいサーバーを構築するときは、必ずディスク監視とログローテーションを最初に設定するようになりました。


章末まとめ

この章では、Linuxのストレージ管理の基礎を学びました。

学んだこと

  • ストレージの階層構造: 物理ディスク → パーティション → ファイルシステム → マウント
  • デバイス名の規則: /dev/sda、/dev/nvme0n1 などの命名パターン
  • パーティションテーブル: GPT(推奨)とMBRの違い
  • パーティション操作: fdisk、parted を使った作成方法
  • ファイルシステム: XFS(デフォルト)とext4の特徴、mkfsでの作成
  • マウント: mountコマンドでの手動マウント、/etc/fstabでの自動マウント
  • 容量管理: df、duコマンドでの使用量確認と対処
  • LVM: 柔軟なストレージ管理の基礎(PV、VG、LV)
  • スワップ: スワップ領域の役割と設定方法

重要なコマンド一覧

カテゴリ コマンド
ディスク確認 lsblk, fdisk -l, parted print, blkid
パーティション操作 fdisk, parted, partprobe
ファイルシステム作成 mkfs.xfs, mkfs.ext4
マウント操作 mount, umount, mount -a
容量確認 df -hT, du -sh
LVM操作 pvcreate, vgcreate, lvcreate, lvextend, pvs, vgs, lvs
スワップ free -h, swapon, mkswap

練習問題

問題1: 以下のlsblk出力を見て、質問に答えてください。

NAME        MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
sda           8:0    0   50G  0 disk 
├─sda1        8:1    0    1G  0 part /boot
└─sda2        8:2    0   49G  0 part 
  ├─al-root 253:0    0   45G  0 lvm  /
  └─al-swap 253:1    0    4G  0 lvm  [SWAP]
sdb           8:16   0   20G  0 disk

a) このシステムには何台のディスクが接続されていますか?

b) /dev/sdb はパーティションが作成されていますか?

c) LVMが使用されているパーティションはどれですか?

解答例を見る

a) 2台(sda と sdb)

b) いいえ、パーティションは作成されていません(子要素がない)

c) /dev/sda2(TYPE=lvm の al-root と al-swap が子要素として表示されている)

問題2: 新しいパーティション /dev/sdb1 を作成し、XFSファイルシステムでフォーマットして /mnt/data にマウントするまでの手順を、コマンドの順序で並べてください。

  1. sudo mount /dev/sdb1 /mnt/data
  2. sudo mkfs.xfs /dev/sdb1
  3. sudo mkdir -p /mnt/data
  4. sudo fdisk /dev/sdb(パーティション作成)
  5. sudo partprobe /dev/sdb
解答例を見る

正しい順序: d → e → b → c → a

  1. d) fdiskでパーティションを作成
  2. e) partprobeでカーネルに通知
  3. b) mkfs.xfsでファイルシステムを作成
  4. c) マウントポイントを作成
  5. a) マウント

問題3: 以下の要件を満たす /etc/fstab エントリを作成してください。

  • UUID: a1b2c3d4-e5f6-7890-abcd-ef1234567890
  • マウントポイント: /mnt/backup
  • ファイルシステム: ext4
  • 読み取り専用でマウント
解答例を見る
UUID=a1b2c3d4-e5f6-7890-abcd-ef1234567890    /mnt/backup    ext4    ro    0 0

問題4: ディスク容量が不足している場合、原因を特定するためにどのようなコマンドをどの順序で実行しますか?

解答例を見る
  1. df -h – どのファイルシステムが満杯かを確認
  2. du -sh /対象ディレクトリ/* – 大きなディレクトリを特定
  3. find / -type f -size +100M – 大きなファイルを検索

その後、不要なファイル(古いログ、キャッシュなど)を削除し、df -hで空き容量を再確認します。

問題5: LVMについて、以下の用語の関係を説明してください: 物理ボリューム(PV)、ボリュームグループ(VG)、論理ボリューム(LV)

解答例を見る

LVMは3層構造になっています。

  • 物理ボリューム(PV): LVMで使用する物理ディスクまたはパーティション。最下層。
  • ボリュームグループ(VG): 複数のPVをまとめたストレージプール。中間層。
  • 論理ボリューム(LV): VGから切り出した仮想パーティション。ここにファイルシステムを作成する。最上層。

物理ディスク → PV → VG → LV → ファイルシステム という流れでストレージを構成します。


次章への橋渡し

この章では、ディスクとファイルシステムの管理方法を学びました。サーバーのストレージを適切に管理することは、安定した運用の基盤となります。

次の第5章では、systemdによるサービス管理と自動化について学びます。Webサーバーやデータベースなどのサービスを起動・停止・監視する方法、そして定期的なタスクを自動実行する方法を習得しましょう。サービス管理は、サーバー運用の中核となるスキルです。