EXT3: Blok boyutu 4K ise, ls -l neden dosya boyutlarını bunun altında gösteriyor?


16

Bir harf içeren bir dosyada ls -l komutunu çalıştırırsanız, boyut olarak 2B olarak listelenir. Dosya sisteminiz 4k bloktaysa, dosyaları blok boyutuna kadar yuvarladığını düşündüm? Ls -l aslında bayt sayısını inode'dan okuduğu için mi? Hangi durumlarda Linux 2.6 Çekirdek GNU araçlarında yanıtları veya gerçek bayt sayısı yanıtlarını engellemek için yuvarlanırsınız?


2
Unutmayın, ext4 "küçük dosya paketleme" kavramını tanıtmaktadır, bunun üzerine küçük bir dosya inode kapladığı aynı disk bloğunu işgal edecektir (ve böylece disk bloklarını boşa harcamayın): lwn.net/Articles/469805
oakad

Yanıtlar:


20

Sanırım bu bir harfi echo a > fileveya ile birlikte dosyaya vim filealdınız, yani bu harf ve içinde ilave bir yeni satır olacak (iki karakter, dolayısıyla iki bayt). ls -ldosya boyutunu bloklar değil bayt cinsinden gösterir (daha spesifik olmak gerekirse: dosya uzunluğu ):

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

( cat -Ayeni satırları $karakter olarak gösteren not )

Aksine ls -l, dugerçek boyutunu gösterecektir diskte işgal:

$ du testfile
4

(aslında, duboyutu 1kiB biriminde gösterir, bu nedenle burada boyut 4 × 1024 bayt = 4096 bayt = 4 kiB, bu dosya sistemindeki blok boyutu)

Bunu lsgöstermek için -s, aşağıdakilere ek olarak / yerine seçeneği kullanmanız gerekir -l:

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

İlk sütun, yine 1 kiloluk birimler halinde tahsis edilen boyuttur. Son olarak --block-size, örn.

$ ls -ls --block-size=1 testfile
4096 -rw-r--r-- 1 aw aw 2 Apr 28 22:08 testfile

3
Üstelik iki bilgiye de sahip olmak güzel. Dosya sistemleri "tail compaction" (sp?) (Kısa dosyalar arasında paylaşılan bir blok kullanabilir), "yazarken kopyala" ve "delik delme" yapabilir ... dosya boyutu <-> disk alanı ilişkisini karmaşık hale getirir.
Rmano

9

Bence derin cevap şudur:

Mantıksal dosya uzunluğu ve kullanılan disk alanı gerçekten farklı şeylerdir.

Diğer cevapların gösterdiği gibi, prensip olarak iki bayt ile oluşturulan bir dosyanın uzunluğu iki bayt (göster ls -l) ve 4 KiB (göster duveya veya ls -ls) işgal eder .

Görmek:

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

Tamam, testuzunluk 1 ve boyut (diskte) 4 KiB var. Fakat:

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

(ilk komut 8191 sıfır bayt ekler test), şimdi testin uzunluğu 8192'dir, ancak yine de diskte 4 KiB işgal eder (bir "delik" vardır) (1).

Bazı dosya sistemleri, blokları paylaşarak daha az yer kaplayacak şekilde kısa dosyaları da sıkıştırabilir (örneğin kuyruk ambalajına bakın ) ve btrfs gibi diğerleri yazma üzerine kopyalar , böylece bir dosya, mantıksal uzunluğu ve ne kadar alan kapladığı bir disk karmaşık bir disktir.

Dipnotlar:

(1) Gerçekten bir delik değil , sonunda ... ama yine de, örneğin sonuna kadar çalışıyor.


5

ls -lsadece uzun bir biçimdir. ls -lsblok boyutunu görüntülemek için kullanılır.

Test yapmak

echo "1" > 1.txt

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

Gördüğümüz gibi dosyanın boyutu 2B olarak listeleniyor. Ancak, blok boyutunu kontrol etmeniz gerekiyorsa, aşağıdaki komutu çalıştırmanız gerekir.

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

Yukarıdaki 4 kullanılan blok boyutunu göstermektedir. Aynı şeyi statkomutu kullanarak da doğrulayabiliriz .

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

Şimdi soru üzerine doğar neden ls -lslisteleri 4'e kadar blok boyutu ise statgörüntüler bu davranışın nedeni açıkça cevap açıklanmıştır 8. olarak blok boyutu burada .

Birçok diskin sektör boyutu 512 bayttır, yani diskteki herhangi bir okuma veya yazma işlemi bir seferde tüm 512 bayt sektörü aktarır. Bir sektörün dosyalar arasında bölünmediği (tasarımı karmaşıklaştıracak ve performansa zarar verecek) dosya sistemleri tasarlamak oldukça doğaldır; bu nedenle dosya sistemleri dosyalar için 512 bayt yığın kullanma eğilimindedir. Gibi nedenle, geleneksel araçları lsve du512 baytlık parçalar birimleriyle boyutlarına işaret etmektedir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.