LPIC Level1 復習ラジオ 15:ディスク管理
音声
目次
ディスク管理コマンドの使い分け
ディスク容量、ファイルサイズ、デバイス構成、マウント状態は、似ているようで確認対象が異なります。
| コマンド | 主な確認対象 | 代表的な用途 |
|---|---|---|
df | マウント済みファイルシステム | 使用量、空き容量、使用率、inode使用状況 |
du | ファイルやディレクトリ | どの場所が容量を使っているか調べる |
lsblk | ブロックデバイス | ディスク、パーティション、LVM、マウント先の構成 |
blkid | デバイス上の識別情報 | UUID、LABEL、ファイルシステムタイプ |
mount | ファイルシステムとディレクトリの接続 | ファイルシステムをディレクトリツリーへ組み込む |
umount | マウント済みファイルシステム | ディレクトリツリーから安全に切り離す |
特に混同しやすいのは、df、du、lsblkです。
df:ファイルシステム全体の使用状況du:指定したファイルやディレクトリの使用量lsblk:未マウント領域も含むブロックデバイス構成
df -h
du -sh /var/log
lsblk -f
df
dfは、マウント済みファイルシステムについて、使用済み容量と利用可能容量を表示します。
df [オプション] [ファイル...]
引数を指定しない場合はファイルシステムを一覧表示します。ファイルやディレクトリを指定した場合は、そのパスが属するファイルシステムを表示します。
基本表示
df
df /var/log
df /home
df /var/logは、ログディレクトリ自体の容量ではなく、そのディレクトリを収容するファイルシステム全体の容量を表示します。
読みやすい単位とタイプ
df -h
df -H
df -hT
| オプション | 意味 |
|---|---|
-h | 1024の累乗を基準にK、M、Gなどで表示する |
-H | 1000の累乗を基準にk、M、Gなどで表示する |
-T | ext4、XFS、tmpfsなどのファイルシステムタイプを表示する |
inode使用状況
df -i
df -ih
-iは、ブロック容量ではなくinodeの総数、使用数、空き数、使用率を表示します。小さなファイルが大量に作成されると、容量が残っていてもinodeを使い切り、新しいファイルを作れない場合があります。
タイプの絞り込みと合計
df -t ext4
df -x tmpfs -x devtmpfs
df -h --total
-t タイプ:指定タイプだけを表示する-x タイプ:指定タイプを除外する--total:表示対象の合計行を追加する
必要な列を指定する
df -h --output=source,fstype,size,used,avail,pcent,target
GNU dfの--outputでは、必要な列を明示できます。代表的な列は、ソース、全体容量、使用済み容量、利用可能容量、使用率、マウントポイントです。
SizeからUsedを引いた値とAvailが一致しない場合があります。ファイルシステムの予約領域や管理用領域などが関係します。
du
duは、指定したファイルやディレクトリが使用しているディスク領域を見積もります。
du [オプション] [ファイル...]
引数を省略すると、現在のディレクトリを対象にします。
合計を表示する
du -s /var/log
du -sh /var/log
-s:指定した対象ごとの合計だけを表示する-h:人が読みやすい単位で表示する
du -shは、ディレクトリ容量を簡潔に確認する代表的な組み合わせです。
段階的に絞り込む
du -h --max-depth=1 /var
du -h -d 1 /var
du -h -d 1 /var | sort -h
--max-depth=1またはGNU版の-d 1は、指定した深さまで表示します。大きなディレクトリを見つけたら、その中を同じ方法で調べます。
ファイルや総合計も表示する
du -ah /var/log
du -ah /var/log | sort -h | tail
du -ch file1 file2 directory/
-a:ディレクトリだけでなくファイルも表示する-c:各対象に加えて総合計を表示する
同じファイルシステム内だけを調べる
sudo du -x -h -d 1 /
-x、--one-file-systemは、別のファイルシステムへ移動しません。ルート以下を調べるときに、別マウントの/proc、/sys、外付けディスクなどへまたがるのを避けられます。
実使用量と見かけのサイズ
du -h file.img
du -h --apparent-size file.img
ls -lh file.img
通常のduは、ファイルが実際に使用するディスクブロックを基準にします。--apparent-sizeは、ファイル内容として見える論理的なサイズを表示します。スパースファイルなどでは、両者が大きく異なる場合があります。
シンボリックリンクと権限
du -h link
du -h -L link
sudo du -x -h -d 1 /
標準ではシンボリックリンクのリンク先をたどりません。-Lを付けるとたどりますが、意図しない大規模な探索や循環に注意します。読み取り権限がない場所では正確な合計を得られない場合があります。
dfとduの結果が違う理由
dfとduは、容量を別の方法で調べるため、値が一致しないことがあります。
| コマンド | 確認方法 |
|---|---|
df | ファイルシステムが管理する使用済みブロックと空きブロックを確認する |
du | ディレクトリツリーをたどり、見つかったファイルの使用量を合計する |
削除済みだが開かれているファイル
プロセスがファイルを開いたままファイル名だけが削除された場合、duでは見つけられません。しかし、プロセスが閉じるまでブロックは解放されないため、dfでは使用済みのままです。
sudo lsof +L1
対象プロセスを確認し、サービスの再起動や適切なログ再オープンなどを検討します。
そのほかの原因
- 管理者用の予約ブロック、ジャーナル、メタデータ
- 論理サイズと実使用量が異なるスパースファイル
- 圧縮や重複排除を行うファイルシステム
- マウントポイントの下に隠れた元のファイル
ls -lh sparse.img
du -h sparse.img
du -h --apparent-size sparse.img
容量不足の基本順序
df -hT
df -ih
sudo du -x -h -d 1 / | sort -h
sudo lsof +L1
df -hTで不足しているファイルシステムを特定するdf -iでinode不足も確認するdu -xで同じファイルシステム内を段階的に絞り込む- 差が大きい場合は削除済みの開いたファイルなどを調べる
lsblk
lsblkは、利用可能なブロックデバイスの情報を表示します。標準では、ディスクとパーティションなどの関係をツリー形式で表示します。
lsblk [オプション] [デバイス...]
基本表示と主な列
lsblk
| 列 | 意味 |
|---|---|
NAME | デバイス名 |
SIZE | デバイス容量 |
RM | リムーバブルデバイスか |
RO | 読み取り専用か |
TYPE | disk、part、lvm、romなどの種類 |
MOUNTPOINTS | 関連付けられたマウントポイント |
ファイルシステム情報
lsblk -f
-fは、ファイルシステムタイプ、LABEL、UUID、空き容量、使用率、マウントポイントなどを表示します。
必要な列とフルパス
lsblk -o NAME,PATH,SIZE,TYPE,FSTYPE,LABEL,UUID,MOUNTPOINTS
lsblk -p
-oは表示列を明示し、-pは/dev/sdb1のような完全なデバイスパスを表示します。既定出力はバージョンによって変わる可能性があるため、スクリプトでは列を指定します。
ディスク本体、バイト、JSON
lsblk -d -o NAME,MODEL,SERIAL,SIZE,ROTA,TRAN
lsblk -b -o NAME,SIZE
lsblk -J -o NAME,TYPE,SIZE,FSTYPE,UUID,MOUNTPOINTS
-d:パーティションなどの子デバイスを表示しない-b:サイズをバイト単位で表示する-J:JSON形式で表示する
dfとの違い
dfは主にマウント済みファイルシステムを表示します。lsblkは、未マウントのパーティションやディスク本体も表示できます。
blkid
blkidは、ブロックデバイスの内容を調べ、ファイルシステムタイプ、UUID、LABELなどの属性を表示します。
blkid [オプション] [デバイス...]
一覧と指定デバイス
sudo blkid
sudo blkid /dev/sdb1
環境や権限によっては、一般利用者ではキャッシュにある情報だけが表示され、すべてのデバイスを直接調査できない場合があります。
項目や値だけを表示する
sudo blkid -s UUID /dev/sdb1
sudo blkid -s TYPE /dev/sdb1
sudo blkid -s UUID -o value /dev/sdb1
-sは表示するタグを指定し、-o valueは値だけを表示します。
LABELやUUIDから探す
blkid -L DATA
blkid -U 12345678-1234-1234-1234-123456789abc
-L ラベル:LABELに対応するデバイス名を表示する-U UUID:UUIDに対応するデバイス名を表示する
低レベルの調査
sudo blkid -p /dev/sdb1
-pは、指定デバイスを低レベルのプローブモードで調べます。通常の一覧確認ではlsblk -f、指定デバイスの詳細確認ではblkidという流れが分かりやすいです。
UUIDを使う理由
/dev/sdb1などのデバイス名は、接続順序や構成変更により変化する可能性があります。そのため、/etc/fstabではUUIDやLABELを使う方法が一般的です。
UUID=12345678-1234-1234-1234-123456789abc /data ext4 defaults 0 2
ディスク複製などでUUIDが重複する場合もあるため、システム内の識別子を確認します。
mountの基本
mountは、デバイスなどにあるファイルシステムを、指定したディレクトリへ接続します。この接続先をマウントポイントと呼びます。
mount [オプション] ソース マウントポイント
基本操作
sudo mkdir -p /mnt/data
sudo mount /dev/sdb1 /mnt/data
sudo mount -t ext4 /dev/sdb1 /mnt/data
-tはファイルシステムタイプを指定します。多くの場合は自動判定されます。標準では管理者権限が必要です。
UUIDやLABELで指定する
sudo mount UUID=12345678-1234-1234-1234-123456789abc /mnt/data
sudo mount LABEL=DATA /mnt/data
状態を確認する
findmnt /mnt/data
findmnt -S /dev/sdb1
df -hT /mnt/data
lsblk -f
引数なしのmountでも一覧表示できますが、柔軟で機械処理しやすい確認にはfindmntが適しています。
マウントポイントに元からある内容
マウントポイントに元からファイルがある場合、マウント中は通常のパスから見えなくなり、代わりにマウントしたファイルシステムの内容が見えます。元のファイルが削除されたわけではなく、アンマウントすると再び見えます。
ループマウントとbindマウント
sudo mkdir -p /mnt/iso
sudo mount -o loop,ro image.iso /mnt/iso
sudo mkdir -p /mnt/shared
sudo mount --bind /srv/data /mnt/shared
loopは通常ファイルをブロックデバイスのように扱います。bindマウントは既存のディレクトリツリーを別のパスからも見えるようにする処理で、データをコピーするものではありません。
マウントオプションとfstab
主なマウントオプション
| オプション | 主な意味 |
|---|---|
ro | 読み取り専用でマウントする |
rw | 読み書き可能でマウントする |
remount | マウント済みファイルシステムのオプションを変更する |
noexec | そのマウント上のバイナリを直接実行しないようにする |
nosuid | SUID・SGIDビットの効果を無効にする |
nodev | デバイスファイルをデバイスとして解釈しない |
noatime | ファイルアクセス時刻を更新しない |
defaults | 一般的な既定オプション群を指定する |
sudo mount -o ro /dev/sdb1 /mnt/data
sudo mount -o rw,nodev,nosuid /dev/sdb1 /mnt/data
sudo mount -o remount,ro /mnt/data
-oの後ろへ、カンマ区切りで複数のオプションを指定します。利用可能なオプションはファイルシステムによっても異なります。
/etc/fstab
/etc/fstabは、通常マウントするファイルシステムのソース、マウントポイント、タイプ、オプションなどを記述するファイルです。
UUID=12345678-1234-1234-1234-123456789abc /data ext4 defaults 0 2
| フィールド | 内容 |
|---|---|
| 1 | デバイス、UUID、LABELなどのソース |
| 2 | マウントポイント |
| 3 | ファイルシステムタイプ |
| 4 | マウントオプション |
| 5 | dumpで使用する値 |
| 6 | 起動時のファイルシステム検査順序 |
fstabを使ったマウント
sudo mount /data
sudo mount -a
findmnt --verify
ソースまたはマウントポイントだけを指定すると、mountはfstabから対応設定を探せます。mount -aは通常、noautoがない対象をまとめてマウントします。
fstab編集後は、再起動前に構文と実際のマウントを確認します。systemd環境では必要に応じて次も実行します。
sudo systemctl daemon-reload
umount
umountは、マウントされたファイルシステムをディレクトリツリーから切り離します。コマンド名はunmountではなくumountです。
umount [オプション] 対象
基本操作
sudo umount /mnt/data
sudo umount /dev/sdb1
同じファイルシステムが複数箇所へマウントされている可能性もあるため、findmntなどで対応関係を確認します。
複数対象と再帰解除
sudo umount -a -t nfs,nfs4
sudo umount -R /mnt/tree
-aは複数の対象をまとめて解除し、-tはタイプを絞ります。-Rは指定マウントの下にある入れ子のマウントも再帰的に解除します。
target is busy
対象が使用中の場合、通常はアンマウントできません。
umount: /mnt/data: target is busy.
主な原因は、シェルのカレントディレクトリが対象内にある、プロセスがファイルを開いている、対象以下に別のファイルシステムがある、サービスが利用していることです。
cd /
findmnt -R /mnt/data
sudo lsof +f -- /mnt/data
sudo fuser -vm /mnt/data
利用中のプロセスを確認し、正常な方法で停止してから再実行します。
遅延解除と強制解除
sudo umount -l /mnt/data
sudo umount -f /mnt/nfs
-lは遅延アンマウントです。-fは主に到達不能なNFSなどで使う強制アンマウントで、データ損失や不整合の危険があります。通常の解除ができない原因を調べずに多用しません。
取り外し前の確認
sudo umount /mnt/data
findmnt /mnt/data
lsblk -f
USBメモリなどを物理的に取り外す前に、アンマウントが完了したことを確認します。
確認からマウント解除までの実践手順
1. デバイス構成を確認する
lsblk -o NAME,PATH,SIZE,TYPE,FSTYPE,LABEL,UUID,MOUNTPOINTS
デバイス名だけでなく、サイズ、タイプ、LABEL、UUID、現在のマウント先を照合します。
2. 識別情報を確認する
sudo blkid /dev/sdb1
3. マウントポイントを準備する
sudo mkdir -p /mnt/data
ls -la /mnt/data
中身のあるディレクトリへマウントすると、元の内容が一時的に見えなくなるため、事前に確認します。
4. 読み取り専用で確認する
sudo mount -o ro /dev/sdb1 /mnt/data
findmnt /mnt/data
ls -la /mnt/data
内容が不明な外部メディアは、最初に読み取り専用で確認すると誤書き込みの危険を減らせます。
5. 容量を確認する
df -hT /mnt/data
df -i /mnt/data
du -sh /mnt/data
6. 利用を終了して解除する
cd /
sudo lsof +f -- /mnt/data
sudo umount /mnt/data
findmnt /mnt/data
lsblk -f
容量不足の切り分け例
df -hT
df -ih
sudo du -x -h -d 1 /var | sort -h
sudo du -x -h -d 1 /var/log | sort -h
sudo lsof +L1
よくある間違い
| 間違いやすい点 | 確認すること |
|---|---|
df /var/logをログディレクトリのサイズだと思う | dfは所属するファイルシステム全体を表示する |
duで空き容量を確認する | 空き容量はdf、ファイル使用量はdu |
| 容量が残っていればファイルを作れると思う | df -iでinode不足も確認する |
lsblkとdfの表示差を異常と考える | lsblkは未マウント領域も表示する |
/dev/sdb1が常に同じだと思う | 永続設定ではUUIDやLABELを検討する |
| 中身のあるディレクトリへマウントする | 元の内容がマウント中は見えなくなる |
umountをunmountと入力する | コマンド名はumount |
target is busyで直ちに-fを使う | カレントディレクトリ、開いたファイル、入れ子のマウントを調べる |
| fstab編集後にすぐ再起動する | mount -aやfindmnt --verifyで事前確認する |
| USBメモリを解除せず取り外す | umount後に解除状態を確認する |
manページとinfo
man df
man du
man lsblk
man blkid
man mount
man umount
man fstab
info coreutils 'df invocation'
info coreutils 'du invocation'
30秒チェック
df、du、lsblkは、それぞれ何を確認するコマンドでしょうか。df -hとdf -iは、何を表示するでしょうか。du -sh /var/logの-sと-hは何を意味するでしょうか。du -xは、探索範囲をどのように制限するでしょうか。lsblk -fでは、どのような情報を確認できるでしょうか。blkid -s UUID -o value /dev/sdb1は何を表示するでしょうか。mountで接続先となるディレクトリを何と呼ぶでしょうか。mount -o roとmount -o remount,roの用途は何でしょうか。umountでtarget is busyとなる原因を一つ答えてください。- 永続設定でデバイス名よりUUIDがよく使われる理由は何でしょうか。
答えを表示
dfはファイルシステム容量、duはファイルやディレクトリの使用量、lsblkはブロックデバイス構成-hは読みやすい容量、-iはinode使用状況-sは合計のみ、-hは読みやすい単位- 別のファイルシステムへ移動せず、同じファイルシステム内だけを調べる
- ファイルシステムタイプ、LABEL、UUID、空き容量、使用率、マウントポイントなど
/dev/sdb1のUUIDの値だけ- マウントポイント
roは読み取り専用でマウントし、remount,roはマウント済み対象を読み取り専用へ再マウントする- カレントディレクトリが対象内、ファイルが開かれている、下位に別マウントがあるなど
/dev/sdb1などの名前は接続順や構成変更で変わる可能性があるため
要約
dfはマウント済みファイルシステムの使用量と空き容量を表示します。df -hは読みやすい容量、df -Tはタイプ、df -iはinode使用状況です。duはファイルやディレクトリが使用するディスク領域を調べます。du -shは合計を簡潔に表示し、du -xは同じファイルシステム内だけを探索します。dfとduの差には、削除済みだが開かれたファイル、予約領域、スパースファイルなどが関係します。lsblkは、未マウント領域を含むブロックデバイス構成を表示します。lsblk -fは、タイプ、LABEL、UUID、マウントポイントなどを表示します。blkidは、指定デバイスのUUID、LABEL、ファイルシステムタイプなどを調べます。mountはファイルシステムをマウントポイントへ接続し、umountは切り離します。- マウントポイントに元からある内容は、マウント中は通常のパスから見えなくなります。
/etc/fstabでは、変化しやすいデバイス名よりUUIDやLABELがよく使われます。target is busyでは、強制解除の前に、カレントディレクトリ、開いたファイル、入れ子のマウントを確認します。
参考資料
- GNU Coreutils:df invocation
- GNU Coreutils:du invocation
- df(1) — Linux manual page
- du(1) — Linux manual page
- lsblk(8) — Linux manual page
- blkid(8) — Linux manual page
- mount(8) — Linux manual page
- umount(8) — Linux manual page
- fstab(5) — Linux manual page
- findmnt(8) — Linux manual page
- util-linux Project Archive