Tại sao kích thước của một thư mục luôn là 4096 byte trong unix?


26

Tôi chắc chắn một tệp thư mục có ít thông tin hơn 4096 byte. Tôi biết kích thước cung là 4096 byte. Nhưng các tập tin bình thường nhỏ hơn đó tồn tại.

Tại sao Unix dự trữ 4096 byte cho mỗi thư mục?

Câu trả lời:


30

Đó là kích thước ban đầu cần thiết để lưu trữ dữ liệu meta về các tệp có trong thư mục đó (bao gồm cả tên). Phân bổ ban đầu bằng với quy mô của một ngành, nhưng có thể tăng lên trên mức đó nếu cần thiết. Sau khi được phân bổ, không gian sẽ không được giải phóng nếu các tệp bị xóa, để giảm sự phân mảnh.

Ví dụ:

$ mkdir testdir
$ cd testdir
$ ls -ld .
drwxr-xr-x 2 matthew matthew 4096 2007-12-03 20:28 ./
$ for ((i=0; i<1000; i++)); do touch some_longish_file_name_$i; done
$ ls -ld .
drwxr-xr-x 2 matthew matthew 36864 2007-12-03 20:29 ./
$ rm some_longish_file_name_*
$ ls -ld .
drwxr-xr-x 2 matthew matthew 36864 2007-12-03 20:29 ./
$ cd ..
$ ls -ld testdir
drwxr-xr-x 2 matthew matthew 36864 2007-12-03 20:29 testdir/
$ rmdir testdir ; mkdir testdir
$ ls -ld testdir
drwxr-xr-x 2 matthew matthew 4096 2007-12-03 20:29 testdir/

nguồn


3
Cảm ơn phần "không gian không được giải phóng nếu các tập tin bị xóa". Tôi đã khôi phục một bản sao lưu và không chắc chắn tại sao hai thư mục giống hệt nhau có kích thước khác nhau.
Tomasz Zieliński

11

Đôi khi 4096 byte là đơn vị phân bổ nhỏ nhất cho một số hệ thống tập tin. Đó là lý do tại sao thư mục có 4096.

Điều tương tự áp dụng cho các tập tin. Mặc dù một số tệp có thể báo cáo ít hơn 4096, nhưng thực tế chúng đang lấy ít nhất 4096 dung lượng lưu trữ từ đĩa.


4
Yup, như Pablo nói. Kích thước bạn đang xem với tệp là kích thước nội dung tệp, không phải tệp trên kích thước đĩa. Kích thước trên đĩa của các tệp nhỏ đó thực sự là 4096, giống như thư mục vì nó chỉ có thể phân bổ không gian đĩa trong các khối có kích thước đó
Dan McGrath

1
Điều này không có gì để làm với câu hỏi.
harrymc

Điều này là không chính xác. Xem câu trả lời được chấp nhận.
Duncan X Simpson

Sai? Nó không phải là sự kết hợp của cả hai câu trả lời sao? 4096 là kích thước của trang, xem hệ thống phân trang bộ nhớ để biết thêm.
Harrichael

5

4096 được dành riêng để giảm phân mảnh, vì thường kích thước thực tế của siêu dữ liệu chứa sẽ dao động dựa trên nội dung thư mục. Nếu nó liên tục phát triển và thu hẹp (giả sử nó chứa các tệp nhật ký hoặc nội dung động) theo thời gian, nó có thể ảnh hưởng đến hiệu suất. Điều này có thể sẽ không xảy ra với một thư mục, nhưng trên toàn bộ hệ thống tệp, nó sẽ tăng lên nhanh chóng.


3

Nó phụ thuộc vào hệ thống tập tin. Trên ext2 / 3/4 nó "là" 4096. Trên reiserfs, nó có thể là 9608 (của tôi $HOME) 1032 ( /tmp) hoặc 48 (một số thư mục trong /tmp).

Theo mặc định, khối ext2 / 3/4 là 4096 - và tệp không thể mất ít hơn thế. Nếu tập tin nhỏ hơn thì phải mất cả một khối. Vì thật vô nghĩa khi hỏi về kích thước logic của thư mục và thông tin này có lẽ không có trên đĩa và nó phải báo cáo một cái gì đó nó báo cáo kích thước của khối lần số khối được lấy, tức là không gian vật lý đã được lấy.


Tôi chắc chắn kích thước tập tin cũng không được lưu trữ với các tập tin. Nó được tính toán khi có yêu cầu. Nhưng đối với các tệp, nó báo cáo actualkích thước tệp.
Lazer

1
Kích thước tệp được lưu trữ với inode. Để chắc chắn inode ext2 chứa kích thước tính bằng byte bên trong nó. Nếu không, sẽ không thể tìm thấy nơi tệp kết thúc \0là ký tự hợp pháp trong tệp nhị phân. Tái bút Có thể tạo ra FS không lưu trữ nó - nhưng không phải là ext familly (và có lẽ không phổ biến nào khác).
Maciej Piechotka
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.