GNU/Linux >> Znalost Linux >  >> Linux

Jak příkaz stat vypočítá bloky souboru?

stat nástroj příkazového řádku používá stat / fstat atd. funkce, které vracejí data v stat struktura. st_blocks člen stat struktura vrátí:

Celkový počet fyzických bloků o velikosti 512 bajtů skutečně přidělených na disku. Toto pole není definováno pro speciální blokové nebo znakové speciální soubory.

Takže pro váš příklad "E-mail" s velikostí 965 a počtem bloků 8 to znamená, že na disku je fyzicky alokováno 8*512=4096 bajtů. Důvod, proč to není 2, je ten, že souborový systém na disku nepřiděluje místo v jednotkách 512, ale evidentně je přiděluje v jednotkách 4096. (A jednotka alokace se může lišit v závislosti na velikosti souboru a sofistikovanosti souborového systému. Např. ZFS podporuje různé jednotky přidělení.)

Podobně pro příklad wxPython označuje, že na disku je fyzicky alokováno 7056*512 bajtů nebo 3612672 bajtů. Máte nápad.

Velikost IO bloku je „nápověda k ‚nejlepší‘ velikosti jednotky pro I/O operace“ – obvykle je to jednotka alokace na fyzickém disku. Nenechte se zmást mezi IO blokem a blokem stat používá k označení fyzické velikosti; bloky pro fyzickou velikost jsou vždy 512 bajtů.

Aktualizace na základě komentáře:

Jak jsem řekl, st_blocks je způsob, jakým OS udává, kolik místa zabírá soubor na disku. Skutečné jednotky alokace na disku jsou volbou systému souborů. Například ZFS může mít alokační bloky proměnné velikosti, dokonce i ve stejném souboru , kvůli způsobu, jakým přiděluje bloky:soubory začínají s malou velikostí bloku a velikost bloku se neustále zvyšuje, dokud nedosáhne určitého bodu. Pokud je soubor později zkrácen, pravděpodobně si zachová původní velikost bloku. Na základě historie souboru tedy může mít více možných velikostí bloků. Takže vzhledem k velikosti souboru není vždy zřejmé, proč má konkrétní fyzickou velikost.

Konkrétní příklad:na mém Solaris boxu se systémem souborů ZFS mohu vytvořit velmi krátký soubor:

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

OK, malý soubor, 2 bloky, využití fyzického disku je pro tento soubor 1024.

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

OK, nyní vidíme využití fyzického disku 32,5 kB a velikost IO bloku 32 kB. Pak jsem to zkopíroval do test3 a zkrátil toto test3 soubor v editoru:

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

No, tady je soubor se 4 bajty - stejně jako test - ale fyzicky využívá 32,5 kB kvůli způsobu, jakým souborový systém ZFS alokuje místo. Velikosti bloků se zvětšují, když se soubor zvětšuje, ale nesnižují se, když se soubor zmenšuje. (A ano, to může vést ke značnému plýtvání místem v závislosti na druzích souborů a operací se soubory, které provádíte na ZFS, což je důvod, proč vám umožňuje nastavit maximální velikost bloku na základě systému souborů a dynamicky ji měnit.)

Doufejme, že nyní můžete ocenit, že mezi velikostí souboru a využitím fyzického disku nemusí nutně existovat jednoduchý vztah. Ani z výše uvedeného není jasné, proč je potřeba 32,5 kB k uložení souboru o velikosti přesně 32 kB – zdá se, že ZFS obecně potřebuje dalších 512 bajtů pro další vlastní úložiště. Možná to úložiště používá pro kontrolní součty, počty referencí, stav transakcí - účetnictví systému souborů. Zahrnutím těchto doplňků do uvedené fyzické velikosti souboru se zdá, že se ZFS snaží neuvést uživatele v omyl ohledně fyzických nákladů na soubor. To neznamená, že je triviální provést zpětné inženýrství výpočtu bez znalosti podrobných podrobností o základní implementaci systému souborů.


Linux
  1. Jak používat příkaz Tar v Linuxu

  2. Jak funguje příkaz Exit na Unixovém terminálu?

  3. Jak funguje Tee Command?

  1. Jak příkaz Xdg-open ví, kterou aplikaci použít k otevření souboru?

  2. Jak připojit výstup do souboru?

  3. Jak získat fyzickou velikost souboru v Linuxu?

  1. Zkontrolujte stav souboru v systému Linux pomocí příkazu stat

  2. Jak mohu použít řádky souboru jako argumenty příkazu?

  3. Jak získat velikost tar.gz v (MB) souboru v pythonu