• # Partition Image

    Posté par . En réponse à la dépêche Le guide IdealX des logiciels libres utilisables en production. Évalué à 10.

    A propos de http://www.partimage.org/(...) , j'ai moi-même eu un jour besoin de sauver des images de partitions, et évidemment j'ai bloqué sur le problème: le fichier est énorme et même quand on le compresse il reste gigantesque car même si le système de fichier a l'air vide, il reste un "bruit de fond" (les anciens fichiers qui ne sont plus référencés mais dont le contenu est toujours là) qui fait que ça se compresse très mal.

    Alors évidemment il y a Partition Image (mais à l'époque je ne connaissais pas, merci IdéalX!) mais dans tous les cas Partition Image ne supporte pas *tous* les FS, par exemple NTFS est en "expérimental" et le FS de BeOS n'est pas supporté.

    Donc du coup, je vous fais part d'un ch'tit programme qui m'a bien aidé pour l'occasion. C'est tout simple, l'idée est d'écrire des "0" sur tout l'espace disque restant en créant un max-fichier-énorme plein de "0", puis de supprimer le fichier. Résultat: le FS contient "0" partout où il n'y a pas vraiment d'info pertinente, et après-coup ça se compresse très bien 8-)

    Voici le source du programme que j'utilise:

    ----8<-----------------------------------------------------------

    #include <stdio.h>
    #include <stdlib.h>

    static char *FILLER_STRING="........................................................................";
    static int FILLER_STEP=1024*1024;

    static void print_syntax()
    {
    printf("usage: filler \n");
    printf("example: filler tmp.bin\n");
    }

    static int do_fill(char *filename)
    {
    int result=0;
    FILE *f;

    f=fopen(filename,"w");
    if (f)
    {
    int i=0;
    int len;

    len=strlen(FILLER_STRING);
    while (fprintf(f,"%s\n",FILLER_STRING)>0)
    {
    i+=len;
    while (i>FILLER_STEP)
    {
    i-=FILLER_STEP;
    printf(".");
    fflush(stdout);
    }
    }
    fclose(f);
    printf("\n");
    }
    else
    {
    result=1;
    printf("unable to open file %s\n",filename);
    }
    }

    int main(int argc, char **argv)
    {
    int result=1;

    if (argc<2)
    {
    print_syntax();
    }
    else
    {
    char *filename;
    filename=argv[1];
    result=do_fill(filename);
    }
    return result;
    }

    ----8<-----------------------------------------------------------

    Ca se compile normalement bien sur n'importe quoi équipé d'un compilo C, et ensuite un petit:
    dd if=/dev/hda1 | gzip> image_disque.img
    marche du feu de dieu 8-)

    Désolé pour ceux que ça intéresse pas, c'est juste que j'ai pas le courage de mettre tout ça sur mon site ouaibe, et là j'avais le courage de le faire, donc bon si ça peut servir à qq'1...