LPIC Level1 復習ラジオ 23:ファイルシステム総復習
音声
目次
ファイルシステムの全体像
ファイルシステムは、ストレージ上のデータをファイルやディレクトリとして管理する仕組みです。単にデータ本体を保存するだけでなく、所有者、パーミッション、時刻、サイズ、配置情報なども管理します。
| 要素 | 主な役割 | 確認例 |
|---|---|---|
| ブロックデバイス | ディスクやパーティションなど、ファイルシステムを置く土台 | lsblk |
| ファイルシステム | ファイル、ディレクトリ、メタデータを管理する | ext4、XFS、vfatなど |
| inode | ファイルの種類、所有者、権限、サイズ、時刻などのメタデータを保持する | stat、ls -li |
| ディレクトリエントリ | ファイル名とinode番号を対応付ける | ls -i |
| マウントポイント | ファイルシステムをディレクトリツリーへ接続する場所 | findmnt |
| UUID・LABEL | ファイルシステムを識別するために使う | lsblk -f、blkid |
ファイルを開く大まかな流れ
- パスをディレクトリごとにたどる
- ディレクトリエントリから、名前に対応するinode番号を得る
- inodeからファイルの種類、権限、データの位置などを確認する
- 権限があれば、ファイルのデータを読み書きする
Linuxでは、複数のファイルシステムを一つのディレクトリツリーへマウントして利用します。利用者からは一つのツリーに見えても、/、/boot、/homeなどが別々のファイルシステムになっている場合があります。
inode
inodeは、ファイルシステム内のファイルやディレクトリを管理するための情報です。inode番号は、そのファイルシステム内でinodeを識別します。
inodeに含まれる主な情報
- ファイルの種類
- パーミッション
- 所有者のUIDとグループのGID
- ファイルサイズ
- ハードリンク数
- アクセス時刻、更新時刻、状態変更時刻など
- データブロックを参照するための情報
inodeに通常含まれないもの
- ファイル名
- ファイルが表示される完全なパス名
stat report.txt
ls -li report.txt
statでは、inode番号、ファイルサイズ、ブロック数、リンク数、UID、GID、パーミッション、各種時刻などを確認できます。
inode番号の範囲
inode番号が一意なのは、そのファイルシステムの中だけです。別のファイルシステムでは、同じinode番号が使われることがあります。
stat -c 'device=%d inode=%i links=%h name=%n' report.txt
ファイルを厳密に区別するときは、inode番号だけでなく、どのファイルシステムやデバイスに属しているかも考える必要があります。
ファイル名とディレクトリエントリ
ディレクトリは、名前とinode番号の対応を持ちます。この対応をディレクトリエントリと考えると、リンクの仕組みを理解しやすくなります。
ファイル名 report.txt
↓
ディレクトリエントリ
↓ inode番号 12345
inode 12345
↓
データ本体
ファイル名を変更した場合
mv report.txt report-old.txt
ls -li report-old.txt
同じファイルシステム内で単純に名前を変更した場合、一般にディレクトリエントリの名前が変わり、inodeとデータ本体は同じままです。
ファイルを削除した場合
rm report-old.txt
rmは、基本的にはファイル名とinodeの対応を取り除きます。最後のハードリンクが削除され、さらにそのファイルを開いているプロセスもなくなると、inodeやデータ領域が再利用可能になります。
開いたまま削除されたファイル
プロセスがファイルを開いたまま、そのファイル名が削除されることがあります。この場合、名前からは見えなくても、プロセスが閉じるまでデータ領域が解放されないことがあります。
lsof +L1
dfでは使用量が多いのに、duで大きなファイルが見つからない場合は、削除済みのファイルをプロセスが開いたままにしていないか確認する方法があります。
inodeの確認と枯渇
ファイルシステムには、データを保存する領域だけでなく、inodeを管理するための資源があります。空き容量が残っていても、利用可能なinodeがなくなると、新しいファイルを作成できないことがあります。
容量とinode使用量
df -h
df -i
| コマンド | 主な確認内容 |
|---|---|
df -h | ファイルシステムのデータ領域の使用量 |
df -i | inodeの総数、使用数、空き数、使用率 |
du -sh ディレクトリ | 指定したディレクトリ以下のファイルが使用する容量 |
inode枯渇が起きやすい例
- 非常に小さなログや一時ファイルが大量に作られた
- メールキューやキャッシュに小さなファイルが蓄積した
- アプリケーションが不要なセッションファイルを削除していない
inode番号から探す
find /var -xdev -inum 12345 2>/dev/null
-inumはinode番号で検索します。-xdevを付けると、検索開始地点とは異なるファイルシステムへ降りないようにできます。
同じinodeを持つ名前を確認する
find /data -xdev -samefile /data/report.txt
ハードリンクが複数ある場合は、同じinodeを参照する複数のパスが表示されます。
UUID・LABEL・PARTUUID
ストレージを指定するとき、/dev/sdb1のようなデバイス名だけでなく、UUIDやLABELなどの識別子を利用できます。
| 識別子 | 主な対象 | 例 |
|---|---|---|
| UUID | ファイルシステム | UUID=8c12a0d5-... |
| LABEL | ファイルシステムに付けた人間向けの名前 | LABEL=DATA |
| PARTUUID | パーティションテーブル上のパーティション | PARTUUID=1a2b3c4d-... |
| PARTLABEL | GPTなどのパーティションに付けた名前 | PARTLABEL=LinuxData |
| デバイス名 | カーネルが認識したデバイスノード | /dev/sdb1 |
なぜUUIDを使うのか
/dev/sdb1のような名前は、機器の追加や認識順序の変化によって変わる可能性があります。UUIDを使うと、特定のファイルシステムをより安定して指定できます。
UUIDとPARTUUIDの違い
- UUIDは、ext4やXFSなどのファイルシステムに付く識別子
- PARTUUIDは、パーティションテーブルのパーティションに付く識別子
- ファイルシステムを作り直すと、そのUUIDが変わる場合がある
- パーティションを作り直すと、PARTUUIDが変わる場合がある
UUIDやLABELは実用上便利ですが、複製したディスクなどでは重複する可能性があります。絶対に重複しないと決めつけず、必要に応じて確認します。
ブロックデバイスと識別情報の確認
デバイス、ファイルシステム種別、UUID、LABEL、マウント先を確認する代表的なコマンドは、lsblk、blkid、findmntです。
lsblk
lsblk
lsblk -f
lsblk -o NAME,SIZE,FSTYPE,UUID,PARTUUID,LABEL,MOUNTPOINTS
lsblkは、利用可能なブロックデバイスをツリー状に確認するのに向きます。-fでは、ファイルシステム種別、UUID、LABEL、マウント先などを表示します。
blkid
sudo blkid
sudo blkid /dev/sdb1
blkid -s UUID -o value /dev/sdb1
blkidは、デバイスからファイルシステム種別やUUIDなどの属性を確認します。一般ユーザーではキャッシュされた情報が表示される場合があるため、直接確認したいときは権限にも注意します。
findmnt
findmnt
findmnt /home
findmnt --target /var/log
findmnt --source UUID=8c12a0d5-0000-0000-0000-000000000000
findmntは、現在マウントされているファイルシステムを表示したり、特定のパスがどのファイルシステムに属するかを確認したりできます。
役割の違い
| コマンド | 向いている確認 |
|---|---|
lsblk | ディスク、パーティション、ファイルシステム、マウント先の全体像 |
blkid | 指定デバイスのUUID、LABEL、TYPEなどの属性 |
findmnt | 現在のマウント関係や、指定パスが属するファイルシステム |
/etc/fstab
/etc/fstabは、通常どのファイルシステムを、どこへ、どのオプションでマウントするかを記述する設定ファイルです。
基本形式
UUID=8c12a0d5-0000-0000-0000-000000000000 /data ext4 defaults 0 2
| フィールド | 例 | 意味 |
|---|---|---|
| 1 | UUID=... | マウントするデバイスやファイルシステム |
| 2 | /data | マウントポイント |
| 3 | ext4 | ファイルシステム種別 |
| 4 | defaults | マウントオプション |
| 5 | 0 | dumpによるバックアップ対象の指定 |
| 6 | 2 | 起動時のファイルシステムチェック順序 |
第6フィールドの基本
0:起動時のチェック対象にしない1:通常はルートファイルシステム2:その他のチェック対象ファイルシステム
代表的なマウントオプション
| オプション | 主な意味 |
|---|---|
defaults | カーネルやファイルシステムの標準的なオプションを使う |
ro / rw | 読み取り専用 / 読み書き可能 |
auto / noauto | mount -aの対象にする / 対象にしない |
user | 一般ユーザーによるマウントを許可する |
nofail | デバイスが存在しない場合でも、失敗を致命的に扱わない |
exec / noexec | 実行ファイルの実行を許可 / 制限する |
suid / nosuid | SUID・SGIDの効果を許可 / 無効化する |
dev / nodev | デバイスファイルを解釈 / 解釈しない |
変更後の確認
sudo cp /etc/fstab /etc/fstab.bak
findmnt --verify
sudo mount -a
findmnt /data
mount -aは、noautoを除く/etc/fstabの対象をマウントします。誤った設定は起動障害につながることがあるため、バックアップを取り、再起動前に検証します。
systemdを使う環境では、/etc/fstabの内容がマウントユニットへ変換されます。変更後に必要であれば、systemctl daemon-reloadでsystemdの設定を再読み込みします。
mount・umount・findmnt
マウントは、ファイルシステムをLinuxのディレクトリツリーへ接続する操作です。アンマウントは、その接続を外す操作です。
一時的にマウントする
sudo mkdir -p /mnt/data
sudo mount /dev/sdb1 /mnt/data
findmnt /mnt/data
ファイルシステム種別やオプションを指定する
sudo mount -t ext4 -o ro /dev/sdb1 /mnt/data
sudo mount -o remount,rw /mnt/data
/etc/fstabを利用する
sudo mount /data
sudo mount -a
/etc/fstabに登録済みなら、デバイスまたはマウントポイントだけを指定してマウントできます。
アンマウントする
sudo umount /mnt/data
sudo umount /dev/sdb1
コマンド名はunmountではなく、umountです。
busyでアンマウントできない場合
findmnt /mnt/data
lsof +f -- /mnt/data
fuser -vm /mnt/data
- シェルのカレントディレクトリがマウントポイント内にないか
- プロセスがファイルを開いていないか
- 別のファイルシステムがその下へマウントされていないか
マウントポイントの下に元からあるファイル
空でないディレクトリへ別のファイルシステムをマウントすると、元のファイルは削除されませんが、マウント中は見えなくなります。アンマウントすると再び見えるようになります。
ハードリンク
ハードリンクは、同じinodeを参照する別のファイル名です。元の名前と新しい名前のどちらが本物という区別はなく、どちらも同じファイルを表します。
作成と確認
echo 'Linux' > original.txt
ln original.txt hardlink.txt
ls -li original.txt hardlink.txt
stat original.txt hardlink.txt
二つの名前は同じinode番号を持ち、リンク数が増えます。一方の名前から内容を書き換えると、もう一方から見ても同じ内容が変化します。
元の名前を削除する
rm original.txt
cat hardlink.txt
original.txtを削除しても、hardlink.txtが残っていればinodeへの参照は残るため、データへアクセスできます。
主な制約
- 異なるファイルシステムをまたいで作成できない
- 通常、ディレクトリに対するハードリンクは作成できない
- 同じinodeを共有するため、所有者やパーミッションも共通する
異なるファイルシステムをまたげない理由
inode番号はファイルシステム内でのみ一意です。ハードリンクは同じinodeを直接参照するため、別のファイルシステムにあるinodeを参照できません。
| 操作 | 結果 |
|---|---|
| 一方の名前で内容を変更 | 同じinodeとデータを参照するため、他方から見ても変わる |
| 一方の名前を削除 | リンク数が減る。別のハードリンクがあればデータは残る |
| 別ファイルシステムへ作成 | 作成できない |
シンボリックリンク
シンボリックリンクは、別のファイルやディレクトリのパス名を内容として持つ、独立した特殊ファイルです。ソフトリンクとも呼ばれます。
作成と確認
ln -s /var/log/syslog syslog-link
ls -l syslog-link
readlink syslog-link
readlink -f syslog-link
ls -lでは、syslog-link -> /var/log/syslogのように参照先が表示されます。シンボリックリンク自身は、参照先とは異なるinodeを持ちます。
シンボリックリンクの特徴
- ファイルにもディレクトリにも作成できる
- 異なるファイルシステムをまたげる
- 参照先が存在しなくてもリンク自体は作成できる
- 参照先が削除または移動されると、リンク切れになることがある
絶対パスと相対パス
ln -s /opt/app/config.yml config-absolute
ln -s ../config/config.yml config-relative
絶対パスのリンクはルートディレクトリから参照先をたどります。相対パスのリンクは、シンボリックリンクが置かれているディレクトリを基準に解決されます。
リンク切れを確認する
ls -l config-relative
readlink config-relative
namei -l config-relative
find . -xtype l
find -xtype lは、参照先をたどれないシンボリックリンクを探す用途に使えます。
リンク自体を削除する
rm syslog-link
unlink syslog-link
リンク名を削除しても、通常は参照先のファイルそのものは削除されません。末尾のスラッシュを付けるとコマンドの解釈が変わることがあるため、リンク自体を操作するときは表示を確認します。
ハードリンクとの比較
| 項目 | ハードリンク | シンボリックリンク |
|---|---|---|
| 参照するもの | 同じinode | 別のパス名 |
| inode番号 | 元の名前と同じ | 参照先とは異なる |
| 別ファイルシステム | 不可 | 可能 |
| ディレクトリへの作成 | 通常不可 | 可能 |
| 参照先削除後 | 他のハードリンクから利用可能 | リンク切れになる |
| 作成コマンド | ln TARGET LINK | ln -s TARGET LINK |
30秒チェック
- inodeに通常保存されていない情報は、ファイル名とパーミッションのどちらでしょうか。
- inode番号は、システム全体とファイルシステム内のどちらで一意でしょうか。
- 空き容量があるのに新しいファイルを作成できない場合、何の枯渇を確認するでしょうか。
df -hとdf -iは、それぞれ何を確認するでしょうか。- UUIDとPARTUUIDは、主に何を識別するでしょうか。
/etc/fstabの第2フィールドは何でしょうか。/etc/fstabの第6フィールドで、ルートファイルシステムに通常指定する値は何でしょうか。- ハードリンク同士のinode番号は同じでしょうか、異なるでしょうか。
- 異なるファイルシステムをまたげるのは、ハードリンクとシンボリックリンクのどちらでしょうか。
- シンボリックリンクの参照先が削除された場合、そのリンクはどうなるでしょうか。
答えを表示
- ファイル名。パーミッションはinodeの情報です。
- ファイルシステム内
- inodeの枯渇
df -hはデータ領域の容量、df -iはinode使用量- UUIDはファイルシステム、PARTUUIDはパーティション
- マウントポイント
- 通常は
1 - 同じ
- シンボリックリンク
- リンク切れ、またはdangling symlinkになる
要約
- ファイルシステムは、データ本体だけでなく、inodeやディレクトリエントリなどを使ってファイルを管理します。
- inodeはファイルの種類、所有者、権限、サイズ、時刻、リンク数などを持ちますが、通常ファイル名は持ちません。
- ディレクトリエントリが、ファイル名とinode番号を対応付けます。
- inode番号が一意なのは、そのファイルシステム内です。
df -hは容量、df -iはinode使用量を確認します。- UUIDはファイルシステム、PARTUUIDはパーティションを主に識別します。
lsblk -fは全体像、blkidは属性、findmntはマウント関係の確認に向きます。/etc/fstabは、デバイス、マウントポイント、種別、オプション、dump、チェック順序の六つのフィールドで記述します。- ハードリンクは同じinodeを参照し、別ファイルシステムをまたげません。
- シンボリックリンクはパス名を保持し、別ファイルシステムやディレクトリも参照できます。
- ハードリンクはinodeへ、シンボリックリンクはパスへつながると整理します。
参考資料
- inode(7) — Linux manual page
- stat(1) — Linux manual page
- stat(2) — Linux manual page
- link(2) — Linux manual page
- symlink(7) — Linux manual page
- ln(1) — Linux manual page
- readlink(1) — Linux manual page
- df(1) — Linux manual page
- find(1) — Linux manual page
- fstab(5) — Linux manual page
- mount(8) — Linux manual page
- umount(8) — Linux manual page
- findmnt(8) — Linux manual page
- lsblk(8) — Linux manual page
- blkid(8) — Linux manual page
- systemd.mount(5) — Linux manual page
- systemd-fstab-generator(8) — Linux manual page
- Linux Kernel Documentation:ext4 Index Nodes
- Linux Kernel Documentation:ext4 Dynamic Structures