MeWrite Docs

No space left on device

ディスクの空き容量が不足している場合に発生するエラー

概要

No space left on device は、ディスクの空き容量が不足している場合に発生するエラーです。ファイルの書き込み、ログの出力、データベースの操作など、様々な場面で発生します。

エラーメッセージ

write error: No space left on device
OSError: [Errno 28] No space left on device
ERROR 1114 (HY000): The table is full

原因

  1. ディスク容量不足: 実際に空き容量がない
  2. inode 枯渇: ファイル数が上限に達している
  3. ログファイルの肥大化: ログが大量に蓄積
  4. 一時ファイルの蓄積: /tmp が一杯
  5. 削除済みファイルの保持: プロセスがファイルを掴んでいる

解決策

1. ディスク使用状況の確認

1
2
3
4
5
6
7
8
9
# ディスク使用状況
df -h

# inode 使用状況
df -i

# 出力例
# Filesystem      Size  Used Avail Use% Mounted on
# /dev/sda1        50G   48G  2.0G  96% /

2. 大きなファイルを特定

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
# 大きなファイルを検索
find / -type f -size +100M -exec ls -lh {} \; 2>/dev/null

# du でディレクトリサイズを確認
du -sh /*
du -sh /var/*
du -sh /var/log/*

# ncdu(インタラクティブ)
ncdu /

# ソートして表示
du -h --max-depth=1 / 2>/dev/null | sort -hr | head -20

3. ログファイルの整理

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
# ログファイルのサイズを確認
ls -lhS /var/log/

# 古いログを削除
sudo rm /var/log/*.gz
sudo rm /var/log/*.1

# logrotate を手動実行
sudo logrotate -f /etc/logrotate.conf

# journal ログを削除
sudo journalctl --vacuum-size=100M
sudo journalctl --vacuum-time=7d

4. 一時ファイルの削除

1
2
3
4
5
6
7
8
# /tmp を確認
du -sh /tmp

# 古い一時ファイルを削除
sudo find /tmp -type f -atime +7 -delete

# systemd の一時ファイルクリーンアップ
sudo systemd-tmpfiles --clean

5. パッケージキャッシュの削除

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
# Ubuntu/Debian
sudo apt-get clean
sudo apt-get autoremove

# CentOS/RHEL
sudo yum clean all
sudo dnf clean all

# npm キャッシュ
npm cache clean --force

# pip キャッシュ
pip cache purge

# Docker キャッシュ
docker system prune -a

6. 削除済みファイルの解放

1
2
3
4
5
6
7
8
9
# 削除されたが開いているファイルを確認
sudo lsof +L1

# 特定のプロセスが掴んでいるファイル
sudo lsof | grep deleted

# プロセスを再起動して解放
sudo systemctl restart apache2
sudo systemctl restart mysql

7. inode の解放

1
2
3
4
5
6
7
8
# inode 使用状況
df -i

# 小さいファイルが大量にあるディレクトリを特定
find / -xdev -printf '%h\n' | sort | uniq -c | sort -k 1 -n | tail

# 不要なファイルを削除
rm -rf /path/to/directory/with/many/files/*

8. 予約領域の調整

1
2
3
4
5
# ext4 の予約領域を確認(デフォルト5%)
sudo tune2fs -l /dev/sda1 | grep 'Reserved block count'

# 予約領域を減らす(1%に変更)
sudo tune2fs -m 1 /dev/sda1

9. ディスクの拡張

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# AWS EBS の場合
# 1. AWS Console でボリュームサイズを増加
# 2. インスタンス内でパーティションを拡張

# パーティションを拡張
sudo growpart /dev/xvda 1

# ファイルシステムを拡張
sudo resize2fs /dev/xvda1  # ext4
sudo xfs_growfs /         # xfs

10. Docker の容量確保

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
# Docker の使用状況
docker system df

# 未使用のリソースを削除
docker system prune

# すべてのイメージ・コンテナを削除
docker system prune -a

# ボリュームも含めて削除
docker system prune -a --volumes

# 停止中のコンテナを削除
docker container prune

# 未使用のイメージを削除
docker image prune -a

11. MySQL/PostgreSQL の容量確保

1
2
3
4
5
6
7
8
-- MySQL: テーブルの最適化
OPTIMIZE TABLE table_name;

-- MySQL: バイナリログの削除
PURGE BINARY LOGS BEFORE '2024-01-01';

-- PostgreSQL: VACUUM
VACUUM FULL;

監視の設定

ディスク使用率のアラート

1
2
3
4
5
6
7
8
# スクリプトで監視
#!/bin/bash
THRESHOLD=90
USAGE=$(df / | tail -1 | awk '{print $5}' | sed 's/%//')

if [ "$USAGE" -gt "$THRESHOLD" ]; then
    echo "Disk usage is at ${USAGE}%" | mail -s "Disk Alert" admin@example.com
fi

cron で定期実行

1
2
# /etc/crontab
0 * * * * root /path/to/disk-check.sh

デバッグのコツ

リアルタイム監視

1
2
3
4
5
6
7
8
# watch で継続監視
watch -n 1 df -h

# iotop で I/O を監視
sudo iotop

# dstat で総合監視
dstat -cdngym

ファイル作成のテスト

1
2
3
4
5
# 書き込みテスト
dd if=/dev/zero of=testfile bs=1M count=100

# 成功したら削除
rm testfile

Linux の他のエラー

最終更新: 2025-12-08