Tại sao có nhiều cách khác nhau để đo mức độ sử dụng đĩa?


114

Khi tôi tổng hợp kích thước của các tập tin của mình, tôi nhận được một con số. Nếu tôi chạy du, tôi nhận được một con số khác. Nếu tôi chạy dutrên tất cả các tệp trên phân vùng của mình, nó không khớp với dfyêu cầu được sử dụng. Tại sao có nhiều số liệu khác nhau cho tổng kích thước tệp của tôi? Máy tính không thể thêm?

Nói về việc thêm: khi tôi thêm các cột Được sử dụng và các cột Có sẵn của dftôi, tôi không nhận được tổng số. Và tổng số đó nhỏ hơn kích thước phân vùng của tôi. Và nếu tôi thêm kích thước phân vùng của mình, tôi sẽ không nhận được kích thước đĩa của mình! Đưa cái gì?

Câu trả lời:


144

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 dulệnh: nếu hệ thống tệp của bạn có kích thước khối 4KiB, thì dusẽ 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 -lhoặ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 dulà 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 ducó 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ư btrfszfs 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 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ố dukhá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 ducho 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 -lliệt kê các kích thước theo byte, nhưng duliệ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 -kbuộc sử dụng kilobyte). Hầu hết các hiệp hội hiện đại đều hỗ trợ ls -lhdu -hsử 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 dutrê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 -llà 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 dubao gồm các file chấmlskhông hiển thị trừ khi bạn sử dụng -Ahoặc -atùy chọn.

Đôi khi dubá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ư ZFStrên Linux, dukhô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, ducũ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 -xtù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 dusẽ 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 -mhoặc lsoftrê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 loopthiết bị. losetup -a(như root) có thể cho bạn biết loopthiế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ừ dfchí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 -ibá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 -ltrê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ó /homehệ thống tệp và xuất/home/bob ), thì dftrê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 dfkhô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 -lvà 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, lsblktrì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, pvscho LVM , fdiskcho truyền thống PC kiểu phân vùng ( “MBR”) (cũng như GPT trên hệ thống gần đây), gdiskcho GPT phân vùng, disklabelcho disklabels BSD, Parted , vv Dưới Linux, cat /proc/partitionscung 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.


1
@Kiwy tune2fsyê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.
Gilles

21
Tôi biết rằng 'cảm ơn bạn' không được khuyến khích ở SE, nhưng Gilles bạn xứng đáng nhận được một 'Cảm ơn' rất lớn cho bài đăng tuyệt vời này.
dotancohen

1
Tôi nhớ đã nhìn thấy một danh mục thẻ khi tôi như 6. Tôi tự hỏi có bao nhiêu người sẽ không biết chúng là gì?
Izkata

1
@ illuminÉ Đó là Solaris quá tiên tiến đối với tôi, tôi không biết nó phù hợp ở cấp độ nào.
Gilles

1
du không chiếm các khối gián tiếp. Đó là sự khác biệt chính từ kích thước tập tin như được báo cáo bởi ls -l.
Stéphane Chazelas

4

Một bản tóm tắt ngắn về các biến chứng để tính kích thước tệp và dung lượng ổ đĩa:

  • Dung lượng mà tệp chiếm trên đĩa là một bội số của số khối mà nó mất so với kích thước của mỗi khối + số lượng nút in. Một tệp dài 1 byte sẽ mất ít nhất 1 khối, 1 inode và một mục nhập thư mục.

    Nhưng nó chỉ có thể mất 1 mục nhập thư mục bổ sung nếu tệp là một liên kết cứng đến tệp khác. Nó sẽ chỉ là một tham chiếu khác cho cùng một tập hợp các khối.

  • Kích thước của nội dung của tập tin. Đây là những gì lshiển thị.
  • Dung lượng đĩa trống không phải là kích thước của tệp lớn nhất bạn có thể vừa hoặc tổng của tất cả các kích thước nội dung tệp sẽ vừa với đĩa. Nó ở đâu đó ở giữa. Nó phụ thuộc vào số lượng tệp (chiếm inodes) kích thước khối và mức độ chặt chẽ của từng nội dung của các tệp.

