Jak vyčistit nevyužitý prostor nuly? (ext3, ext4)
Hledám něco chytřejšího než
cat /dev/zero > /mnt/X/big_zero ; sync; rm /mnt/X/big_zero
Stejně jako FSArchiver hledá "použitý prostor" a ignoruje nepoužívané, ale opačné stránky.
Účel: Chtěl bych komprimovat obrazy diskových oddílů, proto se důrazně doporučuje vyplnit nevyužitý prostor nulami.
Mimochodem. Pro btrfs: Vyčistit nevyužité místo nuly (btrfs)
Takový nástroj je zerofree
.
Z jeho popisu:
Zerofree najde nepřidělené nenulové bloky v souborovém systému ext2 nebo ext3 a vyplní je nuly. To je užitečné, pokud zařízení, na kterém je tento souborový systém umístěn, je bitová kopie disku. V tomto případě v závislosti na typu bitové kopie disku může být sekundární obslužný program schopen po spuštění zerofree zmenšit velikost bitové kopie disku. Zerofree vyžaduje, aby byl systém souborů odpojen nebo připojen pouze pro čtení.
Obvyklým způsobem, jak dosáhnout stejného výsledku (vynulování nepoužitých bloků), je spustit „dd“, vytvořit soubor plný nul, který zabírá celé volné místo na jednotce, a poté tento soubor smazat. To má mnoho nevýhod, které zerofree zmírňují:
- je to pomalé
- způsobí, že se obraz disku (dočasně) zvětší v maximálním rozsahu
- (dočasně) využívá veškeré volné místo na disku, takže jiné souběžné akce zápisu mohou selhat.
Program Zerofree byl napsán tak, aby byl spouštěn ze systémů GNU/Linux nainstalovaných jako hostující OS uvnitř virtuálního počítače. Pokud tomu tak není, tento balíček téměř určitě nepotřebujete.
Popis balíčku .deb nyní obsahuje následující odstavec, který by naznačoval, že to bude fungovat i s ext4.
Popis: nulové volné bloky ze souborových systémů ext2, ext3 a ext4 Zerofree najde nepřidělené bloky s nenulovou hodnotou v souborovém systému ext2, ext3 nebo ext4 a vyplní je nuly ...
Další aplikací tohoto nástroje je komprimovat obrazy disků, které jsou zálohou skutečného disku. Typickým příkladem je výpis SD karty v BeagleBone nebo Raspberry Pi. Po vynulování prázdných mezer lze záložní obrazy komprimovat efektivněji.
Shrnutí metod (jak je uvedeno v této otázce a jinde) pro vymazání nevyužitého prostoru na ext2/ext3/ext4:
e2fsck -E discard src_fs
zahodit nevyužité místo (vyžaduje e2fsprogs 1.42.2 nebo vyšší).zerofree src_fs
) explicitně zapisovat nuly přes nepoužívané bloky.e2image -rap src_fs dest_fs
pouze kopírovat používané bloky (nový souborový systém by měl být na jinak vynulovaném „disku“, vyžaduje e2fsprogs 1.42.9 nebo vyšší).fstrim /mnt/fs/
požádat souborový systém, aby zahodil nevyužité místo.cat /dev/zero > /mnt/fs/zeros; sync; rm /mnt/fs/zeros
(sfill
od secure-delete používá tuto techniku). Tato metoda je neefektivní, nedoporučuje ji Ted Ts'o (autor ext4), nemusí vynulovat určité věci a může zpomalit budoucí fsck
s.Pokud nebude souborový systém odpojen, získáte lepší výsledky než připojení. Vyřazování má tendenci být nejrychlejší metodou, když je třeba vynulovat mnoho dříve používaného prostoru, ale použití zerofree
po procesu vyřazení může někdy vynulovat trochu navíc (v závislosti na tom, jak je vyřazení implementováno na „disku“). .
Budete muset použít vhodný nástroj bitové kopie disku (například qemu-img convert src_image dst_image
) umožnit regeneraci vynulovaného prostoru a zmenšit soubor představující obraz.
K rozptýlení souboru lze použít jednu z následujících technik (takže spuštění nulového zastavení zabírá místo):
cp --sparse=always src_image dst_image
.fallocate -d src_image
(vyžaduje util-linux v2.25 nebo vyšší).V těchto dnech může být snazší použít tyto nástroje jako virt-sparify k provedení těchto kroků a více najednou.
zerofree
sfill
od secure-delete to může udělat a několik dalších souvisejících úloh.
např.
sfill -l -l -z /mnt/X
Zdá se, že existuje zdrojový strom, který se zdá být používán v projektu ArchLinux na githubu, který obsahuje zdroj pro sfill
, což je nástroj zahrnutý v balíčku Secure-Delete.
Je zde také kopie manuálové stránky sfill
:
Pokud máte e2fsprogs 1.42.9, můžete použít e2image
pro vytvoření obrazu oddílu bez volného místa na prvním místě, takže můžete vynechat krok nulování.
pokud se nechcete uchýlit k dalším nástrojům, měla by být tato metoda rychlejší než cat /dev/zero > /mnt/fs/zeros
:
dd if=/dev/zero of="/mnt/fs/filler" bs=10485760
dd if=/dev/zero of="/mnt/fs/filler1" bs=1
rm /mnt/fs/filler
rm /mnt/fs/filler1
Můžete použít sfill
. Je to lepší řešení pro tenké objemy.