Filesystems

檢測 ext2 或 ext3 或 ext4 的可靠方法?

  • July 22, 2018

我需要使用文件系統超級塊從 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_CSUMEXT4_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驅動程序也可以與ext3and一起使用ext2(實際上有一個核心選項可以始終使用該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

三個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是文件系統類型確實由特性定義的最好證明。

引用自:https://unix.stackexchange.com/questions/123009