Slint με BTRFS

Σε αυτό το άρθρο περιγράφουμε τα μοναδικά χαρακτηριστικά του συστήματος αρχείων BTRFS και πώς ένα σύστημα Slint έχει ρυθμιστεί κατά την εγκατάσταση για να επωφεληθεί από αυτά.

Για να μην υπερφορτώσουμε αυτό το έγγραφο με ορισμούς, παραπέμπουμε τον αναγνώστη στο glossary που περιλαμβάνεται στο εγχειρίδιο Slint και πιο συγκεκριμένα για btrfs "jargon" στο glossary που περιλαμβάνεται στην τεκμηρίωσή του.

Ένα σύστημα αρχείων BTRFS αποτελείται από έναν λογικό όγκο που μπορεί να καλύπτει πολλαπλές συσκευές (διαμερίσματα ή δίσκους). Αρχικά, το Slint εγκαθίσταται σε ένα ενιαίο διαμέρισμα.

Ένας υποόγκος είναι ένα υποδέντρο αρχείων μέσα στον τόμο, η ρίζα του οποίου μπορεί να τοποθετηθεί σαν να ήταν ένα ανεξάρτητο σύστημα αρχείων. Ωστόσο, ο χώρος που κατανέμεται σε όγκο κατανέμεται επίσης σε καθέναν από τους επιμέρους όγκους του: δεν είναι επομένως αναγκαίο να κατανεμηθεί μεταξύ των υποόγκων, σαν να ήταν σε ξεχωριστά χωρίσματα.

Οι υποόγκοι μπορούν να δημιουργηθούν ταυτόχρονα με τον τόμο (από την εντολή mkfs.btrfs), αλλά και να προστεθούν ή να διαγραφούν αργότερα χρησιμοποιώντας τα εργαλεία btrfs.

Για παράδειγμα, οι παρακάτω εντολές δημιουργούν τον τόμο Slint "system" και τους υποτόμους του, σε περίπτωση που χρησιμοποιείται BTRFS. Στο ακόλουθο $ROOTNAME είναι το όνομα του διαμερίσματος στο οποίο θα εγκατασταθεί το Slint και $SLINT το σημείο προσάρτησης του τόμου του συστήματος κατά την εγκατάσταση.

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

Το διαμέρισμα $ROOTNAME (υποδεικνύεται από το UUID το οποίο θα καλέσουμε <uuid>) θα τοποθετηθεί στη συνέχεια τρεις φορές (μία φορά ανά υποτόμο) κάθε φορά που ξεκινά το Slint, όπως αναφέρεται στο αρχείο /etc/fstab:

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

Αυτό δίνει για παράδειγμα (λαμβάνεται από την έξοδο του lsblk /dev/sda5):

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

Βλέπουμε ότι ο διαθέσιμος χώρος για τον όγκο (28G) είναι επίσης διαθέσιμος για κάθε επιμέρους τόμο. Από την άλλη πλευρά, η επιλογή προσάρτησης "compress_zstd:3" σημαίνει ότι όλα τα αρχεία που θα αποθηκευτούν θα συμπιέζονται από το βοηθητικό πρόγραμμα zstd με το επίπεδο συμπίεσης 3. Έτσι, το μέγεθος του συστήματος είναι περίπου το μισό που θα ήταν με το σύστημα αρχείων ext4.

Εάν προσαρτήσουμε τη συσκευή στη ρίζα του όγκου (χωρίς να αναφέρουμε έναν υποόγκο), όπως αυτό:

mount /dev/sda5 /mnt

βλέπουμε τους υποτόμους να εμφανίζονται ως υποκατάλογοι του /mnt:

ls /mnt
@ @home @swap
ls /mnt/@home/didier
Desktop Documents GNUstep Images Templates Music Audience Downloads Videos

Ένα άλλο αξιοσημείωτο χαρακτηριστικό του BTRFS είναι το "copy-on-write". Κατά την επεξεργασία ενός αρχείου, τα τροποποιημένα μέρη γράφονται σε άλλη τοποθεσία, τα μεταδεδομένα (που καταγράφουν τη θέση όλων των τμημάτων του αρχείου) που ενημερώνονται. Όσο τα προηγούμενα δεδομένα αναφέρονται ακόμη, θα παραμείνουν άθικτα.

Αυτό το καθιστά πολύ εύκολο να δημιουργήσετε στιγμιότυπα του υποτόμου BTRFS: λαμβάνοντας ένα νέο στιγμιότυπο είναι "ελεύθερο", καθώς χρησιμοποιεί πολύ λίγους χώρους στο δίσκο: μόνο τα μεταδεδομένα του στιγμιοτύπου γράφονται, το οποίο αποθηκεύει τη φυσική θέση όλων των τμημάτων των αρχείων στον υποτόμου, και αυτό γίνεται σχεδόν αμέσως. Ο χώρος που χρησιμοποιείται από το στιγμιότυπο θα αυξηθεί μόνο όταν ο αρχικός υποόγκος και το στιγμιότυπο διαφέρουν, καθώς το στιγμιότυπο θα ανακτά τα δεδομένα που αφαιρέθηκαν από το αρχικό. Από τα άλλα δεδομένα που προστίθενται στο αρχικό δεν θα συμπεριληφθούν στο στιγμιότυπο: με άλλα λόγια, η τροποποίηση του αρχικού υποτόμου δεν τροποποιεί το στιγμιότυπο.

