Dosar rar

Versiunea actuală a paginii nu a fost încă examinată de colaboratori experimentați și poate diferi semnificativ de versiunea revizuită la 26 ianuarie 2017; verificările necesită 7 modificări .

Un  fișier rar este un fișier în care secvențele de zero octeți [1] sunt înlocuite cu informații despre aceste secvențe (o listă de găuri).

Hole ( în engleză  hole ) - o secvență de zero octeți în interiorul fișierului, care nu este scrisă pe disc . Informațiile despre găuri (decalaj de la începutul fișierului în octeți și numărul de octeți) sunt stocate în metadatele FS .

Avantaje și dezavantaje

Avantaje:

Defecte:

Suport

Pentru a implementa suport pentru fișiere rare, aveți nevoie de:

Următoarele sisteme de fișiere acceptă fișiere rare: BTRFS , NILFS , ZFS , NTFS [2] , ext2 , ext3 , ext4 , XFS , JFS , ReiserFS , Reiser4 , UFS , Rock Ridge , UDF , ReFS , APFS , F2FS .

Următorul software acceptă fișiere rare:

Aplicație

Fișierele rare sunt folosite pentru a stoca containere , de exemplu:

Comenzi

Comenzi pentru lucrul cu fișiere rare.

linux :

dd if = /dev/zero of = ./sparse-file bs = 1 count = 0 seek = 200G # sau trunchiați -s200G ./sparse-file
  • conversia unui fișier obișnuit într-unul rar (căutarea găurilor și înregistrarea locației acestora (decalaje și lungimi) în metadatele fișierului):
cp --sparse = întotdeauna ./simple-file ./sparse-file
  • salvarea unei copii de disc într-un fișier rar folosind utilitarul ddrescue :
ddrescue --sparse /dev/sdb ./sparse-file ./history.log

ferestre :

  • crearea unui fișier (nu rar) de 200 GB ( 214 748 364 800 octeți ) (dimensiunea este specificată în octeți):
fișier fsutil createnew some-file 214748364800
  • setarea steagului „rar” (nu caută găuri în interiorul fișierului):
fsutil sparse setflag some-file
  • eliminarea steagului „rar”:
fsutil sparse setflag some-file 0
  • obținerea valorii steagului „rar”:
fsutil sparse queryflag un fișier
  • marcarea unei zone de fișier ca găuri (decalajul și lungimea sunt date în octeți):
fsutil sparse setrange some-file 0 214748364800

Caracteristici

  • Citirea dintr-o gaură returnează octeți nuli; nu există acces la disc (se presupune că hărțile de zonă au fost deja citite de pe disc din metadatele fișierului și sunt în memorie).
  • Când scrieți într-o gaură, este lansat un algoritm pentru a căuta spațiu liber (blocuri libere) pe disc. Dacă se găsesc blocuri, datele vor fi scrise. Blocurile găsite adesea sunt situate pe disc departe de blocurile cu conținut de fișier deja scris; aceasta duce la fragmentarea FS. Dacă spațiul pe disc se epuizează, algoritmul nu va găsi nimic și scrierea nu va fi efectuată ( write() va raporta o lipsă de spațiu liber, iar dacă fișierul a fost folosit cu mmap() , va apărea o eroare de segmentare ).
  • Scrierea într-o locație arbitrară a unui fișier rar, de regulă, duce la o fragmentare mare FS.
  • Fișierele rare nu sunt întotdeauna copiate corect; la copierea unui fișier, octeții nuli pot fi scriși pe disc în loc de informații despre găuri. Pentru Linux, copierea corectă este efectuată de comanda cp cu opțiunea --sparse . Există două moduri de a implementa o copiere adecvată: 1) căutați zonele pline cu octeți nuli (găuri) și efectuați seek() (în loc să scrieți valori nule cu write() ); 2) obțineți o hartă a locației fișierului pe disc folosind fibmap() .
  • Pentru a marca o regiune arbitrară a unui fișier ca o gaură , apelul de sistem fallocate() cu indicatorul punch hole [3] („punch a hole”) permite. Apelul de sistem nu numai că va elibera spațiu pe disc, dar va executa și comanda TRIM pe SSD -uri pentru blocurile din zona specificată.
  • Deoarece adresarea în majoritatea FS se realizează folosind blocuri [4] , decalajul și dimensiunea găurilor nu pot fi arbitrare, ci trebuie să fie un multiplu al dimensiunii blocului (aliniat cu dimensiunea blocului). Dimensiunea blocului este constantă pentru o partiție . Astfel, este imposibil să faci o „găură” în câțiva octeți; într-o astfel de încercare, driverul FS va scrie octeți nuli pe disc.
  • Utilitarele pentru afișarea dimensiunii fișierului afișează de obicei dimensiunea reală a fișierului (în octeți) și dimensiunea ocupată de fișierul de pe disc (în blocuri FS [4] sau octeți). Un fișier rar poate ocupa mai puțin spațiu pe disc.
  • Rețineți că apelul de sistem fallocate() cu indicatorul 0 alocă blocuri pentru fișier și le marchează ca „umplute cu octeți nuli”. Acest lucru vă permite să creați un fișier mare aproape instantaneu fără a scrie octeți nuli pe disc. Diferența față de fișierele rare este rezervarea blocului; blocurile pentru fișier sunt alocate imediat; la scrierea în bloc, steag-ul „umplut cu zero octeți” este eliminat; dacă discul rămâne fără spațiu liber, nu va exista nicio eroare la scrierea într-o zonă care conține octeți nuli. Comanda TRIM pentru unitățile SSD este, de asemenea, apelată în acest caz.

Note

  1. Un octet nul este un octet cu toți biții setați la zero (0, NUL sau „\0” în C ).
  2. Fișiere rare în NTFS . Consultat la 6 aprilie 2011. Arhivat din original pe 15 martie 2012.
  3. FALLOC_FL_PUNCH_HOLE. Cm.om 2 fallocate
  4. 1 2 Pentru FS diferite, „blocul” este numit diferit: „cluster” ( cluster în engleză  ) în NTFS , „bloc” ( bloc în engleză ) în ext4 .