ext2、ext3、またはext4を検出する安定した方法は何ですか?

ext2、ext3、またはext4を検出する安定した方法は何ですか?

ファイルシステムスーパーブロックを使用して、C / C ++プログラムでファイルシステムの種類を検出する必要があります。しかし、ext2とext4のスーパーブロックには大きな違いはないと思います。フィールドs_rev_levelは同じ(= 1)、フィールドはs_minor_rev_level同じです(= 0)。

一部の機能(およびその他の機能フィールド)を確認し、s_feature_compatext2がサポートしていない機能を参照できます。ただし、パーティションをフォーマットする人は意図的に特定の機能を無効にすることができます。したがって、この方法ではext4を検出できますが、ext4関連機能が無効になっているとext2とext4を区別することはできません。

だから何をしますか?

答え1

さまざまなユーティリティのコードとカーネルコードを少し見て、@Haukeが提案しました。true - ファイルシステムがext2有効なオプションでのみ定義されているかどうか。ext3ext4

~からウィキペディアページ存在するext4

下位互換性

ext4はext3とext2と逆互換であるため、ext3とext2をext4としてマウントできます。新しいブロック割り当てアルゴリズムのような ext4 の新機能のいくつかは ext3 と ext2 でも動作するため、パフォーマンスがわずかに向上します。

ext3はext4と部分的に互換性があります。つまり、ext4をext3としてマウントできます(ファイルシステムタイプとして「ext3」を使用してマウント)。ただし、ext4パーティションがエクステント(ext4の新機能)を使用している場合、ext3としてマウントできる機能は失われます。

ext2ほとんどの人がすでに知っているようにext3

読んだ後blkidさまざまなコードextファイルシステムを区別するために使用されます。、私はファイルシステムを認識されたものに置き換えるext4ことができました。次の方法でこれを繰り返すことができます。ext3ext2

truncate -s 100M testfs
mkfs.ext4 -O ^64bit,^extent,^flex_bg testfs <<<y
blkid testfs
tune2fs -O ^huge_file,^dir_nlink,^extra_isize,^mmp testfs
e2fsck testfs
tune2fs -O metadata_csum testfs
tune2fs -O ^metadata_csum testfs
blkid testfs
./e2fsprogs/misc/tune2fs -O ^has_journal testfs
blkid testfs

最初のblkid出力は次のとおりです。

testfs: UUID="78f4475b-060a-445c-a5d2-0f45688cc954" SEC_TYPE="ext2" TYPE="ext4"

2番目は次のとおりです。

testfs: UUID="78f4475b-060a-445c-a5d2-0f45688cc954" SEC_TYPE="ext2" TYPE="ext3"

最後のもの:

testfs: UUID="78f4475b-060a-445c-a5d2-0f45688cc954" TYPE="ext2"

e2fsprogsこのフラグを取得するには、マイディストリビューションで利用可能な新しいバージョンを使用する必要がありますmetadata_csum。これを設定して消去する理由は、基本EXT4_FEATURE_RO_COMPAT_GDT_CSUMフラグに影響を与える他の方法が見つからなかったためです。デフォルトフラグmetadata_csumEXT4_FEATURE_RO_COMPAT_METADATA_CSUM)と()はEXT4_FEATURE_RO_COMPAT_GDT_CSUM相互に排他的です。設定はmetadata_csum無効になっていますEXT4_FEATURE_RO_COMPAT_GDT_CSUMが、設定を解除してもmetadata_csum再び有効になりません。

結論として

ファイルシステムの内部構造に関する深い知識がないため、次のようになります。

  1. ジャーナルチェックサムは生成されたファイルシステムを定義する機能であり、実際には無効にしてはext4いけませんe2fsprogs

  2. すべてのext4機能は常に無効になるように設計されており、無効にするとファイルシステムがext3ファイルシステムになります。

それにもかかわらず、ファイルシステム間の高いレベルの互換性は明らかに設計目標である。これをReiserFSとReiser4と比較してみてください。 Reiser4は完全に再設計されました。本当に重要なのは、システムのインストールに使用されたドライバが提供されている機能をサポートしているかどうかです。 Wikipediaの記事で指摘したように、このext4ドライバはと一緒に使用することもできますext3ext2実際には常にこのext4ドライバを使用し、他のドライバは廃止するカーネルオプションがあります)。この機能を無効にすることは、単に古いドライバにファイルシステムの問題がないことを意味するので、ファイルシステムのマウントを防ぐ理由はありません。

提案

extCプログラムで異なるファイルシステムを区別することがlibblkid最善の選択であるようです。util-linuxこれはmount、コマンドがファイルシステムの種類を決定するために使用するものです。 APIドキュメントはここ

直接チェックを行う必要がある場合同じフラグテストlibblkid正しいアプローチのようです。リンクされた文書には、EXT4_FEATURE_RO_COMPAT_METADATA_CSUM実際にテストされているように見えるフラグへの言及がないことに注目する価値があります。

本当にすべてをやりたい場合は、ログチェックサムを見てみると、これらのフラグがないファイルシステムがあるか(または多分以前はext4

修正する

実際には、ファイルシステムを反対方向にext2昇格する方が簡単ですext4

truncate -s 100M test
mkfs.ext2 test
blkid test
tune2fs -O has_journal test
blkid test
tune2fs -O huge_file test
blkid test

3つのblkid出力:

test: UUID="59dce6f5-96ed-4307-9b39-6da2ff73cb04" TYPE="ext2"

test: UUID="59dce6f5-96ed-4307-9b39-6da2ff73cb04" SEC_TYPE="ext2" TYPE="ext3"

test: UUID="59dce6f5-96ed-4307-9b39-6da2ff73cb04" SEC_TYPE="ext2" TYPE="ext4"

ext3/ext4機能がファイルシステムで簡単に有効になることは、ext2おそらくファイルシステムの種類が実際に機能によって定義されているという最良の証拠です。

答え2

これは直接的な答えではありませんが、各ファイルシステムタイプの出力を見ると、tune2fs -l ...次の違いがわかります。

ファイルシステム機能

外部2

ファイルシステム機能: ext_attr resize_inode dir_index ファイルタイプ sparse_super

EXT3

ファイルシステム機能:has_journal ext_attr resize_inode dir_indexファイルタイプneed_recovery sparse_super

外部4

ファイルシステム機能: has_journal ext_attr resize_inode dir_index ファイルタイプ need_recovery 範囲 flex_bg sparse_super Large_file huge_file uninit_bg dir_nlink extra_isize

ログパラメータ

外部2

ロギングパラメータは表示されません。

EXT3

これを見せてください:

Journal inode:            8
外部4

これを見せてください:

Required extra isize:     28
Desired extra isize:      28
Journal inode:            8
First orphan inode:       1967934

関連情報