Snapshots amb Btrfs

Enviat per Jordi Reñé el Dj, 31/03/2016 - 18:32
Btrfs file system

Introducció

A partir de la versió openSUSE 13.2, el sistema de fitxers per defecte és el nou Btrfs. Aquest sistema és el substitut del ext4. Btrfs (b-tree fs) basat en la funcionalitat copy-on-write i entès com un “better FS”, aporta rapidesa, robustesa i moltes possibilitats. Entre elles la que avui ens ocupa, els “snapshots”.

El terme “snapshot” es fa servir en diferents entorns i fa molt temps que ha estat disponible. No obstant això, en aquests moments, el suport que ofereixen openSUSE 13.2 i superiors (ja ha sortit la openSUSE Leap 34.1) permet aplicar-los per a casos d’ús molt quotidians i útils.

Per tal de provar les bondats dels “snapshots”, muntem un servidor de proves i creem una partició de tipus Btrfs.

Tutorial

Formatem la partició:

miserver /root# cfdisk /dev/sdb
Disk: /dev/sdb
Size: 15 GiB, 16106127360 bytes, 31457280 sectors
Label: dos, identifier: 0x0a20e307

Device       Boot     Start     Sectors      Size      Id Type        
>> /dev/sdb1 2048     31457279  31455232     15G       83 Linux       

Creem el file system, de tipus Btrfs:

miserver /root# mkfs.btrfs  /dev/sdb1 
btrfs-progs v4.1.2+20151002
See http://btrfs.wiki.kernel.org for more information.

Label:              (null)
UUID:               ffce50d9-ab70-4712-a4d1-8b87b638d655
Node size:          16384
Sector size:        4096
Filesystem size:    15.00GiB
Block group profiles:
 Data:             single            8.00MiB
 Metadata:         DUP               1.01GiB
 System:           DUP              12.00MiB
SSD detected:       no
Incompat features:  extref, skinny-metadata
Number of devices:  1
Devices:
  ID        SIZE  PATH
   1    15.00GiB  /dev/sdb1
miserver /root# 

Muntem el file system i comprovem que és ‘btrfs’:

miserver /root# mkdir /mibtrfs
miserver /root# mount /dev/sdb1  /mibtrfs
miserver /root# mount | grep mibt
/dev/sdb1 on /mibtrfs type btrfs (rw,relatime,space_cache,subvolid=5,subvol=/)
miserver /root#

Cada partició de la qual vulguem mantenir snapshots ha de tenir una configuració pròpia. En iniciar el sistema, no hi ha cap configuració disponible. El sistema ens obliga a tenir una configuració per cada partició sobre la qual vulguem prendre snapshots, perquè poden tenir paràmetres de configuració diferents.

miserver /root# snapper list-configs
Config | Subvolume
-------+----------

Anem a crear una configuració per mantenir els snapshots de la nostra partició /mibtrfs:

miserver /root# snapper -c mibtrfs  create-config /mibtrfs/
miserver /root# snapper list-configs
Config  | Subvolume
--------+----------
mibtrfs | /mibtrfs 
miserver /root#

Donada aquesta configuració, llistem els snapshots disponibles:

miserver /root# snapper -c mibtrfs list
Type   | # | Pre # | Date | User | Cleanup | Description | Userdata
-------+---+-------+------+------+---------+-------------+---------
single | 0 |       |      | root |         | current     |         

Ara creem el primer snapshot:

miserver /root# snapper -c mibtrfs create  --description "snapshot despues de crear el filesystem" 

Tornem a llistar els snapshots disponibles:

miserver /root# snapper -c mibtrfs list
Type   | # | Pre # | Date                     | User | Cleanup | Description                             | Userdata
-------+---+-------+--------------------------+------+---------+-----------------------------------------+---------
single | 0 |       |                          | root |         | current                                 |         
single | 1 |       | Tue Mar 29 17:05:27 2016 | root |         | snapshot despues de crear el filesystem |         
miserver /root# 

Comprovem si hi ha diferències entre el snapshot 1 i l’estat actual, i no n’hi ha, perquè no hi ha hagut activitat al file system.

miserver /root# snapper -c mibtrfs  status 1..0
miserver /root# 

