Για την ανάγκη διαχείρισης των προσωρινών αρχείων
Ένα μοντέρνο σύστημα απαιτεί ένα μεγάλο αριθμό από προσωρινά αρχεία και καταλόγους. Τα αρχεία αυτά οι εφαρμογές και υπηρεσίες τα αποθηκεύουν συνήθως σε υποκαταλόγους κάτω από ‘/tmp
’ ή το ‘/var
’. Ένα κλασσικό πρόβλημα που υπήρχε είναι όταν τα αρχεία που υπάρχουν εκεί μέσα ξεφύγουν από κάθε έλεγχο και καταλάβουν όλο τον διαθέσιμο χώρο στον δίσκο κάνοντας το σύστημα μη χρησιμοποιήσιμο. Στο παρελθόν που είχε συμβεί κάποιες φορές. Η κλασσική λύση στο παρελθόν ήταν να έχουμε διαφορετικές κατατμήσεις για αυτούς τους καταλόγους, ώστε να περιοριστεί η ζημία σε μια κατάτμηση. Η λύση αυτή ήταν πολύπλοκη, οι κατατμήσεις ήταν είτε πολύ μεγάλες είτε πολύ μικρές, και συνήθως αυτό γίνονταν σε συστήματα με χρήση σαν server. Με κάποιο cron job καθαρίζαμε τα προσωρινά αρχεία, ώστε να κρατάμε τον χώρο υπό έλεγχο. Ένα άλλο δευτερεύον πρόβλημα, ήταν η αργή λειτουργία, μιας και πολλά προγράμματα και υπηρεσίες χρησιμοποιούν πολλά τέτοια προσωρινά αρχεία και η πρόσβαση στον δίσκο (ειδικά πριν τους SSD) ήταν αργή.
Η λύση του tmpfs
.
Μια λύση είναι να θυσιάσουμε λίγη ιδεατή μνήμη και να έχουμε τα αρχεία αυτά στην “μνήμη”. Αν έχουμε άφθονη μνήμη θα υπάρχουν στην RAM αλλιώς ότι δεν χρησιμοποιείται συχνά θα καταλήγει στο swap. Ο πυρήνας παρέχει ένα ιδεατό file system για αυτή την δουλεία. Το όνομα του tmpfs(5). Επίσης κερδίζουμε μια αύξηση της ζωής του SSD. Αξίζει τον κόπο για λίγη μνήμη παραπάνω .
Στο σύστημα μου δεν έχω μόνο ένα τέτοιο, έχω πολλά.
mount -t tmpfs
tmpfs on /run type tmpfs (rw,nosuid,nodev,noexec,relatime,size=1633084k,mode=755,inode64) tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev,inode64) tmpfs on /run/lock type tmpfs (rw,nosuid,nodev,noexec,relatime,size=5120k,inode64) tmpfs on /sys/fs/cgroup type tmpfs (ro,nosuid,nodev,noexec,size=4096k,nr_inodes=1024,mode=755,inode64) tmpfs on /run/user/1000 type tmpfs (rw,nosuid,nodev,relatime,size=1633080k,nr_inodes=408270,mode=700,uid=1000,gid=1000,inode64)
Αλλά αν κοιτάξω στο αρχείο ‘/etc/fstab
’ δεν θα βρω κάποια καταχώρηση για αυτά. Που ορίζονται; Ποιος τα φτιάχνει; Πως αλλάζω το μέγεθος τους; Πως προσθέτω; Ποίος κάνει στην τελική κουμάντο στο μηχάνημα μου;
Το systemd-tmpfiles
Γιατί απλά να μην προσθέσω αυτές τις καταχωρήσεις στο ‘/etc/fstab
’; Γιατί θα κάνω μισή δουλεία. Είναι στην μνήμη το θυμάσαι; Όταν ξεκινάει ο υπολογιστής οι φάκελοι προσάρτησης (που θα πρέπει να τους φτιάξουμε ξεχωριστά) είναι κενοί. Αλλά εκεί μέσα κάποιες υπηρεσίες για να ξεκινήσουν απαιτούν μια δομή καταλόγων να υπάρχει, ίσως και κάποια αρχεία να δημιουργηθούν ή να αντιγραφτούν. Και κάτι θα πρέπει να κάνει ένα καθαρισμό σε τακτά χρονικά διαστήματα, το να κάνουμε επανεκκίνηση του υπολογιστή είναι μεν μια λύση, αλλά σίγουρα θα συμφωνήσετε πως δεν είναι η βέλτιστη λύση .
Την δουλειά αυτή θα την κάνει το πρόγραμμα systemd-tmpfiles(8) χρησιμοποιώντας κάποια αρχεία ρυθμίσεων όπως περιγράφετε εδώ tmpfiles.d(5). Επίσης απαιτούνται κάποιες υπηρεσίες συστήματος που να του κάνουν χρήση.
Έχω δει μια διανομή από τις “σκληροπυρηνικές” ενάντια στο systemd, να ανακαλύπτει πως μπορεί να κάνει compile το systemd με τρόπο που να πάρει μόνο αυτήν την εντολή, γιατί οι εναλλακτικές λύσεις απλά δεν είναι τόσο καλές. Αυτό το διαφήμισαν ως “απελευθέρωση”. Χαλαρώστε λίγο παιδιά, δεν “απελευθερώσατε” τίποτα. Απλά αποδείξατε πως το systemd δεν είναι τόσο μονολιθικό όσο λέτε .
Διερεύνηση των αρχείων ρυθμίσεων και των υπηρεσιών
Ας διερευνήσουμε πρώτα την υποδομή που παρέχει το systemd και τις σχετικές υπηρεσίες
systemctl list-units "systemd-tmpfiles-*"
θα δούμε πως υπάρχουν 3 σχετικά units
Unit | Τύπος | Κατάσταση | Περιγραφή |
---|---|---|---|
systemd-tmpfiles-setup-dev.service |
service | exited | Δημιουργία αρχείων συσκευών κάτω από το /dev
|
systemd-tmpfiles-setup.service |
service | exited | Δημιουργία προσωρινών αρχείων και καταλόγων |
systemd-tmpfiles-clean.service |
service | inactive | Περιοδικό καθάρισμα προσωρινών αρχείων |
systemd-tmpfiles-clean.timer |
timer | waiting | Περιοδικό καθάρισμα προσωρινών αρχείων |
Ας κοιτάξουμε τις υπηρεσίες και τους timers να δούμε τι ακριβώς κάνουν. Το systemd-tmpfiles(8) περιέχει πληροφορίες για τις επιλογές, αν και είναι μάλλον προφανείς.
systemctl cat systemd-tmpfiles-setup-dev.service
Είναι μια καλή ευκαιρία να δείτε αυτά τα αρχεία και προσπαθήσετε να βρείτε τι κάνει κάθε επιλογή. Το βασικό, δηλαδή η εντολή που τρέχουν υπάρχει στον παρακάτω πίνακα.
Unit | Εντολή |
---|---|
systemd-tmpfiles-setup-dev.service |
systemd-tmpfiles --prefix=/dev --create --boot |
systemd-tmpfiles-setup.service |
systemd-tmpfiles --create --remove --boot --exclude-prefix=/dev |
systemd-tmpfiles-clean.service |
systemd-tmpfiles --clean |
Ας δούμε επίσης πότε είναι να τρέξει ο timer
🚀~ ➜ systemctl list-timers systemd-tmpfiles-clean.timer NEXT LEFT LAST PASSED UNIT ACTIVATES Tue 2021-06-08 20:52:40 EEST 20h left Mon 2021-06-07 20:52:40 EEST 3h 21min ago systemd-tmpfiles-clean.timer systemd-tmpfiles-clean.service
Τα αρχεία ρυθμίσεων
Ας ξεκινήσουμε με τους καταλόγους που υπάρχουν τα αρχεία ρυθμίσεων. Κατά προτεραιότητα οι φάκελοι αυτοί είναι
Κατάλογος | Σχόλια |
---|---|
/etc/tmpfiles.d/*.conf |
Οι αλλαγές που κάναμε στο σύστημα |
/run/tmpfiles.d/*.conf |
Προσωρινά(!) αρχεία που φτιάχνουν οι υπηρεσίες |
/usr/lib/tmpfiles.d/*.conf |
Οι ρυθμίσεις όπως τις θέλει η διανομή |
Κάθε υπηρεσία θα προσθέσει σε αυτούς τους καταλόγους ένα αρχείο με τις προδιαγραφές που θέλει, χωρίς να πειράξει κάποιο υπάρχον αρχείο. Η εγκατάσταση και απεγκατάσταση εφαρμογών και υπηρεσιών γίνεται έτσι πολύ εύκολα.
Όπως σε οτιδήποτε άλλο στο systemd
δεν πειράζουμε ποτέ τα αρχεία της διανομής, αλλά μόνο τα αρχεία κάτω από το ‘/etc/
’. Έτσι ξέρουμε τι αλλαγές έχουμε κάνει, δεν είναι ανάγκη να υπάρχουν αρχεία backup και απλά σβήνουμε το αρχείο για να ακυρώσουμε τις αλλαγές. Αν κάποιο αρχείο δεν υπάρχει εκεί απλά το φτιάχνουμε .
Εκτός από τα αρχεία του συστήματος έχει νόημα να υπάρχουν και προσωρινά αρχεία για την συνεδρία του χρήστη. Αυτά θα τα βρούμε (με σειρά προτεραιότητας) στους φακέλους ‘~/.config/user-tmpfiles.d /*.conf
’, ‘$XDG_RUNTIME_DIR/user-tmpfiles.d/*.conf
’, ‘~/.local/share/user-tmpfiles.d/*.conf
’ και για όλουςτους χρήστες στο ‘/usr/share/user-tmpfiles.d/*.conf
’.
Ας δούμε αυτά τα αρχεία:
🚀/usr/lib/tmpfiles.d🔒 ❯ ls ✘ 127 00rsyslog.conf debian.conf legacy.conf passwd.conf sudo.conf systemd.conf colord.conf gvfsd-fuse-tmpfiles.conf lvm2.conf resolvconf.conf systemd-nologin.conf tmp.conf cryptsetup.conf home.conf man-db.conf speech-dispatcher.conf systemd-pstore.conf var.conf dbus.conf journal-nocow.conf openvpn.conf static-nodes-permissions.conf systemd-tmp.conf x11.conf
Πολλά είναι , ας δούμε τι περιέχουν κάποια από αυτά
🚀/usr/lib/tmpfiles.d🔒 ➜ cat sudo.conf # Create an empty sudo time stamp directory on OSes using systemd. # Sudo will create the directory itself but this can cause problems # on systems that have SELinux enabled since the directories will be # created with the user's security context. d /run/sudo 0711 root root D /run/sudo/ts 0700 root root 🚀/usr/lib/tmpfiles.d🔒 ➜ cat resolvconf.conf d /run/resolvconf 0755 root root - d /run/resolvconf/interface 0755 root root - f /run/resolvconf/resolv.conf 644 root root - f /run/resolvconf/enable-updates 644 root root - f /run/resolvconf/postponed-update 644 root root -
και ένα λίγο ποιο πολύπλοκο
systemd-tmp.conf
🚀/usr/lib/tmpfiles.d🔒 ➜ cat systemd-tmp.conf # This file is part of systemd. # # systemd is free software; you can redistribute it and/or modify it # under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or # (at your option) any later version. # See tmpfiles.d(5) for details # Exclude namespace mountpoints created with PrivateTmp=yes x /tmp/systemd-private-%b-* X /tmp/systemd-private-%b-*/tmp x /var/tmp/systemd-private-%b-* X /var/tmp/systemd-private-%b-*/tmp # Remove top-level private temporary directories on each boot R! /tmp/systemd-private-* R! /var/tmp/systemd-private-* # Handle lost systemd-coredump temp files. They could be lost on old filesystems, # for example, after hard reboot. x /var/lib/systemd/coredump/.#core*.%b* r! /var/lib/systemd/coredump/.#*
H γενική σύνταξη είναι η εξής:
#Type Path Mode User Group Age Argument...
d /run/user 0755 root root 10d -
L /tmp/foobar - - - - /dev/null
Η πρώτη στήλη (#Type
) περιγράφει μια ενέργεια. Ας δούμε τι κάνουν αυτές με την βοήθεια του tmpfiles.d(5). Οι επιλογές είναι πολλές και θα περιγράψω μόνο κάποιες από αυτές
Σύμβολο | Ενέργεια |
---|---|
f |
Δημιούργησε το αρχείο αν δεν υπάρχει |
f+ |
… και μείωσε το μέγεθος του αν υπάρχει |
d |
Δημιούργησε κάποιο φάκελο |
D |
… και σβήσε τα περιεχόμενα του όταν ζητηθεί |
x , X
|
Μην σβήσεις το αρχείο/κατάλογο |
r |
Σβήσε σβήσε τον κατάλογο ή το αρχείο |
R |
… καθώς και τους υποκαταλόγους |
'!` | Ασφαλής ενέργεια μόνο κατά την εκκίνηση του συστήματος |
Ας δούμε και τα άλλα πεδία
Πεδίο | Χρήση |
---|---|
Type | Δες τον προηγούμενο πίνακα |
Path | Η διαδρομή τους αρχείου η του καταλόγου |
Mode | Εντολή chmod: τι είναι αυτοί οι αριθμοί ; |
User | O χρήστης που θα ανήκει η διαδρομή |
Group | και η ομάδα |
Age | Η ελάχιστη ηλικία πριν σβηστεί |
Argument | Επιπρόσθετες επιλογές (χωρίς εισαγωγικά) ανάλογα με το Type |
Αλλάζοντας τον timer
Κάποιες φορές θέλουμε η διαγραφή να γίνεται ποιο συχνά, και όχι κάθε μέρα. Ας δούμε πως θα το κάνουμε να τρέχει κάθε 6 ώρες. Θα δώσουμε την εντολή
sudo systemctl edit systemd-tmpfiles-clean.timer
θα ανοίξει ένας επεξεργαστής κειμένου που θα περιέχει το κείμενο του Unit σαν σχόλια. Από εκεί θα πάρουμε μόνο ότι θέλουμε να αλλάξουμε, και θα κρατήσουμε το
[Timer] OnBootSec=15min OnUnitActiveSec=6h
Θα φτιαχτεί ένα αρχείο ‘/etc/systemd/system/systemd-tmpfiles-clean.timer.d/override.conf
’. Αν θέλουμε να ακυρώσουμε την αλλαγή απλά θα σβήσουμε αυτό το αρχείο.
Δεν ξεχνάμε, μετά από κάθε αλλαγή, να δώσουμε την παρακάτω εντολή για να ενημερωθεί το σύστημα.
sudo systemctl daemon-reload
Παράδειγμα
Έστω ότι θέλουμε ένα φάκελο να βάζουμε κάποια προσωρινά αρχεία που κατεβάζουμε, αλλά που δεν θέλουμε να κρατήσουμε και θέλουμε να σβήνουν αυτόματα. Υπάρχουν πολλοί τρόποι να το κάνουμε αυτό, με κάτι που θα ξεκινά με την συνεδρία, με κάποιο systemd timer ή cron job. Αλλά ο ποιο απλός τρόπος κατά την γνώμη μου είναι να χρησιμοποιήσουμε την υπάρχουσα υποδομή.
Θα φτιάξουμε ένα αρχείο ~/.config/user-tmpfiles.d/remove_Downloads.conf
🚀~ ➜ mkdir -p ~/.config/user-tmpfiles.d 🚀~ ➜ vi ~/.config/user-tmpfiles.d/remove_Downloads.conf
που θα περιέχει τα εξής
# ~/.config/user-tmpfiles.d/remove_Downloads.conf d %h/Downloads/AutoDelete R %h/Downloads/AutoDelete/\*
Θα τρέξουμε την εντολή με το χέρι (αλλιώς θα φτιαχτεί αυτόματα κατά την επανεκκίνηση).
🚀~ ❯ systemd-tmpfiles --user --create --remove --boot ✘ 130 🚀~ ➜ ls -la ~/Downloads/AutoDelete drwxr-xr-x talos talos 4.0 KB Mon Jun 7 23:35:41 2021 ./ drwxr-xr-x talos talos 4.0 KB Mon Jun 7 23:35:41 2021 ../
Βλέπουμε πως φτιάχτηκε αυτόματα ο κατάλογος. Ότι αρχείο μπει εκεί μέσα θα διαγραφεί αυτόματα όταν τρέξει ο timer. Αφήνω σαν άσκηση πως θα γίνει να σβήνουν αν είναι παλιότερα από μια εβδομάδα.
Άσκηση για το σπίτι: Καθαρίστε τα προσωρινά αρχεία το Firefox ή του Chrome αυτόματα.
Συμπεράσματα
Στο άρθρο αυτό είδαμε πως ένα μοντέρνο σύστημα Linux διαχειρίζεται τα προσωρινά αρχεία. Είδαμε σε κάποιο βάθος το μηχανισμό και πως μπορούμε να τον χρησιμοποιήσουμε. Δεν είδαμε πως έγιναν mount οι προσαρτήσεις tmpfs, αυτό θα το δούμε κάποια άλλη στιγμή. Όπως πάντα σχολιάστε ελεύθερα και διορθώστε τα λάθη που σίγουρα υπάρχουν.
Διαβάστε
https://systemd.io/TEMPORARY_DIRECTORIES/
Η εικόνα του άρθρου οικειοποιήθηκε από εδώ.