Το Slint περιλαμβάνει το βοηθητικό πρόγραμμα absm, το οποίο επιτρέπει τη λήψη στιγμιότυπων του υποτόμου @, επιτρέποντας την επιστροφή σε προηγούμενη κατάσταση του συστήματος εάν μια ενημέρωση πάει στραβά, εκκινώντας το σύστημα σε αυτό το στιγμιότυπο, επιλεγμένο στο μενού εκκίνησης GRUB. Για να γνωρίζετε τη χρήση του, απλά πληκτρολογήστε absm ως root ή χρησιμοποιώντας sudo.

Το BTRFS επαληθεύει επίσης την ακεραιότητα κάθε αρχείου όταν ανοίγει με τη χρήση αθροίσματος ελέγχου, καθιστώντας περιττό να ελέγξετε το σύστημα αρχείων κατά την εκκίνηση του συστήματος. Επιπλέον, η εντολή "btrfs scrub" επαληθεύει την ακεραιότητα όλων των αρχείων, συμπεριλαμβανομένων εκείνων που σπάνια διαβάζονται. Από προεπιλογή, το βοηθητικό πρόγραμμα btrfsmaintenance που περιλαμβάνεται στο Slint τρέχει "btrtfs scrub" μία φορά την εβδομάδα.

Το "btrfsmaintenance" ενεργοποιεί επίσης το "btrfs balance" μία φορά την εβδομάδα από προεπιλογή. Με αυτή την εντολή μπορείτε να κατανείμετε τα δεδομένα μεταξύ των συσκευών αν το σύστημα αρχείων εκτείνεται σε διάφορες, αλλά και να αναδιοργανώσετε το χρησιμοποιούμενο χώρο, ιδίως για να ελευθερώσετε τον αδιάθετο χώρο του συστήματος αρχείων, το οποίο βελτιώνει ιδιαίτερα την απόδοση του BTRFS στην περίπτωση ενός σκληρού δίσκου. Για να μάθετε περισσότερα για το ` btrfsmaintenance` διαβάστε το /usr/doc/btrfsmaintenance*/README.html

Άλλα χρήσιμα και BTRFS-συμβατά εργαλεία περιλαμβάνονται στο Slint, όλα έχουν μια επιλογή βοήθειας και μια σελίδα man:

  • "Jdupes" ανιχνεύει τα διπλότυπα αρχεία και σας επιτρέπει να αναλάβετε δράση αναλόγως, ανεξάρτητα από το σύστημα αρχείων που χρησιμοποιείται

  • btdu επιτρέπει να γνωρίζετε με ακρίβεια τη θέση που καταλαμβάνουν οι υπό-τόμοι και οι κατάλογοι BTRFS

  • restic είναι ένα πολύ ευέλικτο λογισμικό δημιουργίας αντιγράφων ασφαλείας που μπορεί να χρησιμοποιηθεί για οποιοδήποτε σύστημα αρχείων.

Προτάσεις.

  • Το BTRFS χρειάζεται χώρο για να αναπνέει και να αναδιοργανώνεται. Να διατηρείτε πάντα 10-20 % ελεύθερο χώρο.

  • Ορισμένες επιλογές εργαλείων που περιλαμβάνονται στο πακέτο btrfs-tools μπορεί να είναι επικίνδυνες ή αντιπαραγωγικές. Χρησιμοποιήστε μόνο εκείνους των οποίων την επίδραση γνωρίζετε πολύ καλά και αν σε αμφιβολία αναζητούν συμβουλές πρώτα, στη λίστα αλληλογραφίας Slint ή από IRC για irc.libera.chat, κανάλι #btrfs.

  • Ειδικότερα, αποφύγετε τη χρήση του "btrfs filesystem defrag" και ειδικά όχι "btrfs check --repair".

  • Πριν χρησιμοποιήσετε μια εντολή, διαβάστε προσεκτικά την αντίστοιχη man σελίδα (ξεκινώντας με το "man btrtfs" που αναφέρει τα άλλα).

  • Όπως συμβαίνει με κάθε σύστημα αρχείων: κάντε κανονικά αντίγραφα ασφαλείας! Αυτός είναι συνήθως ο μόνος τρόπος για να ανακτήσετε τα δεδομένα σας σε περίπτωση βλάβης υλικού.

Περαιτέρω:

Customize a Slint system layout

Introduction

In this article, we review how the Slint installer organizes the system’s basic directories (their layout), and show how to customize this layout after installation. The installation process is detailed in Chapter 2: Installation of the HandBook.

The installer places all the directories listed below, which constitute the core of the system, in the same partition:

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

If other partitions already formatted are accessible during the installation, the installer proposes that they be mounted at system startup, with a directory name chosen by the user as mount point, except those listed above.

