(0)
Artikel
bewerten
(100% positiv)
(6)

BTRFS Dateisystem Befehle Beginner - Überblick

Überblick über BTRFS Befehle

Inhalt dieses Artikels:

    Aufgrund zusätzlicher Möglichkeiten, wie Snapshots und Filesystemraid, hab ich mich bei meinem Heimrechner für das Dateisystem BTRFS entschieden. Hier eine kurze Zusammenfassung der wichtigsten Befehle

    Dateisystem anlegen

    Nachdem ich mit GParted zwei gleich große Partitionen, auf zwei verschiedenen Laufwerken erstellt habe, konnte ich mit folgenden Befehl das Dateisystem anlegen:

    sudo mkfs.btrfs -d raid1 /dev/sdc2 /dev/sdd1 -f

    WARNING! - Btrfs v3.12 IS EXPERIMENTAL
    WARNING! - see http://btrfs.wiki.kernel.org before using
    Turning ON incompat feature 'extref': increased hardlink limit per file to 65536
    adding device /dev/sdd1 id 2
    fs created label (null) on /dev/sdc2
    nodesize 16384 leafsize 16384 sectorsize 4096 size 2.73TiB
    Btrfs v3.12

    Dateisystem anzeigen

    sudo btrfs filesystem show /dev/sdc2

    sudo btrfs filesystem show /dev/sdc2
    Label: none uuid: ????????-????-????-????-??????????
    Total devices 2 FS bytes used 112.00KiB
    devid 1 size 1.36TiB used 2.03GiB path /dev/sdc2
    devid 2 size 1.36TiB used 2.01GiB path /dev/sdd1

    Speicherplatzbelegung anzeigen

    sudo btrfs filesystem usage /daten

    hier ein Beispiel mit 3 unterschiedlich-großen Disken RAID1: 3TB, 4TB und 2 TB; die 2TB Disk wurde zuletzt hinzugefügt:

     sudo btrfs filesystem usage /daten
    Overall:
    Device size: 8.19TiB
    Device allocated: 5.24TiB
    Device unallocated: 2.94TiB
    Device missing: 0.00B
    Used: 5.19TiB
    Free (estimated): 1.50TiB (min: 1.50TiB)
    Data ratio: 2.00
    Metadata ratio: 2.00
    Global reserve: 512.00MiB (used: 0.00B)

    Data,RAID1: Size:2.61TiB, Used:2.58TiB
    /dev/sdc 2.61TiB
    /dev/sdd 2.21TiB
    /dev/sde 407.00GiB

    Metadata,RAID1: Size:15.00GiB, Used:13.55GiB
    /dev/sdc 15.00GiB
    /dev/sdd 8.00GiB
    /dev/sde 7.00GiB

    System,RAID1: Size:32.00MiB, Used:416.00KiB
    /dev/sdc 32.00MiB
    /dev/sde 32.00MiB

    Unallocated:
    /dev/sdc 1.02TiB
    /dev/sdd 523.52GiB
    /dev/sde 1.41TiB

    Dateisystem mounten

    sudo mkdir /daten

    sudo mount /dev/sdc2 /daten

     

    permanentes Mounten, durch Eintrag in der fstab:

    UUID=????????-????-????-????-???????????? /daten btrfs defaults,subvol=@,compress,autodefrag 0 1

    Version auslesen: BTRFS Version auslesen: 

    btrfs fi show

     

     

    Raid Level ändern:

    sudo btrfs balance start -mconvert=raid1 -dconvert=raid1 /daten

    Done, had to relocate 6 out of 6 chunks

    Disk hinzufügen

    Sollte zu wenig Platz auf dem Volume sein, kann jederzeit eine zusätzliche Disk hinzugefügt werden:

    sudo btrfs device add -f /dev/sda /daten

    Nach dem Hinzufügen einer zusätzlichen Disk muss ein Rebalance ausgeführt werden, damit die Daten neu verteilt werden, siehe Balance 

     

    Subvolume

    Subvolume erstellen

    sudo btrfs subvolume create /daten/BEZEICHNUNG 

    Subvolume anzeigen

    sudo btrfs subvolume list /daten

    Subvolume löschen

    sudo btrfs subvolume delete /daten/BEZEICHNUNG

    Balance

    Neuaufteilen der Dateichunks nach einer Änderung der Konfig

    sudo btrfs balance /daten

    Ohne Filter dauert ein Balance sehr lange, der Status kann mit folgendem Befehl angezeigt werden:

    sudo btrfs balance status /daten

     

    Balance pausieren: sudo btrfs balance pause /daten

    Ein bereits gestartetes Balance wieder ausführen: sudo btrfs balance resume /daten

    Filesystem überprüfen und Fehler beheben: Scrub

    Device Status

    BTRFS Fehler können mit folgendem Befehl angezeigt werden:

    sudo btrfs device status

    Sollten hier Fehler angezeigt werden, empfiehlt es sich ein btrfs scrub auszuführen: 

    sudo btrfs device stats /daten
    [/dev/sdc].write_io_errs 2053
    [/dev/sdc].read_io_errs 377
    [/dev/sdc].flush_io_errs 29
    [/dev/sdc].corruption_errs 57
    [/dev/sdc].generation_errs 7
    [/dev/sdd].write_io_errs 0
    [/dev/sdd].read_io_errs 0
    [/dev/sdd].flush_io_errs 0
    [/dev/sdd].corruption_errs 1667845
    [/dev/sdd].generation_errs 0
    [/dev/sdb].write_io_errs 1051499
    [/dev/sdb].read_io_errs 131904
    [/dev/sdb].flush_io_errs 0
    [/dev/sdb].corruption_errs 0
    [/dev/sdb].generation_errs 7378

    Nur Fehler anzeigen: btrfs device stats /daten | grep -vE ' 0$'

    Scrub

    Der Befehl Scrub prüft mittels Checksumme ob die Datenblöcke in Ordnung sind. Sollte die Checksumme nicht stimmen, werden bei Verwendung von Raid 1 Datenblöcke mit richtiger Checksumme für die Reparatur der defekten Datenblöcke verwendet.

    sudo btrfs scrub start /media/btrfs

    Der Status kann mit folgendem Befehl kontrolliert werden:

    sudo btrfs scrub status /media/btrfs
    Ausgabe:
    scrub status for xxxx
    scrub started at Sun Aug 19 10:33:06 2018, running for 00:54:43
    total bytes scrubbed: 1.03TiB with 7378 errors
    error details: verify=7378
    corrected errors: 7378, uncorrectable errors: 0, unverified errors: 0

    Behobene Fehler werden unter "corrected errors" angezeigt. 

    Die Statusanzeige des Befehles device stats  wird nach einem scrub nicht zurückgesetzt: dazu empfiehlt es sich nach einem Scrub den Parameter -z zu verwenden: sudo btrfs device stats -z /daten

    -z gibt den aktuellen Fehler-Zähler aus und setzt diesen wieder auf 0

    Snapshots

    Ursprünglich habe ich für das Erstellen der Snapshots das Skript btrfs-snaps.sh verwendet: https://github.com/jf647/btrfs-snap/blob/master/btrfs-snap

    Beim Update auf 16.04 wollte das Skript  aber auf Anhieb nicht mehr funktionieren, daher habe ich kurzerhand Snapper installiert.

     

    am einfachsten können Snapshots mittels Snapper verwaltet werden:

    sudo apt-get install snapper
    snapper -c root create-config /daten
    sudo chmod a+rx /daten/.snapshots

    Standardmässig werden 10 stündliche, 10 tägliche, 10 monatliche and 10 jährliche Snapshots behalten:

    Die Konfig wird in folgendem Ordner abgelegt: /etc/snapper/configs/

    Der Timer wird in systemctl hinterlegt:

    systemctl list-unit-files | grep snapper

     

    deaktivieren:
    systemctl disable snapper-cleanup.timer
    systemctl disable snapper-timeline.timer
    einschalten
    systemctl enable snapper-cleanup.timer
    systemctl enable snapper-timeline.timer

    siehe auch: https://wiki.archlinux.org/index.php/Snapper

     

    Anzeigen der Snapshots - Snapper

    User@Rechner ~ $ sudo snapper -c root list
    [sudo] Passwort für boern:
    Typ | # | Vor # | Datum | Benutzer | Bereinigen | Beschreibung | Benutzerdaten
    -------+----+-------+-------------------------------+----------+------------+--------------+--------------
    single | 0 | | | root | | current |
    single | 1 | | Sam 29 Apr 2017 10:17:01 CEST | root | timeline | timeline |
    single | 6 | | Son 30 Apr 2017 10:17:01 CEST | root | timeline | timeline |
    single | 11 | | Mon 01 Mai 2017 10:17:01 CEST | root | timeline | timeline |
    single | 12 | | Die 02 Mai 2017 18:17:01 CEST | root | timeline | timeline |
    single | 14 | | Fre 05 Mai 2017 06:17:01 CEST | root | timeline | timeline |
    single | 16 | | Fre 05 Mai 2017 08:17:01 CEST | root | timeline | timeline |
    single | 17 | | Fre 05 Mai 2017 15:17:01 CEST | root | timeline | timeline |
    single | 18 | | Fre 05 Mai 2017 16:17:01 CEST | root | timeline | timeline |
    single | 19 | | Sam 06 Mai 2017 06:17:02 CEST | root | timeline | timeline |
    single | 20 | | Sam 06 Mai 2017 07:17:01 CEST | root | timeline | timeline |
    single | 21 | | Sam 06 Mai 2017 08:17:01 CEST | root | timeline | timeline |
    single | 22 | | Sam 06 Mai 2017 09:17:01 CEST | root | timeline | timeline |
    single | 23 | | Sam 06 Mai 2017 10:17:01 CEST | root | timeline | timeline |
    single | 24 | | Sam 06 Mai 2017 20:17:01 CEST | root | timeline | timeline |
    single | 25 | | Son 07 Mai 2017 10:17:02 CEST | root | timeline | timeline |
    single | 26 | | Son 07 Mai 2017 11:17:01 CEST | root | timeline | timeline |
    single | 27 | | Son 07 Mai 2017 12:17:01 CEST | root | timeline | timeline |
    single | 28 | | Son 07 Mai 2017 13:17:01 CEST | root | timeline | timeline |

      

    Snapshots löschen

    Für das Löschen der Snapshots wird der Befehl btrfs subvolume delete verwendet. Für alle Snapshots z.B.

    sudo btrfs subvolume delete /daten/.snapshot/*

    Bei Verwendung von Snapper können mehrere Snapshot gleichzeit gelöscht werden: 

    zuvor angelegte Konfig root: snapper -c root delete 6 28

    zuvor angelegte Konfig sync: snapper -c sync delete 1-300 (1 bis 300)

    (Falls nur ein Snapshot gelöscht werden soll, einfach die jeweilige Nummer verwenden)

     

    Disk entfernen

    Bei Umbauaktionen kann das Volume jederzeit entfernt werden, vorausgesetzt es ist genügend freier Platz vorhanden

    sudo btrfs device delete /dev/sda /daten

    im Fehlerfall mounten

    Bei einer defekten Festplatte kann das Dateisystem mit folgenden Befehl gemountet werden:

    mount -o degraded,rw /dev/sda /daten

    Disk ersetzen: replace ..

    Als Hilfe für die Auswahl der Disk können diese mit btrfs filesystem show angezeigt werden:

    sudo btrfs filesystem show

    folgender Befehl ersetzt eine defekte Platte:

    sudo btrfs replace start 6 /dev/sdf1 /mnt

    Sollte die neue Platte grösser als die Alte sein, kann diese mit folgendem Befehl vergrößert werden:

    hinzugefügte Disk vergrössern:

    btrfs filesystem resize devid:max /daten

    fehlende Platten von der Konfig entfernen:

    sudo btrfs device delete missing /daten 

    Vorausgesetzt ist ist genügend Platz vorhanden, versucht der Befehl delete missing bei eingestelltem Raid alle "Single" Datenblöcke auf alle Platten zu verteilen..

    root@soxn:~# sudo btrfs filesystem usage /daten
    Overall:
    Device size: 5.46TiB
    Device allocated: 4.70TiB
    Device unallocated: 772.49GiB
    Device missing: 0.00B
    Used: 4.18TiB
    Free (estimated): 677.66GiB (min: 660.42GiB)
    Data ratio: 1.91
    Metadata ratio: 1.91
    Global reserve: 512.00MiB (used: 0.00B)

    Data,single: Size:214.00GiB, Used:211.62GiB
    /dev/sdb 214.00GiB

    Data,RAID1: Size:1.97TiB, Used:1.97TiB
    /dev/sdb 1.97TiB
    /dev/sdc 1.36TiB
    missing 633.00GiB

    Data,DUP: Size:269.70GiB, Used:8.44GiB
    /dev/sdb 539.39GiB

    Metadata,single: Size:1.00GiB, Used:153.50MiB
    /dev/sdb 1.00GiB

    Metadata,RAID1: Size:8.00GiB, Used:6.08GiB
    /dev/sdb 8.00GiB
    /dev/sdc 8.00GiB

    Metadata,DUP: Size:2.00GiB, Used:976.00KiB
    /dev/sdb 4.00GiB

    System,single: Size:32.00MiB, Used:16.00KiB
    /dev/sdb 32.00MiB

    System,RAID1: Size:32.00MiB, Used:368.00KiB
    /dev/sdb 32.00MiB
    /dev/sdc 32.00MiB

    System,DUP: Size:32.00MiB, Used:96.00KiB
    /dev/sdb 64.00MiB

    Unallocated:
    /dev/sdb 7.00GiB
    /dev/sdc 1.37TiB
    missing 16.00EiB 

    Crontab regelmäßig den Status überprüfen

    Damit der Volume-Status regelmäßig überprüft wird, habe ich ein paar Zeilen in Crontab eingetragen:

    um 0:01 Uhr wöchentlich jeden Sonntag sollte ein Email mit dem Volume-Status verschickt werden:

    1 0 * * 0 btrfs device stats -z /daten | mail -s "BTRFS Device Status" email@domain.dom 

    um 0:03 Uhr Sonntags sollte das Volume komplett überprüft werden:

    3 0 * * 0 btrfs scrub start /daten

    um 6:01 Uhr Sonntags sollte das Ergebnis des Scrub-Befehles per Email verschickt werden:

    1 6 * * 0 btrfs scrub status /daten | mail -s "BTRFS Scrub Status" email@domain.dom

    um 6:02 Uhr Sonntags dann nochmal den Status des Volume:

    2 6 * * 0 btrfs device stats -z /daten | mail -s "BTRFS Device Status" boern99@gmail.com

    Zusätzlich sollte der Status täglich überprüft werden und im Fehlerfall ein Scrub angestossen werden:

    3 3 * * * if [ "$(btrfs device stats /daten | grep -vE ' 0$')" != "" ];then btrfs device stats -z /daten | mail -s "BTRFS Device Status" email@domain.dom;btrfs scrub start /daten;fi

    Der Befehl btrfs device stats /daten enthält in der Regel Zeilen mit 0, außer es sind Fehler aufgetreten:

    [/dev/sdc].write_io_errs 0
    [/dev/sdc].read_io_errs 0
    [/dev/sdc].flush_io_errs 0
    [/dev/sdc].corruption_errs 0
    [/dev/sdc].generation_errs 0

    grep -vE ' 0$' sucht nach Zeilen in denen ein ander Wert als 0 steht.

    Sollten also Fehler gelistet sein, werden die Befehle innerhalb der IF-Abfrage ausgeführt:

    btrfs device stats -z /daten | mail -s "BTRFS Device Status" email@domain.dom;btrfs scrub start /daten

    Die Ausgabe von btrfs device stats -z /daten wird per mail verschickt und ein btrfs scrub start /daten ausgeführt ...

     

     

     

    letzte Änderung dieses Artikels: 04.10.2018 17:41



    Feedback: