파일 시스템 슈퍼블록을 사용하여 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
활성화된 옵션으로만 정의되는지 여부입니다.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
다시 활성화되지는 않습니다.
결론적으로
파일 시스템의 내부 구조에 대한 깊은 지식이 부족하기 때문에 다음과 같이 보입니다.
저널 체크섬은 생성된 파일 시스템을 정의하는 기능이며
ext4
실제로 비활성화하면 안 되므로 실제로 그렇게 되도록 관리했습니다e2fsprogs
.모든
ext4
기능은 항상 비활성화되도록 설계되어 있으며, 비활성화하면 파일 시스템이ext3
파일 시스템이 됩니다.
그럼에도 불구하고 파일 시스템 간의 높은 수준의 호환성은 분명히 설계 목표입니다. 이를 ReiserFS 및 Reiser4와 비교해 보세요. Reiser4는 완전히 재설계되었습니다. 정말로 중요한 것은 시스템을 설치하는 데 사용된 드라이버가 제공된 기능을 지원하는지 여부입니다. Wikipedia 기사에서 지적했듯이 이 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
아마도 파일 시스템 유형이 실제로 기능에 의해 정의된다는 가장 좋은 증거일 것입니다.
답변2
이는 직접적인 대답은 아니지만 각 파일 시스템 유형의 출력을 보면 tune2fs -l ...
다음과 같은 차이점을 알 수 있습니다.
파일 시스템 기능
외부 2EXT3파일 시스템 기능: ext_attr resize_inode dir_index 파일 유형 sparse_super
외부 4파일 시스템 기능: has_journal ext_attr resize_inode dir_index 파일 유형 need_recovery sparse_super
파일 시스템 기능: 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