ファイルシステムとディスク管理

LinuxBeginner
オンラインで実践に進む

はじめに

Linux のストレージには、複数の関連する層があります。デバイスにはパーティションを含めることができ、パーティションやイメージにはファイルシステムを作成できます。ファイルシステムは、マウントポイントでディレクトリツリーに接続すると利用できるようになります。これらの用語を区別すると、ディスク関連のコマンドを理解しやすくなります。

この実験では、安全にストレージを確認し、使用量を分析します。また、通常のファイル内に ext4 ファイルシステムを作成してマウントとアンマウントを行い、パーティション情報を読み取り、練習用の fstab ファイルを作成します。書き込み操作の対象は、実験用に作成する使い捨てファイルだけです。実際のディスクのパーティション構成を変更したり、システムの /etc/fstab を編集したりすることはありません。

Linux ストレージの各層を理解する

このステップでは、ブロックデバイス、ファイルシステム、マウントポイントの関係を確認し、安全に作業するためのワークスペースを準備します。

lsblk コマンドは「ブロックデバイスを一覧表示する」という意味です。-o オプションで表示する列を選択できます。

lsblk -o NAME,TYPE,SIZE,FSTYPE,MOUNTPOINTS

出力は左から右に、次のように読み取ります。

  • NAME はデバイスまたはパーティションを識別します。
  • TYPE はディスク、パーティション、loop デバイスを区別します。
  • SIZE は容量を示します。
  • FSTYPE は、存在する場合に検出されたファイルシステムの種類を示します。
  • MOUNTPOINTS は、ファイルシステムがディレクトリツリーのどこに接続されているかを示します。

1 台のディスクには、1 つ以上のパーティションを含めることができます。ext4 などのファイルシステムは、パーティションやその他のストレージオブジェクト内のファイルを整理します。マウントポイントは、Linux がそのファイルシステムを公開するための通常のディレクトリです。

findmnt を使って、現在プロジェクトディレクトリが含まれているファイルシステムを確認します。-T オプションには任意のパスを指定でき、そのパスが属するマウント済みファイルシステムを検索します。

findmnt -T /home/labex/project

正確なソースデバイスは環境によって異なりますが、出力にはソース、ターゲット、ファイルシステムの種類、マウントオプションが表示されます。

blkid コマンドは、ファイルシステムのシグネチャ、ラベル、UUID を読み取ります。利用可能なすべてのブロックデバイスを確認するには、管理者権限が必要です。

sudo blkid

UUID は、デバイス名が変わっても安定して利用できるように設計されたファイルシステム識別子です。後ほど、永続的なマウントを学ぶときにこの仕組みを使います。

専用のワークスペースを作成して移動します。

mkdir -p /home/labex/project/storage-lab
cd /home/labex/project/storage-lab
pwd

最後の出力は /home/labex/project/storage-lab になります。

ファイルシステムとディレクトリの使用量を分析する

このステップでは、ファイルシステム全体の空き容量を報告する df と、ファイルやディレクトリツリーの使用量を測定する du を比較します。

見かけ上のサイズが分かっているサンプルファイルを 2 つ作成します。truncate -s オプションを使うと、実際のデータで埋めることなく効率的にファイルサイズを設定できます。

cd /home/labex/project/storage-lab
mkdir -p usage/reports usage/archive
truncate -s 2M usage/reports/weekly.log
truncate -s 5M usage/archive/records.bin

ワークスペースに対して df -h を実行します。-h オプションは、MiB や GiB などの読みやすい単位で表示します。

df -h /home/labex/project/storage-lab

df は、「このパスを含むファイルシステムで、どれだけの容量が使用済みで、どれだけ利用可能か」という問いに答えます。主な列は SizeUsedAvailUse%Mounted on です。

サンプルディレクトリの概要を du -sh で確認します。ここで -s は概要のみを表示し、-h は読みやすい単位を選択します。

du -sh usage

df とは異なり、du は「このファイルまたはディレクトリツリーがどれだけの容量を使用しているか」という問いに答えます。truncate で作成したスパースファイルは、見かけ上のサイズが大きくても、実際に割り当てられているディスク容量は少ない場合があります。--apparent-size オプションを使うと、論理的なサイズを測定できます。

