Btrfs / snapper und Tools

Über dieses Datei-System und seine Tools wird ja viel geredet und spekuliert, ich möchte heute ein bißchen Praktisches und Kommandos zeigen und was man im Alltag gut brauchen kann.
Vorraussetzung ist das das Paket btrfs-procs und Abhängigkeiten installiert sind, das ist auch schon alles.
man btrfs zeigt die Möglichkeiten von btrfs und die Optionen/Schalter die es gibt.
Partitionen und UUID’s kann man so anschauen:
root:~ # btrfs filesystem show /      -> oder  abgekürzt btrfs fi sh /
Label: none uuid: 957ad303-786f-4456-95b6-1942e5d1943d
Total devices 1 FS bytes used 23.90GiB
devid 1 size 40.00GiB used 26.63GiB path /dev/sda2

————————
Speicherplatz-Belegung:
root ~ # btrfs fi df /
Data, single: total=23.01GiB, used=22.75GiB
System, DUP: total=64.00MiB, used=16.00KiB
Metadata, DUP: total=1.75GiB, used=1.14GiB
GlobalReserve, single: total=400.00MiB, used=0.00B

————————
btrfs scrub start /
liest alle Daten vom Root Filesystem und verifiziert / prüft die Checksum der Dateien im Filesystem
btrfs scrub status /
gibt den derzeitigen Status von scrub ob es Fehler in den Checksums gibt z.B.
scrub status for 957ad303-786f-4456-95b6-1942e5d1943d
scrub started at Tue Apr 5 13:35:17 2016 and finished after 00:04:16<
total bytes scrubbed: 25.03GiB with 0 errors

————————
Es gibt noch mehr Schalter z.B subvolume mit dem Subvolumes aufgelistet erzeugt werden können.
root:~ # btrfs subvolume list /
ID 257 gen 115 top level 5 path @
ID 258 gen 13814 top level 257 path @/.snapshots
ID 259 gen 13839 top level 258 path @/.snapshots/1/snapshot
ID 260 gen 4138 top level 257 path @/boot/grub2/i386-pc

————————
So kommen wir jetzt mal zu Snapper (Snapshot-Tool)
http://snapper.io/
Snapper wird bei SLES (SUSE) oder openSUSE automatisch mit installiert fürs Root-Dateisystem aktiviert, so das sofortige Änderungen am System als neuer Snapshot gespeichert werden. Diese werden normalerweise unter „/.snapshots/0 angelegt.
Für andere Linux-Distributionen wie Debian und Fedora muss wahrscheinilich installiert werden.
root:~ # snapper list
Type | # | Pre # | Date | User | Cleanup | Description | Userdata
-------+-----+-------+--------------------------+------+---------+-----------------------+--------------
single | 0 | | | root | | current |
single | 1 | | Fri Mar 4 13:01:15 2016 | root | | first root filesystem |
single | 2 | | Fri Mar 4 13:14:12 2016 | root | number | after installation | important=yes
pre | 3 | | Fri Mar 4 13:25:06 2016 | root | number | zypp(zypper) | important=yes
post | 4 | 3 | Fri Mar 4 14:00:49 2016 | root | number | | important=yes

————————
Konfig anschauen:
root:~ # 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

Eine tolle ausführliche Beschreibung zu weiteren Funktionen gibt’s auf:
https://en.opensuse.org/openSUSE:Snapper_Tutorial
————————
Schönste Funktion: ROLLBACK
mit snapper rollback snapshotnumber kann man das System auf einen älteren Stand zurücksetzen..
Falls ein Update oder andere System-Probleme z.b nach einer Paket-Installation  (Kernel) fehlschlägt oder das System nicht mehr  funktionstüchig ist, kann man auf den letzten Snapshot, das System wieder auf den Stand vor dem Fehler  zurückdrehen.
Es wird vor dem Rollback noch ein Snapshot von dem „aktuellen Stand”(defeketen) gemacht und dann auf dem gewünschten Snapshot zurückgerollt.
Diese Rollback-Funktion geht nur mit dem BTRFS Datei-System und nur beim Root-Filesystem.
Es ist auch möglich von einer anderen Partition z.B. /home einen Snapper -Config zu erstellen um so automatische Snappschüsse von Home-Verzeichnis zu erhalten.
snapper -c home create-config /home
Um Dateien von einem älteren Snapshot vom /home/.snapshots/1/.. zu bekommen, muss man sich den Snapshot mounten:

mount -o subvolid=XY /dev/sdXY /mnt/