Đây chỉ là sự trầy xước bề mặt của các hệ thống tập tin và nó được đơn giản hóa quá mức. Cũng nên nhớ rằng các hệ thống tập tin khác nhau hoạt động khác nhau.

statlà rất hữu ích trong việc phát hiện một số thông tin này. Dưới đây là một số ví dụ về cách sử dụng stat và những gì tốt cho: http://landoflinux.com/linux_stat_command_examples.html


1
Một tệp 1 byte thường sẽ có một khối chứ không phải 8. Tạo một liên kết cứng hoàn toàn không tạo ra một nút: một tệp là một nút cho dù có bao nhiêu liên kết đến tệp. Tạo một liên kết cứng chỉ yêu cầu không gian cho mục nhập thư mục.
Gilles

Cảm ơn đã sửa chữa, phải thừa nhận rằng trí nhớ của tôi lại: nghiên cứu ext2 theo chiều sâu bây giờ hơi mờ. Tôi đã theo dõi đầu ra của stat re: số khối - nó cảm thấy quá mức nhưng đó là những gì ở đó. Tôi sẽ sửa câu trả lời.
Pedro

1
Đó là bởi vì 1 khối ext2 = 8 khối stat, nếu hệ thống tệp ext2 sử dụng các khối 4kB: số lượng stat trong các khối 512 byte vì lý do lịch sử. Xem unix.stackexchange.com/questions/14409/ từ
Gilles

3

Tôi sẽ minh họa ở đây các trường hợp khác nhau gây ra dusự khác biệt df.

dfđếm các khối hệ thống tệp được phân bổ, dusử dụng thông tin kích thước của từng tệp. Một sự khác biệt có thể có nhiều nguyên nhân:

1) Các tệp không được liên kết (đã xóa) vẫn đang mở bằng ứng dụng. Thông tin tập tin bị thiếu, khối vẫn được phân bổ. lsof +aL1 <filesystem>sẽ giúp bạn xác định các quy trình. Hầu hết thời gian bạn phải tiêu diệt các tiến trình để giải phóng không gian (tùy thuộc vào quy trình, đôi khi tải lại cấu hình là đủ).

2) Tập tin bên dưới các điểm gắn kết bị ẩn dunhưng không df. debugfscó thể giúp bạn đọc hệ thống tập tin.

$ sudo debugfs 
debugfs 1.42.12 (29-Aug-2014)
debugfs:  open /dev/xxx    (the desired file system  device)
debugfs:  cd /boot
debugfs:  ls -l 
 1966081   40755 (2)      0      0    4096 26-May-2016 16:28 .
      2   40555 (2)      0      0    4096 11-May-2016 10:43 ..
 1974291  100644 (1)      0      0       0 26-May-2016 16:28 bob   <---<<< /boot/bob is hidden by /boot fs

3) Các tập tin thưa thớt trông lớn hơn thực tế. các khối không được phân bổ không được tính bởi dfnhưng kích thước tệp rõ ràng được tính theo du.

Lưu ý rằng liên kết cứng không lừa du


3

dfthường được sử dụng để xem hệ thống tập tin là gì, mỗi hệ thống đầy đủ và vị trí chúng được gắn kết. Rất hữu ích khi bạn hết dung lượng trong một hệ thống tệp và có thể muốn thay đổi mọi thứ xung quanh các hệ thống tệp hoặc mua một đĩa lớn hơn, v.v.

duhiển thị chi tiết về lượng lưu trữ tích lũy mà mỗi thư mục của một người đang tiêu thụ (giống như windirstattrong Windows). Tuyệt vời cho việc tìm kiếm nơi bạn đang chiếm dụng không gian khi cố gắng dọn dẹp tệp.

Ngoài những khác biệt nhỏ về số lượng được giải thích bởi những người khác, tôi nghĩ rằng dudfcác tiện ích phục vụ các mục đích rất khác nhau.

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.