To systemd
ήρθε να αντικαταστήσει και το /etc/fstab
! Όχι δεν είναι έτσι τα πράγματα. Το systemd
ήρθε να προσθέσει αρκετά χρήσιμα πράγματα στην διαχείριση των προσαρτήσεων και προσθέτει και τρόπους να κάνεις προσαρτήσεις χωρίς την χρήση του. Σύμφωνα με το ίδιο το systemd
το /etc/fstab
παραμένει ο προτεινόμενος τρόπος. Αλλά μπορεί υπό κάποιες προϋποθέσεις να κάνει την χρήση του εντελώς προαιρετική.
Μια πρώτη ματιά
Αυτόματα το systemd
θα φτιάξει αυτόματα τα κατάλληλα units
από το /etc/fstab
και θα σεβαστεί παραμέτρους όπως nofail
, [no]auto
. Αυτόματες εξαρτήσεις θα δημιουργηθούν, ενώ υπάρχουν κάποιες επιπλέον επιλογές για καλύτερο έλεγχο των εξαρτήσεων. Δείτε το manual για περισσότερα, αν και σπάνια θα χρειαστούν. Ακόμα και ένας προχωρημένος χρήστης δεν έχει κάποιο λόγο να στενοχωρηθεί από την αλλαγή, ούτε να ασχοληθεί παραπέρα. Αλλά εδω θα το κάνουμε και θα δούμε τι παρέχει και πως μπορούμε να το χρησιμοποιήσουμε .
Υπάρχουν καταρχήν δυο διαφορετικά σχετικά units
. Τα mount
για τοπικές κατατμήσεις ή μόνιμες εξωτερικές και τα automount
για αυτόματες εξωτερικές προσαρτήσεις κάτι ανάλογο με το autofs
. Έχοντας ταλαιπωρηθεί με το τελευταίο στο παρελθόν θα το δοκιμάσω κάποια στιγμή, αλλά η κουβέντα εδώ θα περιοριστεί μόνο στις πρώτες.
Μια χρήσιμη παράμετρος
Ας υποθέσουμε πως έχουμε κάποιο μεγάλο εξωτερικό δίσκο μόνιμα συνδεμένο με ταινίες κλπ. Αν του κάνουμε μια μόνιμη προσάρτηση θα μας καθυστερήσει σημαντικά κατά την εκκίνηση γιατί θα πρέπει να ελεγχθεί για σφάλματα. Είναι ποιο έξυπνο να τον κάνουμε προσάρτηση μόνο όταν θέλουμε να δούμε μια ταινία. Μπορεί να γλυτώσουμε και λίγο χρόνο ζωής (και ρεύμα) με αυτόν τον τρόπο.
Μπορούμε να το κάνουμε αυτό αυτόματα. Θα προσθέσουμε στο /etc/fstab
, στις παραμέτρους της προσάρτησης, τα παρακάτω:
noauto,x-systemd.automount
Σημείωση: Η κατάτμηση θα γίνει τύπου automount
. Ένα μειονέκτημα είναι πως θα εξαιρεθεί της εντολής locate
. Αν προσθέσεις την διαδρομή στην βάση με το χέρι, τότε θα γίνει προσάρτηση όταν ενημερωθεί η βάση, οπότε δεν κερδίζεις τίποτα
Άσκηση για το σπίτι
Ας δούμε πρώτα τα σχετικά units
λοιπόν (Κάντε κλικ στο βελάκι για την έξοδο της εντολής):
systemctl list-unit-files --type=mount --all
~ ❯ systemctl list-unit-files --type=mount --all UNIT FILE STATE VENDOR PRESET -.mount generated enabled boot-efi.mount generated enabled dev-hugepages.mount static enabled dev-mqueue.mount static enabled home.mount generated enabled proc-sys-fs-binfmt_misc.mount disabled enabled sys-fs-fuse-connections.mount static enabled sys-kernel-config.mount static enabled sys-kernel-debug.mount static enabled sys-kernel-tracing.mount static enabled var-lib-machines.mount static enabled 11 unit files listed.
όπου με μια ματιά βλέπουμε ποια είναι ενεργά και ποια δημιουργήθηκαν αυτόματα.
Ας δούμε την κατάσταση τους (Κάντε κλικ στο βελάκι για την έξοδο της εντολής):
systemctl --no-pager list-units --type=mount --all
~ ❯ systemctl --no-pager list-units --type=mount --all UNIT LOAD ACTIVE SUB DESCRIPTION -.mount loaded active mounted Root Mount boot-efi.mount loaded active mounted /boot/efi ● boot.mount not-found inactive dead boot.mount dev-hugepages.mount loaded active mounted Huge Pages File System dev-mqueue.mount loaded active mounted POSIX Message Queue File System home.mount loaded active mounted /home proc-sys-fs-binfmt_misc.mount loaded active mounted Arbitrary Executable File Formats File System run-timeshift-backup.mount loaded active mounted /run/timeshift/backup run-user-1000-appimagelauncherfs.mount loaded active mounted /run/user/1000/appimagelauncherfs run-user-1000-doc.mount loaded active mounted /run/user/1000/doc run-user-1000-gvfs.mount loaded active mounted /run/user/1000/gvfs run-user-1000.mount loaded active mounted /run/user/1000 sys-fs-fuse-connections.mount loaded active mounted FUSE Control File System sys-kernel-config.mount loaded active mounted Kernel Configuration File System sys-kernel-debug.mount loaded active mounted Kernel Debug File System sys-kernel-tracing.mount loaded active mounted Kernel Trace File System tmp-.mount_jetbragQHjlx.mount loaded active mounted /tmp/.mount_jetbragQHjlx ● tmp.mount not-found inactive dead tmp.mount var-lib-machines.mount loaded inactive dead Virtual Machine and Container Storage (Compatibility) LOAD = Reflects whether the unit definition was properly loaded. ACTIVE = The high-level unit activation state, i.e. generalization of SUB. SUB = The low-level unit activation state, values depend on unit type. 19 loaded units listed. To show all installed unit files use 'systemctl list-unit-files'.
Απλούστερα μπορείς απλά να γράψεις: systemctl -t mount
Και σαν κάθε unit
μπορούμε να δούμε αναλυτικές πληροφορίες για την κατάσταση κάθε προσάρτησης (Κάντε κλικ στο βελάκι για την έξοδο της εντολής):
systemctl --no-pager status home.mount
~ ❯ systemctl --no-pager status home.mount ● home.mount - /home Loaded: loaded (/etc/fstab; generated) Active: active (mounted) since Fri 2020-07-10 11:26:06 EEST; 3h 34min ago Where: /home What: /dev/sda2 Docs: man:fstab(5) man:systemd-fstab-generator(8) Tasks: 0 (limit: 19042) Memory: 592.0K CGroup: /system.slice/home.mount Ιουλ 10 11:26:06 Minty systemd[1]: Mounting /home... Ιουλ 10 11:26:06 Minty systemd[1]: Mounted /home.
Για λόγους πληρότητας ας δούμε και την κατάσταση του ίδιου του δίσκου:
systemctl status /dev/sda
~ 🚀 ❯ systemctl status /dev/sda ● dev-sda.device - WDC_WDS100T2B0A-00SM50 Follow: unit currently follows state of sys-devices-pci0000:00-0000:00:11.0-ata3-host2-target2:0:0-2:0:0:0-block-sda.device Loaded: loaded Active: active (plugged) since Fri 2020-07-10 11:26:04 EEST; 4h 23min ago Device: /sys/devices/pci0000:00/0000:00:11.0/ata3/host2/target2:0:0/2:0:0:0/block/sda
Μια πρώτη κριτική
Την πρώτη φορά που θα δεις τα παραπάνω είμαι βέβαιως που θα σου φανούν ελληνικά κινέζικα. Αλλά όσο μαθαίνεις το systemd
θα αρχίσεις να εκτιμάς τον ενιαιο τρόπο διαχείρησης. Εκτιμώ το γεγονός πως με μια ματία βλέπω τι απέτυχε να προσαρτηθεί καθώς και τις καταγραφές συστήματος. Εκτιμώ το γεγονός πως βλεπω σε απλά ελληνικά αγγλικά τι είναι καθε τι.
Για σύγκριση ας δούμε το αποτέλεσμα της απλής εντολής mount
:
mount
sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime)
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
devtmpfs on /dev type devtmpfs (rw,nosuid,size=8124780k,nr_inodes=2031195,mode=755)
securityfs on /sys/kernel/security type securityfs (rw,nosuid,nodev,noexec,relatime)
tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev)
devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000)
tmpfs on /run type tmpfs (rw,nosuid,nodev,size=1634020k,mode=755)
tmpfs on /run/lock type tmpfs (rw,nosuid,nodev,noexec,relatime,size=5120k)
tmpfs on /sys/fs/cgroup type tmpfs (ro,nosuid,nodev,noexec,mode=755)
cgroup2 on /sys/fs/cgroup/unified type cgroup2 (rw,nosuid,nodev,noexec,relatime,nsdelegate)
cgroup on /sys/fs/cgroup/systemd type cgroup (rw,nosuid,nodev,noexec,relatime,xattr,name=systemd)
pstore on /sys/fs/pstore type pstore (rw,nosuid,nodev,noexec,relatime)
efivarfs on /sys/firmware/efi/efivars type efivarfs (rw,nosuid,nodev,noexec,relatime)
none on /sys/fs/bpf type bpf (rw,nosuid,nodev,noexec,relatime,mode=700)
cgroup on /sys/fs/cgroup/perf_event type cgroup (rw,nosuid,nodev,noexec,relatime,perf_event)
cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup (rw,nosuid,nodev,noexec,relatime,cpu,cpuacct)
cgroup on /sys/fs/cgroup/hugetlb type cgroup (rw,nosuid,nodev,noexec,relatime,hugetlb)
cgroup on /sys/fs/cgroup/net_cls,net_prio type cgroup (rw,nosuid,nodev,noexec,relatime,net_cls,net_prio)
cgroup on /sys/fs/cgroup/freezer type cgroup (rw,nosuid,nodev,noexec,relatime,freezer)
cgroup on /sys/fs/cgroup/pids type cgroup (rw,nosuid,nodev,noexec,relatime,pids)
cgroup on /sys/fs/cgroup/memory type cgroup (rw,nosuid,nodev,noexec,relatime,memory)
cgroup on /sys/fs/cgroup/blkio type cgroup (rw,nosuid,nodev,noexec,relatime,blkio)
cgroup on /sys/fs/cgroup/rdma type cgroup (rw,nosuid,nodev,noexec,relatime,rdma)
cgroup on /sys/fs/cgroup/devices type cgroup (rw,nosuid,nodev,noexec,relatime,devices)
cgroup on /sys/fs/cgroup/cpuset type cgroup (rw,nosuid,nodev,noexec,relatime,cpuset)
configfs on /sys/kernel/config type configfs (rw,nosuid,nodev,noexec,relatime)
/dev/sda3 on / type btrfs (rw,relatime,ssd,space_cache,subvolid=501,subvol=/@)
systemd-1 on /proc/sys/fs/binfmt_misc type autofs (rw,relatime,fd=32,pgrp=1,timeout=0,minproto=5,maxproto=5,direct,pipe_ino=18529)
hugetlbfs on /dev/hugepages type hugetlbfs (rw,relatime,pagesize=2M)
mqueue on /dev/mqueue type mqueue (rw,nosuid,nodev,noexec,relatime)
debugfs on /sys/kernel/debug type debugfs (rw,nosuid,nodev,noexec,relatime)
tracefs on /sys/kernel/tracing type tracefs (rw,nosuid,nodev,noexec,relatime)
binfmt_misc on /proc/sys/fs/binfmt_misc type binfmt_misc (rw,nosuid,nodev,noexec,relatime)
fusectl on /sys/fs/fuse/connections type fusectl (rw,nosuid,nodev,noexec,relatime)
/dev/sda2 on /home type ext4 (rw,relatime)
/dev/sda1 on /boot/efi type vfat (rw,relatime,fmask=0077,dmask=0077,codepage=437,iocharset=iso8859-1,shortname=mixed,errors=remount-ro)
tmpfs on /run/user/1000 type tmpfs (rw,nosuid,nodev,relatime,size=1634016k,mode=700,uid=1000,gid=1000)
/dev/fuse on /run/user/1000/appimagelauncherfs type fuse (rw,nosuid,nodev,relatime,user_id=1000,group_id=1000)
gvfsd-fuse on /run/user/1000/gvfs type fuse.gvfsd-fuse (rw,nosuid,nodev,relatime,user_id=1000,group_id=1000)
jetbrains-toolbox on /tmp/.mount_jetbragQHjlx type fuse.jetbrains-toolbox (ro,nosuid,nodev,relatime,user_id=1000,group_id=1000)
/dev/fuse on /run/user/1000/doc type fuse (rw,nosuid,nodev,relatime,user_id=1000,group_id=1000)
/dev/sda3 on /run/timeshift/backup type btrfs (rw,relatime,ssd,space_cache,subvolid=5,subvol=/)
υπάρχει κάποια σύγκριση; Πολλά cgroups
και χάνεις την μπάλα . Καταραμένο systemd
Τι δεν μου αρέσει: Δεν μπορώ να δω μόνο αυτό που σηνήθως με ενδιαφέρει: τις φυσικές καταμήσεις και τον ελέυθερο τους χώρο. Ούτε το σύστημα αρχείων. Αλλά ούτε πριν μπορούσα και θα έπρεπε να χρησιμοποιήσω τις εντολές df
και lsblk
.
Προσάρτηση μόνο με το systemd
Ας δούμε πως μπορείς να κάνει προσάρτηση ένα εξωτερικό δίσκο χρησιμοποιώντας μόνο το systemd
.
Μια γραμμή στο /etc/fstab
σαν την:
UUID=b2ee0b8f-1d7b-4745-a188-ab387f8bdbf0 /home ext4 defaults 0 0
Θα γίνει μέσα σε ένα ένα unit
[Mount]
What=/dev/disk/by-uuid/b2ee0b8f-1d7b-4745-a188-ab387f8bdbf0
Where=/home
Type=ext4
Options=defaults
καθόλου δύσκολο και δεν έχεις αυτές τις μακρίες γραμμές στο /etc/fstab
. Άσε που κάθε φορά τρώω χρόνο να κρατάω τα πεδία σε μια τάξη με κενά .
Αν αναρωτιέστε που είναι τα αυτόματα
units
και τι περιέχουν θα τα βρείτε στον κατάλογο:
/var/run/systemd/generator
.
Ένα παράδειγμα
Θα προσαρμόσουμε ένα εξωτερικό δίσκο. Όπως και με το /etc/fstab
θα πρέπει πρώτα να βρώ τα στοιχεία του δίσκου:
blkid /dev/sdb1
~ 🚀 ❯ blkid /dev/sdb1 /dev/sdb1: LABEL="vapor" UUID="cdc229cc-37d2-4d77-b3f9-4ca4fa0bab57" UUID_SUB="9551c20b-7c66-45f0-acca-cb287b8f5ca3" TYPE="btrfs"
PARTLABEL="vapor" PARTUUID="69916b32-f327-48c6-be5c-204c986c7f2a"
Θα φτιάξω πρώτα ένα mount unit
που θα περιέχει τα παρακάτω:
# /etc/systemd/system/vapor.mount
[Unit]
Description=External disk (vapor)
[Mount]
What=/dev/disk/by-uuid/cdc229cc-37d2-4d77-b3f9-4ca4fa0bab57
Where=/vapor
Type=btrfs
Options=defaults
[Install]
WantedBy=local-fs.target
Έβαλα WantedBy=local-fs.target
για να μην γίνει αυτόματη προσάρτηση σε κονσόλα επιδιόρθωσης.
Όπως κάθε φορά που σκαλίζω κάτι:
~ 🚀 ❯ sudo systemctl daemon-reload
Και στην συνέχεια θα ενεργοποιήσω το unit
:
~ 🚀 ❯ sudo systemctl enable vapor.mount
Αυτό αρκεί όταν ξεκινάει ο υπολογιστής. Μόνο που εγω το θέλω τώρα:
~ 🚀 ❯ sudo systemctl start vapor.mount
sudo systemctl start vapor.mount
~ 🚀 ❯ sudo systemctl start vapor.mount ● vapor.mount - External disk (vapor) Loaded: loaded (/etc/systemd/system/vapor.mount; enabled; vendor preset: enabled) Active: active (mounted) since Fri 2020-07-10 16:08:39 EEST; 8s ago Where: /vapor What: /dev/sdb1 Tasks: 0 (limit: 19042) Memory: 14.2M CGroup: /system.slice/vapor.mount Ιουλ 10 16:08:35 Minty systemd[1]: Mounting External disk (vapor)... Ιουλ 10 16:08:39 Minty systemd[1]: Mounted External disk (vapor).
Και αυτό ήταν. Δείτε πως το Description
δείχνει τι ακριβώς είναι η προσάρτηση με τις εντολές της άσκησης. (Σε δικό σας δίσκο θα πρέπει να αλλάξετε και τον τυπο της κατάτμησης σε ntfs
ή ext4
). Με το /etc/fstab
θα έπρεπε να φτιάξω τον φάκελο προσάρτησης και να το δώσω τα κατάλληλα δικαιώματα. Αλλά έτσι απλά θα φταιχτεί αυτόματα. Ζήτω!
Μια κριτική ματία
Την πρώτη φορά που θα το δεις μοιάζει ποιο δύσκολο απο το να προσθέσεις μια γραμμή στο /etc/fstab
. Αλλά δείξε το σε κάποιον που δεν έχει δει ούτε το ένα, ούτε το άλλο και δες τι θα διαλέξει και πόσο εύκολα θα καταλάβει την σύνταξη .
Ο καινούργιος τρόπος είναι πολύ ποιο κατανοητός κατά την γνώμη μου. Αν τώρα θέλεις να καταργήσεις προσωρινα μια προσάρτηση αρκεί να κάνεις απενεργοποίηση του σχετικού unit
. Δεν είναι ανάγκη να κάνεις την γραμμή σχόλιο στο /etc/fstab
. Ένα πλεονέκτημα της μεθόδου είναι πως μπορείς εύκολα να δεις τι είναι απενεργοποιημένο.
Αλλά η κύρια χρήση δεν είναι η αντικατάσταση του /etc/fstab
. Είναι ο αυτοματισμός. Οταν κάνεις devops
συχνά θέλεις να αλλάξεις μέσα απο κάποιο πρόγραμμα το αρχείο αυτό. Και χρησιμοποιείς ειδικά εργαλεία όπως το augeas
για να μην γίνει καμιά στραβή. Πόσο ποιο απλό είναι απλά να προσθέσεις ένα αρχείο και να ενεργοποιήσεις ένα unit
;
Η ενσωμάτωση με το υπόλοιπο systemd
προσφέρει επιπλέον πλεονεκτήματα. Θέλεις για παράδειγμα να γίνει προσάρτηση μόνο πριν τρέξει κάποια άλλη υπηρεσία; Θέλεις να αλλάξεις την σειρά; Θέλεις να κάνεις κάτι ακόμα ποιο τρελό; Αρκει να ξέρεις να χρησιμοποιείς το systemd
γιατί η γνώση μεταφέρετε.
Ένα πρόβλημα που πρέκυψε είναι το εξής: Ενώ μπορώ να κάνω κανονικά umount /vapor
δεν μπορώ να κάνω mount με mount /vapor
μιας και η εντολή mount
δεν ξέρει αυτά τα καινούργια κόλπα. Επίσης δεν κατάφερα να βάλω εικονίδιο στο δίσκο. Αναγνωρίζει μεν την παράμετρο x-gvfs-show
, αλλά αποτυγχάνει στις x-gvfs-name
, x-gvfs-icon
. Μικρό το κακό, αλλά πρέπει να το πω .
Επειδή μπορείς να το κάνεις δεν πρέπει κιόλας. Και αν το κάνεις κάνε το μόνο για τις μόνιμες προσαρτήσεις. Το
/etc/fstab
είναι μια χαρά.
Παράξενες διαδρομές
Είναι μια κακή ιδέα αλλά μπορεί να θέλεις να γίνει η προσάρτηση στην διαδρομή “/home/talos/Τα αρχεία μου στο vapor” ή ποιο πρακτικά στο σημείο /home/user/.steam
. Υπάρχει ένα χρήσιμο utility για να ονομάσεις δυσκολες διαδρομές
~ ❯ systemd-escape --path --suffix=mount "/home/talos/Τα αρχεία μου στο vapor" home-talos-\xce\xa4\xce\xb1\x20\xce\xb1\xcf\x81\xcf\x87\xce\xb5\xce\xaf\xce\xb1\x20\xce\xbc\xce\xbf\xcf\x85\x20\xcf\x83\xcf\x84\xce\xbf\x20vapor.mount
Ξέρω είναι άσχημο.
Συμπεράσματα
Εδώ και λίγες μέρες έβαλα στόχο να δω γιατί το systemd
έχει προκαλέσει τόσο θόρυβο και αν είναι τόσο κακό όσο λένε. Σε άρθρα εδώ παρουσιάζω ότι καλό ή κακό βρίσκω χωρίς φανατισμούς και ιδεοληψίες. Γενικά μέχρι τώρα έχω καλές εντυπώσεις και δεν βρήκα κάτι που να δικαιολογεί τον υπερβολικό θόρυβο που έχει ξεσπάσει ενάντια στο systemd
.
Αλλά αυτό το χαρακτηριστικό αυτό μου αφήνει ανάμεικτα συναισθήματα. Μου άρεσαν οι αναφορές που κάνει αν και θα μπορούσαν να είναι καλύτερες. Επίσης μου αρέσει που μπορείς να χρησιμοποιήσεις τις προσαρτήσεις targets
για άλλα πραγματα καθώς και ο γενικότερος αυτοματισμός. Σε κάποιες περιπτώσεις παρέχει λύσεις σε υπαρκτά προβλήματα, δεν είναι ανάγκη για παράδειγμα αυτοματοποιημένα scripts
να σκαλίζουν το /etc/fstab
. Δεν είναι τυχαίο που ένα σχετικό εργαλείο πήρε το όνομα του απο τους γνωστούς στάβλους .
H ενοποιημένη σύνταξη στις εντολές και στα units
είναι επίσης ένα καλό πράγμα.
Αλλά για τις τοπικές κατατμήσεις τουλάχιστον, θα μείνω στο παλιό καλο /etc/fstab
. Στα θετικά του, όλλες αυτές οι γραφικές εφαρμογές που το χρησιμοποιούν. Εσείς;
Δείτε τα άρθρα για το
systemd
ακολουθώντας το tag: Νήματα με ετικέτες systemd