Надежный способ обнаружить ext2 или ext3 или ext4?

Тестирование будет всегда указывать на текущее тестирование. Вы ничего не должны изменять, если Вы хотите остаться на тестировании. Единственное время, которое необходимо было бы изменить, чтобы остаться на тестировании, - то, при определении выпуска по имени, например:

deb http://ftp.us.debian.org/debian wheezy main
7
22.07.2018, 06:14
2 ответа

После просмотра кода различных утилит и кода ядра в течение некоторого времени кажется, что то, что @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"

Второй:

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 не приводит к повторному включению последнего.

Выводы

Не имея глубоких знаний о внутреннем устройстве файловой системы, кажется либо:

  1. Контрольная сумма журнала должна быть определяющей функцией файловой системы, созданной как ext4 , что вы действительно не должны отключить и тот факт, что мне удалось это сделать, на самом деле является ошибкой в ​​ e2fsprogs . Или

  2. Все функции ext4 всегда были предназначены для отключения, и их отключение действительно превращает файловую систему в файловую систему ext3 .

В любом случае высокий уровень совместимости между файловыми системами явно является целью дизайна, сравните это с ReiserFS и Reiser4, где Reiser4 - это полная переработка. Что действительно важно, так это то, поддерживаются ли имеющиеся функции драйвером, который используется для монтирования системы.Как отмечается в статье в Википедии, драйвер 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

Три 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 , вероятно, наилучшая демонстрация того, что Тип файловой системы действительно определяется функциями.

6
27.01.2020, 20:18

Не прямой ответ, но при просмотре вывода tune2fs -l ... для каждого типа файловой системы показаны следующие различия .

Характеристики файловой системы

EXT2

Функции файловой системы: ext_attr resize_inode dir_index filetype sparse_super

EXT3

Особенности файловой системы: has_journal ext_attr resize_inode dir_index filetype needs_recovery sparse_super_

Особенности файловой системы EXT4

EXT4] dir_index тип файла needs_recovery extension flex_bg sparse_super large_file huge_file uninit_bg dir_nlink extra_isize

Параметры ведения журнала

EXT2

Не показывает параметров для ведения журнала.

EXT3

Показывает это:

Journal inode:            8
EXT4

Показывает это:

Required extra isize:     28
Desired extra isize:      28
Journal inode:            8
First orphan inode:       1967934
1
27.01.2020, 20:18

Теги

Похожие вопросы