• Sortie de snapper 0.3

    Snapper est un outil de création et de gestion des snapshots du système de fichiers Btrfs. Une nouvelle version vient de sortir, avec un nettoyage automatique plus performant. Fini les partitions racines saturées par de trop nombreux instantanés !

    Résumé des épisodes précédents

    Btrfs

    openSUSE promeut depuis quelques années maintenant le système de fichiers Btrfs. En gros, celui-ci organise les données sur le disque dur sous la forme d'un arbre particulier et fait en sorte que chaque écriture sur le disque n'écrase pas la donnée précédente (c'est le copy-on-write).

    Tout cela offre des possibilités nouvelles. Celle qui nous intéresse ici est de réaliser des sortes d'images du système de fichiers, appelées instantanés ou snapshots. Celles-ci peuvent servir de « points de restauration » : si un problème survient, il est possible de revenir dans l'état enregistré par l'instantané. Copié proprement sur un autre disque ou espace de stockage, un instantané peut parfaitement jouer le rôle de sauvegarde.

    Les outils de Btrfs en ligne de commande permettent de créer et de gérer des instantanés, mais c'est un peu laborieux. Des solutions ont vu le jour pour faciliter le travail. L'une d'elles est snapper.

    snapper

    Cet outil a été présenté à plusieurs reprises sur Alionet.

    Il dispose d'une interface en ligne de commande ainsi que d'une interface graphique sous la forme d'un module YaST.

    Un problème qui peut lui être reproché est sa tendance à créer beaucoup (trop) d'instantanés automatiquement, dans sa configuration par défaut, sans se soucier de l'espace disque que les instantanés prennent.


    Nouveautés

    La dernière version de snapper propose un meilleur nettoyage automatique des instantanés, en prenant désormais en compte l’espace disque utilisée par les instantanés, et non plus seulement leur nombre.

    Cette version est déjà disponible sur Tumbleweed. Elle est également disponible dans le dépôt YaST:Head pour d'autres versions d'openSUSE, si vous ne voulez pas attendre. snapper 0.3 sera très probablement disponible sur Leap 42.2.

    Configuration de snapper 0.3

    1. Démarrer les quotas Btrfs

    Le nouvel algorithme se base sur les quotas Btrfs, qui ne sont pas activés par défaut sur openSUSE. snapper fournit une commande pour les activer et créer un nouveau qgroup :
    Code:
    # snapper setup-quota

    2. Configurer snapper pour utiliser la fonctionnalité

    La configuration se fait dans le fichier /etc/snapper/configs/root (ou /etc/snapper/configs/toto si vous avez créé un profil pour l’utilisateur toto).

    Les deux nouvelles variables intéressantes sont QGROUP et SPACE_LIMIT :
    Code:
    # QGROUP est l'identifiant de votre groupe d'instantanés ; vous pouvez le laisser vide, ce sera par défaut 1/0
    # Les instantanés seront enregistrés comme des qgroups enfants de $QGROUP (voir plus loin)
    QGROUP="1/0"
    
    # Fraction maximale d’espace disque que snapper peut utiliser pour stocker les instantanés
    # 50 % ici, soit tout de même 20 Go pour une partition racine de 40 Go ; vous pouvez l'ajuster comme vous le voulez
    SPACE_LIMIT="0.5"
    Et voilà !

    Une 'tite démo

    J'ai repris la configuration de snapper par défaut (qui est très généreuse) mais en activant les quotas et avec une variable SPACE_LIMIT à 0.1 :
    Code:
    linux-l4a8:/ # snapper get-config
    Clé                    | Valeur
    -----------------------+-------
    ALLOW_GROUPS           |       
    ALLOW_USERS            |       
    BACKGROUND_COMPARISON  | yes   
    EMPTY_PRE_POST_CLEANUP | yes   
    EMPTY_PRE_POST_MIN_AGE | 1800  
    FSTYPE                 | btrfs 
    NUMBER_CLEANUP         | yes   
    NUMBER_LIMIT           | 50    
    NUMBER_LIMIT_IMPORTANT | 10    
    NUMBER_MIN_AGE         | 1800  
    QGROUP                 | 1/0   # Le qgroup parent de tous les instantanés porte l'identifiant 1/0 
    SPACE_LIMIT            | 0.1   # Je ne veux pas donner plus de 10% de ma partition racine
    SUBVOLUME              | /     
    SYNC_ACL               | no    
    TIMELINE_CLEANUP       | yes   
    TIMELINE_CREATE        | yes   
    TIMELINE_LIMIT_DAILY   | 10    
    TIMELINE_LIMIT_HOURLY  | 10    
    TIMELINE_LIMIT_MONTHLY | 10    
    TIMELINE_LIMIT_WEEKLY  | 0     
    TIMELINE_LIMIT_YEARLY  | 10    
    TIMELINE_MIN_AGE       | 1800  
    linux-l4a8:/ #
    J'ai laissé tourné plusieurs jours, et je suis arrivé à une belle liste d'instantanés pris automatiquement :
    Code:
    linux-l4a8:/ # snapper ls
    Type   | #  | Pre # | Date                             | Utilisateur | Nettoyer | Description           | Données utilisateur
    -------+----+-------+----------------------------------+-------------+----------+-----------------------+---------------------
    single | 0  |       |                                  | root        |          | current               |                     
    single | 1  |       | dim. 07 févr. 2016 11:57:04 CET  | root        |          | first root filesystem |                     
    single | 3  |       | jeu. 05 mai 2016 21:15:01 CEST   | root        | timeline | timeline              |                     
    pre    | 6  |       | jeu. 05 mai 2016 23:28:41 CEST   | root        | number   | zypp(zypper)          | important=no        
    post   | 7  | 6     | jeu. 05 mai 2016 23:29:26 CEST   | root        | number   |                       | important=no        
    pre    | 8  |       | jeu. 05 mai 2016 23:30:15 CEST   | root        | number   | zypp(zypper)          | important=no        
    post   | 9  | 8     | jeu. 05 mai 2016 23:30:15 CEST   | root        | number   |                       | important=no        
    single | 10 |       | ven. 06 mai 2016 14:15:01 CEST   | root        | timeline | timeline              |                     
    single | 15 |       | sam. 07 mai 2016 10:45:01 CEST   | root        | timeline | timeline              |                     
    pre    | 18 |       | sam. 07 mai 2016 12:48:44 CEST   | root        | number   | yast firewall         |                     
    post   | 19 | 18    | sam. 07 mai 2016 12:54:55 CEST   | root        | number   |                       |                     
    single | 25 |       | dim. 08 mai 2016 11:30:01 CEST   | root        | timeline | timeline              |                     
    pre    | 30 |       | dim. 08 mai 2016 17:47:47 CEST   | root        | number   | zypp(zypper)          | important=no        
    post   | 31 | 30    | dim. 08 mai 2016 17:51:25 CEST   | root        | number   |                       | important=no        
    pre    | 35 |       | dim. 08 mai 2016 23:23:46 CEST   | root        | number   | zypp(zypper)          | important=no        
    post   | 36 | 35    | dim. 08 mai 2016 23:23:53 CEST   | root        | number   |                       | important=no        
    pre    | 37 |       | dim. 08 mai 2016 23:33:28 CEST   | root        | number   | zypp(zypper)          | important=no        
    post   | 38 | 37    | dim. 08 mai 2016 23:33:30 CEST   | root        | number   |                       | important=no        
    single | 39 |       | lun. 09 mai 2016 08:00:02 CEST   | root        | timeline | timeline              |                     
    single | 44 |       | mar. 10 mai 2016 06:45:01 CEST   | root        | timeline | timeline              |                     
    pre    | 49 |       | mar. 10 mai 2016 22:04:11 CEST   | root        | number   | zypp(zypper)          | important=yes       
    post   | 50 | 49    | mar. 10 mai 2016 22:09:44 CEST   | root        | number   |                       | important=yes       
    pre    | 51 |       | mar. 10 mai 2016 22:10:46 CEST   | root        | number   | zypp(zypper)          | important=no        
    post   | 52 | 51    | mar. 10 mai 2016 22:10:48 CEST   | root        | number   |                       | important=no        
    single | 54 |       | mer. 11 mai 2016 00:00:01 CEST   | root        | timeline | timeline              |                     
    single | 59 |       | mer. 11 mai 2016 23:00:01 CEST   | root        | timeline | timeline              |                     
    pre    | 60 |       | mer. 11 mai 2016 23:23:42 CEST   | root        | number   | zypp(zypper)          | important=no        
    post   | 61 | 60    | mer. 11 mai 2016 23:23:45 CEST   | root        | number   |                       | important=no        
    pre    | 62 |       | mer. 11 mai 2016 23:28:30 CEST   | root        | number   | zypp(zypper)          | important=no        
    post   | 63 | 62    | mer. 11 mai 2016 23:28:31 CEST   | root        | number   |                       | important=no        
    single | 64 |       | jeu. 12 mai 2016 18:45:01 CEST   | root        | timeline | timeline              |                     
    single | 65 |       | ven. 13 mai 2016 00:45:02 CEST   | root        | timeline | timeline              |                     
    pre    | 66 |       | ven. 13 mai 2016 01:01:33 CEST   | root        | number   | zypp(zypper)          | important=no        
    post   | 67 | 66    | ven. 13 mai 2016 01:04:29 CEST   | root        | number   |                       | important=no        
    pre    | 68 |       | ven. 13 mai 2016 01:05:03 CEST   | root        | number   | zypp(zypper)          | important=no        
    post   | 69 | 68    | ven. 13 mai 2016 01:05:05 CEST   | root        | number   |                       | important=no        
    single | 70 |       | ven. 13 mai 2016 18:30:02 CEST   | root        | timeline | timeline              |                     
    single | 71 |       | ven. 13 mai 2016 19:30:01 CEST   | root        | timeline | timeline              |                     
    single | 72 |       | ven. 13 mai 2016 20:30:01 CEST   | root        | timeline | timeline              |                     
    single | 73 |       | ven. 13 mai 2016 21:30:01 CEST   | root        | timeline | timeline              |                     
    single | 74 |       | ven. 13 mai 2016 22:30:01 CEST   | root        | timeline | timeline              |                     
    single | 75 |       | ven. 13 mai 2016 23:30:01 CEST   | root        | timeline | timeline              |                     
    single | 76 |       | sam. 14 mai 2016 00:30:02 CEST   | root        | timeline | timeline              |                     
    single | 77 |       | sam. 14 mai 2016 10:00:01 CEST   | root        | timeline | timeline              |                  
    linux-l4a8:/ #
    Liste qu'on peut aussi voir avec les commandes btrfs :
    Code:
    linux-l4a8:/ # btrfs subvolume list / | grep snapshots/
    ID 258 gen 12588 top level 257 path .snapshots/1/snapshot
    ID 366 gen 12102 top level 257 path .snapshots/3/snapshot
    ID 369 gen 12102 top level 257 path .snapshots/6/snapshot
    ID 370 gen 12102 top level 257 path .snapshots/7/snapshot
    ID 371 gen 12102 top level 257 path .snapshots/8/snapshot
    ID 372 gen 12102 top level 257 path .snapshots/9/snapshot
    ID 373 gen 12102 top level 257 path .snapshots/10/snapshot
    ID 379 gen 12102 top level 257 path .snapshots/15/snapshot
    ID 382 gen 12102 top level 257 path .snapshots/18/snapshot
    ID 383 gen 12102 top level 257 path .snapshots/19/snapshot
    ID 389 gen 12102 top level 257 path .snapshots/25/snapshot
    ID 394 gen 12102 top level 257 path .snapshots/30/snapshot
    ID 396 gen 12102 top level 257 path .snapshots/31/snapshot
    ID 401 gen 12102 top level 257 path .snapshots/35/snapshot
    ID 402 gen 12102 top level 257 path .snapshots/36/snapshot
    ID 403 gen 12102 top level 257 path .snapshots/37/snapshot
    ID 404 gen 12102 top level 257 path .snapshots/38/snapshot
    ID 406 gen 12102 top level 257 path .snapshots/39/snapshot
    ID 411 gen 12102 top level 257 path .snapshots/44/snapshot
    ID 416 gen 12102 top level 257 path .snapshots/49/snapshot
    ID 417 gen 12102 top level 257 path .snapshots/50/snapshot
    ID 418 gen 12102 top level 257 path .snapshots/51/snapshot
    ID 419 gen 12102 top level 257 path .snapshots/52/snapshot
    ID 421 gen 12102 top level 257 path .snapshots/54/snapshot
    ID 426 gen 12102 top level 257 path .snapshots/59/snapshot
    ID 428 gen 12120 top level 257 path .snapshots/60/snapshot
    ID 429 gen 12120 top level 257 path .snapshots/61/snapshot
    ID 430 gen 12120 top level 257 path .snapshots/62/snapshot
    ID 431 gen 12120 top level 257 path .snapshots/63/snapshot
    ID 432 gen 12120 top level 257 path .snapshots/64/snapshot
    ID 433 gen 12120 top level 257 path .snapshots/65/snapshot
    ID 434 gen 12120 top level 257 path .snapshots/66/snapshot
    ID 435 gen 12120 top level 257 path .snapshots/67/snapshot
    ID 436 gen 12120 top level 257 path .snapshots/68/snapshot
    ID 437 gen 12120 top level 257 path .snapshots/69/snapshot
    ID 438 gen 12120 top level 257 path .snapshots/70/snapshot
    ID 439 gen 12120 top level 257 path .snapshots/71/snapshot
    ID 441 gen 12161 top level 257 path .snapshots/72/snapshot
    ID 442 gen 12243 top level 257 path .snapshots/73/snapshot
    ID 443 gen 12319 top level 257 path .snapshots/74/snapshot
    ID 444 gen 12394 top level 257 path .snapshots/75/snapshot
    ID 445 gen 12495 top level 257 path .snapshots/76/snapshot
    ID 446 gen 12587 top level 257 path .snapshots/77/snapshot
    linux-l4a8:/ #
    Mais au final, tout va bien, les snapshots ne prennent pas plus de 10% de l'espace disque de ma racine (soit 4 Go) :
    Code:
    linux-l4a8:/ # sudo btrfs qgroup show -p / | awk 'NR <= 2 || /1\/0/'
    qgroupid         rfer         excl parent  
    --------         ----         ---- ------  
    # Une ligne, c'est le qgroup associé à un instantané pris par snapper.
    # Par exemple l'instantané au-dessous, qgroup 0/366, référence 6,13 Gio de données.
    # Seulement 52,46 Mio ne sont pas partagées avec d'autres qgroups, donc le snapshot
    # « pèse » 52,46 Mio
    0/366         6.13GiB     52.46MiB 1/0     
    0/369         6.13GiB    912.00KiB 1/0     
    0/370         6.13GiB      6.05MiB 1/0     
    0/371         6.13GiB    320.00KiB 1/0     
    0/372         6.13GiB      1.11MiB 1/0     
    0/373         6.13GiB      6.46MiB 1/0     
    0/379         6.11GiB      3.16MiB 1/0     
    0/382         6.11GiB      1.03MiB 1/0     
    0/383         6.11GiB      3.38MiB 1/0     
    0/389         6.11GiB     10.23MiB 1/0     
    0/394         6.11GiB      9.64MiB 1/0     
    0/396         6.15GiB     50.70MiB 1/0     
    0/401         6.12GiB    448.00KiB 1/0     
    0/402         6.12GiB      1.56MiB 1/0     
    0/403         6.12GiB    864.00KiB 1/0     
    0/404         6.12GiB    916.00KiB 1/0     
    0/406         6.12GiB      2.94MiB 1/0     
    0/411         6.12GiB     13.04MiB 1/0     
    0/416         6.12GiB      4.46MiB 1/0     
    0/417         6.32GiB     28.41MiB 1/0     
    0/418         6.30GiB    512.00KiB 1/0     
    0/419         6.30GiB    764.00KiB 1/0     
    0/421         6.30GiB      4.44MiB 1/0     
    0/426         6.08GiB      6.05MiB 1/0     
    0/428         6.08GiB    256.00KiB 1/0     
    0/429         6.08GiB    544.00KiB 1/0     
    0/430         6.08GiB    160.00KiB 1/0     
    0/431         6.08GiB    292.00KiB 1/0     
    0/432         6.08GiB      4.38MiB 1/0     
    0/433         6.08GiB      2.58MiB 1/0     
    0/434         6.08GiB      2.61MiB 1/0     
    0/435         6.12GiB     17.43MiB 1/0     
    0/436         6.10GiB    672.00KiB 1/0     
    0/437         6.10GiB      1.05MiB 1/0     
    0/438         6.10GiB    900.00KiB 1/0     
    0/439         6.10GiB    756.00KiB 1/0     
    0/441         6.10GiB    928.00KiB 1/0     
    0/442         6.10GiB    452.00KiB 1/0     
    0/443         6.10GiB    260.00KiB 1/0     
    0/444         6.10GiB    428.00KiB 1/0     
    0/445         6.10GiB    920.00KiB 1/0     
    0/446         6.10GiB     96.00KiB 1/0     
    # 1/0 est le qgroup parent de tous les instantanés pris par snapper.
    # Il référence 10,20 Gio de données mais seulement 4,16 Gio ne sont pas partagés avec d'autres qgroups (hors qgroups enfants)
    # Ainsi, tous les instantanés « pèsent » 4,16 Gio, soit 10% de mon espace disque
    1/0          10.20GiB      4.16GiB ---     
    linux-l4a8:/ # 
    Tout ça grâce à la tâche cron de nettoyage (/etc/cron.daily/suse.de-snapper) qui prend désormais en compte l'espace disque utilisé et plus seulement un nombre d'instantanés ;-)


    Have a lot of fun!


    Voir aussi :
    Commentaires 7 Commentaires
    1. Avatar de manchette
      manchette -
      Salut

      Merci de ces tests et informations, j'espère que ce sera utile a tout ceux désireux d'utiliser ce système de fichier (FS) plus facilement. Par contre je me demande si
      - openSUSE n'a pas dégainé ce FS un peu trop tôt
      - d'autres distributions ont t'elles fait également le choix de ce FS par défaut ?
    1. Avatar de Antoine
      Antoine -
      Citation Envoyé par manchette Voir le message
      Par contre je me demande si
      - openSUSE n'a pas dégainé ce FS un peu trop tôt
      Bof, non. Pis pour Btrfs c'est bien d'avoir une distribution qui l'intègre par défaut et permette de l'améliorer grâce aux retours de ses utilisateurs.

      Par contre snapper si je pense, à cause de cette histoire de snapshots qui remplissaient la partition racine, maintenant réglée.


      Citation Envoyé par manchette Voir le message
      - d'autres distributions ont t'elles fait également le choix de ce FS par défaut ?
      Je crois pas.
    1. Avatar de jb1
      jb1 -
      Bonjour,
      il ya plusieurs version de snapper?
      Code:
      alpha30:~ # snapper get-config
      Key                    | Value
      -----------------------+------
      ALLOW_GROUPS           |      
      ALLOW_USERS            |      
      BACKGROUND_COMPARISON  | yes  
      EMPTY_PRE_POST_CLEANUP | yes  
      EMPTY_PRE_POST_MIN_AGE | 1800 
      FSTYPE                 | btrfs
      NUMBER_CLEANUP         | yes  
      NUMBER_LIMIT           | 10   
      NUMBER_LIMIT_IMPORTANT | 10   
      NUMBER_MIN_AGE         | 1800 
      SUBVOLUME              | /    
      SYNC_ACL               | no   
      TIMELINE_CLEANUP       | yes  
      TIMELINE_CREATE        | no   
      TIMELINE_LIMIT_DAILY   | 10   
      TIMELINE_LIMIT_HOURLY  | 10   
      TIMELINE_LIMIT_MONTHLY | 10   
      TIMELINE_LIMIT_WEEKLY  | 0    
      TIMELINE_LIMIT_YEARLY  | 10   
      TIMELINE_MIN_AGE       | 1800 
      alpha30:~ # snapper ls
      qgroup et space_limits absents
      A+
      JB1
    1. Avatar de Antoine
      Antoine -
      Citation Envoyé par jb1 Voir le message
      il ya plusieurs version de snapper?
      Nouveautés

      La dernière version de snapper propose un meilleur nettoyage automatique des instantanés, en prenant désormais en compte l’espace disque utilisée par les instantanés, et non plus seulement leur nombre.

      Cette version est déjà disponible sur Tumbleweed. Elle est également disponible dans le dépôt YaST:Head pour d'autres versions d'openSUSE, si vous ne voulez pas attendre. snapper 0.3 sera très probablement disponible sur Leap 42.2.
      .....
    1. Avatar de jb1
      jb1 -
      Bonjour,
      merci pour l'info

      42.2 quelle semaine SVP?
      A+
      JB1
    1. Avatar de Antoine
      Antoine -
      Citation Envoyé par jb1 Voir le message
      42.2 quelle semaine SVP?
      Novembre 2016 : https://en.opensuse.org/openSUSE:Roadmap.
    1. Avatar de Grenouille
      Grenouille -
      Excellent !
      J'ai bien envie de tester tout ça...