Slint mit BTRFS

In diesem Artikel beschreiben wir die einzigartigen Eigenschaften des BTRFS-Dateisystems und wie ein Slint-System bei der Installation konfiguriert wird, um diese zu nutzen.

Um dieses Dokument nicht mit Definitionen zu überladen, verweisen wir den Leser auf das Glossar im Slint-Handbuch und speziell für den btrfs "jargon" auf das Glossar in dessen Dokumentation.

Ein BTRFS-Dateisystem besteht aus einem logischen Datenspeicher, der sich auf mehrere Blockgeräte (Partitionen oder Festplatten) verteilen kann. Anfangs wird Slint auf einer einzigen Partition installiert.

Ein Untervolumen ist ein Unterverzeichnis von Dateien innerhalb des Volumens, dessen Root wie ein unabhängiges Dateisystem gemountet werden kann. Allerdings wird der Speicherplatz, der einem Volumen zugewiesen wird, auch jedem seiner Untervolumen zugewiesen: Es ist daher nicht notwendig, ihn auf die Untervolumina zu verteilen, wie wenn sie in verschiedenen Partitionen wären.

Untervolumen können gleichzeitig mit dem Volumen erstellt werden (durch den Befehl mkfs.btrfs), aber auch später mit den btrfs Tools hinzugefügt oder gelöscht werden.

Als Beispiel erzeugen die folgenden Befehle das Slint "system" Volumen und seine Untervolumen, falls BTRFS verwendet wird. Im folgenden ist $ROOTNAME der Name der Partition, in der Slint installiert wird, und $SLINT der Mount-Punkt des System-Volumens während der Installation.

mkdir /SLINT
SLINT="/SLINT"
mkfs.btrfs -L root $ROOTNAME
mount -o compress=zstd:3,noatime $ROOTNAME $SLINT
btrfs subvolume create $SLINT/@
btrfs subvolume create $SLINT/@home
btrfs subvolume create $SLINT/@swap
umount $SLINT
mount -o subvol=/@,compress=zstd:3,noatime $ROOTNAME $SLINT
mkdir $SLINT/home
mkdir $SLINT/swap

Die $ROOTNAME Partition (die durch ihre UUUID gekennzeichnet ist, die wir <uuid>nennen) wird dann dreimal (einmal pro Untervolumen) bei jedem Start von Slint eingehängt wie in der Datei /etc/fstab eingetragen:

UUID=<uuid> / btrfs subvol=/@,compress=zstd:3,noatime 0 0
UUID=<uuid> /home btrfs subvol=/@home,compress=zstd:3,noatime 0 0
UUID=<uuid> /swap btrfs subvol=/@swap,compress=zstd:3,noatime 0 0

Was zum Beispiel (aus der Ausgabe von lsblk /dev/sda5) ergibt:

Filesystem      Size  Used Avail Use% Mounted on
/dev/sda5        50G   22G   28G  44% /
/dev/sda5        50G   22G   28G  44% /home
/dev/sda5        50G   22G   28G  44% /swap

Wir sehen, dass der Platz für das Volumen (28G) auch für jedes der Untervolumen verfügbar ist. Andererseits bedeutet die Option "compress_zstd:3", dass alle Dateien, die gespeichert werden, durch das Dienstprogramm zstd mit Komprimierungsstufe 3 komprimiert werden. Daher ist die Größe des Systems ungefähr halb so groß wie beim ext4-Dateisystem.

Wenn wir das Gerät im root des Volumens mounten (ohne Angabe eines Untervolumens), wie:

mount /dev/sda5 /mnt

sehen wir die Untervolumen als Unterverzeichnisse von /mnt:

ls /mnt
@ @home @swap
ls /mnt/@home/didier
Bilder Dokumente Downloads Musik Schreibtisch Videos Vorlagen Öffentlich

Ein weiteres bemerkenswertes Merkmal von BTRFS ist das "copy-on-write". Beim Bearbeiten einer Datei werden geänderte Teile an einen anderen Ort geschrieben, die Metadaten (die den Speicherort aller Teile der Datei aufzeichnen) werden aktualisiert. Solange auf die vorherigen Daten verwiesen wird, bleiben sie unangetastet.

