ext4ファイルシステムでiノードの数を増やすにはどうすればよいですか?


61

先週問題がありました(私にとっては新しい)。ext4(Fedora 15)ファイルシステムがあります。サーバーで実行されているアプリケーションが突然停止しました。最初に問題を見つけることができませんでした。

df50%の使用可能なスペースを示しました。1時間ほど検索した後、その男が使ったフォーラムの投稿を見ましたdf -i。このオプションは、iノードの使用を探します。システムはiノード不足でしたが、これは単純な問題でしたが、私は気づきませんでした。パーティションには3.2Mのiノードしかありませんでした。

さて、私の質問は次のとおりです。システムにさらにiノードを持たせることはできますか?ディスクをフォーマットするときに設定する必要がありますか?3.2Mのiノードでは、いくつのファイルを保持できますか?


1
すべてのファイルまたはディレクトリは1つのiノードを使用します。ファイルへのハードリンクは、iノードを作成しませen.wikipedia.org/wiki/Inode
ポールトムブリン

回答:


33

通常の予想よりも多くのファイルがあるようです。

iノードテーブルのサイズを動的に変更する解決策があるかどうかはわかりません。データをバックアップし、新しいファイルシステムを作成し、データを復元する必要があると思います。

このような巨大なinodeテーブルで新しいファイルシステムを作成するには、mke2fs(8)の '-N'オプションを使用する必要があります。

iノードの推定数を取得できるように、最初に「-n」オプションを使用することをお勧めします(fsは作成されませんが、有用な情報が表示されます)。次に、必要に応じて、「-N」を使用して特定のiノード番号でファイルシステムを作成します。


11
を使用mke2fs -iして、iノードの数を指定できます。そのドキュメントは、「ファイルシステムが作成された後、ファイルシステム上のiノードの数を拡張することはできない」ことを示しています。
ジル 'SO-悪であるのをやめる'

2
@piovisqui:各ファイルは、ファイルシステム内のポインターであるiノードで消費します。ファイルが別のファイルへのハードリンクである場合、同じiノードがあります。
ハナンN.

6
@Gilles -iオプションは、iノードのサイズではなく、iノードのサイズを指定します。この-Nオプションは、iノードの数を設定します。
theillien 14年

1
iノードとファイル番号の関係は必ずしも1:1ではありません。最初のiノードには、ファイルが保存されているブロックへのポインターのリストが含まれています。ブロックのリストが1つのiノードに収まらない場合、そのiノードには、ファイルが保存されているブロックをリストするiノードへのポインターのリストが含まれます。それはそこに収まらない、それが深いなどのブロックのリストについては、inodeの3セットを行けば
StuWhitby

2
@StuWhitbyそれは正しくありません。単一のiノードには、複数の直接ポインターと、単一、二重、および三重の間接ポインターがあります。ブロックのリストが直接ポインターに収まらない場合、単一の間接ポインターは、より多くのポインターを含むデータのブロック(別のiノードではない)を指します。それよりも多くのポインターが必要な場合、二重間接ポインターは単一間接ポインターを含むブロックを指し、三重間接ポインターは二重間接ポインターを持つブロックを指します。したがって、実際には、ファイルはサイズに関係なく1つのiノードのみを使用します。
user125355

11

別の回避策として、膨大なファイルのコレクションを非圧縮(!)tarアーカイブにパックし、それを使用archivemountしてファイルシステムとしてマウントすることを検討することをお勧めします。tarアーカイブは、ファイルシステムイメージよりも共有に優れており、クラウドまたは別のストレージにバックアップするときに同様のパフォーマンスを提供します。


コレクションが読み取り専用でsquashfsあると想定されている場合、オプションの可能性がありますが、カーネルで特定のオプションを有効にする必要xzがあり、同じパフォーマンスでtarの圧縮も利用できます。


2
いい提案。
piovisqui

11

320万のiノードを使用すると、合計320万のファイルとディレクトリを使用できます(ただし、ファイルへの複数のハードリンクは1つのiノードのみを使用します)。

はい、パーティションにファイルシステムを作成するときに設定できます。オプションには-T usage-type-N number-of-inodes、または-i bytes-per-inodeすべてのiノード数を設定することができます。私は一般的に使用-iの出力を比較した後、du -sおよびfind | wc -lファイルの同様のコレクションのために、いくつかのたるみを可能にします。

