Mengapa ada begitu banyak cara untuk mengukur penggunaan disk?

114

Ketika saya meringkas ukuran file saya, saya mendapatkan satu angka. Jika saya lari du, saya mendapat angka lain. Jika saya menjalankan dusemua file di partisi saya, itu tidak cocok dengan dfklaim apa yang digunakan. Mengapa ada begitu banyak angka berbeda untuk ukuran total file saya? Tidak bisakah komputer menambahkan?

Berbicara tentang menambahkan: ketika saya menambahkan kolom "Digunakan" dan "Tersedia" df, saya tidak mendapatkan angka total. Dan angka total itu lebih kecil dari ukuran partisi saya. Dan jika saya menambah ukuran partisi saya, saya tidak mendapatkan ukuran disk saya! Apa yang menyebabkannya?

Gilles
sumber

Jawaban:

144

Menambahkan angka itu mudah. Masalahnya adalah, ada banyak angka berbeda untuk ditambahkan.

Berapa banyak ruang disk yang digunakan file?

Ide dasarnya adalah bahwa file yang berisi n byte menggunakan n byte ruang disk, ditambah sedikit untuk beberapa informasi kontrol: metadata file (izin, cap waktu, dll.), Dan sedikit overhead untuk informasi yang dibutuhkan sistem untuk temukan di mana file tersebut disimpan. Namun ada banyak komplikasi.

Komplikasi mikroskopis

Pikirkan setiap file sebagai serangkaian buku di perpustakaan. File yang lebih kecil hanya satu volume, tetapi file yang lebih besar terdiri dari banyak volume, seperti ensiklopedia. Agar dapat menemukan file, ada katalog kartu yang merujuk setiap volume. Setiap volume memiliki sedikit overhead karena penutup. Jika file sangat kecil, overhead ini relatif besar. Juga katalog kartu itu sendiri memakan ruang.

Menjadi sedikit lebih teknis, dalam sistem file sederhana yang khas, ruang dibagi menjadi beberapa blok . Ukuran blok yang khas adalah 4KiB. Setiap file membutuhkan jumlah blok bilangan bulat. Kecuali ukuran file adalah kelipatan dari ukuran blok, blok terakhir hanya digunakan sebagian. Jadi file 1-byte dan file 4096-byte sama-sama memakan 1 blok, sedangkan file 4097-byte membutuhkan dua blok. Anda dapat mengamati ini dengan duperintah: jika filesystem Anda memiliki ukuran blok 4KiB, maka duakan melaporkan 4KiB untuk file 1-byte.

Jika file besar, maka blok tambahan diperlukan hanya untuk menyimpan daftar blok yang membentuk file (ini adalah blok tidak langsung ; sistem file yang lebih canggih dapat mengoptimalkan ini dalam bentuk luasan ). Itu tidak muncul dalam ukuran file seperti yang dilaporkan oleh ls -latau GNU du --apparent-size; du, yang melaporkan penggunaan disk sebagai lawan ukuran, tidak memperhitungkannya.

