GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana perintah stat menghitung blok file?

stat alat baris perintah menggunakan stat / fstat etc., yang mengembalikan data dalam stat struktur. st_blocks anggota stat pengembalian struktur:

Jumlah total blok fisik berukuran 512 byte sebenarnya dialokasikan pada disk. Kolom ini tidak ditentukan untuk blok khusus atau file khusus karakter.

Jadi untuk contoh "Email" Anda, dengan ukuran 965 dan jumlah blok 8, ini menunjukkan bahwa 8*512=4096 byte dialokasikan secara fisik pada disk. Alasan bukan 2 adalah karena sistem file pada disk tidak mengalokasikan ruang dalam unit 512, itu jelas mengalokasikannya dalam unit 4096. (Dan unit alokasi dapat bervariasi tergantung pada ukuran file dan kecanggihan sistem file. Misalnya ZFS mendukung yang berbeda unit alokasi.)

Demikian pula, untuk contoh wxPython, ini menunjukkan bahwa 7056*512 byte, atau 3612672 byte dialokasikan secara fisik pada disk. Anda mengerti.

Ukuran blok IO adalah "petunjuk untuk ukuran unit 'terbaik' untuk operasi I/O" - biasanya merupakan unit alokasi pada disk fisik. Jangan bingung antara blok IO dan blok yang stat gunakan untuk menunjukkan ukuran fisik; blok untuk ukuran fisik selalu 512 byte.

Perbarui berdasarkan komentar:

Seperti yang saya katakan, st_blocks adalah bagaimana OS menunjukkan berapa banyak ruang yang digunakan oleh file pada disk. Unit alokasi sebenarnya pada disk adalah pilihan sistem file. Misalnya, ZFS dapat memiliki blok alokasi dengan ukuran variabel, bahkan dalam file yang sama , karena caranya mengalokasikan blok:file mulai memiliki ukuran blok kecil, dan ukuran blok terus meningkat hingga mencapai titik tertentu. Jika file tersebut kemudian dipotong, itu mungkin akan mempertahankan ukuran blok yang lama. Jadi berdasarkan riwayat file, itu dapat memiliki beberapa kemungkinan ukuran blok. Jadi mengingat ukuran file, tidak selalu jelas mengapa file tersebut memiliki ukuran fisik tertentu.

Contoh konkrit:pada kotak Solaris saya, dengan sistem file ZFS, saya dapat membuat file yang sangat singkat:

$ echo foo > test
$ stat test
  Size: 4               Blocks: 2          IO Block: 512    regular file
(irrelevant details omitted)

Oke, file kecil, 2 blok, penggunaan disk fisik adalah 1024 untuk file ini.

$ dd if=/dev/zero of=test2 bs=8192 count=4
$ stat test2
  Size: 32768           Blocks: 65         IO Block: 32768  regular file

Oke, sekarang kita melihat penggunaan disk fisik sebesar 32,5K, dan ukuran blok IO sebesar 32K. Saya kemudian menyalinnya ke test3 dan memotong test3 ini file di editor:

$ cp test2 test3
$ joe -hex test3
$ stat test3
  Size: 4               Blocks: 65         IO Block: 32768  regular file

Nah sekarang, inilah file dengan 4 byte di dalamnya - seperti test - tetapi menggunakan 32,5K secara fisik pada disk, karena cara sistem file ZFS mengalokasikan ruang. Ukuran blok meningkat saat file semakin besar, tetapi tidak berkurang saat file semakin kecil. (Dan ya, ini dapat menyebabkan ruang terbuang yang substansial tergantung pada jenis file dan operasi file yang Anda lakukan di ZFS, oleh karena itu memungkinkan Anda untuk mengatur ukuran blok maksimum berdasarkan sistem per file, dan mengubahnya secara dinamis.)

Mudah-mudahan, sekarang Anda dapat menghargai bahwa tidak selalu ada hubungan sederhana antara ukuran file dan penggunaan disk fisik. Bahkan di atas tidak jelas mengapa 32,5K byte diperlukan untuk menyimpan file yang ukurannya persis 32K - tampaknya ZFS umumnya membutuhkan tambahan 512 byte untuk penyimpanan tambahannya sendiri. Mungkin menggunakan penyimpanan itu untuk checksum, jumlah referensi, status transaksi - pembukuan sistem file. Dengan menyertakan tambahan ini dalam ukuran file fisik yang ditunjukkan, sepertinya ZFS berusaha untuk tidak menyesatkan pengguna mengenai biaya fisik file tersebut. Itu tidak berarti merekayasa balik penghitungan tanpa mengetahui detail mendalam tentang implementasi sistem file yang mendasarinya bukanlah hal yang sepele.


Linux
  1. Periksa status file di Linux dengan perintah stat

  2. Bagaimana Perintah Keluar Bekerja Pada Terminal Unix?

  3. Bagaimana Cara Kerja Perintah Tee??

  1. Bagaimana Perintah Xdg-open Mengetahui Aplikasi Yang Digunakan Untuk Membuka File?

  2. Bagaimana cara menggunakan baris file sebagai argumen perintah?

  3. Bagaimana cara menambahkan output ke file?

  1. Cara Menggunakan Perintah Tar di Linux

  2. Bagaimana cara ACL menghitung izin efektif pada suatu file?

  3. Bagaimana cara mendapatkan ukuran fisik file di Linux?