Journal fpart ou comment partitionner un ensemble de fichiers

Posté par  (site web personnel) .
12
6
jan.
2012

Chers lecteurs,

Vous êtes-vous déjà demandé comment partitionner un ensemble de fichiers afin de les répartir de manières équitables dans des sous-ensembles de même taille ou bien des sous-ensembles d'une taille pré-définie ?

Je souhaiterais vous présenter un outil qui répond à ce besoin : il s'agit de fpart (file partitioner). Il est écrit en C et est disponible sous license BSD.

Quelques exemples valent mieux qu'un long discours :

1) La ligne suivante produit 3 partitions depuis les données de /var, ayant (approximativement) la même taille et le même nombre de fichiers :

$ fpart -n 3 -o var-parts /var

2) La ligne suivante produit des partitions de 4.4 Go (maximum) de fichiers de musicaux, prêtes à êtres gravées sur un DVD :

$ fpart -s 4724464025 -o music-parts /path/to/my/music

3) Ce dernier exemple produit des partitions contenant maximum 10000 fichiers à partir de /usr et /home et les affiche sur la sortie standard. On extrait ensuite la partition 0 :

$ find /usr ! -type d | ./fpart -f 10000 -i - /home | grep '^0:'

L'outil est disponible à ces adresses :
http://sourceforge.net/projects/fpart
et
http://contribs.martymac.org

