Διαχείριση προσωρινών αρχείων σε μια μοντέρνα διανομή

Μα όλα τα κάνει αυτό το **systemd**; Στο σημερινό σημείωμα θα εξετάσουμε πως δημιουργεί και διαχειρίζεται προσωρινά αρχεία και καταλόγους. Ένα άλλο άρθρο "κάτω από το καπάκι", όπου βλέπουμε την υποδομή που χρειάζεται μια σημερινή διανομή, με κάποιες λεπτομέρειες.

Για την ανάγκη διαχείρισης των προσωρινών αρχείων

Ένα μοντέρνο σύστημα απαιτεί ένα μεγάλο αριθμό από προσωρινά αρχεία και καταλόγους. Τα αρχεία αυτά οι εφαρμογές και υπηρεσίες τα αποθηκεύουν συνήθως σε υποκαταλόγους κάτω από ‘/tmp’ ή το ‘/var’. Ένα κλασσικό πρόβλημα που υπήρχε είναι όταν τα αρχεία που υπάρχουν εκεί μέσα ξεφύγουν από κάθε έλεγχο και καταλάβουν όλο τον διαθέσιμο χώρο στον δίσκο κάνοντας το σύστημα μη χρησιμοποιήσιμο. Στο παρελθόν που είχε συμβεί κάποιες φορές. Η κλασσική λύση στο παρελθόν ήταν να έχουμε διαφορετικές κατατμήσεις για αυτούς τους καταλόγους, ώστε να περιοριστεί η ζημία σε μια κατάτμηση. Η λύση αυτή ήταν πολύπλοκη, οι κατατμήσεις ήταν είτε πολύ μεγάλες είτε πολύ μικρές, και συνήθως αυτό γίνονταν σε συστήματα με χρήση σαν server. Με κάποιο cron job καθαρίζαμε τα προσωρινά αρχεία, ώστε να κρατάμε τον χώρο υπό έλεγχο. Ένα άλλο δευτερεύον πρόβλημα, ήταν η αργή λειτουργία, μιας και πολλά προγράμματα και υπηρεσίες χρησιμοποιούν πολλά τέτοια προσωρινά αρχεία και η πρόσβαση στον δίσκο (ειδικά πριν τους SSD) ήταν αργή.

Η λύση του tmpfs.

Μια λύση είναι να θυσιάσουμε λίγη ιδεατή μνήμη και να έχουμε τα αρχεία αυτά στην “μνήμη”. Αν έχουμε άφθονη μνήμη θα υπάρχουν στην RAM αλλιώς ότι δεν χρησιμοποιείται συχνά θα καταλήγει στο swap. Ο πυρήνας παρέχει ένα ιδεατό file system για αυτή την δουλεία. Το όνομα του tmpfs(5). Επίσης κερδίζουμε μια αύξηση της ζωής του SSD. Αξίζει τον κόπο για λίγη μνήμη παραπάνω :innocent:.

Στο σύστημα μου δεν έχω μόνο ένα τέτοιο, έχω πολλά.

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’ δεν θα βρω κάποια καταχώρηση για αυτά. Που ορίζονται; Ποιος τα φτιάχνει; Πως αλλάζω το μέγεθος τους; Πως προσθέτω; Ποίος κάνει στην τελική κουμάντο στο μηχάνημα μου; :scream:

Το systemd-tmpfiles

Γιατί απλά να μην προσθέσω αυτές τις καταχωρήσεις στο ‘/etc/fstab’; Γιατί θα κάνω μισή δουλεία. Είναι στην μνήμη το θυμάσαι; Όταν ξεκινάει ο υπολογιστής οι φάκελοι προσάρτησης (που θα πρέπει να τους φτιάξουμε ξεχωριστά) είναι κενοί. Αλλά εκεί μέσα κάποιες υπηρεσίες για να ξεκινήσουν απαιτούν μια δομή καταλόγων να υπάρχει, ίσως και κάποια αρχεία να δημιουργηθούν ή να αντιγραφτούν. Και κάτι θα πρέπει να κάνει ένα καθαρισμό σε τακτά χρονικά διαστήματα, το να κάνουμε επανεκκίνηση του υπολογιστή είναι μεν μια λύση, αλλά σίγουρα θα συμφωνήσετε πως δεν είναι η βέλτιστη λύση :smiley:.

Την δουλειά αυτή θα την κάνει το πρόγραμμα systemd-tmpfiles(8) χρησιμοποιώντας κάποια αρχεία ρυθμίσεων όπως περιγράφετε εδώ tmpfiles.d(5). Επίσης απαιτούνται κάποιες υπηρεσίες συστήματος που να του κάνουν χρήση.

Έχω δει μια διανομή από τις “σκληροπυρηνικές” ενάντια στο systemd, να ανακαλύπτει πως μπορεί να κάνει compile το systemd με τρόπο που να πάρει μόνο αυτήν την εντολή, γιατί οι εναλλακτικές λύσεις απλά δεν είναι τόσο καλές. Αυτό το διαφήμισαν ως “απελευθέρωση”. Χαλαρώστε λίγο παιδιά, δεν “απελευθερώσατε” τίποτα. Απλά αποδείξατε πως το systemd δεν είναι τόσο μονολιθικό όσο λέτε :joy:.

Διερεύνηση των αρχείων ρυθμίσεων και των υπηρεσιών

Ας διερευνήσουμε πρώτα την υποδομή που παρέχει το 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 και απλά σβήνουμε το αρχείο για να ακυρώσουμε τις αλλαγές. Αν κάποιο αρχείο δεν υπάρχει εκεί απλά το φτιάχνουμε :grin:.

Εκτός από τα αρχεία του συστήματος έχει νόημα να υπάρχουν και προσωρινά αρχεία για την συνεδρία του χρήστη. Αυτά θα τα βρούμε (με σειρά προτεραιότητας) στους φακέλους ‘~/.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

Πολλά είναι :stuck_out_tongue:, ας δούμε τι περιέχουν κάποια από αυτά

🚀/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/

Η εικόνα του άρθρου οικειοποιήθηκε από εδώ.

7 «Μου αρέσει»