Dies macht es sehr einfach, Schnappschüsse von BTRFS Untervolumen zu erstellen: Ein neuer Schnappschuss ist "frei", da es sehr wenig Speicherplatz verbraucht: Es werden nur die Metadaten des Schnappschusses geschrieben, die den physikalischen Speicherort aller Teile von Dateien im Untervolumen speichern, und dies geschieht fast sofort. Der vom Schnappschuss verwendete Raum wird nur wachsen, wenn sich das ursprüngliche Untervolumen und der Schnappschuss unterscheiden, dann ruft der Schnappschuss Daten aus dem Original ab. Auf der anderen Seite werden die dem Original hinzugefügten Daten nicht in der Momentaufnahme enthalten: Mit anderen Worten, eine Änderung des ursprünglichen Untervolumens ändert den Schnappschuss nicht.

Slint enthält das Dienstprogramm absm, welches Schnappschüsse vom Untervolumen @ macht und es erlaubt zu einem vorherigen Zustand des Systems zurückzukehren, wenn eine Aktualisierung schief geht, durch Booten des Systems auf diesem Schnappschuss, ausgewählt im GRUB Boot-Menü. Um zu erfahren wie es verwendert wird, tippen Sie einfach absm als root ein oder verwenden Sie sudo.

BTRFS überprüft auch die Integrität jeder Datei, wenn sie geöffnet wird, mit einer Prüfsumme, was die Überprüfung des Dateisystems beim Systemstart unnötig macht. Darüber hinaus überprüft der Befehl "btrfs scrub" die Integrität aller Dateien, einschließlich derer, die selten gelesen werden. Standardmäßig führt das Dienstprogramm btrfsmaintenance in Slint einmal pro Woche "btrtfs scrub" aus.

btrfsmaintenance führt standardmäßig auch einmal pro Woche "btrfs balance" aus. Dieser Befehl erlaubt es Ihnen, die Daten zwischen den Geräten zu verteilen, wenn sich das Dateisystem über mehrere erstreckt, aber auch den genutzten Speicherplatz neu zu organisieren, insbesondere um den nicht zugewiesenen Speicherplatz des Dateisystems freizugeben. Dies verbessert insbesondere die Leistung von BTRFS auf einer Festplatte. Um mehr über btrfsmaintenance zu erfahren, lesen Sie /usr/doc/btrfsmaintenance*/README.html

Auch andere nützliche und BTRFS-kompatible Werkzeuge sind in Slint enthalten, alle haben eine --help Option und eine man-Seite:

  • jdupes erkennt doppelte Dateien und erlaubt Ihnen, entsprechend zu handeln, unabhängig vom verwendeten Dateisystem

  • btdu erlaubt es, präzise genau zu erfahren, wieviel Platz auf den BTRFS-Subvolumen und -Verzeichnissen belegt ist

  • restic ist eine sehr vielseitige Backup-Software, die für jedes Dateisystem verwendet werden kann.

Empfehlungen.

  • BTRFS braucht Platz zum Atmen und Reorganisieren. Halten Sie immer 10-20% Speicherplatz frei.

  • Einige Werkzeug-Optionen, die im Paket btrfs-tools enthalten sind, können gefährlich oder kontraproduktiv sein. Verwenden Sie nur diejenigen, deren Wirkung Sie sehr gut kennen und wenn Sie Zweifel haben, zuerst Rat einholen auf der Slint-Mailingliste oder im IRC auf irc. libera.chat, Kanal #btrfs.

  • Insbesondere vermeiden Sie die Verwendung von "btrfs filesystem defrag" und vor allem "btrfs check --repair".

  • Bevor Sie einen Befehl verwenden, lesen Sie sorgfältig die entsprechende Manpage (beginnend mit "man btrtfs", die die anderen auflistet).

  • Wie bei jedem Dateisystem: Erstellen Sie regelmäßige Sicherungen! Dies ist in der Regel die einzige Möglichkeit, Ihre Daten im Falle eines Hardware-Fehlers wiederherzustellen.

Für Weiteres:

Das Layout eines Slint Systems anpassen

Einführung

In diesem Artikel zeigen wir, wie der Slint-Installer die grundlegenden Verzeichnisse des Systems (deren Layout) organisiert und wie man dieses Layout nach der Installation anpassen kann. Der Installationsprozess wird im Kapitel 2: Installation des Handbuchs detailliert beschrieben.

Der Installer platziert alle unten aufgelisteten Verzeichnisse, die den Kern des Systems ausmachen, in derselben Partition:

bin boot dev etc home lib lib64 media mnt proc root run sbin srv sys usr

Wenn andere bereits formatierte Partitionen während der Installation verfügbar sind, schlägt der Installer vor, dass sie beim Systemstart gemountet werden, mit einem Verzeichnisnamen, der vom Benutzer als Mount-Punkt zugewiesen wurde, außer denen, die oben aufgelistet sind.

