メインコンテンツへスキップ
レッスン 4 / 8推定時間: 25

ファイルシステムとディスク使用量

ディスクの使用量を監視し、ファイルシステムの情報を確認する方法を学びます

このレッスンの学習目標

  • ディスクの使用量を正確に把握できる
  • 大きなファイルやディレクトリを効率的に見つけられる
  • ファイルシステムの情報を読み取れる
  • ディスク容量の問題を解決できる

ディスク使用量の確認:df

df(Disk Free)コマンドは、マウントされたファイルシステムのディスク使用量を表示します。

dfの基本的な使用法

CommandAcademy Terminal
Welcome to CommandAcademy Terminal!
Type "help" to see available commands.
user@cmdac:~$

ファイルツリー

/
etc
hosts35B
passwd76B
home
user
tmp
usr
bin
share
var
log

dfの主要オプション:

  • -h : 人間が読みやすい形式(MB、GB等)
  • -T : ファイルシステムタイプを表示
  • -i : inode使用量を表示
  • -x : 特定のファイルシステムタイプを除外

dfの出力の読み方

# 基本的な使用量表示
df -h

# 出力例:
# Filesystem      Size  Used Avail Use% Mounted on
# /dev/sda1        20G  8.5G   11G  45% /
# /dev/sda2       100G   45G   51G  47% /home
# tmpfs           2.0G     0  2.0G   0% /tmp

各列の意味:

  • Filesystem: デバイス名
  • Size: 総容量
  • Used: 使用容量
  • Avail: 利用可能容量
  • Use%: 使用率
  • Mounted on: マウントポイント

特定のディレクトリの使用量

# 特定のマウントポイントのみ表示
df -h /home

# inode使用量を確認
df -i

# 全ファイルシステムタイプを表示
df -hT

ディレクトリ使用量の確認:du

du(Disk Usage)コマンドは、ディレクトリやファイルのディスク使用量を表示します。

duの基本操作

CommandAcademy Terminal
Welcome to CommandAcademy Terminal!
Type "help" to see available commands.
user@cmdac:~$

ファイルツリー

/
etc
hosts35B
passwd76B
home
user
tmp
usr
bin
share
var
log

duの主要オプション:

  • -h : 人間が読みやすい形式
  • -s : 指定したディレクトリの合計のみ表示
  • -a : すべてのファイルを表示
  • -c : 総計を表示
  • --max-depth=N : 表示する階層を制限

duの実践的な使用法

# 現在のディレクトリの使用量
du -h

# サマリのみ表示
du -sh .

# 深さを制限
du -h --max-depth=1

# 大きいディレクトリから順に表示
du -h | sort -hr

# 特定のファイル/ディレクトリのサイズ
du -sh /var/log /tmp /home

大きなファイル・ディレクトリの発見

CommandAcademy Terminal
Welcome to CommandAcademy Terminal!
Type "help" to see available commands.
user@cmdac:~$

ファイルツリー

/
etc
hosts35B
passwd76B
home
user
tmp
usr
bin
share
var
log
# トップ10の大きなディレクトリ
du -h | sort -hr | head -10

# 1MB以上のファイル
find . -type f -size +1M -exec du -h {} + | sort -hr

# 特定サイズ以上のディレクトリ
du -h | awk '$1~/[0-9]+M/ || $1~/[0-9]+G/'

# 隠しファイルも含めて検索
du -ah | sort -hr | head -20

ファイル情報の詳細確認

stat - 詳細なファイル情報

CommandAcademy Terminal
Welcome to CommandAcademy Terminal!
Type "help" to see available commands.
user@cmdac:~$

ファイルツリー

/
etc
hosts35B
passwd76B
home
user
tmp
usr
bin
share
var
log
# ファイルの詳細情報
stat example.txt

# 表示される情報:
# - ファイルサイズ
# - ブロック数
# - inode番号
# - パーミッション
# - 所有者/グループ
# - タイムスタンプ(アクセス、変更、作成)

