dosya bloğu boyutu - stat ve ls arasındaki fark


9

Bunu yaptığımda şunu fark ettim:

ls -ls file

8 blok gibi blok sayımı sağlar.

Ben yaparken:

stat file

Blok sayısının 16, ls tarafından verilen sayının iki katı olduğunu fark ettim.

Dosya sistemimdeki blok boyutu 4096. Ben ls tarafından kullanılan bloklar için rasgele birim 1024 olduğunu öğrendim. Stat blokları bildirirken 512 bayt rasgele bir birim kullandığını söylemek doğru mu?

Eğer öyleyse, tutarsızlığın bir nedeni var mı?

Bir ext4 dosya sisteminde Ubuntu 11.10 kullanıyorum.

Yanıtlar:


9

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.

İnsanlar için 512 baytlık birimler çok anlamlı değildir. 1kB aynı büyüklük sırası ve çok daha anlamlı. Bir dosya sistemi bloğu (bir dosyanın bölündüğü en küçük birim) genellikle birkaç sektörden oluşur: 1kB, 2kB ve 4kB, ortak dosya sistemi blok boyutlarıdır; bu nedenle 512 baytlık birim, dosya sistemi tasarımı tarafından güçlü bir şekilde haklı gösterilmez ve bir disk sürücüsünün dışında 512 baytlık bir birim kullanma geleneğinden başka iyi bir neden yoktur.

Yani bunun için çok fazla şey yapmayan bir geleneğiniz ve devam eden daha okunabilir bir sözleşmeniz var. Biraz sekizli ve onaltılık gibi: biri doğru diğeri yanlış, aynı sayıları yazmanın farklı yolları.

Birçok aracın görüntü birimlerini seçme seçeneği vardır: ls --block-size=512GNU için, GNU ve GNU'nun 512 baytlık birimler elde etmesi için ortamın lsayarlanması (veya 1kB'lik birimlerin yürürlüğe girmesi). GNU coreutils içindeki komutun “blok boyutu” ( değer) olarak gösterdiği şey, dahili arayüzün işletim sistemine bağlı bir değeridir; işletim sistemine bağlı olarak, dosya sistemi veya disk kodu tarafından kullanılan bir boyutla ilişkili olabilir veya olmayabilir (genellikle böyle değildir - bkz. Blok boyutu ve küme boyutu arasındaki fark ). Linux'ta, temel sürücünün ne yaptığından bağımsız olarak değer 512'dir. Değeri asla buna hiç var olduğunu sadece bir cilvesi var, önemli.POSIXLY_CORRECT=1dfdu-kstat%B%B


4

Kaynak kodu ve POSIX standardını inceledikten sonra, @ antje-m ve @Gilles'in cevabının çoğunlukla doğru olduğunu söyleyebilirim.

Özet olarak POSIX.1-2008'deki yorumu alıntılamakta fayda var :

512 baytlık birimlerin kullanımı tarihsel bir uygulamadır ve bu POSIX.1-2008 birimindeki ls ve diğer yardımcı programlarla uyumluluğu korur. Bu, dosya sisteminin kendisinin 512 baytlık blokları temel almasını zorunlu kılmaz. Uzlaşma önlemi olarak -k seçeneği eklendi. Standart geliştiriciler tarafından, Sistem V'deki tam tarihsel tutarlılığı (BSD sistemlerinde karışık 512/1024 bayt kullanıma karşı) nedeniyle 512 baytın en iyi varsayılan birim olduğu ve 1024- bayt birimleri iyi bir uzlaşma oldu. Daha mantıklı 1024 bayt miktarını tercih eden kullanıcılar, 512 bayt birimlere dayanan birçok geçmiş komut dosyasını bozmadan df'den df -k'ye kolayca takma ad atabilir.

Blok boyutu için ls -s:

POSIX , seçenek verilmedikçe varsayılan blok boyutunun uygulama tanımlı olduğunu belirtir -k.

Uygulanan varsayılan blok boyutu GNU coreutils lsşu şekilde tanımlanır 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

eski bir taahhütten geliyor:

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

Taahhüt mesajının kendisi 1024 sayısı hakkında hiçbir şey söylemedi.

Ve blok boyutu kullanılan nota olduğunu duve dfaynı zamanda 1024, lssadece onlarla oluşur seçti. İçin olsa duve dfo POSIX standardına bunu bir çelişki olduğu (yani burada ortam değişkeni POSIXLY_CORRECTgeliyor). Bu GNU ekibinin bir kararı gibi görünüyor, bu tartışma hakkında POSIX wikipedia sayfasına bakınız .

Komuta için stat.

POSIX standardının bir parçası değildir, ancak sistem çağrısıdır . Ancak blok boyutu birimi standart değildir ( sys_stat.h ):stat

Stat yapısının st_blocks üyesi için birim POSIX.1-2008 içinde tanımlanmamıştır.

statKomut basitçe tarafından sağlanan bilgileri görüntüleyen statsistem çağırma ve birkaç istisna dışında 512 blok boyutuyla (bunlar Linux olmayan, örneğin HP-UX, IBM AIX vb makro tanımlanan bakınız gnulib/lib/stat-size.h).

512 sayısı daha tarihsel bir seçim ve bir Linux sözleşmesi.

GNU coreutils(Dolayısıyla lskomutu) Linux çekirdeği (dolayısıyla bir parçası değildir statçağrı), farklı sistem yönünü hedefliyorsanız GNU coreutilsdaha insana (daha kolay okumak için), ve soyut donanım için Linux çekirdeği (dolayısıyla daha yakın donanıma).

Düzenleme: 4096 blok boyutu "IO blok" boyutudur, gerçek fiziksel blok boyutu hala bu soruda açıklandığı gibi 512 Byte muhtemelen .


1

statKomutlar sabit diskin fiziksel blok boyu kullanır. Temel olarak 1956'da kuruluşundan bu yana tüm sabit disklerde 512 bayt blok kullanılmıştır. Ancak, bu son zamanlarda Gelişmiş Biçimin yaklaşmasıyla değişmeye başladı.

ls'1024byte-blocksize'nin tarihsel bir nedeni de olduğundan şüpheleniyorum . Belki bir zamanlar dosya sisteminin 1024 boyutunda bir blok boyutuna sahip olması yaygındı veya size kilobayt cinsinden boyut vermek için kullanıldı. Ancak (en azından ile GNU coreutils) --block-size=seçenekle blok boyutunu belirleyebilirsiniz .

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.