Thêm số rất dễ dàng. Vấn đề là, có nhiều số khác nhau để thêm.
Một tập tin sử dụng bao nhiêu dung lượng đĩa?
Ý tưởng cơ bản là một tệp chứa n byte sử dụng n byte không gian đĩa, cộng với một chút cho một số thông tin điều khiển: siêu dữ liệu của tệp (quyền, dấu thời gian, v.v.) và một chút chi phí cho thông tin mà hệ thống cần tìm nơi lưu trữ tập tin Tuy nhiên có nhiều biến chứng.
Biến chứng vi thể
Hãy nghĩ về mỗi tệp như một loạt sách trong thư viện. Các tệp nhỏ hơn chỉ chiếm một tập, nhưng các tệp lớn hơn bao gồm nhiều tập, như bách khoa toàn thư. Để có thể xác định vị trí các tập tin, có một danh mục thẻ tham chiếu mọi khối lượng. Mỗi tập có một chút chi phí do bìa. Nếu một tệp rất nhỏ, chi phí này tương đối lớn. Ngoài ra danh mục thẻ tự nó chiếm một số phòng.
Kỹ thuật hơn một chút, trong một hệ thống tập tin đơn giản điển hình, không gian được chia thành các khối . Một kích thước khối điển hình là 4KiB. Mỗi tệp chiếm một số nguyên khối. Trừ khi kích thước tệp là bội số của kích thước khối, khối cuối cùng chỉ được sử dụng một phần. Vì vậy, một tệp 1 byte và một tệp 4096 byte đều chiếm 1 khối, trong khi đó tệp 4097 byte chiếm hai khối. Bạn có thể quan sát điều này bằng du
lệnh: nếu hệ thống tệp của bạn có kích thước khối 4KiB, thì du
sẽ báo cáo 4KiB cho tệp 1 byte.
Nếu một tập tin quá lớn, sau đó khối cần có thêm chỉ để lưu trữ danh sách các khối tạo nên các tập tin (đây là những khối gián tiếp ; hệ thống tập tin phức tạp hơn có thể tối ưu hóa này theo hình thức mức độ ). Những người không hiển thị trong kích thước tệp như được báo cáo bởi ls -l
hoặc GNU du --apparent-size
; du
, báo cáo việc sử dụng đĩa trái ngược với kích thước, không tính đến chúng.
Một số hệ thống tệp cố gắng sử dụng lại không gian trống còn lại trong khối cuối cùng để đóng gói một số đuôi tệp trong cùng một khối . Một số hệ thống tệp (chẳng hạn như ext4 kể từ Linux 3.8 sử dụng 0 khối cho các tệp nhỏ (chỉ một vài byte) hoàn toàn phù hợp với inode.
Biến chứng vĩ mô
Nói chung, như đã thấy ở trên, tổng kích thước được báo cáo du
là tổng kích thước của các khối hoặc phạm vi được sử dụng bởi tệp.
Kích thước được báo cáo bởi du
có thể nhỏ hơn nếu tệp được nén. Theo truyền thống, các hệ thống Unix hỗ trợ một dạng nén thô: nếu một khối tệp chỉ chứa các byte rỗng, thì thay vì lưu trữ một khối các số 0, hệ thống tệp có thể bỏ qua khối đó hoàn toàn. Một tệp có các khối bị bỏ qua như thế này được gọi là tệp thưa . Các tệp thưa thớt không được tạo tự động khi một tệp chứa một chuỗi lớn byte rỗng, ứng dụng phải sắp xếp để tệp trở nên thưa thớt.
Một số hệ thống tập tin như btrfs và zfs hỗ trợ nén mục đích chung .
Biến chứng nâng cao
Hai tính năng chính của các hệ thống tệp rất hiện đại như zfs và btrfs làm cho mối quan hệ giữa kích thước tệp và việc sử dụng đĩa trở nên xa hơn đáng kể: ảnh chụp nhanh và sao chép.
Ảnh chụp nhanh là trạng thái đóng băng của hệ thống tệp tại một ngày nhất định. Các hệ thống tập tin hỗ trợ tính năng này có thể chứa nhiều ảnh chụp nhanh được chụp vào các ngày khác nhau. Những bức ảnh chụp nhanh này có chỗ, tất nhiên. Ở một thái cực, nếu bạn xóa tất cả các tệp khỏi phiên bản hoạt động của hệ thống tệp, hệ thống tệp sẽ không trống nếu có các ảnh chụp nhanh còn lại.
Bất kỳ tệp hoặc khối nào không thay đổi kể từ ảnh chụp nhanh hoặc giữa hai ảnh chụp nhanh đã được thực hiện tồn tại giống hệt nhau trong ảnh chụp nhanh và trong phiên bản hoạt động hoặc ảnh chụp nhanh khác. Điều này được thực hiện thông qua copy-on-write . Trong một số trường hợp cạnh, có thể việc xóa một tệp trên hệ thống tệp đầy đủ sẽ không thành công do không đủ dung lượng trống - vì việc xóa tệp đó sẽ yêu cầu tạo một bản sao của một khối trong thư mục và không còn chỗ cho một khối đó nữa.
Chống trùng lặp là một kỹ thuật tối ưu hóa lưu trữ bao gồm tránh lưu trữ các khối giống hệt nhau. Với dữ liệu điển hình, tìm kiếm các bản sao không phải lúc nào cũng đáng nỗ lực. Cả zfs và btrfs đều hỗ trợ chống trùng lặp như một tính năng tùy chọn.
Tại sao tổng số du
khác với tổng kích thước tệp?
Như chúng ta đã thấy ở trên, kích thước được báo cáo du
cho mỗi tệp thường là tổng kích thước của các khối hoặc phạm vi được sử dụng bởi tệp. Lưu ý rằng theo mặc định, ls -l
liệt kê các kích thước theo byte, nhưng du
liệt kê các kích thước theo KiB hoặc theo đơn vị 512 byte (cung) trên một số hệ thống truyền thống hơn ( du -k
buộc sử dụng kilobyte). Hầu hết các hiệp hội hiện đại đều hỗ trợ ls -lh
và du -h
sử dụng các số điện thoại có thể đọc được của con người bằng cách sử dụng các số K, M, G, v.v. (đối với KiB, MiB, GiB) khi thích hợp.
Khi bạn chạy du
trên một thư mục, nó tổng hợp việc sử dụng đĩa của tất cả các tệp trong cây thư mục, bao gồm cả các thư mục . Một thư mục chứa dữ liệu (tên của các tệp và một con trỏ tới vị trí siêu dữ liệu của tệp), vì vậy nó cần một chút dung lượng lưu trữ. Một thư mục nhỏ sẽ chiếm một khối, một thư mục lớn hơn sẽ yêu cầu nhiều khối hơn. Dung lượng lưu trữ được sử dụng bởi một thư mục đôi khi không chỉ phụ thuộc vào các tệp mà nó chứa mà còn theo thứ tự chúng được chèn và trong đó một số tệp bị xóa (với một số hệ thống tệp, điều này có thể để lại lỗ hổng - sự thỏa hiệp giữa không gian đĩa và hiệu năng ), nhưng sự khác biệt sẽ rất nhỏ (một khối bổ sung ở đây và đó). Khi bạn chạyls -ld /some/directory
, kích thước của thư mục được liệt kê. (Lưu ý rằng dòng tổng NNN của nhà mạng ở đầu ra từ ls -l
là một số không liên quan, đó là tổng kích thước trong các khối của các mục được liệt kê, được biểu thị bằng KiB hoặc các cung.)
Hãy ghi nhớ rằng du
bao gồm các file chấm mà ls
không hiển thị trừ khi bạn sử dụng -A
hoặc -a
tùy chọn.
Đôi khi du
báo cáo ít hơn số tiền dự kiến. Điều này xảy ra nếu có các liên kết cứng bên trong cây thư mục: chỉ du
đếm mỗi tệp một lần.
Trên một số hệ thống tệp như ZFS
trên Linux, du
không báo cáo toàn bộ không gian đĩa bị chiếm bởi các thuộc tính mở rộng của tệp.
Xin lưu ý rằng nếu có các điểm gắn kết trong một thư mục, du
cũng sẽ tính tất cả các tệp trên các điểm gắn kết này, trừ khi được cung cấp -x
tùy chọn. Vì vậy, nếu ví dụ bạn muốn tổng kích thước của các tệp trong hệ thống tệp gốc của bạn, hãy chạy du -x /
, không du /
.
Nếu một hệ thống tệp được gắn vào một thư mục không trống , các tệp trong thư mục đó sẽ bị ẩn bởi hệ thống tệp được gắn. Họ vẫn chiếm không gian của họ, nhưng du
sẽ không tìm thấy chúng.
Đã xóa các tập tin
Khi một tệp bị xóa , điều này chỉ xóa mục nhập thư mục, không nhất thiết phải là chính tệp đó. Hai điều kiện là cần thiết để thực sự xóa một tệp và do đó lấy lại không gian đĩa của nó:
- Số lượng liên kết của tệp phải giảm xuống 0: nếu một tệp có nhiều liên kết cứng, việc xóa một liên kết sẽ không ảnh hưởng đến các liên kết khác.
- Miễn là tệp được mở bởi một số quy trình, dữ liệu vẫn còn. Chỉ khi tất cả các quy trình đã đóng tệp thì tệp mới bị xóa. Đầu ra
fuser -m
hoặc lsof
trên một điểm gắn kết bao gồm các quy trình mở tệp trên hệ thống tệp đó, ngay cả khi tệp bị xóa.
- ngay cả khi không có quá trình nào mở tệp bị xóa, không gian của tệp có thể không được lấy lại nếu tệp đó là phụ trợ của
loop
thiết bị. losetup -a
(như root
) có thể cho bạn biết loop
thiết bị nào hiện đang được thiết lập và trên tệp nào. Thiết bị lặp phải được hủy (với losetup -d
) trước khi có thể lấy lại không gian đĩa.
Nếu bạn xóa một tệp trong một số trình quản lý tệp hoặc môi trường GUI, nó có thể được đặt vào vùng rác nơi có thể xóa được. Miễn là tập tin có thể được phục hồi, không gian của nó vẫn được sử dụng.
Những con số này từ df
chính xác là gì?
Một hệ thống tập tin điển hình chứa:
- Các khối chứa dữ liệu tệp (bao gồm thư mục) và một số siêu dữ liệu (bao gồm các khối gián tiếp và các thuộc tính mở rộng trên một số hệ thống tệp).
- Khối miễn phí.
- Các khối được dành riêng cho người dùng root.
- superblocks và thông tin kiểm soát khác.
- Nút
- Một tạp chí
Chỉ có loại đầu tiên được báo cáo bởi du
. Khi nói đến df
, những gì được đưa vào trong sử dụng, sử dụng các cột và các cột tổng số phụ thuộc vào hệ thống tập tin (tất nhiên là các khối được sử dụng (bao gồm cả các khối gián tiếp) luôn ở trong cột được sử dụng và các khối không được sử dụng luôn ở trong cột có sẵn).
Các hệ thống tập tin trong ext2 / ext3 / ext4 dành 5% dung lượng cho người dùng root. Điều này rất hữu ích trên hệ thống tập tin gốc, để giữ cho hệ thống hoạt động nếu nó đầy (đặc biệt là để ghi nhật ký và để quản trị viên hệ thống lưu trữ một chút dữ liệu trong khi khắc phục sự cố). Ngay cả đối với các phân vùng dữ liệu như /home
, việc giữ không gian dành riêng đó cũng hữu ích vì hệ thống tệp gần như đầy đủ dễ bị phân mảnh. Linux cố gắng tránh phân mảnh (làm chậm truy cập tệp, đặc biệt là trên các thiết bị cơ học xoay như đĩa cứng) bằng cách phân bổ trước nhiều khối liên tiếp khi tệp được ghi, nhưng nếu không có nhiều khối liên tiếp, thì không thể hoạt động .
Hệ thống tập tin truyền thống, lên đến và bao gồm ext4 nhưng không btrfs, đặt số cố định của các inode khi hệ thống tập tin được tạo ra. Điều này đơn giản hóa đáng kể thiết kế của hệ thống tập tin, nhưng có nhược điểm là số lượng nút cần phải được định kích thước chính xác: với quá nhiều nút, không gian bị lãng phí; với quá ít inodes, hệ thống tập tin có thể hết inodes trước khi hết dung lượng. Lệnh df -i
báo cáo có bao nhiêu nút đang được sử dụng và có bao nhiêu nút (hệ thống tệp trong đó khái niệm không áp dụng được có thể báo cáo 0).
Chạy tune2fs -l
trên ổ chứa hệ thống tệp ext2 / ext3 / ext4 báo cáo một số thống kê bao gồm tổng số và số lượng các nút và khối miễn phí.
Một tính năng khác có thể gây nhầm lẫn vấn đề là subvolume (được hỗ trợ trong btrfs và trong zfs dưới bộ dữ liệu tên ). Nhiều subvolume chia sẻ cùng một không gian, nhưng có gốc cây thư mục riêng.
Nếu một hệ thống tệp được gắn trên mạng (NFS, Samba, v.v.) và máy chủ xuất một phần của hệ thống tệp đó (ví dụ: máy chủ có /home
hệ thống tệp và xuất/home/bob
), thì df
trên máy khách sẽ phản ánh dữ liệu cho toàn bộ hệ thống tệp, không phải chỉ cho phần được xuất và gắn trên máy khách.
Cái gì đang sử dụng không gian trên đĩa của tôi?
Như chúng ta đã thấy ở trên, tổng kích thước được báo cáo df
không phải lúc nào cũng tính đến tất cả dữ liệu điều khiển của hệ thống tệp. Sử dụng các công cụ dành riêng cho hệ thống tệp để có được kích thước chính xác của hệ thống tệp nếu cần. Ví dụ: với ext2 / ext3 / ext4, hãy chạy tune2fs -l
và nhân kích thước khối với số khối.
Khi bạn tạo một hệ thống tập tin, nó thường sẽ lấp đầy không gian có sẵn trên phân vùng hoặc âm lượng kèm theo. Đôi khi bạn có thể kết thúc với một hệ thống tệp nhỏ hơn khi bạn di chuyển các hệ thống tệp xung quanh hoặc thay đổi kích thước khối lượng.
Trên Linux, lsblk
trình bày tổng quan đẹp về dung lượng lưu trữ có sẵn. Để biết thêm thông tin hoặc nếu bạn không có lsblk
, hãy sử dụng các công cụ phân vùng hoặc quản lý âm lượng chuyên dụng để kiểm tra xem bạn có phân vùng nào. Trên Linux, có của lvs
, vgs
, pvs
cho LVM , fdisk
cho truyền thống PC kiểu phân vùng ( “MBR”) (cũng như GPT trên hệ thống gần đây), gdisk
cho GPT phân vùng, disklabel
cho disklabels BSD, Parted , vv Dưới Linux, cat /proc/partitions
cung cấp cho một bản tóm tắt nhanh chóng. Các bản cài đặt thông thường có ít nhất hai phân vùng hoặc khối lượng được sử dụng bởi hệ điều hành: hệ thống tệp (đôi khi nhiều hơn) và khối lượng trao đổi .
Một số máy tính có phân vùng chứa BIOS hoặc phần mềm chẩn đoán khác. Máy tính có UEFI có phân vùng bootloader chuyên dụng.
Cuối cùng, lưu ý rằng hầu hết các chương trình máy tính sử dụng các đơn vị dựa trên quyền hạn 1024 = 2 10 (vì các lập trình viên thích nhị phân và quyền hạn 2). Vì vậy, 1 kB = 1024 B, 1 MB = 1048576 B, 1 GB = 1073741824, 1 TB = 1099511627776 B, chính thức, các đơn vị này được gọi là kibibyte KiB, mebibyte MiB, v.v. M hoặc MB, v.v. Mặt khác, các nhà sản xuất đĩa cứng sử dụng một cách có hệ thống số liệu (đơn vị dựa trên 1000). Vì vậy, ổ đĩa 1 TB chỉ có 931 GiB hoặc 0.904 TiB.
tune2fs
yêu cầu phải có quyền truy cập đọc vào thiết bị khối có chứa hệ thống tệp, nói chung yêu cầu phải là root vì điều đó cho phép bạn đọc nội dung của bất kỳ tệp nào.