Wenn außerdem die automatische Partitionierung ausgewählt wurde, schlägt der Installer vor, eine zusätzliche Partition auf dem verbleibenden Platz auf dem Gerät zu erstellen, mit einem vom Benutzer gewählten Mount-Punkt, auch außerhalb der oben aufgelisteten Mount-Punkte.

Kurz gesagt, der Installer:

  • platziert alle Verzeichnisse, die den Kern des Systems bilden, in derselben Partition,

  • erlaubt das Einrichten anderer Verzeichnisse in anderen Partitionen, die zuvor formatiert wurden.

Allerdings möchten Sie möglicherweise Dateien oder Verzeichnisse installieren, die Teil des Kerns des Systems sind, wie /home in einer anderen Partition, insbesondere, wenn der Speicherplatz auf dem Gerät begrenzt ist. Zum Beispiel, wenn der Computer mit einem schnellen Gerät (SSD oder NVMe) und auch mit einer langsameren, aber größeren Festplatte ausgestattet ist, können Sie das System auf der SSD oder NVMe und die größeren Dateien auf der Festplatte installieren.

Möglicherweise möchten Sie auch große Dateien, die normalerweise in /home gespeichert werden, mit einem anderen System teilen, wie z.B. Bilder, verschiedene Dokumente, Audio- oder Videodateien.

Praktische Anleitung

Als Beispiel zeigen wir, wie /home auf ein anderes Gerät verlagert wird, mit einigen Variationen.

/home vollständig auf ein anderes Gerät verlagern

Wir gehen davon aus, dass Sie das Verzeichnis /home, das ursprünglich auf einer SSD oder NVMe installiert wurde, auf eine Festplatte verschieben wollen. Dies kann direkt nach der Installation oder später erledigt werden.

Zuerst benötigen Sie eine formatierte Partition auf der Festplatte, namens /dev/sdb1, auf der /home bereitgestellt wird:

  • Erstellen Sie die Partitionstabelle (vom Typ GPT) und die Partition mit einem der folgenden Werkzeuge: parted, gdisk, cgdisk oder gparted, alle in Slint, groß genug für den beabsichtigten Gebrauch.

  • Formatieren Sie diese Partition mit einem der Dateitypen btrfs, ext4 oder xfs (Befehle mkfs.btrfs, mkfs.ext4 oder mkfs.xfs)

Um das Verzeichnis /home auf diese Partition kopieren zu können, müssen Sie es mounten zum Beispiel auf /mnt, mit einem der folgenden Befehle:

mount /dev/sdb1 /mnt -o compress=zstd:3 # falls /dev/sdb1 mit btrfs formatiert wurde
mount /dev/sdb1 /mnt # falls /dev/sdb1 mit xfs oder ext4 formatiert wurde

Kopieren Sie dann die Dateien, zum Beispiel wie folgt:

