Pertumbuhan monoton ukuran direktori / jumlah blok Linux

8

Di Linux, (mungkin sebagai fungsi dari ukuran blok filesystem), ketika saya membuat direktori dan statitu, ia mengembalikan ukuran 4096. Saya dapat membuat file di direktori ini, sampai suatu titik, tanpa meningkatkan ukuran yang dirasakan dari direktori (sebagaimana dilaporkan oleh stat).

Pada titik tertentu, ketika direktori diisi dengan banyak file, ukuran balon direktori (saya tidak berbicara tentang isi direktori, saya berbicara tentang blok yang dikonsumsi untuk mewakili direktori itu sendiri). Jika file dihapus, ukuran direktori tetap sama.

Ini contoh singkatnya:

[root@uxlabtest:/]$ mkdir test
[root@uxlabtest:/]$ stat test
  File: `test'
  Size: 4096            Blocks: 8          IO Block: 4096   directory
Device: fd00h/64768d    Inode: 1396685     Links: 2
Access: (0755/drwxr-xr-x)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2011-07-26 14:06:04.000000000 -0400
Modify: 2011-07-26 14:06:04.000000000 -0400
Change: 2011-07-26 14:06:04.000000000 -0400

Kemudian sentuh banyak file:

[root@uxlabtest:/]$ for i in `seq 1 10000`; do touch /test/$i; done
[root@uxlabtest:/]$ stat test
  File: `test'
  Size: 155648          Blocks: 312        IO Block: 4096   directory
Device: fd00h/64768d    Inode: 1396685     Links: 2
Access: (0755/drwxr-xr-x)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2011-07-26 14:06:04.000000000 -0400
Modify: 2011-07-26 14:06:56.000000000 -0400
Change: 2011-07-26 14:06:56.000000000 -0400

Kemudian hapus file:

[root@uxlabtest:/]$ rm -rf /test/*
[root@uxlabtest:/]$ stat test
  File: `test'
  Size: 155648          Blocks: 312        IO Block: 4096   directory
Device: fd00h/64768d    Inode: 1396685     Links: 2
Access: (0755/drwxr-xr-x)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2011-07-26 14:07:11.000000000 -0400
Modify: 2011-07-26 14:07:12.000000000 -0400
Change: 2011-07-26 14:07:12.000000000 -0400

Pertanyaan saya adalah:

  • Mengapa ukuran / jumlah blok suatu direktori meningkat secara monoton?
  • Apakah ini fungsi dari sistem file yang mendasarinya atau Linux VFS?
  • Apakah ukuran direktori dapat dikurangi tanpa menghapus dan menciptakan kembali direktori?
  • Poin bonus: Tunjukkan saya di kode sumber kernel tempat perilaku ini diterapkan.
loopforever
sumber
Tidak begitu yakin mengapa ini dipilih. Ini adalah pertanyaan yang sah dan dinyatakan dengan jelas dengan perintah yang diberikan untuk mereplikasi skenario. Jawaban atas pertanyaan-pertanyaan ini akan memuaskan pengetahuan masyarakat dan akan bermanfaat untuk didokumentasikan di suatu tempat.
loopforever

Jawaban:

9

Inilah jawaban yang benar untuk ext2 / ext3 / ext4. Jika mereka benar untuk sistem file lain tergantung pada implementasinya.

  1. user48838 menjawab yang ini dengan benar. Semakin banyak file mengkonsumsi lebih banyak data meta. Mereka dialokasikan dalam potongan 4k atau dalam ukuran lain yang ditentukan pada saat pembuatan sistem file
  2. Ya itu adalah fitur / masalah dari sistem file nyata
  3. Dalam sistem file ext3 ini tidak mungkin. Hanya dengan membuat ulang direktori (kosong)
  4. Kode sumber ada di sekitar sini dan di file terkait

Tapi kamu beruntung. Saat Anda membuat ulang jumlah file yang sama dengan yang sudah Anda hapus, ukuran direktori akan tetap sama. Hanya ketika Anda menambahkan lebih banyak file, itu akan meningkat.

mailq
sumber
1
Satu hal: "e2fsck -fD" harus memadatkan setiap direktori dalam sistem file ext2 / 3. Ini dapat melakukan apa yang diinginkan OP, meskipun saya curiga lambat, dan sistem file harus offline. Ini mungkin membutuhkan waktu lebih lama daripada menautkan setiap file dalam direktori baru dan menghapus yang lama.
akramer
4

Peningkatan blok yang Anda lihat disebabkan oleh bagaimana sistem file mengelola penyimpanan file dan informasi manajemen file terkait. Dalam situasi yang Anda gambarkan, itu akan tampak peningkatan 4K, sehingga setiap entri "baru" / "unik" ke dalam sistem file akan mencadangkan 4K, apakah ukuran data aktual mengisi seluruh 4K. Jika data terkait mengambil seluruh 4K, maka blok 4K lainnya dicadangkan dan diisi sesuai kebutuhan untuk menyimpan seluruh aliran data / urutan yang terkait.

Bergantung pada penghapusan "keras" versus "lunak" yang dikelola oleh sistem file, penghapusan mungkin tidak (biasanya bukan untuk fungsi "hapus") segera membebaskan blokir yang dipesan. Beberapa sistem file dapat membedakan berbagai jenis "penghapusan" dan menyediakan kemampuan manajemen blok penyimpanan yang sesuai.

Bagaimana manajemen penyimpanan didekati dan diimplementasikan berbeda dengan sistem file, sehingga pada OS yang mendukung sistem file multi-modular, OS biasanya hanya akan menyediakan "kait" untuk diintegrasikan dengan sistem file.

pengguna48838
sumber
1

Menambahkan beberapa komentar bertele-tele ke jawaban yang baik user48838:

Semuanya adalah file, termasuk direktori. Untuk menyimpan semua informasi file itu, Anda memerlukan ruang.

Itu juga akan valid untuk menunjukkan, katakanlah, '64B digunakan' untuk direktori kecil dan benar-benar menunjukkan jumlah ruang yang digunakan, tapi kami akan menggunakan banyak dari 4K pada disk, jadi itu adalah keputusan desain untuk hanya menunjukkan jumlah ruang yang digunakan.

Dari perspektif desain FS, mengapa Anda repot-repot melalui kesulitan menghitung apa yang digunakan? Tidak perlu. Dan kemudian Anda harus memindahkan entri untuk menghindari meninggalkan lubang ... ick.

Ketika penghapusan terjadi dan ukuran dir turun sehingga Anda bisa membebaskan blok, semua manajemen itu perlu terjadi sebelum Anda benar-benar bisa melakukannya. Mengapa repot-repot menyimpan beberapa KB? Kemungkinan Anda harus mengembangkannya nanti.

Ditinggalkan sebagai latihan untuk pembaca: Pikirkan mengapa direktori / lost + found Anda dibuat kosong tetapi membutuhkan 16K (setidaknya pada ext3).

MikeyB
sumber