Domanda

Si consideri un file sparse con 1s scritte ad una porzione del file.

Voglio recuperare lo spazio effettivo su disco per questi 1s come non ho più bisogno quella porzione del file sparse. La porzione del file che contiene questi 1s dovrebbe diventare un "buco" come lo era prima che i 1s sono stati essi stessi scritti.

Per fare questo, ho cancellato la regione a 0s. Questo fa non recuperare i blocchi sul disco.

Come faccio effettivamente rendere il file sparse, bene, ancora una volta sparse?

Questa domanda è simile a questo , ma non v'è alcuna risposta accettata per quella domanda.

Si consideri la seguente sequenza di eventi eseguito su un server Linux magazzino:

$ cat /tmp/test.c
#include <unistd.h>
#include <stdio.h>
#include <fcntl.h>
#include <string.h>

int main(int argc, char **argv) {
    int fd;
    char c[1024];

    memset(c,argc==1,1024);

    fd = open("test",O_CREAT|O_WRONLY,0777);
    lseek(fd,10000,SEEK_SET);
    write(fd,c,1024);
    close(fd);

    return 0;
}

$ gcc -o /tmp/test /tmp/test.c

$ /tmp/test

$ hexdump -C ./test
00000000  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00002710  01 01 01 01 01 01 01 01  01 01 01 01 01 01 01 01  |................|
*
00002b10

$ du -B1 test; du -B1 --apparent-size test
4096        test
11024       test

$ /tmp/test clear

$ hexdump -C ./test
00000000  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00002b10

$ du -B1 test; du -B1 --apparent-size test
4096        test
11024       test

# NO CHANGE IN SIZE.... HMM....

Modifica -

Lasciatemi qualificare ulteriormente che io non voglio riscrivere i file, copiare i file, ecc Se non è possibile in qualche modo i blocchi liberi precedentemente assegnati in situ , così sia, ma io' d come per determinare se questo è effettivamente possibile o no. Sembra che "no, non è" a questo punto. Suppongo che sto cercando sys_punchhole per Linux (discussioni di cui ho appena imbattuto).

È stato utile?

Soluzione

In questo momento sembra che solo NTFS supporta foratura. Questa è stata storicamente un problema nella maggior parte dei file system. POSIX per quanto ne so, non definire un'interfaccia OS per perforare, per cui nessuno dei file system standard di Linux hanno il supporto per esso. NetApp supporta perforazione tramite Windows nella sua WAFL filesystem. C'è un bel post su questo blog qui .

Per il vostro problema, come altri hanno indicato, l'unica soluzione è quella di spostare il file lasciando fuori blocchi che contengono zeri. Già la sua intenzione di essere lento. O scrivere un'estensione per il filesystem su Linux che fa questo e presentare un cerotto al noreferrer brava gente nella squadra kernel di Linux. ;)

Modifica appare come XFS supporta foratura. Controllare questa discussione .

Un'altra opzione davvero contorto può essere quella di utilizzare un filesystem debugger di andare a pugno fori in tutti i blocchi indiretti, che puntano a blocchi azzerato nel file (forse si può script che). Quindi eseguire fsck, che correggerà tutti i conteggi dei blocchi associati, raccogliere tutti i blocchi orfani (quelli azzerato) e metterli nella directory lost + found (è possibile eliminarli per recuperare lo spazio) e correggere le altre proprietà nel filesystem. Spaventoso, eh?


Avviso: Fate questo a proprio rischio. Io non sono responsabile per eventuali perdite di dati si incorre ,.)

Altri suggerimenti

Sembra come se Linux hanno aggiunto una chiamata di sistema chiamato fallocate per "buche punzonatrici" nei file. Le implementazioni nei singoli filesystem sembrano concentrarsi sulla capacità di utilizzare questo per la pre-assegnazione di un numero maggiore di blocchi continuo.

C'è anche la chiamata posix_fallocate che si concentrano solo su quest'ultimo, e non è utilizzabile per la foratura.

Ron Yorston offre diverse soluzioni; ma tutti coinvolgono sia il montaggio delle FS sola lettura (o smontarlo) mentre lo sparsifying avviene; o fare un nuovo file sparse, quindi copiare attraverso quei pezzi di l'originale che non sono solo 0s, e quindi sostituire il file originale con il file appena sparsified.

In realtà dipende il vostro filesystem però. Abbiamo già visto che NTFS gestisce questo. Immagino che uno qualsiasi degli altri filesystem Wikipedia elenca come la manipolazione di compressione trasparente farebbe esattamente il stessa - questo è, dopo tutto, equivalente al comprime in modo trasparente il file.

Dopo aver "azzerato" qualche regione del file dovete dire al file system che questa nuova regione è destinato ad essere una regione sparsa. Quindi, in caso di NTFS si deve chiamare DeviceIoControl () per quella regione di nuovo. Almeno io faccio in questo modo nel mio programma di utilità: "sparse_checker"

Per me il problema più grande è il modo di disinserire la regione sparse indietro:).

Saluti

In questo modo è a buon mercato, ma funziona. :-P

  1. Leggi tutti i dati oltre il foro che si desidera, in memoria (o un altro file, o qualsiasi altra cosa).
  2. Tronca il file per l'inizio del foro (ftruncate è tuo amico).
  3. Cercare alla fine del foro.
  4. Scrivi i dati indietro in.

smontare il filesystem e modificare file system direttamente in modo debugfs o fsck simili. di solito è necessario il driver per ogni fs utilizzato.

Sembra che la scrittura zeri (come nella questione riferimento) per la parte che è finito con una cosa logica da provare. Ecco un link ad una domanda MSDN per i file sparsi NTFS che fa proprio questo a "rilasciare" la parte "non utilizzati". YMMV.

http://msdn.microsoft.com/en-us/library /ms810500.aspx

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top