du -h --apparent-size --max-depth=1 usage

usage/archive のほうが usage/reports より大きく表示されるはずです。du と並べ替えを組み合わせて、見かけ上のサイズが大きい項目から順に表示します。

du -ah --apparent-size usage | sort -rh | head -n 5

パイプによって du の出力が sort に渡されます。-r は順序を逆にし、-h は読みやすいサイズの単位を理解して並べ替えます。head -n 5 は先頭 5 件だけを残します。

Ext4 ファイルシステムを作成して確認する

このステップでは、仮想ディスクイメージを作成し、ext4 でフォーマットして、実際のディスクに触れることなくファイルシステムのメタデータを確認します。

128 MiB のイメージファイルを作成します。このファイルを、実験の残りの作業で使う使い捨てのストレージとして使用します。

cd /home/labex/project/storage-lab
truncate -s 128M virtual.img

見かけ上のサイズを確認します。

ls -lh virtual.img

フォーマット前は、file から見ると一般的なデータまたは空のファイルとして認識されます。

file virtual.img

mkfs.ext4 コマンドは ext4 ファイルシステムを作成します。-F オプションは通常のファイルを意図的な対象として指定し、-L はラベル LABEXDATA を割り当てます。

sudo mkfs.ext4 -F -L LABEXDATA virtual.img

フォーマットによって、イメージ内にファイルシステムの構造が作成されます。2 つのツールで結果を確認します。

file virtual.img
sudo blkid -p virtual.img

出力には ext4 であること、ラベル LABEXDATA、生成された UUID が表示されるはずです。その UUID だけを表示します。

sudo blkid -s UUID -o value virtual.img

UUID の値はフォーマット時に生成されるため、学習者ごとに異なります。

ファイルシステムをマウント、使用、アンマウントする

このステップでは、仮想ファイルシステムを Linux のディレクトリツリーに接続し、ファイルを 1 つ書き込んでから安全に切り離します。

マウントポイントは、ファイルシステムが表示されるディレクトリです。一時的な管理用マウントの標準的な場所である /mnt の下に作成します。

sudo mkdir -p /mnt/labex-virtual

イメージをマウントします。-o loop オプションは、通常のファイルを loop デバイスに関連付け、ブロックストレージのように扱えるよう Linux に指示します。

cd /home/labex/project/storage-lab
sudo mount -o loop virtual.img /mnt/labex-virtual

現在有効なマウントを確認します。

findmnt /mnt/labex-virtual

通常、ソースには loop デバイス、ターゲットには /mnt/labex-virtual、ファイルシステムの種類には ext4 が表示されます。このファイルシステムを対象に df を実行することもできます。

df -h /mnt/labex-virtual

マウントしたファイルシステム内にファイルを書き込みます。リダイレクトはシェルが実行し、マウント先のルートディレクトリは root が所有しているため、ここでは sudo sh -c を使います。

sudo sh -c 'echo "stored inside the virtual filesystem" > /mnt/labex-virtual/welcome.txt'
cat /mnt/labex-virtual/welcome.txt

アンマウントすると、保留中の書き込みが反映され、ファイルシステムがマウントポイントから切り離されます。

sudo umount /mnt/labex-virtual

マウントが解除されたことを確認します。

findmnt /mnt/labex-virtual

出力は表示されないはずです。また、指定したターゲットに有効なマウントが見つからないため、findmnt は 0 以外のステータスを返します。マウントポイントのディレクトリ自体は残りますが、再度イメージをマウントするまで、そのディレクトリからイメージの内容にはアクセスできません。

パーティションテーブルを安全に確認する

このステップでは、fdisk を読み取り専用の一覧表示モードで使い、パーティションテーブルとファイルシステムシグネチャを区別します。

システムから認識されているディスクとパーティションを一覧表示します。

sudo fdisk -l

-l オプションは一覧表示を意味します。ディスクサイズ、セクターサイズ、パーティションテーブルの種類、パーティションを報告しますが、それらを変更することはありません。正体の分からない本番ディスクで、対話型のパーティション操作を開始しないでください。

次に、仮想イメージを確認します。

cd /home/labex/project/storage-lab
sudo fdisk -l virtual.img

