Tips en Trucs 2015

BTRFS, snapshots en schijfruimte

Standaard worden vele bestandsbewerkingen in een BTRFS bestandssysteem in zogenaamde snapshots opgenomen. Met snapshots kan je het bestandssysteem naar een eerdere samenstelling herstellen. Aanvankelijk nemen snapshots geen extra ruimte op de harde schijf in, maar hoe meer je werkt, hoe meer bestanden op uw systeem aangepast worden. Deze aanpassingen komen in een snapshot terecht en gaandeweg wordt de ruimte die door snapshots wordt ingenomen groter en groter. Deze handige functie (terug keren in de tijd) is een verbetering t.o.v. bestandssystemen zoals Ext4. Op een kleine partitie of harde schijf, kunnen snapshots alle beschikbare ruimte in beslag nemen, waardoor het systeem onbruikbaar wordt. Je kunt dan drastisch het snapshot systeem uitschakelen en deze nuttige functie overboord gooien. Of je kunt als je schuifruimte op de harde schijf te beperkt wordt, snapshots opruimen om meer beschikbare ruimte op de harde schijf vrij te maken.

Vaststellen

Op een grafisch systeem kan je eenvoudig de beschikbare harde schijf ruimte volgen met de widget Ruimtegebruik van de harde schijf.
Widget Ruimtegebruik van de harde schijf

In de terminal gebruik je de df (DiskFree) opdracht:

dany@linux-u6r3:~> df -h
Bestandssysteem Grootte Gebruikt Besch Geb% Aangekoppeld op
/dev/sda8          174G      34G  140G  20% /
devtmpfs           7,9G        0  7,9G   0% /dev
tmpfs              7,9G      88K  7,9G   1% /dev/shm
tmpfs              7,9G     2,4M  7,9G   1% /run
tmpfs              7,9G        0  7,9G   0% /sys/fs/cgroup
/dev/sda2          356M      38M  319M  11% /boot/efi
/dev/sda4          270G     113G  158G  42% /windows/C
/dev/sda8          174G      34G  140G  20% /tmp
/dev/sdb2          200G     178G   23G  89% /media/NTFS
/dev/sda8          174G      34G  140G  20% /boot/grub2/x86_64-efi
/dev/sda8          174G      34G  140G  20% /.snapshots
/dev/sda8          174G      34G  140G  20% /var/tmp
/dev/sda8          174G      34G  140G  20% /var/spool
/dev/sda8          174G      34G  140G  20% /var/opt
/dev/sda8          174G      34G  140G  20% /var/lib/pgsql
/dev/sda8          174G      34G  140G  20% /var/log
/dev/sda8          174G      34G  140G  20% /var/lib/named
/dev/sda8          174G      34G  140G  20% /var/lib/mailman
/dev/sda8          174G      34G  140G  20% /var/crash
/dev/sda8          174G      34G  140G  20% /usr/local
/dev/sda8          174G      34G  140G  20% /srv
/dev/sda8          174G      34G  140G  20% /opt
/dev/sda8          174G      34G  140G  20% /home
/dev/sdb1          720G     449G  235G  66% /usr/home/Documents
/dev/sda8          174G      34G  140G  20% /boot/grub2/i386-pc

De root van het systeem (/dev/sda8) heeft nog 140G ruimte beschikbaar, slechts 34G of 20% van de partitie is in gebruikt. Dit lijkt weinig, maar is voor een Linux systeem aanzienlijk.

Snapshots opruimen

BTRFS snapshots beheer met btrfs terminal opdrachten of met Snapper, een handige en eenvoudig te gebruiken YaST module uit de categorie Diversen.
YaST Snapper

Vanzelfsprekend kan dit ook in een terminal:
Snapper in de terminal

De rest is kinderspel, selecteer elke snapshot en wis deze met de knop Verwijderen.

Indien na het verwijderen van de snapshots geen extra harde schijfruimte vrijkomt, dan is er te weinig ruimte om de verwijder opdracht uit te voeren. In zo'n geval wordt de vrijgemaakte ruimte pas beschikbaar na het herstarten van de computer.

dany@linux-u6r3:~> df -h     
Bestandssysteem Grootte Gebruikt Besch Geb% Aangekoppeld op
/dev/sda8          174G      29G  144G  17% /
devtmpfs           7,9G        0  7,9G   0% /dev
tmpfs              7,9G      96K  7,9G   1% /dev/shm
tmpfs              7,9G     2,4M  7,9G   1% /run
tmpfs              7,9G        0  7,9G   0% /sys/fs/cgroup
/dev/sda2          356M      38M  319M  11% /boot/efi
/dev/sda4          270G     113G  158G  42% /windows/C
/dev/sda8          174G      29G  144G  17% /tmp
/dev/sdb2          200G     178G   23G  89% /media/NTFS
/dev/sda8          174G      29G  144G  17% /boot/grub2/x86_64-efi
/dev/sda8          174G      29G  144G  17% /.snapshots
/dev/sda8          174G      29G  144G  17% /var/tmp
/dev/sda8          174G      29G  144G  17% /var/spool
/dev/sda8          174G      29G  144G  17% /var/opt
/dev/sda8          174G      29G  144G  17% /var/lib/pgsql
/dev/sda8          174G      29G  144G  17% /var/log
/dev/sda8          174G      29G  144G  17% /var/lib/named
/dev/sda8          174G      29G  144G  17% /var/lib/mailman
/dev/sda8          174G      29G  144G  17% /var/crash
/dev/sda8          174G      29G  144G  17% /usr/local
/dev/sda8          174G      29G  144G  17% /srv
/dev/sda8          174G      29G  144G  17% /opt
/dev/sda8          174G      29G  144G  17% /home
/dev/sdb1          720G     449G  235G  66% /usr/home/Documents
/dev/sda8          174G      29G  144G  17% /boot/grub2/i386-pc

