Cách đáng tin cậy để phát hiện ext2 hoặc ext3 hoặc ext4?


7

Tôi cần phát hiện loại hệ thống tệp từ chương trình C / C ++ bằng cách sử dụng siêu khối hệ thống tệp. Tuy nhiên, tôi không thấy nhiều sự khác biệt giữa các siêu khóa cho ext2 và ext4. Trường s_rev_levelgiống nhau (= 1), s_minor_rev_levelgiống nhau (= 0).

Tôi có thể kiểm tra một số tính năng từ s_feature_compat(và các trường tính năng khác) và thử định vị các tính năng không được ext2 hỗ trợ. Nhưng - người, định dạng một phân vùng, có thể vô hiệu hóa một số tính năng trên mục đích. Vì vậy, phương pháp này có thể phát hiện ext4, nhưng nó không thể phân biệt giữa ext2 và ext4 với các tính năng cụ thể của ext4 bị vô hiệu hóa.

Vì vậy, làm thế nào để làm điều đó?


2
Sự khác biệt giữa ext2 và ext4 là gì nếu mọi khác biệt đã bị vô hiệu hóa?
Hauke ​​Laging

Tôi đã kiểm tra mã nguồn để filetự hỏi nó làm gì, nhưng filehiện tại báo cáo một ext4hệ thống tập tin với tạp chí đã tắt ext2.
Graeme

@HaukeLaging - Tôi thấy quan điểm của bạn. Nhưng - một loạt các công cụ có thể làm điều đó, vì vậy tôi đã tự hỏi làm thế nào họ làm điều đó.
HEKTO

Câu trả lời:


6

Sau khi xem mã cho các tiện ích khác nhau và mã hạt nhân một thời gian, có vẻ như những gì @Hauke ​​đề xuất là đúng - liệu hệ thống tệp có ext2/ ext3/ ext4được xác định hoàn toàn bởi các tùy chọn được bật hay không.

Từ trang Wikipedia trên ext4:

Khả năng tương thích ngược

ext4 tương thích ngược với ext3 và ext2, cho phép gắn ext3 và ext2 thành ext4. Điều này sẽ cải thiện hiệu suất một chút, bởi vì một số tính năng mới của ext4 cũng có thể được sử dụng với ext3 và ext2, chẳng hạn như thuật toán phân bổ khối mới.

ext3 tương thích một phần với ext4. Nghĩa là, ext4 có thể được gắn dưới dạng ext3 (sử dụng "ext3" làm kiểu hệ thống tập tin khi gắn). Tuy nhiên, nếu phân vùng ext4 sử dụng phạm vi (một tính năng mới chính của ext4), thì khả năng gắn kết như ext3 sẽ bị mất.

Như hầu hết có lẽ đã biết, có sự tương thích tương tự giữa ext2ext3.

Sau khi xem blkidsử dụng để phân biệt các exthệ thống tập tin khác nhau , tôi có thể biến một ext4hệ thống tập tin thành một cái gì đó được công nhận là ext3(và từ đó đến ext2). Bạn sẽ có thể lặp lại điều này với:

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

Đầu blkidra đầu tiên là:

testfs: UUID="78f4475b-060a-445c-a5d2-0f45688cc954" SEC_TYPE="ext2" TYPE="ext4"

Thứ hai là:

testfs: UUID="78f4475b-060a-445c-a5d2-0f45688cc954" SEC_TYPE="ext2" TYPE="ext3"

Và cái cuối cùng:

testfs: UUID="78f4475b-060a-445c-a5d2-0f45688cc954" TYPE="ext2"

Lưu ý rằng tôi phải sử dụng một phiên bản mới e2fsprogshơn có sẵn trong bản phân phối của mình để lấy metadata_csumcờ. Lý do để thiết lập, sau đó xóa điều này là vì tôi không tìm thấy cách nào khác để ảnh hưởng đến EXT4_FEATURE_RO_COMPAT_GDT_CSUMcờ bên dưới . Cờ cơ bản cho metadata_csum( EXT4_FEATURE_RO_COMPAT_METADATA_CSUM) và EXT4_FEATURE_RO_COMPAT_GDT_CSUMloại trừ lẫn nhau. Cài đặt metadata_csumvô hiệu hóa EXT4_FEATURE_RO_COMPAT_GDT_CSUM, nhưng bỏ cài đặt metadata_csumkhông kích hoạt lại cái sau.

Kết luận

