Sparsom fil
Den aktuelle version af siden er endnu ikke blevet gennemgået af erfarne bidragydere og kan afvige væsentligt fra den
version , der blev gennemgået den 26. januar 2017; checks kræver
7 redigeringer .
En sparse fil er en fil , hvor sekvenser på nul bytes [1] er erstattet med information om disse sekvenser (en liste over huller).
Hole ( engelsk hul ) - en sekvens af nul bytes inde i filen, ikke skrevet til disk . Information om huller (offset fra begyndelsen af filen i bytes og antal bytes) gemmes i FS metadata .
Fordele og ulemper
Fordele:
Fejl:
- overhead til at arbejde med en liste over huller;
- filfragmentering, når data ofte skrives til huller;
- umuligheden af at skrive data ind i huller i fravær af ledig diskplads;
- umuligheden af at bruge andre indikatorer for huller, bortset fra null-bytes.
Support
For at implementere understøttelse af sparsomme filer skal du:
- evnen til at registrere metadata i FS;
- support fra system- og applikationssoftware.
Følgende filsystemer understøtter sparsomme filer: BTRFS , NILFS , ZFS , NTFS [2] , ext2 , ext3 , ext4 , XFS , JFS , ReiserFS , Reiser4 , UFS , Rock Ridge , UDF , ReFS , APFS , F2FS .
Følgende software understøtter sparsomme filer:
Ansøgning
Sparse filer bruges til at opbevare containere , for eksempel:
Kommandoer
Kommandoer til at arbejde med sparsomme filer.
linux :
- oprettelse af en 200 GB sparsom fil :
dd
hvis = /dev/nul
af = ./sparse-fil
bs = 1 antal = 0 søgning = 200G
# eller
truncate -s200G ./sparse-file
- konvertering af en almindelig fil til en sparsom fil (søgning efter huller og registrering af deres placering (forskydninger og længder) i filens metadata):
cp --sparse
= altid ./simple-fil ./sparse-fil
- gemmer en diskkopi til en sparsom fil ved hjælp af ddrescue -værktøjet :
ddrescue --sparse /dev/sdb ./sparse-fil ./history.log
vinduer :
- oprettelse af en (ikke sparsom) 200 GB fil ( 214 748 364 800 bytes ) (størrelsen er angivet i bytes):
fsutil-fil opret ny nogle-fil 214748364800
- indstilling af "sparse" flag (søger ikke efter huller i filen):
fsutil sparse setflag nogle-fil
- fjernelse af "sparse" flag:
fsutil sparse setflag some-file 0
- få værdien af "sparse" flaget:
fsutil sparse queryflag nogle-fil
- markering af et filområde som huller (offset og længde er angivet i bytes):
fsutil sparse setrange nogle-fil 0 214748364800
Funktioner
- Læsning fra et hul returnerer null bytes; der er ingen diskadgang (det antages, at områdekort allerede er blevet læst fra disken fra filens metadata og er i hukommelsen).
- Når du skriver til et hul, startes en algoritme til at søge efter ledig plads (frie blokke) på disken. Hvis der findes blokke, vil dataene blive skrevet. Ofte fundne blokke er placeret på disken langt fra blokke med allerede skrevet filindhold; dette fører til fragmentering af FS. Hvis diskpladsen løber tør, vil algoritmen ikke finde noget, og skrivningen vil ikke blive udført ( write() vil rapportere mangel på ledig plads, og hvis filen blev brugt med mmap() , vil der opstå en segmenteringsfejl ).
- At skrive til en vilkårlig placering af en sparsom fil fører som regel til stor FS-fragmentering.
- Sparsomme filer kopieres ikke altid korrekt; Når du kopierer en fil, kan null-bytes skrives til disken i stedet for information om huller. For Linux udføres korrekt kopiering af cp -kommandoen med --sparse-indstillingen . Der er to måder at implementere korrekt kopiering på: 1) kig efter områder fyldt med null-bytes (huller) og udfør seek() (i stedet for at skrive nuller med write() ); 2) få et kort over placeringen af filen på disken ved hjælp af fibmap() .
- For at markere et vilkårligt område af en fil som et hul , tillader fallocate()- systemkaldet med punch hole [3] -flaget ("punch a hole"). Systemkaldet vil ikke kun frigøre diskplads, men også udføre TRIM-kommandoen på SSD'er for blokkene i det specificerede område.
- Da adressering i de fleste FS udføres ved hjælp af blokke [4] , kan forskydningen og størrelsen af huller ikke være vilkårlig, men skal være et multiplum af blokstørrelsen (tilpasset blokstørrelsen). Blokstørrelsen er konstant for én partition . Det er således umuligt at lave et "hul" på et par bytes; i et sådant forsøg vil FS-driveren skrive null-bytes til disken.
- Værktøjer til visning af filstørrelse viser normalt filens faktiske størrelse (i bytes) og størrelsen optaget af filen på disken (i FS-blokke [4] eller bytes). En sparsom fil kan optage mindre diskplads.
- Bemærk, at fallocate()- systemkaldet med flag 0 tildeler blokke til filen og markerer dem som "fyldt med null-bytes". Dette giver dig mulighed for at oprette en stor fil næsten øjeblikkeligt uden at skrive null-bytes til disken. Forskellen fra sparsomme filer er blokreservationen; blokke til filen tildeles straks; når du skriver til blokken, fjernes flaget "fyldt med nul bytes"; hvis disken løber tør for ledig plads, vil der ikke være nogen fejl, når du skriver til et område, der indeholder null bytes. TRIM-kommandoen til SSD -drev kaldes også for dette tilfælde.
Noter
- ↑ En nulbyte er en byte med alle bit sat til nul (0, NUL eller '\0' i C ).
- ↑ Sparsomme filer i NTFS . Hentet 6. april 2011. Arkiveret fra originalen 15. marts 2012. (ubestemt)
- ↑ FALLOC_FL_PUNCH_HOLE. Cm.mand 2 fallocate
- ↑ 1 2 For forskellige FS kaldes "blokken" forskelligt: "cluster" ( engelsk klynge ) i NTFS , "blok" ( engelsk blok ) i ext4 .