cp -a /home/* /mnt

oder auch so:

rsync -aAXv /home/* /mnt

Danach überprüfen Sie, ob die Kopie korrekt ausgeführt wurde:

diff -r /home /mnt

Ändern Sie dann die /etc/fstab Datei, um /home auf der neuen Partition beim nächsten Booten zu mounten.

Wenn das Root-Dateisystem btrfs ist, wird /home als Untervolumen eingebunden. In diesem Fall kommentieren Sie die Zeile in der Datei /etc/fstab aus, die verwendet wird, um /home einzubinden, indem Sie am Anfang ein # Zeichen einfügen. Zum Beispiel diese Zeile bearbeiten (ersetzen Sie <uuid1> mit der UUID in /etc/fstab):

UUID=<uuid1> /home btrfs subvol=/@home,discard=async,compress=zstd:3,noatime 0

die geändert wird in:

#UUID=<uuid1> /home btrfs subvol=/@home,discard=async,compress=zstd:3,noatime 0 0

Dann fügen Sie in die Datei eine Zeile ein, mit der Sie zur Bootzeit /home auf der neuen Partition einhängen. Wir nennen den Wert ihrer UUID <uuid2>, die durch diesen Befehl angezeigt wird:

lsblk -lno uuid /dev/sdb1

Die Zeile, die in die /etc/fstab Datei eingefügt werden soll, hängt vom gewählten Dateisystem auf /dev/sdb1 ab.

Für btrfs:

UUID=<uuid2> /home btrfs compress=zstd:3,discard=async,noatime 0 0

Für ext4 oder xfs:

UUID=<uuid2> /home ext4 noatime 1 2

Dann starten Sie den Rechner neu. Im Falle eines Problems gehen Sie zurück:

  • Gegebenenfalls entfernen Sie das Kommentarzeichen aus der Zeile in der /etc/fstab (entfernen Sie das # Zeichen am Anfang der Zeile)

  • Kommentieren Sie die neue Zeile aus (fügen Sie ein # Zeichen am Zeilenanfang ein)

  • Dann starten Sie das System neu.

Sobald die neue Partition auf korrekte Funktion überprüft wurde, kann die alte gelöscht werden. Die Art und Weise dies zu tun, hängt von dem vom Installer konfigurierten Dateisystem ab. Sobald der Rechner neu gestartet wurde, stellen Sie sicher, dass /home auf der neuen Partition gemountet ist, zum Beispiel mit dem Befehl:

findmnt -o source

Dann löschen Sie das alte /home:

  • Im Falle von btrfs geben Sie diese Befehle ein (wir gehen davon aus, dass das System in /dev/sda3 installiert wurde):

    umount /mnt
    mount /dev/sda3 /mnt -o subvolid=0
    btrfs subvolume delete -c /mnt/@home
    btrfs subvolume sync /mnt # dieser Befehl initiiert die Wiederherstellung des Speichers des alten /home
    btrfs filesystem sync # dieser Befehl beendet die Wiederherstellung des Speichers des alten /home
    umount /mnt
  • Im Falle von ext4 oder xfs müssen wir das neue /home nicht verwenden, um das alte zu entfernen. Also:

    Zuerst im Text-Modus neustarten.
    Anmelden als root # Nicht als normaler Benutzer, sonst können wir /home nicht umkehren, da es benutzt werden würde.
    umount /home # Dies macht das vorherige /home wieder zugänglich.
    rm -r /home/* # Wir löschen den Inhalt des vorherigen /home, aber behalten das Verzeichnis.
    mount /home # Jetzt wird /dev/sdb1 als /home eingebunden

Das Verschieben nur der größten Dateien von /home auf die Festplatte

Im obigen Beispiel wurde das Verzeichnis /home vollständig von der SSD auf die Festplatte übertragen.

Möglicherweise ist es besser, nur große Dateien auf der Festplatte zu speichern und versteckte Verzeichnisse und Dateien, die häufig geschrieben, werden auf der SSD zu belassen, weil die SSD viel schneller ist.

Um dies zu tun, können Sie zum Beispiel den Mount-Punkt der /dev/sdb1-Partition /data in /etc/fstab benennen. Sobald diese Partition gemountet ist, kopieren Sie die Verzeichnisse, die von /home nach /data übertragen werden sollen, und ersetzen Sie diese Verzeichnisse schließlich in /home mit symbolischen Links zu den Verzeichnissen in /data. Zum Beispiel, sobald das /data Verzeichnis erstellt und auf /dev/sdb1 gemountet wurde:

chown -R didier:users /data mv /home/didier/Images /data ln -s /data/Images /home/didier/Images

Diese Vorgehensweise muss angepasst werden, wenn das System mehrere Benutzer hat, zum Beispiel durch das Erstellen eines Unterverzeichnisses pro Benutzer in /data.

Verschieben von /home auf die Festplatte, aber häufig geänderte Dateien auf der SSD speichern

Andererseits ist es möglich, häufig veränderte Dateien auf der SSD selektiv zu speichern, wie etwa die in ~/.mozilla, ~/.thunderbird oder ~/.purple.

Sie können zum Beispiel ein Verzeichnis /data und ein Unterverzeichnis /data/.thunderbird auf der SSD erstellen, ~/. hunderbird darauf verschieben und einen symbolischen Link /data/.thunderbird ⇒ ~/.thunderbird erstellen.

Wenn btrfs für das Kernsystem verwendet wird, wird empfohlen, vor dem Verschieben von ~/ ein Untervolumen für /data mit den folgenden Befehlen zu erstellen, bevor ~/.mozilla oder ~/.thunderbird erstellt wird:

mount /dev/sda3 /mnt subvolid=0 btrfs subvolume create /mnt/@data mkdir /data umount /mnt

Dann fügen Sie eine Zeile in /etc/fstab ein, um /data beim Systemstart einzubinden (<uuid1> ist der UUID-Wert von /dev/sda3):

UUID=<uuid1> /data btrfs subvol=/@data,discard=async,compress=zstd:3,noatime 0 0

Starten Sie dann neu und geben die folgenden Befehle ein:

chown -R didier:users /data mv /home/didier/.thunderbird /data ln -s /data/.thunderbird ~/.thunderbird