いいえ、既存のファイルシステムでインプレースで変更することはできません。しかしながら:

  • LVMを実行している場合、またはファイルシステムがSANのLUNにある場合(LUNに直接、またはLUNの最後のパーティションとして)、またはパーティションの後のディスクに空きスペースがある場合、パーティションを拡大してからresize2fsファイルシステムを拡張するために使用します。これにより、追加されたスペースにほぼ比例してiノードが追加されます。将来のファイルが平均してほぼ同じサイズであると仮定して、スペースの前にiノードが不足しないようにするには、を使用して十分に高い予約ブロック率を設定しtune2fs -mます。
  • 十分なスペースがあり、ファイルシステムをオフラインにできる場合は、オフラインにして、より多くのiノードを持つ新しいファイルシステムを作成し、すべてのファイルをコピーします。
  • ファイルのサブセットのみが多くのiノードを使用しており、十分な空き領域がある場合は、ファイルシステム上のファイルでバッキングされたループデバイス上にファイルシステムを作成し、より多くのiノード(およびおそらくより小さいブロック)を持つファイルシステムを作成しますその上に、問題のディレクトリを移動します。これはおそらくパフォーマンスの低下とメンテナンスの面倒ですが、代替手段です。
  • そしてもちろん、多くの不要なファイルを削除できれば、それも助けになるはずです。

6

この状況に対する別の解決策があります。10Gのパーティションに1000個のiノードがあるとします。しかし、iノードの制限により、パーティションのすべてのスペースを使用することは想定されていません。ただし、このソリューションでは、フォーマットせずにパーティションの残りのスペースを使用できます。

$ df -i  # see list ( I need just one free inode here so move just one file into other PARTITION)
/dev/part1  1000 999 1 99.9%     /data

$ dd if=/dev/zero of=/data/new_data
$ mkfs.ext4 /data/new_data
$ mkdir /data1
$ mount /data/new_data /data1

永久取り付け用

$ echo "/data/new_data /data1 ext4 defaults 0 1" >> /etc/fstab

2
U&Lへようこそ。ここでコードのより一般的な表現に対する回答を再フォーマットし、$コマンドと出力を明確に区別するためのプロンプト()を挿入しました(コマンドのみの場合、通常、プロンプトは省略されます)。また、大胆なフェーズ強調でシャウティングを変更しました。私が物事を誤って伝えた場合、変更をロールバックできます
アントン

このソリューションにはロジックがあると思いますが、ddを実行するときにサイズを管理する必要があります。
piovisqui

3
詳細は間違っています。ループデバイスを使用する必要があります。アプリケーションによってはunionfsを使用する必要がありますが、これはフォーマットを避け、バックアップから復元する唯一のソリューションです。これが一日を節約できる状況があります!
メドック

6

最近、aptまたはaptitudeアップグレードを使用しているときにこの問題に遭遇しました。

df -h

Filesystem      Size  Used Avail Use% Mounted on
/dev/xvda1      7.8G  5.1G  2.3G  70% /

df -i

Filesystem     Inodes  IUsed  IFree IUse% Mounted on
/dev/xvda1     524288 521497   2791  100% /

発行されたコマンド:

du /|sort -k1 -n

ほとんどのファイルが以下のカーネルバージョンのサブフォルダーにあることが明らかになりました。

/usr/src/linux-headers

これらのサブフォルダーを削除し、iノードの問題を修正しました。

df -i

Filesystem     Inodes  IUsed  IFree IUse% Mounted on
/dev/xvda1     524288 104986 419302   21% /

「du / | sort -k1 -n」はiノードを表示しますか?
孤児

いいえ。ディレクトリを並べ替え、どのファイルに最も多くのファイルが含まれているか、多くのiノードを消費しているが実際のスペース使用量が少ないフォルダーを表示しました。
kph0x1

正直に言って、「du」がフラグ付きのファイル数をどのように示しているのかわかりません。もっと詳しく説明していただけますか?
孤児

duコマンドのフラグはありません。使用法は、上記の例のファイルシステムのルートであり、スペースのみを見ています。どのディレクトリに最も多くのファイルが含まれているかを示すために、出力はソートされてソートされます。上記の例では、ファイルについてはカウントされません。質問の「ファイル数」の部分です。duただし、出力に示されている原因はカーネルソースのものです。たとえば、多くの小さなファイル、過去のコンパイルからのサブフォルダー、iノードを解放するための削除に最適なものです。du出力のマニュアルによる人間によるレビューがまだ残っており、/usr/src/linux-headersそれは明らかでした。
kph0x1

1
duは、ファイルではなくバイトのみを表示します。そして、duコマンドからのみoutoutをソートします。では、sort -k1 -nは、あなたが提案した方法で出力をどのようにソートしますか?私が見ることができる唯一のことは、「du / | sort -k1 -n」がバイト単位のサイズに基づいてすべての行のみをソートするということです。他に何もない
孤児

2

du -s --inodes * 2>/dev/null |sort -g出力の最後のディレクトリにcdを試して、繰り返します。

完全な開示:--inodesduコマンドに対するすべてのOSのサポートフラグ(私のMac OSはサポートしていません)ではなく、多くのLinux OSがサポートしています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.