このイメージにはディスクサイズはありますが、パーティションエントリはありません。この管理された例では、ext4 をイメージ全体に直接作成しています。物理ディスクでは、一般的に次のような構成になります。

disk device -> partition table -> partition -> filesystem -> mount point

比較用に、空のイメージをもう 1 つ作成します。

truncate -s 64M partition-demo.img
sudo fdisk -l partition-demo.img

このイメージにもパーティションテーブルはありません。wipefs をデフォルトの読み取り専用モードで使い、ファイルシステムシグネチャを比較します。

sudo wipefs virtual.img partition-demo.img

virtual.img には ext4 のシグネチャが表示され、空の比較用イメージにはファイルシステムシグネチャが表示されないはずです。この実験では、破壊的な wipefs -a オプションを使用しないでください。

練習用 fstab を作成して検証する

このステップでは、fstab エントリの 6 つのフィールドを学びます。また、/etc/fstab を変更せずに、別の練習用ファイルを安全にテストします。

システムは /etc/fstab を読み取り、どのファイルシステムを一貫してマウントするかを決定します。ファイルを編集せずに、コメントではない行を表示します。

grep -Ev '^\s*(#|$)' /etc/fstab

fstab エントリには、空白で区切られた次の 6 つのフィールドがあります。

source  mount-point  filesystem-type  options  dump  fsck-order

物理パーティションでは、通常 /dev/sdb1 のような名前よりも UUID=<value> のほうが安全です。ハードウェアの検出順序が変わると、デバイス名が変わる可能性があるためです。

イメージの UUID を取得し、コメント付きの UUID 例を練習用ファイルに書き込みます。

cd /home/labex/project/storage-lab
uuid=$(sudo blkid -s UUID -o value virtual.img)
printf '## Real block device example: UUID=%s /mnt/data ext4 defaults,nofail 0 2\n' "$uuid" > practice-fstab

この実験では物理パーティションではなく通常のファイルを使うため、実際に使用する練習用エントリでは絶対パスと loop オプションを指定します。

printf '%s\n' '/home/labex/project/storage-lab/virtual.img /mnt/labex-virtual ext4 loop,nofail 0 2' >> practice-fstab

練習用ファイルを表示して検証します。--tab-file により、findmnt は実際の /etc/fstab を使用せず、指定したファイルを読み取ります。

cat practice-fstab
findmnt --verify --tab-file practice-fstab

最後の概要には、0 parse errors0 errors が表示されるはずです。また、ソースが通常のファイルであることについて警告が 1 件表示されます。この警告は、物理ブロックデバイスではなく、ファイルを使った loop ファイルシステムを意図的に使用しているために表示されるもので、ここでは想定どおりです。

練習用ファイルを使って、管理されたマウントを 1 回実行します。-T オプションにより、mount は指定された別の fstab ファイルを読み取ります。

sudo mount -T practice-fstab /mnt/labex-virtual
findmnt /mnt/labex-virtual

先ほど作成した welcome.txt が残っているはずです。これは、マウントによってファイルシステムに保存されたデータが表示されることを示しています。

cat /mnt/labex-virtual/welcome.txt

実験を安全に切り離した状態で終えるため、もう一度アンマウントします。

sudo umount /mnt/labex-virtual

システムの起動設定を変更せずに、永続的なマウント構文を検証できました。実際の /etc/fstab に誤りがあると起動に支障をきたす可能性があるため、管理者は通常、再起動する前に変更内容を検証します。

まとめ

Linux ストレージの主な層であるデバイス、パーティション、ファイルシステム、マウントポイントのつながりを確認しました。lsblkblkidfindmnt を使ってこれらを調べ、df で確認できるファイルシステム全体の使用量と、du で確認できるファイルやディレクトリの使用量を比較しました。

使い捨てのイメージ内に ext4 ファイルシステムを作成してラベルを付け、loop デバイス経由でマウントしました。また、アンマウント後もデータが保持されることを確認し、実際のディスクを変更せずにパーティション情報を調べました。最後に、fstab の 6 つのフィールド、安定した UUID が重要な理由、実際に使用する前に別の練習用 fstab を検証する方法を学びました。