Linuxカーネルが、実際にはiノードが不足しているのに、「ディスク領域不足」を報告するのはなぜですか


10

Linux環境でのプログラミングは好きだが、Linuxの管理についてはよく知らない私の友人が、最近彼のOS(Ubuntu)が「XXXボリュームのディスク容量不足」を報告していた問題に遭遇しました。しかし、彼がボリュームをチェックしに行ったとき、まだ700 GBが残っていました。多くの時間を浪費した後、彼は最終的に自分がiノードの外にあることを理解することができました。(彼はこのボリュームにバックアップシステムからの小さな増分更新をたくさん保存し、彼のすべてのiノードを焼き付けていました。)

Linuxカーネルがエラーメッセージ(「ディスク容量不足」)を適切に報告(「inode不足」)するのではなく、なぜ報告したのかと彼は私に尋ねました。私は知らなかったので、StackExchangeに質問すると思いました。

なぜこれが起こるのか誰でも知っていますか?そしてなぜそれがこれらすべての年月の後でまだ修正されていないのですか?(1995年に別の友人がこの問題について教えてくれたのを覚えています。)

回答:


18

1つのエラー番号ENOSPCが両方の状況を報告するために使用されるため、同じエラーメッセージが表示されます。

ISO CPOSIX標準への準拠を維持するために、カーネル開発者は両方のイベントに単一のエラー番号を使用するしかありません。新しいエラー番号を追加すると、既存のプログラムが壊れます。

ただし、従来のエラーメッセージに固執することはAFAIKの義務ではないため、たとえば次のように、開発者が単一のメッセージをより明確にすることを禁止するものはありません。 out of disk/inode space

技術的には、inode領域外でもデータ領域外でも同じです。つまり、システムコールを成功させるための十分な空きディスク領域がないことを意味します。

空きのiノードスロットがまだあるときにディスクがいっぱいであると報告されても、文句を言わなかったと思います。

、、およびiノードを動的に割り当てるなどのファイルシステムJFSによりXFS、この問題は発生しなくなりました。ZFSbtrfs


最近のファイルシステムにはext4が含まれていますか?
Camilo Martin、

@CamiloMartin私はそうは思わない。
jlliagre 2014年

@CamiloMartinいいえ、残念ながら、ext4ext2 / 3のようにfsの作成時にiノードを割り当て、後で変更することはできません。
Matt

@mindthemonkeyくそー!おそらくこれは後方互換性の問題だと思います。他のどのファイルシステムに優れた機能がありますが、十分に安定しています(btrfsは安定しています)?ext4はある種の「デフォルトの選択」のようです(少なくとも私の初心者の観点から)。
Camilo Martin

1
ええ、extは常に以前のバージョンの拡張であり、後方互換性があるため、大きな変更はありませんが、かなり堅固で安定しています。私は個人的にすべての大容量ストレージをZFSのfreebsdボックスで実行しています。ほとんどのディストリビューションでは少なくともBTRFSを使用できますが、BTRFSは依然として「不安定」と見なされています。
Matt

2

私はあなたの友人がext fsを使用していると思います。これは、iノードを使い果たすことができる数少ない賢明なfsの1つだからです。

それはあなたの友人が彼のファイルシステムをいじって壊してしまったか、数TBのとんでもないボリュームを持っているかのように見えます。iノードは使い捨てではありません。彼が実際にiノードを使い果たした場合、それは彼が途方もなく多くのファイルとディレクトリを持っていることを意味します...これは> 4TB(教育的推測)ボリュームで発生する可能性があります。fsのextファミリーでは、fsが作成されるときにiノードの数が決定されます。mkfs.ext4manページから:

-i bytes-per-inode
          Specify  the  bytes/inode ratio.  mke2fs creates an inode for every bytes-per-inode
          bytes of space on the disk.  The larger the bytes-per-inode ratio, the fewer inodes
          will  be  created.  This value generally shouldn't be smaller than the blocksize of
          the filesystem, since in that case more inodes would be made than can ever be used.
          Be  warned  that  it is not possible to expand the number of inodes on a filesystem
          after it is created, so be careful deciding the correct value for this parameter.

この回答の残りの部分を短縮するにmkfsは:これは、そのような比率が提供されているか、それが想定されることを意味します。友人が想定とは異なる方法でfsを使用している場合、選択した比率が彼のユースケースでは間違っている可能性があり、そのエラーが発生します。

あなたの友人は、ファイルや、大量のファイルを作成する可能性のある他の形式のバックアップ用の「ゴミ箱」の概念を実装するデスクトップ環境を使用していますか?多分彼は単に不要なファイルを取り除くことによって彼の問題を修正することができます。

カーネル2.4がかなり新しい頃のext2の問題を覚えています。経験則として、私は常に現在一般的なものと比較して非常に大きいボリュームにXFSを使用します。現在、250GBから1TBまでのすべてを1つのボリュームに共通と呼び、4TBのHDDを購入できます。したがって、3TBを超えるすべての場合、extではなくXFSを使用します。単なる経験則ですが、長い間iノードが不足していません...


1
質問に答えていないと思います。
jlliagre 2014年

そうだね。タイトルにある質問ではなく、「なぜこれが起こるのか誰もが知っていますか?」という最初のインライン質問に答えようとしました。
Bananguin 2014年

正しい。私の友人は何が起こったのか知っています。彼はある種のバックアップシステムを実行していて、圧縮されていない(またはTARされていない)増分変更を格納していたため、これらの小さなファイルすべてが領域を占有していました。彼がこれほど大きなFSをこれまでに持っていたとは思えないので、iノードの不足は彼にとって新しいことでした。エルゴ、彼が「df -h」と入力したときに欲求不満になり、「ええと、私はまだたくさんのスペースが残っている」と思いました-率直に言って、私は彼に同意します。カーネルが「out of space」と言う場合、実際には「out of inodes」という別のメッセージが表示されるはずですが、非常に混乱します。
プレッツェル2014年

@Bananguin-デフォルトのバイトとiノードの比率が何か知っていますか?
プレッツェル2014年

@プレッツェル:デフォルトは4kごとに1つのiノードであることを覚えています。コンピューター(tune2fs -l /dev/sda1)を確認したところ、4つのブロックごとに1つのiノードの比率があり、すべてのブロックのサイズは1kです。これがどの程度「デフォルト」と見なされるかはわかりません。
Bananguin 2014年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.