In bovenstaande geval werd 3% beschikbare ruimte vrijgegeven. In absolute cijfers heb ik echter 5 GB ruimte vrijgemaakt. Deze 5 GB schijfruimte werd door BTRFS snapshot's gebruikt na anderhalve maand werken op het systeem. M.a.w. in anderhalve maand nam enkel door het gebruik van BTRFS snapshots de gebruikte harde schijfruimte met meer dan 15% toe. Kleine harde schijven of partities raken zo in geen tijd vol.

Snapshots opruimen met behulp van scripts

Met de volgende opdracht wordt een overzicht van de BTRFS snapshots weergegeven:

dany@linux-oj7m:~> sudo snapper list
Type   | #  | Pre # | Datum                       | Gebruiker | Opschonen | Beschrijving  | Gebruikersgegevens
-------+----+-------+-----------------------------+-----------+-----------+---------------+-------------------
single | 0  |       |                             | root      |           | current       |                   
pre    | 1  |       | do 01 jan 2015 14:49:32 CET | root      | number    | zypp(zypper)  | important=yes     
post   | 2  | 1     | do 01 jan 2015 15:00:28 CET | root      | number    |               | important=yes     
pre    | 3  |       | do 01 jan 2015 15:01:34 CET | root      | number    | zypp(zypper)  | important=no      
post   | 4  | 3     | do 01 jan 2015 15:02:03 CET | root      | number    |               | important=no      
pre    | 5  |       | za 28 feb 2015 14:13:37 CET | root      | number    | zypp(zypper)  | important=yes     
post   | 6  | 5     | za 28 feb 2015 14:25:43 CET | root      | number    |               | important=yes     
pre    | 7  |       | za 28 feb 2015 14:42:55 CET | root      | number    | zypp(zypper)  | important=no      
post   | 8  | 7     | za 28 feb 2015 14:42:56 CET | root      | number    |               | important=no      
pre    | 9  |       | za 28 feb 2015 14:42:58 CET | root      | number    | zypp(zypper)  | important=no      
post   | 10 | 9     | za 28 feb 2015 14:43:00 CET | root      | number    |               | important=no      
pre    | 11 |       | za 28 feb 2015 14:43:01 CET | root      | number    | zypp(zypper)  | important=no      
post   | 12 | 11    | za 28 feb 2015 14:43:03 CET | root      | number    |               | important=no      
pre    | 13 |       | za 28 feb 2015 14:43:08 CET | root      | number    | yast firewall |                   
post   | 14 | 13    | za 28 feb 2015 14:43:09 CET | root      | number    |               |                   
pre    | 15 |       | za 28 feb 2015 14:43:12 CET | root      | number    | zypp(zypper)  | important=no      
post   | 16 | 15    | za 28 feb 2015 14:43:26 CET | root      | number    |               | important=no      
pre    | 17 |       | za 28 feb 2015 14:43:27 CET | root      | number    | zypp(zypper)  | important=no      
post   | 18 | 17    | za 28 feb 2015 14:43:34 CET | root      | number    |               | important=no      
pre    | 19 |       | za 28 feb 2015 14:44:18 CET | root      | number    | zypp(zypper)  | important=yes     
post   | 20 | 19    | za 28 feb 2015 14:44:41 CET | root      | number    |               | important=yes     
pre    | 21 |       | za 28 feb 2015 14:44:51 CET | root      | number    | zypp(zypper)  | important=no      
post   | 22 | 21    | za 28 feb 2015 14:45:10 CET | root      | number    |               | important=no      
pre    | 23 |       | za 28 feb 2015 14:45:13 CET | root      | number    | zypp(zypper)  | important=no      
post   | 24 | 23    | za 28 feb 2015 14:45:14 CET | root      | number    |               | important=no      
pre    | 25 |       | za 28 feb 2015 14:45:15 CET | root      | number    | yast firewall |                   
post   | 26 | 25    | za 28 feb 2015 14:45:16 CET | root      | number    |               |

Elke snapshot heeft zijn eigen ID (in het voorbeeld hierboven van ID 0 tot en met 26). Met de volgende opdracht wis je alle snapshots met ID's tussen 1 en 999. In ons geval veel te veel, maar bij een poging om een snapshot met een onbestaande ID te wissen, krijg je enkel een onschuldige foutmelding. Het snapshot met het ID 0 wis je nooit, want dit is uw huidig systeem.

dany@linux-oj7m:~> su -c 'for i in `seq 1 999`; do snapper delete $i; done'          
Wachtwoord:
Ongeldige momentopname.
Ongeldige momentopname.
Ongeldige momentopname.
Ongeldige momentopname.
Ongeldige momentopname.
...