ukuran blok file - perbedaan antara stat dan ls


9

Saya perhatikan ketika saya melakukan:

ls -ls file

Ini memberikan jumlah blok, katakan 8 blok.

Ketika saya melakukannya:

stat file

Saya perhatikan bahwa jumlah blok adalah 16, dua kali jumlah yang diberikan oleh ls.

Ukuran blok pada sistem file saya adalah 4096. Saya belajar bahwa unit sewenang-wenang untuk blok yang digunakan oleh ls adalah 1024. Apakah benar untuk mengatakan bahwa stat menggunakan unit sewenang-wenang 512 byte ketika melaporkan blok?

Jika demikian, apakah ada alasan ketidakkonsistenan?

Saya menjalankan Ubuntu 11.10 pada sistem file ext4.

Jawaban:


9

Banyak disk memiliki ukuran sektor 512 byte, yang berarti bahwa setiap membaca atau menulis pada disk mentransfer sektor keseluruhan 512-byte sekaligus. Adalah wajar untuk merancang sistem file di mana suatu sektor tidak terbagi antara file (yang akan mempersulit desain dan merusak kinerja); oleh karena itu sistem file cenderung menggunakan potongan 512-byte untuk file. Oleh karena itu utilitas tradisional seperti lsdan dumenunjukkan ukuran dalam unit potongan 512-byte.

Bagi manusia, unit 512-byte tidak terlalu berarti. 1kB adalah urutan besarnya yang sama dan jauh lebih bermakna. Blok filesystem (unit terkecil tempat file terbagi) sebenarnya sering terdiri dari beberapa sektor: 1kB, 2kB, dan 4kB adalah ukuran blok filesystem yang umum; jadi unit 512-byte tidak sangat dibenarkan oleh desain sistem file, dan tidak ada alasan lain selain tradisi untuk menggunakan unit 512-byte di luar driver disk sama sekali.

Jadi, Anda memiliki tradisi yang tidak memiliki banyak manfaat, dan ada konvensi yang lebih mudah dibaca. Agak seperti oktal dan heksadesimal: tidak ada yang benar dan yang salah, mereka berbeda cara menulis angka yang sama.

Banyak alat memiliki opsi untuk memilih unit tampilan: ls --block-size=512untuk GNU ls, pengaturan POSIXLY_CORRECT=1di lingkungan untuk GNU dfdan GNU duuntuk mendapatkan unit 512-byte (atau meneruskan -kmemaksa unit 1kB). Apa yang statdiekspos perintah dalam GNU coreutils sebagai "ukuran blok" ( %Bnilai) adalah nilai yang bergantung pada OS dari antarmuka internal; tergantung pada OS, itu mungkin atau mungkin tidak terkait dengan ukuran yang digunakan oleh sistem file atau kode disk (biasanya tidak - lihat Perbedaan antara ukuran blok dan ukuran cluster ). Di Linux, nilainya 512, terlepas dari apa yang dilakukan oleh driver yang mendasarinya. Nilai %Btidak pernah berarti, itu hanya kekhasan bahwa itu ada sama sekali.


4

Setelah menggali ke dalam kode sumber dan standar POSIX, saya akan mengatakan jawaban oleh @ antje-m dan @Gilles sebagian besar benar.

Layak untuk mengutip komentar dari POSIX.1-2008 , sebagai ringkasan:

Penggunaan unit 512-byte adalah praktik historis dan memelihara kompatibilitas dengan ls dan utilitas lain dalam volume POSIX.1-2008 ini. Ini tidak mengamanatkan bahwa sistem file itu sendiri didasarkan pada blok 512-byte. Opsi -k ditambahkan sebagai ukuran kompromi. Disetujui oleh pengembang standar bahwa 512 byte adalah unit default terbaik karena konsistensi historis lengkapnya pada Sistem V (versus penggunaan campuran 512/1024-byte pada sistem BSD), dan bahwa opsi -k untuk beralih ke 1024- unit byte adalah kompromi yang baik. Pengguna yang lebih suka kuantitas 1024-byte yang lebih logis dapat dengan mudah alias df ke df -k tanpa melanggar banyak skrip historis yang mengandalkan unit 512-byte.

Untuk ukuran blok di ls -s:

POSIX mengatakan bahwa ukuran blok default ditentukan oleh implementasi, kecuali jika -kopsi diberikan.

Ukuran blok default yang diterapkan GNU coreutils lsadalah didefinisikan dalam GNU gnulib: gnulib/lib/human.c

/* The default block size used for output.  This number may change in
   the future as disks get larger.  */
#ifndef DEFAULT_BLOCK_SIZE
# define DEFAULT_BLOCK_SIZE 1024
#endif

yang berasal dari komit lama:

commit 96e78d1f64d7c8d2acc5ad27dc3e73b96ae80585
Author: Jim Meyering <jim@meyering.net>
Date:   Mon Jun 29 15:23:04 1998 +0000

Pesan komit itu sendiri tidak mengatakan apa-apa tentang nomor 1024.

Dan perhatikan bahwa ukuran blok yang digunakan dudan dfjuga 1024, lshanya memilih untuk mengikutinya. Meskipun untuk dudan dfitu adalah konflik dengan standar POSIX (jadi di sini variabel lingkungan POSIXLY_CORRECTdatang). Ini sepertinya keputusan tim GNU, lihat halaman wikipedia POSIX tentang kontroversi ini.

Untuk perintah stat.

Ini bukan bagian dari standar POSIX, tetapi panggilan sistem . Namun unit untuk ukuran blok tidak terstandarisasi ( sys_stat.h ):stat

Unit untuk anggota st_blocks dari struktur stat tidak didefinisikan dalam POSIX.1-2008.

The statperintah hanya menampilkan informasi yang diberikan oleh statsystem call, dan menggunakan 512 ukuran blok dengan beberapa pengecualian (mereka non-Linux, misalnya HP-UX, IBM AIX dll melihat makro didefinisikan dalam gnulib/lib/stat-size.h).

Jadi angka 512 lebih merupakan pilihan historis dan konvensi Linux.

The GNU coreutils(maka lsperintah) bukan merupakan bagian dari kernel Linux (maka statpanggilan), mereka menargetkan aspek sistem yang berbeda, GNU coreutilslebih untuk manusia (mudah dibaca), dan kernel Linux untuk hardware abstrak (maka lebih dekat ke hardware).

Sunting: ukuran blok 4096 adalah ukuran "IO blok", ukuran blok fisik nyata kemungkinan masih 512 Byte seperti yang dijelaskan dalam pertanyaan ini .


1

statPerintah - perintah tersebut menggunakan pemblokiran fisik hard-disk. Pada dasarnya semua hard-disk sejak didirikan pada tahun 1956 telah menggunakan 512 byte blok. Namun, ini baru-baru ini mulai berubah dengan datangnya Format Lanjutan.

Saya menduga bahwa ls'1024byte-blocksize juga memiliki alasan historis. Mungkin dulunya sistem file memiliki ukuran 1024 atau digunakan untuk memberi Anda ukuran dalam kilobyte. Tetapi (setidaknya dengan GNU coreutils) Anda dapat menentukan ukuran blok dengan --block-size=opsi.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.