EXT3: Jika ukuran blok adalah 4K, mengapa ls-l menunjukkan ukuran file di bawah itu?

16

Jika Anda menjalankan ls-l pada file yang berisi satu huruf, ukurannya akan terdaftar sebagai 2B. Jika sistem file Anda dalam blok 4k, saya pikir itu membulatkan file hingga ukuran blok? Apakah karena ls-l sebenarnya membaca jumlah byte dari inode? Dalam keadaan apa Anda dibulatkan untuk memblokir jawaban vs jawaban jumlah byte aktual dalam Linux 2.6 Kernel GNU utils?

Gregg Leventhal
sumber
2
Perlu diketahui, bahwa ext4 memperkenalkan konsep "pengemasan file kecil", di mana sebuah file kecil akan menempati blok disk yang sama dengan inode-nya (dan dengan demikian, hindari pemborosan blok disk): lwn.net/Articles/469805
oakad

Jawaban:

20

Saya kira Anda memasukkan satu huruf ke dalam file dengan echo a > fileatau vim file, yang berarti, Anda akan memiliki huruf itu dan baris baru tambahan di dalamnya (dua karakter, jadi dua byte). ls -lmenunjukkan ukuran file dalam byte, bukan blok (lebih spesifik: panjang file ):

$ echo a > testfile
$ ls -l testfile
-rw-r--r-- 1 user user 2 Apr 28 22:08 testfile
$ cat -A testfile
a$

(catatan yang cat -Amenampilkan baris baru sebagai $karakter)

Berbeda dengan ls -l, duakan menunjukkan ukuran sebenarnya yang ditempati pada disk:

$ du testfile
4

(sebenarnya, dumenunjukkan ukuran dalam unit 1kiB, jadi di sini ukurannya 4 × 1024 byte = 4096 byte = 4 kiB, yang merupakan ukuran blok pada sistem file ini)

Untuk lsmenunjukkan ini, Anda harus menggunakan -sopsi alih-alih / selain -l:

$ ls -ls testfile
4 -rw-r--r-- 1 user user 2 Apr 28 22:08 testfile

Kolom pertama adalah ukuran yang dialokasikan, lagi dalam satuan 1kiB. Terakhir dapat diubah dengan menentukan --block-size, mis

$ ls -ls --block-size=1 testfile
4096 -rw-r--r-- 1 aw aw 2 Apr 28 22:08 testfile
Andreas Wiese
sumber
3
Dan, lebih dari itu, senang memiliki dua informasi. Filesystem dapat melakukan "tail compaction" (sp?) (Gunakan satu blok yang dibagi di antara file-file pendek), "copy on write" dan "hole punching" ... membuat ukuran file <-> hubungan ruang disk menjadi kompleks.
Rmano
9

Saya pikir jawabannya adalah sebagai berikut:

Panjang file logis dan ruang disk yang digunakan adalah hal yang sangat berbeda.

Seperti jawaban lain menunjukkan, pada prinsipnya file yang dibuat dengan dua byte memiliki panjang dua byte (show by ls -l) dan menempati 4 KiB (show by duatau ls -ls).

Lihat:

1& [:~/tmp] % echo -n A > test
1& [:~/tmp] % ls -l test
-rw-rw-r-- 1 romano romano 1 Apr 28 14:31 test
1& [:~/tmp] % du test
4 test

Ok, testmemiliki panjang 1 dan ukuran (pada disk) 4 KiB. Tapi:

1& [:~/tmp] % truncate -s +8191 test
1& [:~/tmp] % ls -l test
-rw-rw-r-- 1 romano romano 8192 Apr 28 14:33 test
1& [:~/tmp] % du test
4   test

(perintah pertama menambahkan 8191 byte nol ke test), sekarang tes memiliki panjang 8192 tetapi masih menempati 4 KiB pada disk (memiliki "lubang") di dalamnya (1).

Beberapa sistem file juga dapat memadatkan file pendek sehingga mereka menghabiskan lebih sedikit ruang dengan berbagi blok (lihat misalnya pengemasan ekor ) dan yang lain seperti btrf yang menyalin pada penulisan , sehingga hubungan antara file, panjang logisnya, dan berapa banyak ruang yang ditempati pada disk adalah disk yang kompleks.

Catatan kaki:

(1) Ini sebenarnya bukan lubang , itu pada akhirnya ... tapi tetap, itu bekerja sampai akhir contoh.

Rmano
sumber
5

ls -lhanya format panjang. ls -lsdigunakan untuk menampilkan ukuran blok.

Pengujian

echo "1" > 1.txt

bash-3.2$ ls -l 1.txt
-rw-rw-r-- 1 ramesh ramesh 2 Apr 28 15:15 1.txt

Seperti yang bisa kita lihat ukuran file tersebut terdaftar sebagai 2B. Namun, jika Anda perlu memeriksa ukuran blok, Anda harus menjalankan perintah di bawah ini.

bash-3.2$ ls -ls 1.txt
4 -rw-rw-r-- 1 ramesh ramesh 2 Apr 28 15:15 1.txt

4 di atas menampilkan ukuran blok yang digunakan. Kami juga dapat memverifikasi yang sama menggunakan statperintah.

bash-3.2$ stat 1.txt
  File: `1.txt'
  Size: 2               Blocks: 8          IO Block: 4096   regular file
Device: 805h/2053d      Inode: 48267720    Links: 1
Access: (0664/-rw-rw-r--)  Uid: (  505/  ramesh)   Gid: (  508/  ramesh)
Access: 2014-04-28 15:17:31.000000000 -0500
Modify: 2014-04-28 15:15:58.000000000 -0500
Change: 2014-04-28 15:15:58.000000000 -0500

Sekarang muncul pertanyaan mengapa ls -lsdaftar ukuran blok sebagai 4 sementara statmenampilkan ukuran blok sebagai 8. Alasan perilaku ini dijelaskan dengan jelas dalam jawaban di sini .

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 filesystem cenderung menggunakan potongan 512-byte untuk file. Oleh karena itu utilitas tradisional seperti lsdan dumenunjukkan ukuran dalam unit potongan 512-byte.

Ramesh
sumber