Furthermore, if automatic partitioning has been chosen, the installer proposes to create an additional partition in the remaining space available on the device, with a mount point chosen by the user, also outside those listed above.

In sum, the installer:

  • places all directories constituting the core of the system in the same partition,

  • allows to set up other directories in other partitions, previously formatted.

However, you may want to install files or directories that are part of the core of the system such as /home in another partition, especially if space is limited on the device. For example, if the computer is equipped with a fast device (SSD or NVMe) and also with a slower but larger capacity hard disk, you might want to install the system on the SSD or NVMe and the larger files on the hard disk.

You may also want to share large files usually stored in /home with another system, such as images, various documents, audio or video files.

Practical guide

As an example we show how to move /home to another device, with some variations.

Move /home entirely to another device

We assume that you want to move the /home directory, initially installed on an SSD or NVMe, to a hard disk. This can be done right after installation or later. All the following is to be done as root.

First, you need a formatted partition on the hard disk, named /dev/sdb1 below, to host /home:

  • Create if not already done on the hard disk the partition table (GPT type) and the partition using one of theses tools: parted, gdisk, cgdisk or gparted, all included in Slint, big enough for its intended use.

  • Format this partition using one of the btrfs, ext4, or xfs file types (commands mkfs.btrfs, mkfs.ext4 or mkfs.xfs)

To be able to copy the /home directory to this partition you need to mount it, for example on /mnt, with one of the following commands:

mount /dev/sdb1 /mnt -o compress=zstd:3 # if /dev/sdb1 has been formatted with btrfs
mount /dev/sdb1 /mnt # if /dev/sdb1 was formatted with xfs or ext4

Then copy the files, for example like this:

cp -a /home/* /mnt

or like this:

rsync -aAXv /home/* /mnt

Then, check that the copy has been done correctly:

diff -r /home /mnt

Then modify the /etc/fstab file to mount /home on the new partition at the next boot.

If the root file system is btrfs, /home is mounted as subvolume. In this case comment out the line in the file used to mount /home by inserting a # character at its beginning. For example edit this line (replace <uuid1> with the UUID value specified in /etc/fstab):

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

which becomes:

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

Then insert in the file a line to mount at boot time /home on the new partition. We will designate <uuid2> the value of its UUID, displayed by this command:

lsblk -lno uuid /dev/sdb1

The line to insert in the /etc/fstab file depends on the chosen file system of /dev/sdb1.

For btrfs:

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

For ext4 or xfs:

UUID=<uuid2> /home ext4 noatime 1 2

Then, reboot the machine. In case of problem, to go back:

  • Case occurring uncomment the commented line in /etc/fstab (remove the # character at the beginning of the line)

  • Comment the new one (insert a # character at the beginning of the line)

  • Then reboot.

Once the new partition has been checked for correct operation, the old one can be deleted. The way to do this depends on the file system configured by the installer. Once the machine is rebooted, make sure that /home is mounted on the new partition, for example with the command

findmnt -o /source

Then delete the old /home:

  • In case of btrfs type these commands (we assume that the system was installed in /dev/sda3):

    umount /mnt
    mount /dev/sda3 /mnt -o subvolid=0
    btrfs subvolume delete -c /mnt/@home
    btrfs subvolume sync /mnt # this command initiates the recovery of the space occupied by the old /home
    btrfs filesystem sync # this command ends the recovery of the space occupied by the old /home
    umount /mnt
  • In case of ext4 or xfs, we need that the new /home be not in use to remove the old one. So:

    First, reboot in text mode.
    Login as root # Not as regular user, else we could not umount /home as it would be busy.
    umount /home # This makes the previous /home accessible again.
    rm -r /home/* # We delete the content of the previous /home but keep the directory.
    mount /home # Now /dev/sdb1 is mounted as /home

Move only the largest files from /home to the hard disk

In the example above the /home directory has been completely transferred from the SSD to the hard disk.

It may be preferable to store only large files on the hard disk and to leave hidden directories and files on the SSD, which are subject to frequent writes, much faster on an SSD.

To do this, you can name the mount point of the /dev/sdb1 partition /data in /etc/fstab, for example, then once this partition is mounted, copy the directories to be transferred from /home to /data, and finally replace these directories in /home with symbolic links to the directories in /data. For instance, once the /data directory is created and mounted on /dev/sdb1:

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

This way of doing is to be adapted if the system is multi-user, for example by creating a subdirectory per user in /data.

Move /home to the hard disk but store frequently changed files on the SSD

On the other hand it is possible to selectively store frequently changed files on the SSD, like those contained in ~/.mozilla, ~/.thunderbird or ~/.purple.

For example, you can create a directory /data and a subdirectory /data/.thunderbird on the SSD, move ~/.thunderbird to it, and create a symbolic link /data/.thunderbird ⇒ ~/.thunderbird.

If btrfs is used for the core system it is recommended to create a subvolume for /data with the following commands, before moving ~/.mozilla or ~/.thunderbird there, like this:

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

Then insert a line in /etc/fstab to mount /data at system boot (<uuid1> is the UUID value of /dev/sda3):

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

Then reboot and type the following commands:

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