GNU/Linux >> Znalost Linux >  >> Linux

proč je výstup `du` často tak odlišný od `du -b`

Porovnejte (například) du -bm do du -m .

-b nastaví --apparent-size --block-size=1 , ale pak m přepíše velikost bloku na 1M .

Podobné pro -bh oproti -h :-bh znamená --apparent-size --block-size=1 --human-readable a znovu h přepíše tuto velikost bloku.


Zdánlivá velikost je počet bajtů, které si vaše aplikace myslí, že jsou v souboru. Je to množství dat, které by bylo přeneseno po síti (nepočítaje hlavičky protokolů), pokud byste se rozhodli odeslat soubor přes FTP nebo HTTP. Je to také výsledek cat theFile | wc -c a množství adresového prostoru, který by soubor zabral, pokud byste to celé načetli pomocí mmap .

Využití disku je množství místa, které nelze použít pro něco jiného, ​​protože toto místo zabírá váš soubor.

Ve většině případů je zdánlivá velikost menší než využití disku, protože využití disku počítá plnou velikost posledního (částečného) bloku souboru a zdánlivá velikost počítá pouze data, která jsou v tomto posledním bloku. Zdánlivá velikost je však větší, když máte řídký soubor (řídké soubory se vytvářejí, když hledáte někde za koncem souboru a pak tam něco zapíšete - OS se neobtěžuje vytvářet spoustu bloků plných nul - - vytvoří blok pouze pro tu část souboru, do které jste se rozhodli zapisovat).


Příklad podrobnosti minimálního bloku

Pojďme si trochu zahrát, abychom viděli, co se děje.

mount říká mi, že jsem na oddílu ext4 připojeném na / .

Velikost jeho bloku najdu pomocí:

stat -fc %s .

což dává:

4096

Nyní vytvoříme několik souborů o velikosti 1 4095 4096 4097 :

#!/usr/bin/env bash
for size in 1 4095 4096 4097; do
  dd if=/dev/zero of=f bs=1 count="${size}" status=none
  echo "size     ${size}"
  echo "real     $(du --block-size=1 f)"
  echo "apparent $(du --block-size=1 --apparent-size f)"
  echo
done

a výsledky jsou:

size     1
real     4096   f
apparent 1      f

size     4095
real     4096   f
apparent 4095   f

size     4096
real     4096   f
apparent 4096   f

size     4097
real     8192   f
apparent 4097   f

Vidíme tedy, že cokoli nižší nebo rovné 4096 zabírá 4096 ve skutečnosti bajtů.

Poté, jakmile překročíme 4097 , jde až na 8192 což je 2 * 4096 .

Je tedy jasné, že disk vždy ukládá data na hranici bloku 4096 bajtů.

Co se stane s řídkými soubory?

Nezkoumal jsem, jaká je přesná reprezentace, ale je jasné, že --apparent bere to v úvahu.

To může vést k tomu, že zdánlivá velikost bude větší než skutečné využití disku.

Například:

dd seek=1G if=/dev/zero of=f bs=1 count=1 status=none
du --block-size=1 f
du --block-size=1 --apparent f

dává:

8192    f
1073741825      f

Související:Jak otestovat, zda je podporován řídký soubor

Co dělat, když chci uložit spoustu malých souborů?

Některé možnosti jsou:

  • použijte databázi místo souborového systému:Databáze vs úložiště souborového systému
  • použijte souborový systém, který podporuje dílčí přidělování bloků

Bibliografie:

  • https://serverfault.com/questions/565966/which-block-sizes-for-millions-of-small-files
  • https://askubuntu.com/questions/641900/how-file-system-block-size-works

Testováno v Ubuntu 16.04.


Linux
  1. Grep – Proč závorky ve vzoru Grep odstraňují proces Grep z výsledků PS?

  2. Jak zajistit, aby „datum“ vydalo čas z jiného časového pásma?

  3. Linux – sloupec Buffers ve výstupu zdarma?

  1. Proč Ls a Hexdump nesouhlasí s velikostí souboru?

  2. Jak zabránit `ls` v třídění výstupu?

  3. Proč je velikost adresáře v unixu vždy 4096 bajtů?

  1. Výstup z Ls má nové řádky, ale zobrazuje se na jednom řádku. Proč?

  2. Jak nastavit proměnnou rovnou výstupu z příkazu v Grub2?

  3. Jaký je sloupec buffers ve výstupu z free?