EXT3: Nếu kích thước khối là 4K, tại sao ls -l hiển thị kích thước tệp dưới mức đó?


16

Nếu bạn chạy ls -l trên một tệp chứa một chữ cái, nó sẽ liệt kê kích thước 2B. Nếu hệ thống tệp của bạn ở trong các khối 4k, tôi nghĩ rằng nó làm tròn các tệp lên đến kích thước khối? Có phải vì ls -l thực sự đọc số byte từ inode? Trong trường hợp nào bạn có thể làm tròn để chặn câu trả lời so với câu trả lời về số byte thực tế trong các tiện ích GNU Kernel GNU?


2
Hãy nhớ rằng, ext4 giới thiệu một khái niệm về "đóng gói tệp nhỏ", trong đó một tệp nhỏ sẽ chiếm cùng một khối đĩa chiếm chỗ inode của nó (và do đó, tránh lãng phí các khối đĩa): lwn.net/Articles/469805
Oakad

Câu trả lời:


20

Tôi đoán bạn đã nhận được một chữ cái đó trong tệp có echo a > filehoặc vim file, có nghĩa là, bạn sẽ có chữ cái đó và một dòng mới bổ sung trong đó (hai ký tự, do đó là hai byte). ls -lhiển thị kích thước tệp theo byte, không phải khối (cụ thể hơn: chiều dài tệp ):

$ echo a > testfile
$ ls -l testfile
-rw-r--r-- 1 user user 2 Apr 28 22:08 testfile
$ cat -A testfile
a$

(lưu ý cat -Ahiển thị dòng mới dưới dạng $ký tự)

Ngược lại ls -l, dusẽ hiển thị kích thước thật chiếm trên đĩa:

$ du testfile
4

(thực tế, duhiển thị kích thước theo đơn vị 1kiB, vì vậy ở đây kích thước là 4 × 1024 byte = 4096 byte = 4 kiB, là kích thước khối trên hệ thống tệp này)

Để lshiển thị điều này, bạn sẽ phải sử dụng -stùy chọn thay vì / ngoài -l:

$ ls -ls testfile
4 -rw-r--r-- 1 user user 2 Apr 28 22:08 testfile

Cột đầu tiên là kích thước được phân bổ, một lần nữa theo đơn vị 1kiB. Cuối cùng có thể được thay đổi bằng cách chỉ định --block-size, ví dụ

$ ls -ls --block-size=1 testfile
4096 -rw-r--r-- 1 aw aw 2 Apr 28 22:08 testfile

3
Và, hơn nữa, thật tốt khi có hai thông tin. Các hệ thống tệp có thể thực hiện "nén đuôi" (sp?) (Sử dụng một khối được chia sẻ giữa các tệp ngắn), "sao chép khi ghi" và "bấm lỗ" ... làm cho kích thước tệp <-> không gian đĩa trở nên phức tạp.
Rmano

9

Tôi nghĩ rằng câu trả lời sâu sắc là như sau:

Chiều dài tập tin hợp lý và không gian đĩa chiếm dụng là những điều thực sự khác nhau.

Như các câu trả lời khác hiển thị, về nguyên tắc, một tệp được tạo bằng hai byte có độ dài hai byte (hiển thị theo ls -l) và chiếm 4 KiB (hiển thị theo duhoặc ls -ls).

Xem:

1& [:~/tmp] % echo -n A > test
1& [:~/tmp] % ls -l test
-rw-rw-r-- 1 romano romano 1 Apr 28 14:31 test
1& [:~/tmp] % du test
4 test

Ok, testcó chiều dài 1 và kích thước (trên đĩa) 4 KiB. Nhưng:

1& [:~/tmp] % truncate -s +8191 test
1& [:~/tmp] % ls -l test
-rw-rw-r-- 1 romano romano 8192 Apr 28 14:33 test
1& [:~/tmp] % du test
4   test

(lệnh đầu tiên thêm 8191 byte không vào test), bây giờ kiểm tra có độ dài 8192 nhưng vẫn chiếm 4 KiB trên đĩa (nó có "lỗ") trong đó (1).

Một số hệ thống tệp cũng có thể nén các tệp ngắn để chúng chiếm ít không gian hơn bằng cách chia sẻ các khối (xem ví dụ đóng gói đuôi ) và các tệp khác như btrfs sao chép trên ghi , do đó, mối quan hệ giữa một tệp, độ dài logic của nó và chiếm bao nhiêu dung lượng một đĩa là một phức tạp.

Chú thích:

(1) Nó không thực sự là một lỗ hổng , nó ở cuối ... nhưng vẫn vậy, nó hoạt động đến cuối ví dụ.


5

ls -lchỉ là một định dạng dài. ls -lsđược sử dụng để hiển thị kích thước khối.

Kiểm tra

echo "1" > 1.txt

bash-3.2$ ls -l 1.txt
-rw-rw-r-- 1 ramesh ramesh 2 Apr 28 15:15 1.txt

Như chúng ta có thể thấy kích thước của tệp được liệt kê là 2B. Tuy nhiên, nếu bạn cần kiểm tra kích thước khối, bạn cần chạy lệnh dưới đây.

bash-3.2$ ls -ls 1.txt
4 -rw-rw-r-- 1 ramesh ramesh 2 Apr 28 15:15 1.txt

4 ở trên hiển thị kích thước khối được sử dụng. Chúng tôi cũng có thể xác minh tương tự bằng cách sử dụng statlệnh.

bash-3.2$ stat 1.txt
  File: `1.txt'
  Size: 2               Blocks: 8          IO Block: 4096   regular file
Device: 805h/2053d      Inode: 48267720    Links: 1
Access: (0664/-rw-rw-r--)  Uid: (  505/  ramesh)   Gid: (  508/  ramesh)
Access: 2014-04-28 15:17:31.000000000 -0500
Modify: 2014-04-28 15:15:58.000000000 -0500
Change: 2014-04-28 15:15:58.000000000 -0500

Bây giờ câu hỏi đặt ra tại sao ls -lsliệt kê kích thước khối là 4 trong khi stathiển thị kích thước khối là 8. Lý do cho hành vi này được giải thích rõ ràng trong câu trả lời ở đây .

Nhiều đĩa có kích thước cung từ 512 byte, nghĩa là mọi dữ liệu đọc hoặc ghi trên đĩa đều chuyển toàn bộ cung 512 byte mỗi lần. Việc thiết kế các hệ thống tập tin trong đó một khu vực không được phân chia giữa các tập tin là điều khá tự nhiên (điều đó sẽ làm phức tạp thiết kế và làm giảm hiệu suất); do đó các hệ thống tệp có xu hướng sử dụng các đoạn 512 byte cho các tệp. Do đó, các tiện ích truyền thống như lsduchỉ ra kích thước theo đơn vị khối 512 byte.

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.