ファイルシステムスーパーブロックを使用して、C/C++プログラムからファイルシステムタイプを検出する必要があります。ただし、ext2とext4のスーパーブロックの間に大きな違いは見られません。 s_rev_level
フィールドは同じ(= 1)、s_minor_rev_level
は同じ(= 0)です。
s_feature_compat
(およびその他の機能フィールド)からいくつかの機能をチェックして、ext2でサポートされていない機能を見つけようとすることができました。しかし、パーティションをフォーマットしている人は、意図的に一部の機能を無効にする可能性があります。したがって、このメソッドはext4を検出できますが、ext2とext4固有の機能が無効になっているext4を区別することはできません。
だから、それを行う方法は?
さまざまなユーティリティのコードとカーネルコードをしばらく見てみると、 @ Haukeが提案 は正しいようです-ファイルシステムが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
ファイルシステムになります。
いずれにせよ、ファイルシステム間の高レベルの互換性が明らかに設計目標です。これを、Reiser4が完全に再設計されたReiserFSおよびReiser4と比較してください。本当に重要なのは、存在する機能がシステムのマウントに使用されるドライバーによってサポートされているかどうかです。ウィキペディアの記事に記載されているように、ext4
ドライバーはext3
およびext2
でも使用できます(実際、常にext4
ドライバーを使用して他のドライバーを捨てるカーネルオプションがあります)。機能を無効にすると、以前のドライバーはファイルシステムに問題がないため、ファイルシステムのマウントを停止する理由はありません。
Cプログラム内の異なるext
ファイルシステムを区別するには、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
として開始されたファイルシステムで有効にすることで非常に簡単にできるという事実は、ファイルシステムタイプが実際に機能によって定義されていることを示す最良のデモンストレーションです。