ファイルシステムスーパーブロックを使用して、C / C ++プログラムでファイルシステムの種類を検出する必要があります。しかし、ext2とext4のスーパーブロックには大きな違いはないと思います。フィールドs_rev_level
は同じ(= 1)、フィールドはs_minor_rev_level
同じです(= 0)。
一部の機能(およびその他の機能フィールド)を確認し、s_feature_compat
ext2がサポートしていない機能を参照できます。ただし、パーティションをフォーマットする人は意図的に特定の機能を無効にすることができます。したがって、この方法ではext4を検出できますが、ext4関連機能が無効になっているとext2とext4を区別することはできません。
だから何をしますか?
答え1
さまざまなユーティリティのコードとカーネルコードを少し見て、@Haukeが提案しました。true - ファイルシステムがext2
有効なオプションでのみ定義されているかどうか。ext3
ext4
~からウィキペディアページ存在するext4
:
下位互換性
ext4はext3とext2と逆互換であるため、ext3とext2をext4としてマウントできます。新しいブロック割り当てアルゴリズムのような ext4 の新機能のいくつかは ext3 と ext2 でも動作するため、パフォーマンスがわずかに向上します。
ext3はext4と部分的に互換性があります。つまり、ext4をext3としてマウントできます(ファイルシステムタイプとして「ext3」を使用してマウント)。ただし、ext4パーティションがエクステント(ext4の新機能)を使用している場合、ext3としてマウントできる機能は失われます。
ext2
ほとんどの人がすでに知っているようにext3
。
読んだ後blkid
さまざまなコードext
ファイルシステムを区別するために使用されます。、私はファイルシステムを認識されたものに置き換えるext4
ことができました。次の方法でこれを繰り返すことができます。ext3
ext2
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_csum
(EXT4_FEATURE_RO_COMPAT_METADATA_CSUM
)と()はEXT4_FEATURE_RO_COMPAT_GDT_CSUM
相互に排他的です。設定はmetadata_csum
無効になっていますEXT4_FEATURE_RO_COMPAT_GDT_CSUM
が、設定を解除してもmetadata_csum
再び有効になりません。
結論として
ファイルシステムの内部構造に関する深い知識がないため、次のようになります。
ジャーナルチェックサムは生成されたファイルシステムを定義する機能であり、実際には無効にしては
ext4
いけませんe2fsprogs
。すべての
ext4
機能は常に無効になるように設計されており、無効にするとファイルシステムがext3
ファイルシステムになります。
それにもかかわらず、ファイルシステム間の高いレベルの互換性は明らかに設計目標である。これをReiserFSとReiser4と比較してみてください。 Reiser4は完全に再設計されました。本当に重要なのは、システムのインストールに使用されたドライバが提供されている機能をサポートしているかどうかです。 Wikipediaの記事で指摘したように、このext4
ドライバはと一緒に使用することもできますext3
(ext2
実際には常にこのext4
ドライバを使用し、他のドライバは廃止するカーネルオプションがあります)。この機能を無効にすることは、単に古いドライバにファイルシステムの問題がないことを意味するので、ファイルシステムのマウントを防ぐ理由はありません。
提案
ext
Cプログラムで異なるファイルシステムを区別することが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 ...
次の違いがわかります。
ファイルシステム機能
外部2EXT3ファイルシステム機能: ext_attr resize_inode dir_index ファイルタイプ sparse_super
外部4ファイルシステム機能:has_journal ext_attr resize_inode dir_indexファイルタイプneed_recovery sparse_super
ファイルシステム機能: 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