Das btrfs (B-tree FS; auch alternativ „Butter FS“ oder „Better FS“) ist ein Copy-On-Write-Dateisystem. Btrfs weist zahlreiche Gemeinsamkeiten mit ZFS auf. Es soll vor allem auch Funktionen bieten, die es vom derzeitigen Linux-Standard ext3/ext4, aber auch von anderen Dateisystemen wie XFS oder JFS abheben, hierunter fallen:
(Quelle: http://de.wikipedia.org/wiki/Btrfs)
Die automatischen Snapshots können allerdings auch sehr schnell dazu führen, das der Speicherplatz auf dem Datenträger zur Neige geht. Der interne Cleaner sorgt zwar für einige Ordnung, aber die Snapshots werden nicht immer als committed angesehen bzw. sind noch nicht alt genug zum Löschen (vereinfacht dargestellt). Mit den vom openSUSE-Team entwickelten Tool snapper lassen sich diese Snapshots löschen. Normalerweise geschieht dies per cronjob, aber manchmal muss es dann doch schneller gehen
(Anmerkung des Autors: Das integrierte Raid habe ich noch nicht ausgetestet, obwohl ich ein RAID 1 als zusätzlichen Speicherplatz betreibe. Hier kommt noch das Software-RAID des Kernels zum Zuge, auf das ein btrfs aufgesetzt wurde.)
Zuerst listet man die verfügbaren Konfigurationen (siehe auch /etc/snapper/configs/*) auf und wählt anschliessend das zu bearbeitende System.
snapper list-configs
Fehlt bei der Auflistung das gewünschte „Device“, weil man eine neue Partition ohne YaST erstellt hat, so muss man die Konfiguration per Hand erzeugen. Hier nehme ich mal an, es gäbe ein unter /srv/raid eingehängtes btrfs-Dateisystem.
snapper --config raid create-config /srv/raid
Hat man mehrere btrfs-Partitionen erstellt, kann man mit folgender Zeile die Konfigurationen automatisch erzeugen lassen. Existiert bereits eine Konfiguration, bricht snapper mit einer Fehlermeldung ab.
for fs in `mount | grep "btrfs" | gawk '{print $3}'`; do fs2=`echo $fs | gawk -F\/ '{print $3;}'` ; if test $fs='/'; then snapper --config root create-config "$fs" ; else snapper --config $fs2 create-config $fs ; fi; done; unset fs; unset fs2
Nehmen wir mal an wir wollten das Root-Verzeichnis bereinigen, so übergeben wir snapper die passende Konfiguration mit „-c root“. Bei der Installation mit YaST hat openSUSE die passende Konfigurationsdatei automatisch erstellt.
for cl in `snapper -c root list | gawk -F\| '{printf "%d\n",$2;}'`; do if [ $cl != "0" ]; then echo "delete snapshot $cl"; snapper -c root delete $cl; fi; done; unset cl
Damit man allerdings nicht jedesmal den Parameter -c doppelt angeben muss, setzt man einfach eine Variable und löscht sie nach Gebrauch wieder. Hier verwende ich $SNAP.
SNAP=root; for cl in `snapper -c $SNAP list | gawk -F\| '{printf "%d\n",$2;}'`; do if [ $cl != "0" ]; then echo "delete snapshot $cl"; snapper -c $SNAP delete $cl; fi; done; unset cl; unset SNAP
Falls man mehrere Btrfs-Systeme nutzt - der Autor hat zwei - so lässt sich das noch ein bisschen bequemer handhaben.
for SNAP in root foo1 foo2; do echo "using $SNAP";for cl in `snapper -c $SNAP list | gawk -F\| '{printf "%d\n",$2;}'`; do if [ $cl != "0" ]; then echo "delete snapshot $cl"; snapper -c $SNAP delete $cl; fi; done; unset cl; done; unset SNAP
Da ich derzeit die Snapshots nicht benötige und sie mir immer mal wieder die SSD komplett vollschreiben, lasse ich diese direkt beim Booten (/etc/init.d/boot.local) löschen. openSUSE enthält zwar auch ein per cron gestartetes Script, aber bisher habe ich keine Wirkung desselben bemerkt.
#! /bin/sh # # Copyright (c) 2002 SuSE Linux AG Nuernberg, Germany. All rights reserved. # # Author: Werner Fink, 1996 # Burchard Steinbild, 1996 # # /etc/init.d/boot.local # # script with local commands to be executed from init on system startup # # Here you should add things, that should happen directly after booting # before we're going to the first run level. # . /etc/rc.status rc_reset # Udo Neist, 27.07.2013 if [ $(grep -c "btrfs" /etc/fstab) -gt 0 ]; then # Check for missing binaries (stale symlinks should not happen) SNAPPER=/usr/bin/snapper test -x $SNAPPER || exit 1 # Config SNAPPER_CONFIGS=$(ls /etc/snapper/configs) # Escape sequences esc=`echo -en "\033"` color="${esc}[1;34m" norm="${esc}[m\017" # Script echo "Cleaning up snapshots from btrfs-partitions" for SNAP in $SNAPPER_CONFIGS do echo -en "${esc}${color}using config: $SNAP${norm}\n" for cl in $($SNAPPER -c $SNAP list | gawk -F\| '{printf "%d\n",$2;}') do if [ $cl != "0" ]; then #echo "delete snapshot $cl" $SNAPPER -c $SNAP delete $cl fi done unset cl done unset SNAP rc_status fi