GNU/Linux >> Znalost Linux >  >> Linux

Jak udělat soubor řídký?

Za 8 let se toho hodně změnilo.

Falokace

fallocate -d filename lze použít k děrování otvorů ve stávajících souborech. Z fallocate(1) manuálová stránka:

       -d, --dig-holes
              Detect and dig holes.  This makes the file sparse in-place,
              without using extra disk space.  The minimum size of the hole
              depends on filesystem I/O block size (usually 4096 bytes).
              Also, when using this option, --keep-size is implied.  If no
              range is specified by --offset and --length, then the entire
              file is analyzed for holes.

              You can think of this option as doing a "cp --sparse" and then
              renaming the destination file to the original, without the
              need for extra disk space.

              See --punch-hole for a list of supported filesystems.

(Ten seznam:)

              Supported for XFS (since Linux 2.6.38), ext4 (since Linux
              3.0), Btrfs (since Linux 3.7) and tmpfs (since Linux 3.5).

tmpfs být na tomto seznamu je ten, který považuji za nejzajímavější. Samotný souborový systém je dostatečně efektivní na to, aby spotřeboval pouze tolik paměti RAM, kolik potřebuje k uložení svého obsahu, ale vytváří obsah sparse může potenciálně tuto efektivitu ještě dále zvýšit.

GNU cp

Navíc někde na cestě GNU cp porozuměli řídkým souborům. Citace cp(1) manuálová stránka týkající se jeho výchozího režimu --sparse=auto :

řídké SOURCE soubory jsou detekovány hrubou heuristikou a odpovídající soubor DEST je také řídký.

Ale je tu také --sparse=always , který aktivuje ekvivalentní kopírování souborů fallocate -d dělá na místě:

Zadejte --sparse=always k vytvoření řídkého souboru DEST vždy, když soubor SOURCE obsahuje dostatečně dlouhou sekvenci nula bajtů.

Konečně jsem mohl vyřadit svůj tar cpSf - SOURCE | (cd DESTDIR && tar xpSf -) one-liner, což byl po 20 let můj šedovousý způsob kopírování řídkých souborů se zachováním jejich řídkosti.


Některé souborové systémy na Linuxu / UNIXu mají schopnost "prorazit díry" do existujícího souboru. Viz:

  • Příspěvek LKML o této funkci
  • Nejčastější dotazy ke zkrácení souborů UNIX (hledejte F_FREESP)

Není to příliš přenosné a nedělá se to stejným způsobem napříč; v tuto chvíli se domnívám, že IO knihovny Java pro to neposkytují rozhraní.

Pokud je k dispozici děrování, buď pomocí fcntl(F_FREESP) nebo prostřednictvím jakéhokoli jiného mechanismu by to mělo být výrazně rychlejší než smyčka kopírování/hledání.


Myslím, že by bylo lepší předem alokovat celý soubor a udržovat tabulku/BitSet stránek/sekcí, které jsou obsazené.

Pokud by byl soubor řídký, vedlo by to k fragmentaci těchto sekcí, pokud by byly někdy znovu použity. Možná úspora několika TB místa na disku nestojí za výkon vysoce fragmentovaného souboru.


Linux
  1. Jak vytvořit řídké soubory v Linuxu pomocí příkazu „dd“.

  2. Jak třídit soubor na místě

  3. Jak přimět ssh, aby se přihlásil jako správný uživatel?

  1. Jak vytvořit místní soubor tar vzdáleného adresáře

  2. vytvořit soubor protokolu

  3. Jak zařídím, aby `ls` zobrazoval velikosti souborů v megabajtech?

  1. Jak přejmenovat soubor v Linuxu?

  2. Jak vytvořit VPN

  3. Jak udělám, aby soubor NELZE upravovat?