Creem un fitxer i comprovem un altre cop les diferències. Ara, ens apareix el fitxer nou que hem creat.

miserver /root# touch /mibtrfs/PROVA

miserver /root# snapper -c mibtrfs status 1..0
+..... /mibtrfs/PROVA
miserver /root# 
miserver /root# 

Tornem a copiar alguns fitxers més i tornem a comprovar:

cp -a  /usr/lib64/yui/ /mibtrfs/

miserver /root# snapper -c mibtrfs status 1..0
+..... /mibtrfs/PROVA
+..... /mibtrfs/yui
+..... /mibtrfs/yui/libyui-ncurses-pkg.so.7
+..... /mibtrfs/yui/libyui-ncurses-pkg.so.7.0.0
+..... /mibtrfs/yui/libyui-ncurses.so.7
+..... /mibtrfs/yui/libyui-ncurses.so.7.0.0
miserver /root#

Ara creem un snapshot:

miserver /root# snapper -c mibtrfs create --description  "PROVA y  libyui creados" 
miserver /root# snapper -c mibtrfs list
Type   | # | Pre # | Date                     | User | Cleanup | Description                             | Userdata
-------+---+-------+--------------------------+------+---------+-----------------------------------------+---------
single | 0 |       |                          | root |         | current                                 |         
single | 1 |       | Tue Mar 29 17:05:27 2016 | root |      | snapshot despues de crear el filesystem |         
single | 2 |       | Wed Mar 30 10:54:18 2016 | root | PROVA y  libyui creados                          |         

Vegem les diferències entre els 2 snapshots disponibles, i veiem els canvis, que corresponen als fitxers nous. El mateix que si haguéssim fet esborrats i/o modificacions.

miserver /root# snapper -c mibtrfs status 1..0
+..... /mibtrfs/PROVA
+..... /mibtrfs/yui
+..... /mibtrfs/yui/libyui-ncurses-pkg.so.7
+..... /mibtrfs/yui/libyui-ncurses-pkg.so.7.0.0
+..... /mibtrfs/yui/libyui-ncurses.so.7
+..... /mibtrfs/yui/libyui-ncurses.so.7.0.0

Si els canvis no ens interessen, podríem tornar enrere en el temps i restaurar l’estat existent en el snapshot 1:

miserver /root# snapper -c mibtrfs -v undochange 1..2
create:0 modify:0 delete:6
deleting /mibtrfs/yui/libyui-ncurses.so.7.0.0
deleting /mibtrfs/yui/libyui-ncurses.so.7
deleting /mibtrfs/yui/libyui-ncurses-pkg.so.7.0.0
deleting /mibtrfs/yui/libyui-ncurses-pkg.so.7
deleting /mibtrfs/yui
deleting /mibtrfs/PROVA
miserver /root# 

A part dels snapshots que es fan sota demanda, el sistema, a través del cron i fent servir la utilitat snapper, va fent cada hora un snapshot de seguretat, a no ser que ho desactivem explícitament. Vegem els snapshots disponibles després d'unes quantes hores d’activitat:

miserver /etc/cron.daily# snapper -c mibtrfs list
Type   | # | Pre # | Date                     | User | Cleanup  | Description                             | Userdata
-------+---+-------+--------------------------+------+----------+-----------------------------------------+---------
single | 0 |       |                          | root |          | current                                 |         
single | 1 |       | Tue Mar 29 17:05:27 2016 | root |          | snapshot despues de crear el filesystem |         
single | 2 |       | Wed Mar 30 10:54:18 2016 | root |          | PROVA y  libyui creados |         
single | 3 |       | Wed Mar 30 11:30:01 2016 | root | timeline | timeline                                |         
single | 4 |       | Wed Mar 30 12:30:01 2016 | root | timeline | timeline                                |         
single | 5 |       | Wed Mar 30 13:30:01 2016 | root | timeline | timeline                                |         
miserver  /etc/cron.daily#

Hem aplicat els snapshots a una partició d’usuari o de dades. OpenSUSE permet el file system Btrfs a la partició root i /usr, permetent aplicar els beneficis dels snapshots a aquesta partició. Això permet que cada cop que fem un update de sistema o quan fem un manteniment amb resultats desconeguts, puguem fer un snapshot abans del canvi, per després poder tornar a aquest punt de recuperació.