Pour les (heureux) utilisateurs de FreeBSD, il est également disponible dans l'arbre officiel des ports (sysutils/fpart). Pour les Linuxiens, il faudra le compiler à la main depuis les sources.

  • # On ne comprend pas bien

    Posté par  . Évalué à 8.

    On ne comprend pas bien concrètement ce que sont ces partitions, ni à quoi elles servent.
    En reprenant ton premier exemple :

    $ fpart -n 3 -o var-parts /var

    Questions :
    1. Quel est le résultat de l'opération ? Obtient-on 3 fichiers ? Ou 3 partitions sur un disque dur ?
    2. Comment peut-on utiliser le résultat de l'opération ? À des fins de sauvegarde ou de répartition de charge ?
    3. Les 3 partitions obtenues sont-elles lisibles avec un éditeur de texte traditionnel ?

    • [^] # Re: On ne comprend pas bien

      Posté par  . Évalué à 2.

      je penses qu'il appelle "partition" un sous ensemble (un sous dossier) de ton dossier initial

      dans son exemple :

      $ fpart -n 3 -o var-parts /var

      on ferait dont 3 sous dossiers (-n 3)
      dans var-parts (-o var-parts)
      à partir du dossier /var

      • [^] # Re: On ne comprend pas bien

        Posté par  (site web personnel) . Évalué à 4.

        Le terme "partition" est peut-être mal choisi ; il désigne un sous-ensemble des fichiers passés en argument.

        Ce qui est généré par fpart n'est pas une "partition" au sens "partition de disque", ni un répertoire contenant les fichiers triés, mais juste une liste de fichiers. Cette liste est soit affichée sur la sortie standard (par défaut), soit écrite dans un fichier texte.

        fpart ne fait qu'analyser les chemins passés en argument et en trie les fichiers suivant des critères de taille ou de nombre (mais il ne modifie bien évidemment pas le système de fichiers analysé).

        J'espère que c'est un peu plus clair... ?

        • [^] # Re: On ne comprend pas bien

          Posté par  (site web personnel) . Évalué à 5.

          Le terme partition s'entend au sens ensembliste de la chose (donc c'est le bon terme mais en se plaçant dans le "bon" système de pensée) : une décomposition en sous-ensemble deux à deux disjoints et recouvrant l'ensemble d'entrée. Il rajoute en plus la condition qu'ils doivent être de taille "aussi équivalente que possible".

          • [^] # Re: On ne comprend pas bien

            Posté par  (site web personnel) . Évalué à 2. Dernière modification le 06 janvier 2012 à 15:37.

            En effet, il aurait été bon de préciser que partition s'entend au sens mathématique du terme. Et là, ça devient tout à coup beaucoup plus clair.

            Parce que tout le monde entend partition au sens informatique: partition faisant parti de la table de partition du disque.

          • [^] # Re: On ne comprend pas bien

            Posté par  (site web personnel) . Évalué à 4. Dernière modification le 06 janvier 2012 à 15:33.

            Vu le contexte informatique de la chose, et la connotation forte de partition vs les disques durs... tu devrais utiliser un synonyme dans les docs / présentations (sous-sélection, découpage, regroupement, etc... le concours est ouvert).

            Et tu devrais être plus explicite dans la description sur le côté travail sur les fichiers, car au début j'ai confondu avec les "par file" qui est un moyen de découper un gros binaire (un partition par exemple :-) en plusieurs fichiers plus petits, avec de la redondance afin que l'altération d'un des fichiers n'empêche pas la reconstruction.

            Sinon, bonne idée.

            Python 3 - Apprendre à programmer dans l'écosystème Python → https://www.dunod.com/EAN/9782100809141

    • [^] # Re: On ne comprend pas bien

      Posté par  . Évalué à 4.

      Tu le lances en root avec --force sur un système en prod, tu verras bien.

      THIS IS JUST A PLACEHOLDER. YOU SHOULD NEVER SEE THIS STRING.

      • [^] # Re: On ne comprend pas bien

        Posté par  . Évalué à 3.

        Edit (merde, trop tard): c'est juste le bon jour et la bonne heure, en plus.

        THIS IS JUST A PLACEHOLDER. YOU SHOULD NEVER SEE THIS STRING.

  • # Je pinaille

    Posté par  (site web personnel) . Évalué à 3.

    La ligne suivante produit des partitions de 4.4 Go (maximum) de fichiers de musicaux, prêtes à êtres gravées sur un DVD :

    4.4 Gio (1G = 1000*1000*1000, 1Gi = 1024*1024*1024)
    Voir le tableaux des préfixes

    Et pour un DVD, tu as de grandes chances que ça ne passe pas, suivant le DVD, car la limite officielle est 4.7 Go (soit 4.37 Gio).

    bref, prend un peu moins si le but est un DVD ;-).

    • [^] # Re: Je pinaille

      Posté par  (site web personnel) . Évalué à 2.

      Effectivement, je m'étais basé sur 4.4 Gio, ce qui est juste au dessus de l'espace réellement utilisable. Merci pour ces précisions !

    • [^] # Re: Je pinaille

      Posté par  (Mastodon) . Évalué à 1.

      Bin justement, avec 4.4Go (environ 4.1Gio) ça passe non ? Puisque tu dis toi-même que c'est 4.7Go la limite...

      En théorie, la théorie et la pratique c'est pareil. En pratique c'est pas vrai.

      • [^] # Re: Je pinaille

        Posté par  (site web personnel) . Évalué à 4. Dernière modification le 06 janvier 2012 à 16:54.

        Il a ensuite mis le chiffre qu'il pensait... Il ne pensait pas à 4.4 Go en écrivant 4.4 Go. Relis.
        Allez : 4724464025 octets. Ca ne fait pas 4.4 Go, ni 4.1 Gio, mais 4.4 Gio (d'où ma remarque 4.4 Gio).

        • [^] # Re: Je pinaille

          Posté par  (Mastodon) . Évalué à 2.

          Ah oui au temps pour moi, je suis allé un peu vite :)

          En théorie, la théorie et la pratique c'est pareil. En pratique c'est pas vrai.

  • # Exemple complet

    Posté par  . Évalué à 9.

    Pour les personnes essayant le programme sous GNU/Linux, pensez à éditer les CFLAGS dans le Makefile (voir commentaires).

    Il faut comprendre partition comme sous ensemble d'une (ou plusieurs) arborescence.

    Voici un exemple où je veux créer 3 listes ("partitions") de fichiers à partir de /usr/share/doc et /usr/local/share/doc :

    ./fpart -n 3 -o doc-parts /usr/share/doc /usr/local/share/doc
    15842 file(s) found.
    Part #0: size = 81096965, 5280 file(s)
    Part #1: size = 81096965, 5280 file(s)
    Part #2: size = 81096964, 5282 file(s)
    $ ls -lh doc-parts.*
    -rw-r----- 1 jbdenis jbdenis 248K Jan  6 13:06 doc-parts.0
    -rw-r----- 1 jbdenis jbdenis 248K Jan  6 13:06 doc-parts.1
    -rw-r----- 1 jbdenis jbdenis 249K Jan  6 13:06 doc-parts.2
    
    

    Résultat : 3 fichiers (doc-parts.0/1/2) contenant un peu près le même nombre d'entrées (des fichiers avec les options par défaut de fpart). Si on additionne la taille de chacun des fichiers pointés par les chemins de chaque fichier, on obtient 3 groupes de même taille environ.

    Si vous avez une grosse verrue de 1T noyée au milieu de 1000 fichiers de 1 Mo, ça ne fera pas de magie, vous obtiendrez une liste de fichiers avec une seule entrée de 1T et deux autres listes dont la somme des entrées feront chacun 500 Mo.

    Ça peut être très pratique lorsqu'on utilise rsync sur une arborescence et qu'on souhaite lancer plusieurs rsync en parallèle (à partir de montages différents par exemple) : il suffit de lancer 3 rsync avec l'option --files-from et hop, on est assuré que chaque rsync s'occupera de transférer le même volume de données.

    Il y a plein d'options sympa, il faut fouiller. On peut par exemple limiter la profondeur de calcul des tailles, changer la granularité pour ne s'occuper que des dossiers et non des fichiers (on a des fichiers de sorties beaucoup plus petit), limiter le nombre de fichiers par partition, limiter la taille des partions etc...

    Chouette programme, je ne connais pas d'équivalent.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.