# 特定の情報のみ表示
stat -c '%s' example.txt  # ファイルサイズ
stat -c '%a' example.txt  # 8進数パーミッション
stat -c '%U %G' example.txt  # 所有者とグループ

file - ファイルタイプの判定

# ファイルタイプの確認
file *

# MIMEタイプで表示
file -i document.pdf

# 複数ファイルの一括確認
find . -type f | head -10 | xargs file

開いているファイルの確認:lsof

lsof(List Open Files)は、現在開かれているファイルを表示します。

lsofの基本使用法

# 現在開いているファイル
lsof

# 特定のファイルを開いているプロセス
lsof /var/log/syslog

# 特定のディレクトリ内の開かれているファイル
lsof +D /tmp

# 特定のプロセスが開いているファイル
lsof -p PID

# 特定のユーザーが開いているファイル
lsof -u username

# ネットワークポート
lsof -i :80
lsof -i TCP:22

実践的なlsofの使用例

CommandAcademy Terminal
Welcome to CommandAcademy Terminal!
Type "help" to see available commands.
user@cmdac:~$

ファイルツリー

/
etc
hosts35B
passwd76B
home
user
tmp
usr
bin
share
var
log
# 削除できないファイルの原因調査
lsof | grep deleted

# ディスク容量が減らない原因調査
lsof | grep -i deleted

# どのプロセスがディスクを使用しているか
lsof -n | grep -E '(REG.*[0-9]+\s*[0-9]+)' | awk '{print $2}' | sort | uniq -c | sort -nr

実践的なディスク容量管理

容量不足の解決手順

CommandAcademy Terminal
Welcome to CommandAcademy Terminal!
Type "help" to see available commands.
user@cmdac:~$

ファイルツリー

/
etc
hosts35B
passwd76B
home
user
tmp
usr
bin
share
var
log
# 1. 現在の状況を確認
df -h

# 2. 大きなディレクトリを特定
du -h --max-depth=1 / | sort -hr

# 3. 大きなファイルを検索
find / -type f -size +100M 2>/dev/null | head -10

# 4. 一時ファイルを確認
find /tmp -type f -mtime +7
find . -name "*.tmp" -o -name "*.cache"

# 5. 古いログファイルを確認
find /var/log -name "*.log" -mtime +30

# 6. 重複ファイルの検索(重複除去ツール使用)
fdupes -r /path/to/check

自動化されたクリーンアップスクリプト

#!/bin/bash
# cleanup.sh - ディスククリーンアップスクリプト

LOG_FILE="/var/log/cleanup.log"
THRESHOLD=90

echo "$(date): Starting cleanup" >> $LOG_FILE

# 現在のディスク使用率を確認
USAGE=$(df / | tail -1 | awk '{print $5}' | sed 's/%//')

if [ $USAGE -gt $THRESHOLD ]; then
    echo "Disk usage is $USAGE%. Cleaning up..." >> $LOG_FILE
    
    # 一時ファイルの削除
    find /tmp -type f -mtime +7 -delete
    
    # ログローテーション
    find /var/log -name "*.log" -size +100M -exec gzip {} \;
    
    # キャッシュファイルの削除
    find /var/cache -name "*.cache" -mtime +30 -delete
    
    echo "Cleanup completed" >> $LOG_FILE
else
    echo "Disk usage is $USAGE%. No cleanup needed." >> $LOG_FILE
fi

ファイルシステムの監視

定期的な監視スクリプト

#!/bin/bash
# disk_monitor.sh

while true; do
    # ディスク使用率を確認
    df -h | awk '$5 > 80 {print "Warning: " $1 " is " $5 " full"}'
    
    # inode使用率も確認
    df -i | awk '$5 > 80 {print "Warning: " $1 " inodes are " $5 " full"}'
    
    sleep 3600  # 1時間待機
done

ログファイルの管理

# ログファイルのサイズ監視
find /var/log -name "*.log" -size +50M -printf "%s %p\n" | sort -nr