Beberapa sistem file mencoba untuk menggunakan kembali ruang kosong yang tersisa di blok terakhir untuk mengemas beberapa ekor file di blok yang sama . Beberapa sistem file (seperti ext4 sejak Linux 3.8 menggunakan 0 blok untuk file kecil (hanya beberapa byte) yang sepenuhnya sesuai dengan inode.

Komplikasi makroskopis

Secara umum, seperti yang terlihat di atas, ukuran total yang dilaporkan oleh duadalah jumlah dari ukuran blok atau luasan yang digunakan oleh file.

Ukuran yang dilaporkan oleh dumungkin lebih kecil jika file dikompresi. Sistem Unix secara tradisional mendukung bentuk kompresi kasar: jika blok file hanya berisi null byte, maka alih-alih menyimpan blok nol, sistem file dapat menghilangkan blok itu sama sekali. File dengan blok yang dihilangkan seperti ini disebut file jarang . File jarang tidak secara otomatis dibuat ketika file berisi serangkaian besar byte nol, aplikasi harus mengatur agar file menjadi jarang.

Beberapa sistem file seperti btrfs dan zfs mendukung kompresi tujuan umum .

Komplikasi lanjut

Dua fitur utama dari sistem file yang sangat modern seperti zfs dan btrfs membuat hubungan antara ukuran file dan penggunaan disk secara signifikan lebih jauh: snapshots dan deduplication.

Snapshots adalah keadaan beku dari sistem file pada tanggal tertentu. Sistem file yang mendukung fitur ini dapat berisi beberapa snapshot yang diambil pada tanggal yang berbeda. Snapshots ini mengambil ruang, tentu saja. Pada satu ekstrim, jika Anda menghapus semua file dari versi aktif filesystem, filesystem tidak akan menjadi kosong jika ada snapshot yang tersisa.

File atau blok apa pun yang belum berubah sejak snapshot, atau antara dua snapshot diambil, ada secara identik dalam snapshot dan dalam versi aktif atau snapshot lainnya. Ini diimplementasikan melalui copy-on-write . Dalam beberapa kasus tepi, mungkin menghapus file pada sistem file lengkap akan gagal karena ruang yang tersedia tidak mencukupi - karena menghapus file itu akan memerlukan membuat salinan blok di direktori, dan tidak ada lagi ruang untuk bahkan satu blok itu.

Deduplikasi adalah teknik optimisasi penyimpanan yang terdiri dari menghindari penyimpanan blok yang identik. Dengan data biasa, mencari duplikat tidak selalu sepadan dengan usaha. Baik zfs dan btrfs mendukung deduplikasi sebagai fitur opsional.

Mengapa total dari duberbeda dari jumlah ukuran file?

Seperti yang telah kita lihat di atas, ukuran yang dilaporkan oleh duuntuk setiap file biasanya adalah jumlah dari ukuran blok atau luasan yang digunakan oleh file. Perhatikan bahwa secara default, ls -ldaftar ukuran dalam byte, tetapi dudaftar ukuran dalam KiB, atau dalam unit 512-byte (sektor) pada beberapa sistem yang lebih tradisional ( du -kmemaksa penggunaan kilobyte). Sebagian besar persatuan modern mendukung ls -lhdan du -hmenggunakan angka yang “dapat dibaca oleh manusia” menggunakan K, M, G, dll. (Untuk KiB, MiB, GiB) sudah memadai.

Ketika Anda menjalankan dupada direktori, itu meringkas penggunaan disk semua file di pohon direktori, termasuk direktori itu sendiri. Direktori berisi data (nama file, dan penunjuk ke tempat metadata file), sehingga perlu sedikit ruang penyimpanan. Direktori kecil akan memakan satu blok, direktori yang lebih besar akan membutuhkan lebih banyak blok. Jumlah penyimpanan yang digunakan oleh suatu direktori kadang-kadang tergantung tidak hanya pada file yang dikandungnya tetapi juga urutan di mana mereka dimasukkan dan di mana beberapa file dihapus (dengan beberapa filesystem, ini dapat meninggalkan lubang - kompromi antara ruang disk dan kinerja ), tetapi perbedaannya akan kecil (blok tambahan di sana-sini). Ketika Anda berlarils -ld /some/directory, ukuran direktori terdaftar. (Perhatikan bahwa garis "total NNN" di bagian atas output dari ls -ladalah angka yang tidak terkait, ini adalah jumlah dari ukuran dalam blok item yang tercantum, dinyatakan dalam KiB atau sektor.)

Ingatlah bahwa itu dutermasuk file dot yang lstidak ditampilkan kecuali jika Anda menggunakan opsi -Aatau -a.

Terkadang dumelaporkan kurang dari jumlah yang diharapkan. Ini terjadi jika ada tautan keras di dalam pohon direktori: dumenghitung setiap file hanya sekali.

Pada beberapa sistem file seperti ZFSdi Linux, dutidak melaporkan ruang disk penuh ditempati oleh atribut file yang diperluas.

Berhati-hatilah bahwa jika ada mount point di bawah direktori, duakan menghitung semua file pada mount point ini juga, kecuali diberikan -xopsi. Jadi jika misalnya Anda menginginkan ukuran total file di sistem file root Anda, jalankan du -x /, bukan du /.

Jika sistem file di-mount ke direktori non-kosong , file-file di direktori tersebut disembunyikan oleh sistem file yang di-mount. Mereka masih menempati ruang mereka, tetapi dutidak akan menemukan mereka.

File yang dihapus

Ketika file dihapus , ini hanya menghapus entri direktori, belum tentu file itu sendiri. Dua kondisi diperlukan untuk benar-benar menghapus file dan dengan demikian merebut kembali ruang disknya:

  • Jumlah tautan file harus turun ke 0: jika file memiliki banyak tautan keras, menghapus satu tidak mempengaruhi yang lain.
  • Selama file dibuka oleh beberapa proses, data tetap ada. Hanya ketika semua proses telah menutup file adalah file dihapus. Output fuser -matau lsofpada titik mount termasuk proses yang memiliki file terbuka di sistem file itu, bahkan jika file tersebut dihapus.
  • bahkan jika tidak ada proses membuka file yang dihapus, ruang file mungkin tidak dapat direklamasi jika file itu adalah backend loopperangkat. losetup -a(as root) dapat memberi tahu Anda loopperangkat mana yang sedang disiapkan dan pada file apa. Perangkat loop harus dihancurkan (dengan losetup -d) sebelum ruang disk dapat direklamasi.

Jika Anda menghapus file di beberapa pengelola file atau lingkungan GUI, file itu dapat dimasukkan ke area tempat sampah di mana file itu dapat dihapus. Selama file tersebut dapat dihapus, ruangnya masih dikonsumsi.

Dari mana dftepatnya angka-angka ini ?

Sistem file tipikal berisi:

  • Blok yang berisi data file (termasuk direktori) dan beberapa metadata (termasuk blok tidak langsung, dan atribut yang diperluas pada beberapa sistem file).
  • Blok gratis.
  • Blok yang disediakan untuk pengguna root.
  • kunci superblok dan informasi kontrol lainnya.
  • Inode
  • Sebuah jurnal

Hanya jenis pertama yang dilaporkan oleh du. Ketika datang ke df, apa yang masuk ke kolom "bekas", "tersedia" dan total tergantung pada sistem file (tentu saja blok yang digunakan (termasuk yang tidak langsung) selalu ada di kolom "bekas", dan blok yang tidak digunakan selalu ada di " tersedia ”kolom).

Filesystem di ext2 / ext3 / ext4 cadangan 5% dari ruang untuk pengguna root. Ini berguna pada sistem file root, untuk menjaga sistem berjalan jika terisi (khususnya untuk logging, dan untuk membiarkan administrator sistem menyimpan sedikit data sambil memperbaiki masalah). Bahkan untuk partisi data seperti itu /home, menjaga ruang yang dipesan itu berguna karena sistem file yang hampir penuh rentan terhadap fragmentasi. Linux mencoba menghindari fragmentasi (yang memperlambat akses file, terutama pada perputaran perangkat mekanis seperti hard disk) dengan mengalokasikan banyak blok berturut-turut ketika file sedang ditulis, tetapi jika tidak ada banyak blok berturut-turut, itu tidak dapat berfungsi .

Filesystem tradisional, hingga dan termasuk ext4 tetapi bukan btrfs, cadangan sejumlah inode tetap ketika filesystem dibuat. Ini secara signifikan menyederhanakan desain sistem file, tetapi memiliki kelemahan bahwa jumlah inode harus berukuran dengan benar: dengan terlalu banyak inode, ruang menjadi terbuang; dengan terlalu sedikit inode, sistem file mungkin kehabisan inode sebelum kehabisan ruang. Perintah df -imelaporkan berapa banyak inode yang digunakan dan berapa banyak yang tersedia (sistem file di mana konsep ini tidak berlaku dapat melaporkan 0).

Berjalan tune2fs -lpada volume yang berisi filesystem ext2 / ext3 / ext4 melaporkan beberapa statistik termasuk jumlah total dan jumlah inode dan blok gratis.

Fitur lain yang dapat membingungkan materi adalah subvolume (didukung dalam btrfs , dan dalam zfs di bawah dataset nama ). Beberapa subvolume berbagi ruang yang sama, tetapi memiliki akar pohon direktori yang terpisah.

Jika sistem file di-mount melalui jaringan (NFS, Samba, dll.) Dan server mengekspor sebagian dari sistem file itu (misalnya server memiliki /homesistem file, dan ekspor/home/bob ), maka dfpada klien mencerminkan data untuk seluruh sistem file, bukan hanya untuk bagian yang diekspor dan dipasang pada klien.

Apa yang menggunakan ruang pada disk saya?

Seperti yang telah kita lihat di atas, ukuran total yang dilaporkan oleh dftidak selalu memperhitungkan semua data kontrol sistem file. Gunakan alat khusus sistem file untuk mendapatkan ukuran yang tepat dari sistem file jika diperlukan. Misalnya, dengan ext2 / ext3 / ext4, jalankan tune2fs -ldan kalikan ukuran blok dengan jumlah blok.

Ketika Anda membuat sistem file, itu biasanya mengisi ruang yang tersedia di partisi atau volume yang terlampir. Kadang-kadang Anda mungkin berakhir dengan sistem file yang lebih kecil ketika Anda telah memindahkan sistem file atau mengubah ukuran volume.

Di Linux, lsblkmenyajikan tinjauan umum yang bagus dari volume penyimpanan yang tersedia. Untuk informasi tambahan atau jika Anda tidak memiliki lsblk, gunakan manajemen volume khusus atau alat partisi untuk memeriksa partisi apa yang Anda miliki. Pada Linux, ada lvs, vgs, pvsuntuk LVM , fdiskuntuk tradisional PC-gaya ( “MBR”) partisi (serta GPT pada sistem baru), gdiskuntuk GPT partisi, disklabeluntuk disklabel BSD, Parted , dll Di Linux, cat /proc/partitionsmemberikan ringkasan cepat. Instalasi khas memiliki setidaknya dua partisi atau volume yang digunakan oleh sistem operasi: sistem file (kadang-kadang lebih), dan volume swap .

Beberapa komputer memiliki partisi yang berisi BIOS atau perangkat lunak diagnostik lainnya. Komputer dengan UEFI memiliki partisi bootloader khusus.

Akhirnya, perhatikan bahwa sebagian besar program komputer menggunakan unit berdasarkan kekuatan 1024 = 2 10 (karena programmer suka biner dan kekuatan 2). Jadi 1 kB = 1024 B, 1 MB = 1.048.576 B, 1 GB = 1073741824, 1 TB = 1099511627776 B, ... Secara resmi, unit ini dikenal sebagai kibibyte KiB, mebibyte MiB, dll, tapi sebagian besar perangkat lunak hanya melaporkan k atau kB, M atau MB, dll. Di sisi lain, produsen hard disk secara sistematis menggunakan metrik (unit berbasis 1000). Sehingga 1 TB drive hanya 931 GiB atau 0,904 TiB.

Gilles
sumber
1
@Kiwy tune2fsmengharuskan memiliki akses baca ke perangkat blok yang berisi sistem file, yang secara umum memerlukan root karena itu memungkinkan Anda membaca konten file apa pun.
Gilles
21
Saya tahu bahwa 'terima kasih' tidak disarankan di SE, tetapi Gilles Anda layak menerima 'Terima kasih' yang luar biasa untuk posting hebat ini.
dotancohen
1
Saya ingat melihat katalog kartu ketika saya berusia 6 tahun. Saya ingin tahu berapa banyak yang tidak tahu apa itu?
Izkata
1
@ illuminÉ Itu Solaris terlalu canggih bagi saya, saya tidak tahu pada tingkat apa itu cocok.
Gilles
1
du tidak memperhitungkan blok tidak langsung. Itulah perbedaan utama dari ukuran file seperti yang dilaporkan oleh ls -l.
Stéphane Chazelas
4

Ringkasan singkat komplikasi untuk menghitung ukuran file dan ruang disk:

  • Ruang file yang digunakan pada disk adalah pengganda dari jumlah blok yang dibutuhkan terhadap ukuran setiap blok + jumlah inode yang dibutuhkan. File panjang 1 byte akan membutuhkan setidaknya 1 blok, 1 inode, dan satu entri direktori.

    Tetapi ini hanya membutuhkan 1 entri direktori tambahan jika file tersebut merupakan tautan keras ke file lain. Ini akan menjadi referensi lain untuk set blok yang sama.

  • Ukuran isi file. Ini yang lsditampilkan.
  • Ruang disk kosong bukan ukuran file terbesar yang dapat Anda masukkan atau jumlah semua ukuran konten file yang sesuai dengan disk. Di suatu tempat di antara keduanya. Itu tergantung pada jumlah file (mengambil inode) ukuran blok dan seberapa dekat masing-masing isi file mengisi blok sepenuhnya.

Ini hanya menggores permukaan sistem file dan terlalu disederhanakan. Juga ingat bahwa sistem file yang berbeda beroperasi secara berbeda.

statsangat membantu dalam mengetahui beberapa informasi ini. Berikut ini beberapa contoh cara menggunakan stat dan apa manfaatnya : http://landoflinux.com/linux_stat_command_examples.html

Pedro
sumber
1
File 1-byte biasanya akan mengambil satu blok, bukan 8. Membuat hard link sama sekali tidak membuat inode: satu file adalah satu inode tidak peduli berapa banyak tautan yang ada ke file tersebut. Membuat tautan keras hanya membutuhkan ruang untuk entri direktori.
Gilles
Terima kasih atas koreksinya, diakui ingatan saya kembali: mempelajari ext2 secara mendalam sekarang sedikit kabur. Saya mengikuti output stat re: jumlah blok - memang terasa berlebihan tapi itulah yang ada. Saya akan memperbaiki jawabannya.
Pedro
1
Itu karena 1 blok ext2 = 8 blok stat, jika filesystem ext2 menggunakan blok 4kB: stat dihitung dalam blok 512-byte karena alasan historis. Lihat unix.stackexchange.com/questions/14409/…
Gilles
3

Saya akan menggambarkan di sini berbagai kasus yang menyebabkan duberbeda df.

dfmenghitung blok sistem file yang dialokasikan, dugunakan informasi ukuran masing-masing file. Perbedaan dapat memiliki banyak penyebab:

1) File yang tidak ditautkan (dihapus) yang masih terbuka oleh aplikasi. Informasi file tidak ada, blok masih dialokasikan. lsof +aL1 <filesystem>akan membantu Anda mengidentifikasi proses. Sebagian besar waktu Anda harus mematikan proses untuk mengosongkan ruang (itu tergantung pada proses, kadang-kadang konfigurasi ulang cukup).

2) File di bawah titik mount disembunyikan dutetapi tidak df. debugfsdapat membantu Anda membaca sistem file.

$ 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) File yang jarang terlihat lebih besar dari kenyataan. blok yang tidak dialokasikan tidak dihitung oleh dftetapi ukuran file jelas dihitung oleh du.

Perhatikan bahwa tautan keras tidak bodoh du

Emmanuel
sumber
3

dfumumnya digunakan untuk melihat apa sistem file, seberapa lengkap masing-masing dan di mana mereka dipasang. Sangat berguna ketika Anda kehabisan ruang dalam sistem file, dan mungkin ingin mengubah hal-hal di antara sistem file, atau membeli disk yang lebih besar, dll.

dumemperlihatkan detail dari berapa banyak penyimpanan kumulatif yang dikonsumsi oleh masing-masing direktori seseorang (seperti windirstatdi Windows). Sangat bagus untuk menemukan di mana Anda memonopoli ruang ketika mencoba melakukan pembersihan file.

Selain perbedaan numerik kecil yang dijelaskan oleh orang lain, saya pikir dudan dfutilitas melayani tujuan yang sangat berbeda.

Jim Robertson
sumber