檢測 ext2 或 ext3 或 ext4 的可靠方法?
我需要使用文件系統超級塊從 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 分區使用了 extents(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"
二是:
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
and一起使用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
三個
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
是文件系統類型確實由特性定義的最好證明。