Thông tin tệp chi tiết thưa thớt trên Linux


11

Tôi có một tệp thưa thớt, trong đó chỉ có một số khối được phân bổ:

~% du -h --apparent-size example
100K    example
~% du -h example
52K     example

Tôi muốn biết khối nào của tập tin thực sự được phân bổ. Có một cuộc gọi hệ thống hoặc giao diện kernel có thể được sử dụng để có được một danh sách phân bổ hoặc các lỗ của tệp không?

Chỉ cần kiểm tra một chuỗi số không đủ dài (cách tiếp cận được sử dụng bởi GNU cp, rsync, v.v.) không hoạt động chính xác:

~% cp example example1  
~% du -h example1 
32K     example1

Nó phát hiện các chuỗi khác của số không thực sự được phân bổ.

Câu trả lời:


7

một câu hỏi tương tự về SO . Các câu trả lời chấp nhận hiện nay bởi @ephemient đề nghị sử dụng một ioctlgọi fiemapđó là tài liệu trong linux/Documentation/filesystems/fiemap.txt. Trích dẫn từ tập tin đó:

Bản đồ ioctl là một phương pháp hiệu quả cho không gian người dùng để có được ánh xạ phạm vi tệp. Thay vì ánh xạ theo từng khối (như bmap), fiemap trả về một danh sách các phạm vi.

Âm thanh như thế này là loại thông tin bạn đang tìm kiếm. Hỗ trợ bởi các hệ thống tập tin là một lần nữa tùy chọn:

Các hệ thống tệp muốn hỗ trợ fiemap phải thực hiện ->fiemap gọi lại trên inode_operationscấu trúc của chúng .

Hỗ trợ cho SEEK_DATAvà các SEEK_HOLEđối số lseekmà bạn đề cập từ Solaris đã được thêm vào Linux 3.1 theo trang hướng dẫn , vì vậy bạn cũng có thể sử dụng điều đó. Hiện tại nó có fiemap ioctlvẻ cũ hơn, do đó, nó có thể dễ mang theo hơn trên các phiên bản Linux khác nhau, trong khi đó lseekcó thể dễ di chuyển hơn trên các hệ điều hành nếu Solaris có cùng.


2
Bạn có thể nhận được thông tin FIEMAP này bằng cách sử dụng --fibmapcác hdparmtiện ích. Xem hướng dẫn.
Típ

2

Có một tập hợp các chương trình python được gọi là spzzyutils sử dụng SEEK_HOLESEEK_DATAđể xác định phần nào của tệp được biểu diễn dưới dạng lỗ và phần nào là dữ liệu. Cách sử dụng khá đơn giản. mksparsecó thể được sử dụng để tạo một tệp thưa thớt theo một số bố cục nhất định.

 $ echo hole,data,hole | mksparse --hole-size 4096 --data-size 4096 example
 $ du -sh example
 4.0K   example

Các sparsemapchương trình có thể được sử dụng để in các bố trí để stdout:

 $ sparsemap example
 HOLE 4096
 DATA 4096
 HOLE 4096

1

Nó phụ thuộc vào hệ thống tập tin. Tôi không tin rằng đó là một cuộc gọi, đó có thể là lý do tại sao nhiều công cụ không xử lý sao chép tốt các tệp thưa thớt. Chuỗi công cụ GNU sử dụng tìm kiếm các khối số không lớn vì điều đó cho phép chúng loại bỏ các khối được phân bổ không sử dụng. Nhiều công cụ sao chép sẽ chuyển đổi một tệp thưa thớt thành một tệp với tất cả các khối được phân bổ.

Bạn có thể sẽ phải mở inode và phân tích kết quả. Định dạng inode phụ thuộc vào hệ thống tập tin. Một số hệ thống tệp có thể có một phần dữ liệu của bạn trong chính nút đó.


1
Phải có một số cách bất khả tri để có thông tin này. Đọc trực tiếp từ inode chắc chắn không phải là một lựa chọn. Tôi đang tìm kiếm một cái gì đó giống như SEEK_DATASEEK_HOLEcác tham số cho lseek(), giống như có trong Solaris: opensolarisforum.org/man/man2/lseek.html
Juliano

@Juliano Nhìn vào tùy chọn lseek của Linux không có các tùy chọn này. Solaris hỗ trợ rất ít hệ thống tập tin, vì vậy nó sẽ tương đối dễ dàng để hỗ trợ. Linux hỗ trợ nhiều hệ thống tệp khác nhau, một số trong đó không hỗ trợ các tệp thưa thớt. Hỗ trợ cho SEEK_DATA / SEEK_HOLE sẽ áp dụng mã hỗ trợ cho tất cả các hệ thống tệp. Những phương pháp này có thể không làm những gì bạn mong đợi. Xem blog.sun.com/bonwick/entry/seek_hole_and_seek_data để biết thêm dữ liệu từ phía Mặt trời.
BillThor

1
Các hệ thống tệp không cần hỗ trợ bất cứ điều gì với giao diện lseek (), hạt nhân sẽ liệt kê các mô-đun hệ thống tệp hỗ trợ XEMK_DATA / SEEK_HOLE thông qua thuộc tính mô-đun. Đây là trong chính manpage và blog được liên kết: "Đối với các hệ thống tệp không cung cấp thông tin về các lỗ hổng, tệp sẽ được biểu diễn dưới dạng một toàn bộ vùng dữ liệu."
Juliano

@Juliano Vẫn yêu cầu mod kernel cũng như thay đổi đối với lseek. Theo mục blog, đây là chức năng khá mới tại Sun. Để nó hoạt động, mã hệ thống tập tin cũng cần phải sửa đổi. Nó chắc chắn sẽ yêu cầu thay đổi đối với tất cả các hệ thống tệp hỗ trợ các tệp thưa thớt để cung cấp các móc nhân.
BillThor
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.