Aplicacions dels snapshots

  • Desfer canvis

    En el tutorial que hem comentat al principi, veiem com desfer canvis. Amb la comanda snapper i l’opció undochange aconseguirem “retornar” a l’estat anterior.

  • Recuperar fitxers de snapshots emmagatzemats

    De la mateixa forma que hem desfet completament els canvis de tot un snapshot, podem recuperar només un fitxer contingut en aquest snapshot.

    snapper -c   diff SNAPSHOT_ID..0 NOMBRE_FICHERO
  • System rollback

    Una vegada comprenem com s’utilitzen els snapshots, la idea és no utilitzar-los manualment, sinó que siguin les aplicacions les que ho utilitzin.

    Per exemple, instal·lant snapper-zypp-plugin aconseguirem que zypper, quan instal·li algun paquet, ens faci un snapshot abans de la instal·lació, per poder tornar enrere en cas que s’hagi desconfigurat alguna cosa.

    Els snapshots en la partició root previndran problemes d’arrencada. Imaginem que esborrem el fitxer /bin/bash, en aquest cas el sistema no bootara. Si hem pres la precaució de fer un snapshot abans de l’esborrat, podrem bootar fent servir aquest snapshot.
    La seqüència seria:

    snapper create --description "estado correcto” --print-number
    35
    rm /bin/bash
        

    El sistema bootarà correctament.

    Al bootar, afegirem el següent paràmetre al kernel:

    rootflags=subvol=.snapshots/35/snapshot

    El sistema botará correctamente.

    Un com engegat, executarem snapper rollback, per fer efectiu el canvi i ja podrem rebootar normalment.

  • Crear snapshots manualment

    La utilitat principal dels snapshots, és quan es fan en la partició root (/), per tenir historia en els directoris /etc, i també quan els connectem a la utilitat d’instal·lació de paquets, zypper.

    És a dir, usats com a punt de recuperació a un estat conegut, quan ens disposem a realitzar canvis.

    D’altra banda, podem usar-los per tenir un backup de fitxers en les particions d’usuari. Aquesta afirmació cal matisar-la. No és realment un backup, que ens protegeix de si es corromp el file system o el medi. Ens protegeix davant pèrdues de fitxer per part de l’usuari.
    Per tant, un snapshot diari de la partició d’usuaris, ens permet poder recuperar ràpidament, un fitxer a data d’ahir. Si guardem els 2 últims snapshots, tindrem una memòria de 2 dies.

    Cal tenir en compte que el snapshot, una vegada realitzat no consumeix espai de disc, solament es treballa amb punters. El snapshot anirà creixent sobre la base del nombre de fitxers que es canviïn.

    Un cicle útil de snapshots, seria guardar 7 snapshots un per dia i reciclar-los a la setmana següent. Això, reforçat amb un backup setmanal total. Però, recordem que el snapshot s’emmagatzema en la mateixa partició, de tal forma que, si es corromp la partició, el snapshot ja no seria accessible, i no podrem recuperar.

Conclusió

Les noves versions de les distribucions, entre elles, openSUSE 13.2, openSUSE Leap 42.1 i Ubuntu 14 entre d’altres, ens ofereixen la possibilitat de treballar de forma nativa amb el file system Btrfs. Aquest sistema, que fa servir la funcionalitat de “copy-on-write”, permet realitzar snapshots d’una forma molt eficient i robusta. Un snapshot ens ofereix un punt de recuperació al qual tornar quan el sistema ha arribat a un punt erroni.

En el futur immediat, caldrà tenir en compte aquest sistema per saber aprofitar-lo al màxim. També el file system Btrfs, disposa d’altres funcionalitats que s’hauran d’aprofitar, com són els subvolumes. D’altra banda, ha de quedar clar que el snapshot no substitueix a l’eina de backup, únicament la completa.

 

Segueix-nos a

Els nostres articles del bloc d'inLab FIB

         
         

inLab FIB incorpora esCert

Icona ESCERT

inLab és membre de