![ext4 Ubuntu 18.04 ファイル システム エラー「構造をクリーニングする必要があります」](https://rvso.com/image/192205/ext4%20Ubuntu%2018.04%20%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%20%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%20%E3%82%A8%E3%83%A9%E3%83%BC%E3%80%8C%E6%A7%8B%E9%80%A0%E3%82%92%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0%E3%81%99%E3%82%8B%E5%BF%85%E8%A6%81%E3%81%8C%E3%81%82%E3%82%8A%E3%81%BE%E3%81%99%E3%80%8D.png)
24TB のディスクを用意して、1 つのディレクトリに膨大な数のディレクトリとファイルを格納できるようにしたいと考えています (この戦略を変更するように言わないでください。これは、私たちにとってブラック ボックスであるソフトウェアによって使用される構造であるため、このアプローチを変更することはできません)。十分に調査したところ、ext4 ファイルシステムには 1 つのディレクトリに数十億のファイルを格納する機能がありますが、特別なフラグとパラメーターを使用して準備する必要があります。これは、調査に基づいて私が使用したものです。
sudo mke2fs -T news /dev/sdb1
sudo tune2fs -O dir_index /dev/sdb1
sudo tune2fs -O large_dir /dev/sdb1
sudo tune2fs -O dir_nlink /dev/sdb1
sudo mkdir /hdd
sudo gedit /etc/fstab
- add following to the end of the file:
/dev/sdb1 /hdd ext4 defaults,noatime 0 0
sudo mount /hdd
構造をテストするために、単一のディレクトリにディレクトリとファイルを作成する bash スクリプトを用意しました。次のようなものです。
for ((i = 1000000; i <= 200000000; i++))
do
sudo mkdir "/hdd/largedir/$i" -p
sudo cp "sample-file.jpg" "/hdd/largedir/$i"
if (( $i % 1000 == 0 ));
then
echo "$i created";
fi;
done
何時間も作業した後、システムをチェックすると、次のエラーが表示されていました。
Structure needs cleaning
私のテストでは、このエラーはすべてのファイルとディレクトリに対して出力されるわけではありません。たとえば、「10000」という名前のディレクトリは作成できますが、「1000」という名前のディレクトリは作成できません。また、次のコマンドを使用してハッシュ アルゴリズムを変更しました。
sudo tune2fs -E "hash_alg=tea" /dev/sdb1
システムを再起動して再マウントしましたが、問題は依然として存在します。問題が何で、ファイルシステムでなぜこの状況が発生したのか知っている人はいますか? ext4 ファイルシステムは、このような大きな構造を持つには強度が足りないのでしょうか? 大量のファイルには ext4 ではなく xfs を使用するというページをいくつか読みました。これは本当でしょうか?
ファイル操作中に、電源が切れたり、システムクラッシュが発生したりしていないことがわかります。すべてが正常だったときにこのような動作が発生するとは予想していませんでした。
-- 詳細情報を編集しました: --
ディスクの inode 情報は次のとおりです。
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sdb1 421216256 183643803 237572453 44% /hdd
スペース情報は以下の通りです。
Filesystem Size Used Avail Use% Mounted on
/dev/sdb1 26T 3.1T 21T 13% /hdd
ファイルシステムをチェックしたところ、ext4 でした (さまざまなツールで表示)。たとえば、gparted はパーティション ファイルシステムを ext4 として表示します。機能については、上記の機能はどれも、Ubuntu 18.04 LTS ではデフォルトで有効になっていませんでした。以前のテスト中にいくつかのエラーが発生し、最終的にこれに至りました。
答え1
このコマンドではsudo mke2fs -T news /dev/sdb1
必ずしもext4ファイルシステムを作成するわけではありませんが、拡張子2ファイルシステム。
Ubuntu 18.04が/etc/mke2fs.conf
私のDebian 10と基本的に同じファイルを持っていると仮定すると、dir_index
modernを使用して作成されたすべてのext2/3/4ファイルシステムの現在の基本機能セットとしてすでに有効になっていますmke2fs
。また、dir_nlink
デフォルトで有効になっています。拡張子4ファイルシステムの種類。
マニュアルmke2fs.conf(5)
ページには次のように書かれています。「ユーザーとmke2fs.conf
ファイルの両方がデフォルトのファイルシステムタイプを指定しない場合は、mke2fs
デフォルトのファイルシステムタイプが使用されます。拡張子3ジャーナルがコマンドラインオプションで要求された場合、または拡張子2そうでなければ。」
ファイルによると/etc/mke2fs.conf
、-T news
オプションはオプションのみを指定しinode_ratio = 4096
、他には何も指定しません。したがって、mkfs.ext4
プレーンな の代わりに 形式を使用しない限りmke2fs
、拡張子2平均サイズが 4 KB 以下のファイル向けにカスタマイズされたファイルシステム。
Debianにはのセクションfs_type =
で指定されたがなく、コマンドにオプションが含まれていないため、UbuntuのがDebianのものと同じである場合(通常はそうです)、コマンドによって24TBが返される可能性があります。[defaults]
mke2fs.conf
-j
mke2fs
mke2fs.conf
拡張子2ファイルシステムは、おそらく誰にも十分にテストされていないものです。
マニュアルext4(5)
ページには、64bit
ファイルシステム機能は必要に応じて自動的に設定されると記載されており、これがツールがエラーを報告しなかった理由かもしれません。また、このdir_index
機能は ext2 ファイルシステムでは無視されると記載されています。
マルチテラバイトのext3
ファイルシステムでの過去の経験から、ファイルシステムの作成とチェックに膨大な時間がかかることが予想されます。 使用ケースによっては、この機能の有無によってdir_index
アプリケーションのパフォーマンスが左右される可能性があります。
tune2fs -l /dev/sdb1
何が起こったか、起こらなかったかを推測する必要がないように、元の質問の実際の出力を編集していただけますか?
「構造をクリーニングする必要があります」は、ファイルシステムが破損しており、ファイルシステムのチェックが必要であることを示すカーネル エラー コードに対応するデフォルトのテキストのようですEUCLEAN
。このサイズのファイルシステムでは、これにはかなりの時間と RAM が必要になります。そしてもちろん、チェック中はファイルシステムをアンマウントする必要があります。
答え2
実際、多くのテストを行った結果、ext4 にはそのようなこと (1 つのディレクトリに数十億のファイルを保持すること) を行う能力がないことが判明しました。Linux でこれを行う方法について調査した結果 (実際のテストでも)、このようなシナリオでは、このタスクを実行するために構築された ext4 ではなく XFS を使用する必要があることがわかりました。