Řídký soubor
Aktuální verze stránky ještě nebyla zkontrolována zkušenými přispěvateli a může se výrazně lišit od
verze recenzované 26. ledna 2017; kontroly vyžadují
7 úprav .
Řídký soubor je soubor, ve kterém jsou sekvence nula bajtů [1] nahrazeny informacemi o těchto sekvencích (seznam děr).
Hole ( anglicky hole ) - sekvence nula bajtů uvnitř souboru, nezapsaná na disk . Informace o dírách (posun od začátku souboru v bajtech a počet bajtů) jsou uloženy v metadatech FS .
Výhody a nevýhody
výhody:
nedostatky:
- režie pro práci se seznamem děr;
- fragmentace souborů, když jsou data často zapisována do děr;
- nemožnost zápisu dat do děr při nedostatku volného místa na disku;
- nemožnost použití jiných indikátorů děr, kromě nulových bajtů.
Podpora
Chcete-li implementovat podporu pro řídké soubory, potřebujete:
- schopnost zaznamenávat metadata do FS;
- podpora ze systémového a aplikačního softwaru.
Následující systémy souborů podporují řídké soubory: BTRFS , NILFS , ZFS , NTFS [2] , ext2 , ext3 , ext4 , XFS , JFS , ReiserFS , Reiser4 , UFS , Rock Ridge , UDF , ReFS , APFS , F2FS .
Následující software podporuje řídké soubory:
Aplikace
Řídké soubory se používají k ukládání kontejnerů , například:
Příkazy
Příkazy pro práci s řídkými soubory.
linux :
- vytvoření 200 GB řídkého souboru :
dd
if = /dev/zero
of = ./sparse-file
bs = 1 počet = 0 hledání = 200G
# nebo
zkrátit -s200G ./sparse-file
- převod běžného souboru na řídký (hledání děr a záznam jejich umístění (odsazení a délky) v metadatech souboru):
cp --sparse
= always ./simple-file ./sparse-file
ddrescue --sparse /dev/sdb ./sparse-file ./history.log
okna :
- vytvoření (ne řídkého) 200 GB souboru ( 214 748 364 800 bajtů ) (velikost je uvedena v bajtech):
fsutil file createnew some-file 214748364800
- nastavení příznaku "řídký" (nehledá díry uvnitř souboru):
fsutil sparse setflag some-file
- odstranění příznaku „řídký“:
fsutil sparse setflag some-file 0
- získání hodnoty příznaku "řídký":
fsutil sparse queryflag some-file
- označení oblasti souboru jako děr (odsazení a délka jsou uvedeny v bajtech):
fsutil sparse setrange some-file 0 214748364800
Funkce
- Čtení z díry vrací nulové bajty; není přístup na disk (předpokládá se, že mapy oblastí již byly načteny z disku z metadat souboru a jsou v paměti).
- Při zápisu do díry se spustí algoritmus, který vyhledá volné místo (volné bloky) na disku. Pokud jsou nalezeny bloky, data budou zapsána. Často nalezené bloky jsou umístěny na disku daleko od bloků s již zapsaným obsahem souboru; to vede k fragmentaci FS. Pokud dojde místo na disku, algoritmus nic nenajde a zápis se neprovede ( write() ohlásí nedostatek volného místa, a pokud byl soubor použit s mmap() , dojde k chybě segmentace ).
- Zápis do libovolného umístění řídkého souboru zpravidla vede k velké fragmentaci FS.
- Řídké soubory nejsou vždy zkopírovány správně; při kopírování souboru mohou být na disk zapsány prázdné bajty místo informací o dírách. Pro Linux se správné kopírování provádí příkazem cp s volbou --sparse . Existují dva způsoby, jak implementovat správné kopírování: 1) hledat oblasti vyplněné prázdnými bajty (dírami) a provádět seek() (místo zápisu hodnot null pomocí write() ); 2) získejte mapu umístění souboru na disku pomocí fibmap() .
- Chcete-li označit libovolnou oblast souboru jako díru , umožňuje systémové volání fallocate() s příznakem punch hole [3] („punch a hole“). Systémové volání nejen uvolní místo na disku, ale také provede příkaz TRIM na SSD pro bloky zadané oblasti.
- Vzhledem k tomu, že se adresování ve většině FS provádí pomocí bloků [4] , offset a velikost otvorů nemůže být libovolná, ale musí být násobkem velikosti bloku (zarovnáno s velikostí bloku). Velikost bloku je konstantní pro jeden oddíl . Je tedy nemožné udělat „díru“ v několika bytech; při takovém pokusu ovladač FS zapíše na disk prázdné bajty.
- Nástroje pro zobrazení velikosti souboru obvykle zobrazují skutečnou velikost souboru (v bajtech) a velikost obsazenou souborem na disku (v blocích FS [4] nebo bajtech). Řídký soubor může zabírat méně místa na disku.
- Všimněte si, že systémové volání fallocate() s příznakem 0 alokuje bloky pro soubor a označí je jako "vyplněné prázdnými bajty". To vám umožní vytvořit velký soubor téměř okamžitě bez zápisu null bajtů na disk. Rozdíl od řídkých souborů je rezervace bloků; bloky pro soubor jsou přiděleny okamžitě; při zápisu do bloku je odstraněn příznak „vyplněno nulovými bajty“; pokud na disku dojde volné místo, nedojde k chybě při zápisu do oblasti obsahující nulové bajty. V tomto případě se také volá příkaz TRIM pro SSD disky .
Poznámky
- ↑ Nulový bajt je bajt se všemi bity nastavenými na nulu (0, NUL nebo '\0' v C ).
- ↑ Řídké soubory v NTFS . Získáno 6. dubna 2011. Archivováno z originálu 15. března 2012. (neurčitý)
- ↑ FALLOC_FL_PUNCH_HOLE. Cm.muž 2 fallocate
- ↑ 1 2 Pro různé FS se „blok“ nazývá odlišně: „cluster“ ( anglicky cluster ) v NTFS , „blok“ ( anglicky block ) v ext4 .