Thiếu kiến ​​thức sâu sắc về các phần bên trong hệ thống tập tin, có vẻ như:

  1. Nhật ký kiểm tra có nghĩa là một tính năng xác định của một hệ thống tập tin được tạo ra vì ext4bạn thực sự không cần phải vô hiệu hóa và thực tế là tôi đã quản lý đây thực sự là một lỗi e2fsprogs. Hoặc là,

  2. Tất cả các ext4tính năng luôn được thiết kế để bị vô hiệu hóa và vô hiệu hóa chúng làm cho hệ thống tập tin với tất cả ý định trở thành mục đích của một ext3hệ thống tập tin.

Dù mức độ tương thích cao giữa các hệ thống tập tin rõ ràng là một mục tiêu thiết kế, hãy so sánh điều này với ReiserFS và Reiser4 trong đó Reiser4 là một thiết kế lại hoàn chỉnh. Điều thực sự quan trọng là liệu các tính năng hiện tại có được hỗ trợ bởi trình điều khiển được sử dụng để gắn kết hệ thống hay không. Như các ghi chú bài viết Wikipedia các ext4lái xe có thể được sử dụng với ext3ext2cũng (trong thực tế có một tùy chọn hạt nhân luôn luôn sử dụng các ext4trình điều khiển và mương khác). Vô hiệu hóa các tính năng chỉ có nghĩa là các trình điều khiển trước đó sẽ không có vấn đề gì với hệ thống tệp và vì vậy không có lý do gì để ngăn chúng gắn hệ thống tệp.

khuyến nghị

Để phân biệt giữa các exthệ thống tập tin khác nhau trong một chương trình C, libblkiddường như là điều tốt nhất để sử dụng. Nó là một phần của util-linuxvà đây là những gì mountlệnh sử dụng để cố gắng xác định loại hệ thống tập tin. Tài liệu API ở đây .

Nếu bạn phải tự thực hiện kiểm tra, thì thử nghiệm các cờ tương tựlibblkid dường như là cách đúng đắn để đi. Mặc dù đáng chú ý là tập tin được liên kết không có đề cập đến EXT4_FEATURE_RO_COMPAT_METADATA_CSUMcờ dường như được thử nghiệm trong thực tế.

Nếu bạn thực sự muốn đi cả con lợn, thì việc xem xét tổng kiểm tra có thể là một cách chắc chắn để tìm kiếm nếu một hệ thống tập tin không có các cờ này là (hoặc có lẽ ) ext4.

Cập nhật

Thực sự dễ dàng hơn để đi theo hướng ngược lại và thúc đẩy một ext2hệ thống tập tin tới ext4:

truncate -s 100M test
mkfs.ext2 test
blkid test
tune2fs -O has_journal test
blkid test
tune2fs -O huge_file test
blkid test

Ba thông số 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"

Thực tế là ext3/ ext4tính năng có thể dễ dàng bằng cách kích hoạt trên một hệ thống tệp bắt đầu như ext2có lẽ là minh chứng tốt nhất cho thấy loại hệ thống tệp thực sự được xác định bởi các tính năng.


Kết luận AFAIK 2 là đúng: ext2 / ext3 / ext4 là các trình điều khiển chia sẻ một phần quan trọng trong mã của họ. Không có ba định dạng hệ thống tệp, nhưng các định dạng hệ thống tệp được xác định bởi sự kết hợp các tính năng. Hệ thống tập tin là ext4 nếu nó sử dụng một tính năng không có trong trình điều khiển ext3 và ext3 nếu nó không phải là ext4 nhưng sử dụng một tính năng không có trong trình điều khiển ext2.
Gilles 'SO- ngừng trở nên xấu xa'

1

Không phải là một câu trả lời trực tiếp nhưng khi nhìn vào đầu ra của tune2fs -l ...từng loại hệ thống tập tin cho thấy sự khác biệt sau đây.

Tính năng hệ thống tập tin

EXT2

Các tính năng của hệ thống tập tin: ext_attr resize_inode dir_index filetype spzzy_super

EXT3

Các tính năng của hệ thống tệp: has_journal ext_attr resize_inode dir_index filetype nhu cầu_recovery spzzy_super

EXT4

Các tính năng của hệ thống tệp: has_journal ext_attr resize_inode dir_index filetype cần_recovery mức độ flex_bg spzzy_super Large_file giant_file uninit_bg dir_nlink Extra_isize

Nhật ký thông số

EXT2

Hiển thị không có tham số cho nhật ký.

EXT3

Cho thấy điều này:

Journal inode:            8
EXT4

Cho thấy điều này:

Required extra isize:     28
Desired extra isize:      28
Journal inode:            8
First orphan inode:       1967934
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.