ext2, ext3 또는 ext4를 감지하는 안정적인 방법은 무엇입니까?

ext2, ext3 또는 ext4를 감지하는 안정적인 방법은 무엇입니까?

파일 시스템 슈퍼블록을 사용하여 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활성화된 옵션으로만 정의되는지 여부입니다.ext3ext4

~에서위키피디아 페이지존재하다 ext4:

하위 호환성

ext4는 ext3 및 ext2와 역호환되므로 ext3 및 ext2를 ext4로 마운트할 수 있습니다. 새로운 블록 할당 알고리즘과 같은 ext4의 새로운 기능 중 일부는 ext3 및 ext2에서도 작동하므로 성능이 약간 향상됩니다.

ext3은 ext4와 부분적으로 호환됩니다. 즉, ext4를 ext3으로 마운트할 수 있습니다(파일 시스템 유형으로 "ext3"을 사용하여 마운트). 그러나 ext4 파티션이 익스텐트(ext4의 새로운 주요 기능)를 사용하는 경우 ext3으로 마운트할 수 있는 기능을 잃게 됩니다.

ext2대부분의 사람들이 이미 알고 있듯이 ext3.

읽고 나서blkid다양한 코드 ext파일 시스템을 구별하는 데 사용됩니다., 나는 파일 시스템을 인식 되는 ext4것으로 바꿀 수 있었습니다 . 다음을 통해 이를 반복할 수 있어야 합니다.ext3ext2

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는 완전히 재설계되었습니다. 정말로 중요한 것은 시스템을 설치하는 데 사용된 드라이버가 제공된 기능을 지원하는지 여부입니다. Wikipedia 기사에서 지적했듯이 이 ext4드라이버는 및 와 함께 사용할 수도 있습니다 ext3( 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아마도 파일 시스템 유형이 실제로 기능에 의해 정의된다는 가장 좋은 증거일 것입니다.

답변2

이는 직접적인 대답은 아니지만 각 파일 시스템 유형의 출력을 보면 tune2fs -l ...다음과 같은 차이점을 알 수 있습니다.

파일 시스템 기능

외부 2

파일 시스템 기능: ext_attr resize_inode dir_index 파일 유형 sparse_super

EXT3

파일 시스템 기능: has_journal ext_attr resize_inode dir_index 파일 유형 need_recovery sparse_super

외부 4

파일 시스템 기능: 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

관련 정보