# ログローテーション設定の確認
cat /etc/logrotate.conf
ls -la /etc/logrotate.d/

# 手動でのログローテーション
logrotate -f /etc/logrotate.conf

実践演習

演習1:容量分析レポート作成

CommandAcademy Terminal
Welcome to CommandAcademy Terminal!
Type "help" to see available commands.
user@cmdac:~$

ファイルツリー

/
etc
hosts35B
passwd76B
home
user
tmp
usr
bin
share
var
log

指定されたディレクトリ構造の容量分析レポートを作成してください。

解答例:

#!/bin/bash
echo "=== Disk Usage Analysis Report ==="
echo "Generated on: $(date)"
echo

echo "Overall disk usage:"
df -h | grep -E '^/dev/'
echo

echo "Top 5 largest directories:"
du -h analysis/ | sort -hr | head -5
echo

echo "Files larger than 10MB:"
find analysis/ -type f -size +10M -exec du -h {} + | sort -hr
echo

echo "File count by type:"
find analysis/ -type f -name "*.dat" | wc -l | sed 's/^/.dat files: /'
find analysis/ -type f -name "*.log" | wc -l | sed 's/^/.log files: /'
find analysis/ -type f -name "*.tmp" | wc -l | sed 's/^/.tmp files: /'

演習2:クリーンアップスクリプト

CommandAcademy Terminal
Welcome to CommandAcademy Terminal!
Type "help" to see available commands.
user@cmdac:~$

ファイルツリー

/
etc
hosts35B
passwd76B
home
user
tmp
usr
bin
share
var
log

7日以上古いファイルを安全に削除するクリーンアップスクリプトを作成してください。

解答例:

#!/bin/bash
# safe_cleanup.sh

CLEANUP_DIR="cleanup"
BACKUP_DIR="backup_$(date +%Y%m%d)"
LOG_FILE="cleanup.log"

echo "$(date): Starting cleanup of $CLEANUP_DIR" >> $LOG_FILE

# バックアップディレクトリ作成
mkdir -p "$BACKUP_DIR"

# 7日以上古いファイルを検索
find "$CLEANUP_DIR" -type f -mtime +7 -print0 | while IFS= read -r -d '' file; do
    echo "Processing: $file" >> $LOG_FILE
    # バックアップ
    cp "$file" "$BACKUP_DIR/"
    # 削除
    rm "$file"
    echo "Removed: $file" >> $LOG_FILE
done

echo "$(date): Cleanup completed" >> $LOG_FILE

トラブルシューティング

よくある問題と解決策

1. ディスクフル状態

# 緊急時の対処
df -h
# 使用率100%のファイルシステムを特定

# 大きなファイルを見つけて削除
find / -type f -size +1G 2>/dev/null | head -5

# 削除されたが開かれているファイルを確認
lsof | grep -i deleted
# 該当プロセスを再起動

2. inode不足

# inode使用率を確認
df -i

# 小さなファイルが大量にある場合
find / -type f | wc -l
find / -size 0 -type f -delete  # 空ファイルを削除

3. 削除できないファイル

# ファイルを使用しているプロセスを確認
lsof filename

# プロセス終了後に削除
kill PID
rm filename

まとめ

このレッスンでは、ファイルシステムとディスク使用量の管理について学びました:

  • df/duを使った使用量の確認
  • 大きなファイル・ディレクトリの特定方法
  • lsofによる開いているファイルの調査
  • 効率的なクリーンアップ手法

定期的な監視と適切なメンテナンスにより、ディスク容量の問題を予防できます。

💡 次のレッスンでは、ファイル属性とメタデータについて学びます。

さらに学習を続けるには

素晴らしい学習ペースです!次のレッスンに進むには、無料会員登録をお願いします。無料会員では各コース3レッスンまで学習できます。

無料で続きを学ぶ

各コース3レッスンまで学習可能

学習進捗の自動保存

コース修了証明書の発行