Die subvolid bekommt man durch:
root:~ # btrfs subvolume list /
ID 257 gen 115 top level 5 path @

————————
Unterschiede von zwei Snapshots:
root:~ # snapper diff 3..4 | head
Binary files /.snapshots/3/snapshot/bin/tar and /.snapshots/4/snapshot/bin/tar differ
--- /.snapshots/3/snapshot/boot/.vmlinuz-4.1.15-8-default.hmac 1970-01-01 01:00:00.000000000 +0100
+++ /.snapshots/4/snapshot/boot/.vmlinuz-4.1.15-8-default.hmac 2016-01-21 10:52:47.000000000 +0100
@@ -0,0 +1 @@
+e8eaf8b2f82bb5549f9be63183feeb09ae6e5f87d737c56ee7d00d38cfa882d6
--- /.snapshots/3/snapshot/boot/System.map-4.1.15-8-default 1970-01-01 01:00:00.000000000 +0100
+++ /.snapshots/4/snapshot/boot/System.map-4.1.15-8-default 2016-01-21 10:03:17.000000000 +0100
@@ -0,0 +1,74925 @@
+0000000000000000 D __per_cpu_start
+0000000000000000 V irq_stack_union

Welche Dateien zwischen Snapshots hinzugekommen sind:
root:~ # snapper status 3..4 | head
c..... /bin/tar
+..... /boot/.vmlinuz-4.1.15-8-default.hmac
+..... /boot/System.map-4.1.15-8-default
+..... /boot/config-4.1.15-8-default
+..... /boot/do_purge_kernels
c..... /boot/grub2/grub.cfg
c..... /boot/initrd
c..... /boot/initrd-4.1.12-1-default
+..... /boot/initrd-4.1.15-8-default
+..... /boot/symvers-4.1.15-8-default.gz

————————
Löschen von Snapshots:
snapper delete 25
snapper delete  25-30  -> löscht snapshots 25 bis 30
Ich persönlich finde das Tool Klasse, es hat mir schon mal sehr wichtige Daten gerettet.
Giv’ em a try!!

Johannes Carraro
Johannes Carraro
Support Engineer

Bevor Johannes bei NETWAYS anheuerte war er knapp drei Jahre als Systemadministrator in Ansbach tätig. Seit Februar 2016 verstärkt er nun unser Managed Services Team als Systems Engineer. In seiner Freizeit spielt Johannes E-Gitarre in einer Metalband, bastelt an Linux Systemen zuhause herum und ertüchtigt sich beim Tischtennisspielen im Verein, bzw. Mountainbiken, Inlinern und nicht zuletzt Skifahren.

check_disk_btrfs reloaded

While BTRFS is still considered experimental in some environments, it gets even more popular with Docker and CoreOS setups.
I did write a check plugin for a customer nearly 3 years ago called check_disk_btrfs which parses the output of “btrfs filesystem df /” and checks against given thresholds.
Over the years, the shell output of the the btrfs cli tool changed and so the plugin was broken. Code quality wasn’t good enough either in a retrospective and so additional feature requests were not added.
opensuse_icingaweb2_disk_btrfsOn Monday Blerim approached me with a question on monitoring the BTRFS filesystem and also told that the plugin was broken. Instead of fixing the old Perl code, I decided to just go for a new implementation in Python, our current language standard for development projects. It also makes usage of “sudo” optional, and parses the raw bytes output returned from the btrfs cli tool. An example for adding it to Icinga 2 is included as well.
You can download the current 2.0.0 release from Icinga Exchange, and of course sponsor or contribute a feature even. Tested on current OpenSUSE 13.2.

Michael Friedrich
Michael Friedrich
Senior Developer

Michael ist seit vielen Jahren Icinga-Entwickler und hat sich Ende 2012 in das Abenteuer NETWAYS gewagt. Ein Umzug von Wien nach Nürnberg mit der Vorliebe, österreichische Köstlichkeiten zu importieren - so mancher Kollege verzweifelt an den süchtig machenden Dragee-Keksi und der Linzer Torte. Oder schlicht am österreichischen Dialekt der gerne mit Thomas im Büro intensiviert wird ("Jo eh."). Wenn sich Michael mal nicht in der Community helfend meldet, arbeitet er am nächsten LEGO-Projekt oder geniesst...

Weekly Snap: Responsive Web, BTRFS Plugin & Cloud Expo Europe

