CentOSやUbuntu、macOSなどのUnix系OSを使用していると、「No space left on device」というエラーが発生することがあります。
ファイルの操作を行おうとしたときに発生することが多く、一度発生すると作業を進められずに困るケースがあります。
この記事では、LinuxやmacOSで「No space left on device」というエラーが表示された時の原因と対処法を紹介します。このエラーに悩まされていた方は、参考にしてください。
この記事の内容
「No space left on device」エラーの原因
「No space left on device」のメッセージは、主にLinuxやmacOSで使用する容量が不足した際に発生するエラーです。
容量不足が発生する原因として、次の2つのパターンがあります。
- ディスク容量が不足している
- 「inode」の容量が不足している
エラーメッセージからディスクの容量の不足と判断しがちですが、inodeの容量が不足しているケースが非常に多いです。
- inodeとは
- inode(index node)とは、Unix系のファイルシステムで、ファイルに関する情報(作成者、サイズ、作成日、アクセス権等)を管理するためのデータのことです。全てのファイルにはinode番号が割り当てられます。
inodeで管理する番号には上限があり、ファイル数が増えると同時にinode番号が使用されます。
「No space left on device」のエラーが発生する場合は、データ容量ではなく、主にファイル数が多くなりinode番号が不足していることが考えられます。
ディスク/inodeの容量を確認する
「No space left on device」エラーが、ディスク容量/inode容量のどちらに原因があるか判断するために、それぞれの容量を確認します。
ディスク/inodeの使用量と空き容量を確認するには、それぞれ次の手順で確認します。
確認1: ディスクの容量を確認する
まずディスク全体の空き容量を確認しておきます。確認手順は以下の通りです。
- ターミナルを起動します。
- 以下のコマンドを入力してEnterキーを押します。
$ df
- 「Used」、「Available」、「Use%」の数値をチェックします。
- 「Used」: ディスクの使用容量です。
- 「Available」: ディスクの空き容量です。
- 「Use%」: ディスクの使用率です。
「Use%」が90%未満であれば、ディスクに十分な空き容量がある状態です。
ディスクの空き容量がない場合は、使用量の大きい不要なファイルを削除する必要があります。
ディスクの空き容量がある場合は、続いてinodeの容量を確認します。
確認2: inodeの容量を確認する
次にinodeの容量を確認します。具体的な確認方法は次の通りです。
- ターミナルを起動します
- 以下のコマンドを入力してEnterを押します。
$ df -i
- 「Inodes」、「IUsed」、「IUse%」の数値をチェックします。
- 「Inodes」: inode番号の最大数です。
- 「IUsed」: 使用しているinode番号の数です。
- 「IUse%」: inode番号の使用率です。
inode番号が不足している場合は、「IUse%」の数値が「100%」になっていることが多いです。
inode番号の容量を空けるには、ファイルを削除してファイル数を減らす必要があります。
次にinodeの容量を確保するための不要なファイルを削除する方法を紹介するので、参考にしてください。
対処1: 不要なファイルを手動で削除する
No space left on deviceエラーを解消するためには、不要なファイルを探して削除するのが有効です。
次の手順で、不要なファイルの削除を行って下さい。
手順1: 不要なファイルが存在しているディレクトリを探す
最初に、不要なファイルが存在しているディレクトリを探します。
- ターミナルを起動して以下のコマンドを実行して下さい。
$ find / -xdev -type f | cut -d "/" -f 2 | sort | uniq -c | sort -nr
- コマンドを実行すると、ルートディレクトリ直下にあるディレクトリのファイル数が表示されます。ファイル数が極端に多いディレクトリを探します。
- 「xxxxxx(ファイル数) yyyy(ディレクトリ)」のように表示されます。
- ファイル数が多いディレクトリが見つかったら、そのディレクトリに対して同じコマンドを実行します。
$ find /ファイル数の多いディレクトリ名 -xdev -type f | cut -d "/" -f 3 | sort | uniq -c | sort -nr
- 例: 「usr」というディレクトリのファイル数が多い場合は次のように入力します。
$ find /usr -xdev -type f | cut -d "/" -f 3 | sort | uniq -c | sort -nr
- 例: 「usr」というディレクトリのファイル数が多い場合は次のように入力します。
- 指定したディレクトリ直下のディレクトリ別のファイル数が表示されます。ファイル数が極端に多いディレクトリを探します。
- 表示内容はルートディレクトリに対してコマンドを実行したときと同様です。
- 上記の操作をを何度か繰り返し、不要なファイルが多数存在しているディレクトリを特定します。
手順2: 不要なファイルを一括削除する
不要なファイルが大量に存在しているディレクトリを特定できたら、ファイルを一括削除して容量を確保しましょう。
ファイルを一括で削除したい場合は、「rm -rf」のコマンドを使うとディレクトリごと削除することができます。
$ sudo rm -rf ディレクトリパス
$ sudo rm -rf /usr/share
上記のコマンドは、実行すると直ちにディレクトリが削除されるため、誤って必要なディレクトリを削除しないよう注意して下さい。
手順3: inodeの空き容量を再度確認する
削除プロセスが全て完了したら、再びdfコマンドを実行してinodeの容量を確認します。
$ df -i
「IUse%」の数値が下がっていれば、inodeの容量を確保できたことになります。
容量を確保したらファイルの操作を行い、No space left on deviceエラーが発生しないかを確認して下さい。
対処2: Cronで定期的にファイルを削除する
不要なファイルが定期的に生成されるファイルだった場合、期間が経つとinodeがまた容量不足になってしまうことが考えられます。
特にログファイルなどが原因の場合は、定期的に手動で削除するのは手間です。
そのため、Cronを使って一定期間経過したファイルを自動で削除する設定を行っておくといいでしょう。
具体的な手順は次の通りです。
- システム用のcrontabの設定ファイルを開きます。
$ sudo vi /etc/crontab
- 定期的に削除するタスクをCronに登録します。
分 時 日 月 曜日 実行コマンドorシェルスクリプト
- 以下は「/usr/src/tmp」内の不要なログファイルを定期的に削除するタスクのサンプルです。
#毎週月曜日0:00に、作成から30日以上経過した.logを削除する 0 0 * * 1 root /usr/src/tmp -name '*.log' -mtime +30 -delete
- cronのデーモンを再起動して設定を反映します。
$ /etc/init.d/crond restart
上記のようにCronにタスクを登録することで、毎週定期的に不要なファイルが削除されてinodeが枯渇するという現象を防げます。
手動削除と定期削除を上手く活用し、inodeが枯渇しないように注意してエラーを防いで下さい。