Câu hỏi Giới thiệu về kích thước tệp và mức sử dụng đĩa trong ext3


Tôi có một vài bản sao của một tập tin. Các tệp có 2390170KiB mỗi tệp, theo ls -lk và du --apparent-size -k.

Vấn đề là ở đó du -k báo cáo các kích thước khác nhau cho mỗi bản sao: 2389824, 2392512, 2392512 và 2390336.

Tôi hy vọng việc sử dụng đĩa nên là 2390172KiB (kích thước của số lượng minimun của khối (597543), nơi tập tin phù hợp.

Vì vậy, tại sao mỗi tệp có mức sử dụng đĩa khác nhau?

Tôi cũng đã thấy rằng một trong những bản sao sử dụng 2389824KiB, nhưng kích thước tập tin là 346KiB lớn hơn: 2390170. Làm thế nào điều này có ý nghĩa?

PD: Tất cả các tệp đều nằm trong cùng hệ thống tệp ext3. Kích thước khối hệ thống tập tin là 4096. Tất cả các tệp có cùng giá trị băm.

Cập nhật: Từ các ý kiến:

although the apparent size is usually smaller, it may be larger due to holes in ('sparse') files, internal fragmentation, indirect blocks, and the like

các tệp thưa thớt có thể là lý do vì việc sử dụng đĩa thấp hơn. Nhưng tôi không thấy cách phân mảnh nội bộ hoặc các khối gián tiếp có thể làm giảm mức sử dụng đĩa đối với tệp gốc. Kể từ khi tập tin là như nhau, việc sử dụng đĩa từ phân mảnh nội bộ và các khối gián tiếp nên được liên tục.

Tôi đã quan sát thấy rằng cp --sparse=always có thể tạo một tệp thưa thớt từ tệp không thưa thớt. cp --sparse=always kết quả trên một tệp sử dụng 2390336KiB cp --sparse=never kết quả trên một tệp sử dụng 2392512KiB

Vì vậy, tôi sẽ đoán rằng việc sử dụng 2389824KiB từ một trong các bản sao được gây ra từ một triển khai khác nhau của thuật toán thưa thớt ...

Các tập tin gốc được sao chép từ một cửa sổ máy thông qua sftp hoặc samba, và tôi nghĩ rằng các tập tin 2389824KiB là một bản sao của nó, nhưng tôi không nhớ làm thế nào tôi đã làm nó (tôi đoán rằng với cp, nhưng tôi không chắc chắn rồi).


3
2017-12-04 17:20


gốc




Các câu trả lời:


Từ man du:

- kích thước
                in kích thước rõ ràng, thay vì sử dụng đĩa; mặc dù                 kích thước rõ ràng thường nhỏ hơn, nó có thể lớn hơn do lỗ                 trong các tệp ('thưa thớt'), phân mảnh nội bộ, các khối gián tiếp,                 và những thứ tương tự

Từ info du:

'--apparent-size'
       In kích thước rõ ràng, thay vì sử dụng đĩa. Kích thước rõ ràng        của một tệp là số byte được báo cáo bởi wc -c thường xuyên        tệp hoặc nói chung, ls -l --block-size=1 hoặc là stat --format=%s. Ví dụ: một tệp chứa từ 'sở thú' với        không có dòng mới nào, tất nhiên, có kích thước rõ ràng là 3.        tập tin nhỏ có thể yêu cầu bất cứ nơi nào từ 0 đến 16 KiB hoặc nhiều đĩa        không gian, tùy thuộc vào loại và cấu hình của hệ thống tệp        mà tệp nằm ở đó. Tuy nhiên, một tệp thưa thớt được tạo bằng        lệnh này:

      dd bs=1 seek=2GiB if=/dev/null of=big

có kích thước rõ ràng là 2 GiB, nhưng trên hầu hết các hệ thống hiện đại, nó        thực sự sử dụng hầu như không có không gian đĩa.

[nhấn mạnh mỏ]


3
2017-12-05 01:55





Có hai thứ đang diễn ra ở đây - các tệp lớn hơn bạn mong đợi là do siêu dữ liệu lưu trữ hệ thống tệp đang được tính vào kích thước của tệp. Các tệp nhỏ hơn bạn mong đợi là do một tính năng UNIX được gọi là "tệp thưa thớt".

Tệp lớn hơn

Đối với ext2 / ext3, việc sử dụng trên đĩa của tệp bao gồm không gian được các cấu trúc hệ thống tệp sử dụng để theo dõi vị trí của các khối dữ liệu trên đĩa. Hãy xem cấu trúc inode Ext2 - inode là cấu trúc dữ liệu theo dõi quyền, kích thước, vv của tệp cũng như nơi các khối dữ liệu của nó nằm trên đĩa. Bản thân inode không được tính vào việc sử dụng (nó được preallocated khi tạo hệ thống tập tin), nhưng các khối gián tiếp là.

Phép tính

Vì vậy, tệp của bạn có kích thước 2390172kB chiếm 597543 khối dữ liệu, như bạn đã nói. Các vị trí của 12 trong số các khối được lưu trữ trong inode chính nó, vì vậy chúng được miễn phí. Vị trí thứ 13 được lưu trữ trong inode là cho một khối gián tiếp - một khối mới được phân bổ lưu trữ các vị trí của 1024 khối dữ liệu. Vì vậy, cho biết thêm 1 khối để các tập tin của bạn, và lá chúng tôi với 596507 khối.

Con trỏ vị trí thứ 14 trong inode là một khối gián tiếp gấp đôi - một khối được cấp phát có chứa không gian vị trí của 1024 khối gián tiếp. 596507/1024 ~ = 582,52, vì vậy chúng tôi cần 583 khối gián tiếp để chứa phần còn lại của khối dữ liệu, cộng với khối gián tiếp gấp đôi.

Vì thế:

    1 (indirect from inode)
+   1 (doubly-indirect from inode)
+ 583 (indirect from doubly-indirect)
-----
= 585
= 598128 - 597543

Và nó chiếm kích thước 2392512 (= 598128 * 4).

Tệp nhỏ hơn

Tôi nghi ngờ rằng các tệp nhỏ hơn (2389824kB) là các tệp thưa thớt, có nghĩa là một số khối không bao giờ được ghi vào và do đó không được cấp phát - các khối chưa phân bổ được định nghĩa là được lấp đầy bằng số không. Xem câu trả lời của Dennis Williamson để tham khảo. Các tệp thưa thớt có thể xảy ra nếu chương trình viết di chuyển con trỏ tập tin xung quanh và ghi vào các vị trí khác nhau trong tệp, thay vì ghi tệp thông qua từ đầu đến cuối. Để có ví dụ cực kỳ về tệp thưa thớt, hãy thử các cách sau:

du if=/dev/zero of=my_sparse_file bs=1000 count=1 seek=1000000

nếu bạn ls tập tin kết quả, kích thước rõ ràng sẽ là 1000001000. Tuy nhiên, vì chỉ 1000 byte được viết, chỉ có một khối dữ liệu được sử dụng, do đó chỉ có một khối dữ liệu được cấp phát. du sẽ báo cáo 12kB được sử dụng - một khối 4k cho dữ liệu, một khối cho khối gián tiếp hai lần và một cho một khối gián tiếp đơn lẻ mà khối gián tiếp gấp đôi trỏ tới con trỏ 976 của nó. Không có phần còn lại nào của các khối của tệp được phân bổ, cho dù dữ liệu hay siêu dữ liệu.

Một khi khối gián tiếp hai lần chạy ra ngoài, hệ thống tập tin bắt đầu sử dụng một khối gián tiếp ba lần. Tệp của bạn sẽ đạt kích thước hệ thống tệp ext3 tối đa có thể trước khi nó lấp đầy tệp đó.


1
2017-12-05 07:46