weekly snap28 January – 1 February turned over a new month with new buzzwords in web development, a new monitoring plugin and a trip to Cloud Expo Europe.
Sebastian reported back from the Cloud Expo Europe 2013 in London, as Bernd started his presentation on OpenNebula.
Jannis then explained the latest buzz-term ‘Responsive Web”, while Michael F shared his Icinga/Nagios plugin to monitor BTRFS file systems.
Finally, Eva counted 79 days till the OSDC with Kris Buytaert’s presentation on “Devops and Open Source”.

Überwachung von BTRFS Filesystemen

Grüss Gott beisammen, ich bin dann auch mal hier 🙂
In einem Kundenprojekt gehts dann auch gleich zur Sache: BTRFS gilt zwar als experimentiell, aber es gibt dennoch Setups, in denen BTRFS bereits als Filesystem verwendet wird. In OpenSUSE 12.2 gibt es BTRFS in einer verbesserten Fassung, und so ist es auch nicht verwunderlich, dass die Anforderung an ein entsprechendes Check Plugin gestellt wurde.
Das eigentliche Problem hierbei ist, dass der systemeigene df Befehl die BTRFS spezifischen Werte nicht kennt, und ebenso nicht ausgibt. Erst mit btrfs filesystem df / lässt sich beispielsweise ermitteln, dass nicht das eigentliche Filesystem vollgelaufen ist, sondern die Snapshots im Hintergrund zu 100% dicht sind, und sich deswegen nichts mehr auf die Platte schreiben lässt.
Da es im Monitoring Umfeld noch keine geeigneten Plugins gibt, habe ich ein Basisplugin in Perl programmiert, das den Output von btrfs filesystem df / parsen kann, sowie daraus die Werte extrahiert, die dann mit globalen Thresholds verglichen werden sollen. Das ist mitunter nicht ganz trivial, da die Ausgabe dieses Befehls einen kunterbunten Mix aus KB, MB und GB ausspuckt, den man in mathematisch logische Bytes zur weiteren Berechnung zerlegen muss. Alles andere ist aber Standardpluginkost und sollte jedem die Möglichkeit eröffnen, die eigenen BTRFS Filesystemfunktionalitäten neben den obligatorischen df Checks (zB check_disk) zu überwachen.
Um die BTRFS Werte auslesen zu können, werden Root Privilegien benötigt. Da der Icinga Core die Checks als Icinga Benutzer durchführt, muss diesem Benutzer das passwortlose sudo für den Befehl /usr/sbin/btrfs filesystem df /* eingeräumt werden. Achtung: /usr/sbin/btrfs ist zu wenig eingeschränkt – damit könn(t)en als Icinga Benutzer alle BTRFS Einstellungen manipuliert werden!

# visudo
icinga ALL=(ALL) NOPASSWD: /usr/sbin/btrfs filesystem df /*

Auch wenn der Icinga Benutzer keine Shell zur Verfügung hat, kann das Plugin mit diesem Befehl als root getestet werden:

# sudo -u icinga /usr/local/icinga/libexec/check_disk_btrfs -f / -w 50 -c 80
WARNING: btrfs "Data" 62.87% used (1.05GB/1.67GB) OK: "System, DUP" 0.05% used (4.00KB/8.00MB), "System" 0.00% used (0.00/4.00MB), "Metadata, DUP" 19.30% used (90.48MB/468.75MB), "Metadata" 0.00% used (0.00/8.00MB) | data_used=1127428915;50;80;; data_total=1793148846;50;80;; system_dup_used=4096;50;80;; system_dup_total=8388608;50;80;; system_used=0;50;80;; system_total=4194304;50;80;; metadata_dup_used=94875156;50;80;; metadata_dup_total=491520000;50;80;; metadata_used=0;50;80;; metadata_total=8388608;50;80;;

Das Plugin befindet sich in seiner ersten Version im GIT Repository auf git.netways.org – bitte um Tests, Feedback und Anregungen.
Für das Plugin selbst gilt dasselbe wie für das BTRFS Filesystem – experimentell in der ersten Version 🙂

Michael Friedrich
Michael Friedrich
Senior Developer

Michael ist seit vielen Jahren Icinga-Entwickler und hat sich Ende 2012 in das Abenteuer NETWAYS gewagt. Ein Umzug von Wien nach Nürnberg mit der Vorliebe, österreichische Köstlichkeiten zu importieren - so mancher Kollege verzweifelt an den süchtig machenden Dragee-Keksi und der Linzer Torte. Oder schlicht am österreichischen Dialekt der gerne mit Thomas im Büro intensiviert wird ("Jo eh."). Wenn sich Michael mal nicht in der Community helfend meldet, arbeitet er am nächsten LEGO-Projekt oder geniesst...