Benutzer-Werkzeuge

Webseiten-Werkzeuge


Writing /srv/www/htdocs/udo/singollo.de/linux.singollo.de/public_html/data/cache/0/01640b2edf1168d6a1d5435c21a31971.metadata failed
scripts:filesystems

Scripte rund um Filesysteme

btrfs

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:

  • erweiterter Speicherbereich (264 Byte)
  • effizientes Speichern von kleinen Dateien und Ordnern
  • dynamische Inodes
  • Schnappschüsse
  • mehrere Wurzelverzeichnisse (Subvolume)
  • integriertes RAID, Spiegelung und Aneinanderhängen von Objekten (RAID 0, RAID 1 und RAID 10)
  • Prüfsummen
  • Datenkompression
  • Dateisystemüberprüfung und -Defragmentierung während des Betriebs
  • effizientes internes inkrementelles Backup

(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.)

snapper

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

cleanup

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
scripts/filesystems.txt · Zuletzt geändert: 27.07.2013 10:54 von udo