Χρονικές σημάνσεις αρχείων Linux Επεξήγηση: atime, mtime και ctime

Πότε το “άλλαξε” δεν σημαίνει “τροποποιημένο”; Όταν μιλάμε για χρονικές σημάνσεις αρχείων Linux. Σε αυτόν τον οδηγό, θα εξηγήσουμε πώς τα ενημερώνει το σύστημα και πώς να τα τροποποιήσετε μόνοι σας.

Η διαφορά μεταξύ χρόνου, mtime και ctime

Κάθε αρχείο Linux έχει τρία χρονικές σημάνσεις: η χρονική σήμανση πρόσβασης (atime), η τροποποιημένη χρονική σήμανση (mtime) και η αλλαγμένη χρονική σήμανση (ctime).

Η χρονική σήμανση πρόσβασης είναι η τελευταία φορά που διαβάστηκε ένα αρχείο. Αυτό σημαίνει ότι κάποιος χρησιμοποίησε ένα πρόγραμμα για να εμφανίσει τα περιεχόμενα του αρχείου ή να διαβάσει ορισμένες τιμές από αυτό. Δεν έγινε καμία επεξεργασία ή προσθήκη στο αρχείο. Τα δεδομένα αναφέρθηκαν αλλά δεν άλλαξαν.

Μια τροποποιημένη χρονική σήμανση υποδηλώνει την τελευταία φορά που τροποποιήθηκαν τα περιεχόμενα ενός αρχείου. Ένα πρόγραμμα ή μια διαδικασία είτε επεξεργάστηκε είτε χειρίστηκε το αρχείο. Το “Τροποποιημένο” σημαίνει ότι κάτι μέσα στο αρχείο τροποποιήθηκε ή διαγράφηκε ή προστέθηκαν νέα δεδομένα.

Οι αλλαγμένες χρονικές σημάνσεις δεν αναφέρονται σε αλλαγές που έγιναν στα περιεχόμενα ενός αρχείου. Μάλλον, είναι η στιγμή κατά την οποία άλλαξαν τα μεταδεδομένα που σχετίζονται με το αρχείο. Οι αλλαγές στα δικαιώματα του αρχείου, για παράδειγμα, θα ενημερώσουν την αλλαγμένη χρονική σήμανση.

Το τυπικό σύστημα αρχείων ext4 Linux εκχωρεί επίσης χώρο για μια χρονική σήμανση δημιουργίας αρχείων στις εσωτερικές δομές του συστήματος αρχείων, αλλά αυτό δεν έχει εφαρμοστεί ακόμα. Μερικές φορές, αυτή η χρονική σήμανση συμπληρώνεται, αλλά δεν μπορείτε να εξαρτηθείτε από τις τιμές σε αυτήν.

The Anatomy of a Timestamp

Οι χρονικές σημάνσεις Linux περιέχουν έναν αριθμό και όχι μια ημερομηνία και ώρα. Αυτός ο αριθμός είναι ο αριθμός των δευτερολέπτων από το Εποχή Unix, που ήταν μεσάνυχτα (00:00:00) της 1ης Ιανουαρίου 1970, στο Συντονισμένη Παγκόσμια Ώρα (UTC). Τα άλματα δευτερόλεπτα αγνοούνται στις χρονικές σημάνσεις Linux, επομένως δεν είναι ανάλογα με τον πραγματικό χρόνο.

Όταν το Linux χρειάζεται να εμφανίσει μια χρονική σήμανση, μεταφράζει τον αριθμό των δευτερολέπτων σε ημερομηνία και ώρα. Αυτό διευκολύνει τους ανθρώπους να το καταλάβουν. Η τοποθεσία και η ζώνη ώρας στην οποία βρίσκεται ο υπολογιστής που προβάλλει το αρχείο καθοδηγούν τη μετατροπή του αριθμού των δευτερολέπτων σε ημερομηνία και ώρα. Διασφαλίζει επίσης ότι ο μήνας είναι στη σωστή γλώσσα.

Λοιπόν, πόσα δευτερόλεπτα μπορούν να αποθηκευτούν σε μια χρονική σήμανση; Πολλά—2.147.483.647, για την ακρίβεια. Είναι μεγάλος αριθμός, αλλά είναι αρκετός; Εάν το προσθέσετε στην εποχή του Unix και στη συνέχεια το μεταφράσετε σε ημερομηνία και ώρα, θα λάβετε την Τρίτη, 19 Ιανουαρίου 2038, στις 03:14:07 π.μ.

  Πώς να δημιουργήσετε αντίγραφα ασφαλείας μιας εικονικής μηχανής σε Linux με το VirtualBox

Προβολή χρονικών σφραγίδων

Όταν χρησιμοποιείτε την επιλογή -l (μεγάλη λίστα) με ls, όπως φαίνεται παρακάτω, μπορείτε να δείτε την τροποποιημένη χρονική σήμανση:

ls -l dp.c

Εάν θέλετε να δείτε τη χρονική σήμανση πρόσβασης, χρησιμοποιήστε την επιλογή -lu (χρόνος πρόσβασης) ως εξής:

ls -lu dp.c

Και τέλος, για να δείτε τη χρονική σήμανση αλλαγής, μπορείτε να χρησιμοποιήσετε την επιλογή -lc (χρόνος αλλαγής). πληκτρολογήστε τα εξής:

ls -lc dp.c

ο

Οι παραπάνω χρονικές σημάνσεις δείχνουν ότι το περιεχόμενο του αρχείου τροποποιήθηκε τελευταία φορά στις 21 Απριλίου 2019. Οι χρονικές σημάνσεις πρόσβασης και οι αλλαγές είναι πανομοιότυπες επειδή το αρχείο αντιγράφηκε από άλλον υπολογιστή σε αυτόν στις 20 Ιανουαρίου 2020 και και οι δύο χρονικές σημάνσεις ενημερώθηκαν εκείνη τη στιγμή.

Προς το δείτε όλες τις χρονικές σημάνσεις ταυτόχρονα, χρησιμοποιήστε την εντολή stat ως εξής:

stat dp.c

ο

Οι ζώνες ώρας εμφανίζονται στο κάτω μέρος της οθόνης. Όπως μπορείτε να δείτε, έχουν μια πολύ ακριβή συνιστώσα κλασματικών δευτερολέπτων. Στο τέλος κάθε χρονικής σήμανσης, βλέπετε επίσης ένα -0500 ή -0400 .

Αυτές είναι μετατοπίσεις ζώνης ώρας. Το σύστημα αρχείων καταγράφει τις χρονικές σημάνσεις σε UTC και τις μετατρέπει στην τοπική ζώνη ώρας όταν εμφανίζονται με stat. Ο υπολογιστής που χρησιμοποιήσαμε για την έρευνα αυτού του άρθρου έχει διαμορφωθεί σαν να βρισκόταν στη ζώνη Eastern Standard Time (EST) των ΗΠΑ

Αυτή η ζώνη ώρας είναι πέντε ώρες πίσω από το UTC όταν είναι σε ισχύ το EST. Ωστόσο, είναι τέσσερις ώρες πίσω από το UTC όταν ισχύει η ανατολική θερινή ώρα (EDT). Τον Απρίλιο του 2019, όταν άλλαξε η τροποποιημένη χρονική σήμανση, τέθηκε σε ισχύ το EDT. Γι’ αυτό δύο από τις χρονικές σημάνσεις έχουν μετατόπιση πέντε ωρών, αλλά η τροποποιημένη έχει μετατόπιση τεσσάρων ωρών.

Οι μετατοπίσεις και οι ζώνες ώρας δεν αποθηκεύονται πουθενά. Δεν υπάρχει ούτε inode ούτε χώρος συστήματος αρχείων αφιερωμένος στη διατήρηση αυτών των τιμών. Πρέπει να τα υπολογίσετε αμέσως χρησιμοποιώντας τη χρονική σήμανση (η οποία είναι πάντα σε ώρα UTC), την τοπική ζώνη ώρας του υπολογιστή που εμφανίζει το αρχείο και εάν ίσχυε η θερινή ώρα.

Βλέπετε επίσης μια χρονική σήμανση “Γέννηση”, η οποία είναι δεσμευμένη για την ημερομηνία δημιουργίας του αρχείου. Αυτό δεν εφαρμόζεται και βλέπετε μια παύλα “-” αντί για χρονική σήμανση.

Αλλαγή χρονικών σφραγίδων

Εάν θέλετε, μπορείτε να αλλάξετε τις χρονικές σημάνσεις σε ένα αρχείο. Μπορείτε να χρησιμοποιήσετε την εντολή αφής για να αλλάξετε την πρόσβαση ή τις τροποποιημένες χρονικές σημάνσεις, ή και τα δύο:

touch -a dp.c

Για να ορίσετε μια νέα χρονική σήμανση πρόσβασης, θα χρησιμοποιούσατε την επιλογή -a (χρόνος πρόσβασης). Αυτή η εντολή ορίζει τη χρονική σήμανση πρόσβασης στην τρέχουσα ώρα του υπολογιστή:

stat dp.c

ο

Η χρονική σήμανση πρόσβασης άλλαξε, όπως αναμενόταν. Ωστόσο, η αλλαγμένη χρονική σήμανση ενημερώθηκε επίσης. αυτό είναι φυσιολογικό.

  Πώς να φτιάξετε ένα τούνελ SSH στο Linux

Για να αλλάξετε την τροποποιημένη χρονική σήμανση, μπορείτε να χρησιμοποιήσετε την επιλογή -m (τροποποιημένη ώρα):

touch -m dp.c
stat dp.c

ο

Αυτή τη φορά, οι τροποποιημένες και αλλαγμένες χρονικές σημάνσεις ενημερώθηκαν.

Μπορείτε να χρησιμοποιήσετε την επιλογή -d (ημερομηνία) εάν θέλετε να αλλάξετε ταυτόχρονα την πρόσβαση και τις τροποποιημένες χρονικές σημάνσεις. Μπορείτε επίσης να καθορίσετε ώρα και ημερομηνία—δεν περιορίζεστε στην αλλαγή των χρονικών σφραγίδων στο παρόν.

Θα χρησιμοποιήσουμε την ακόλουθη εντολή για να ορίσουμε την πρόσβαση και τις τροποποιημένες χρονικές σημάνσεις στις 10:30:45 στις 15 Ιανουαρίου 2020:

touch -d "2020-01-15 10:30:45" dp.c
stat dp.c

Τώρα έχουμε ορίσει την πρόσβαση και τις τροποποιημένες χρονικές σημάνσεις σε μια ημερομηνία στο παρελθόν. Η αλλαγμένη χρονική σήμανση ενημερώθηκε επίσης στην τρέχουσα ώρα του υπολογιστή.

Μπορείτε επίσης να χρησιμοποιήσετε την επιλογή -r (αναφορά), όπως φαίνεται παρακάτω, εάν θέλετε να ορίσετε τις χρονικές σημάνσεις ενός αρχείου στις τιμές χρονικής σφραγίδας ενός άλλου:

touch dp.c -r dice_words.sl3
stat dp.c

ο

Και μετά, είμαστε λίγο πολύ πίσω από εκεί που ξεκινήσαμε, με ένα μείγμα χρονικών σφραγίδων -0400 και -0500.

Ας κάνουμε κάτι που επηρεάζει μόνο την αλλαγμένη χρονική σήμανση. Θα χρησιμοποιήσουμε την εντολή chmod για να δώσουμε ένα εκτελέσιμο αρχείο εκτέλεση αδειών για όλους τους χρήστες:

chmod +x dp
stat dp

ο

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

Πώς το σύστημα αρχείων ενημερώνει τις χρονικές σημάνσεις

Όταν προσαρτάται ένα σύστημα αρχείων, υπάρχουν επιλογές που μπορείτε να χρησιμοποιήσετε για να καθορίσετε πώς θα λειτουργεί ή θα αντιμετωπίζεται αυτό το σύστημα αρχείων. Αυτά αποθηκεύονται στο αρχείο /etc/fstab, το οποίο διαβάζεται και υποβάλλεται σε επεξεργασία κατά την εκκίνηση. Μπορείτε επίσης να ορίσετε επιλογές για να υπαγορεύσετε το σχήμα που θα πρέπει να χρησιμοποιούν για να ενημερώσουν τη χρονική σήμανση πρόσβασης.

Οι παρακάτω είναι μερικές από τις πιο κοινές επιλογές:

strictatime (strict atime): Αυτή η επιλογή ενημερώνει τη χρονική σήμανση πρόσβασης των αρχείων κάθε φορά που γίνεται πρόσβαση σε αυτά. Υπάρχει μια επιβάρυνση που συνδέεται με αυτήν την προσέγγιση, αλλά ορισμένοι διακομιστές μπορούν να επωφεληθούν από αυτό το σχήμα. Έχει μικρή αξία σε έναν επιτραπέζιο ή φορητό υπολογιστή.
noatime (noatime): Αυτή η επιλογή απενεργοποιεί πλήρως την ενημέρωση των χρονικών σφραγίδων πρόσβασης για αρχεία και καταλόγους. Ωστόσο, οι τροποποιημένες χρονικές σημάνσεις θα συνεχίσουν να ενημερώνονται.
nodiratime (χωρίς dir atime): Αυτή η επιλογή επιτρέπει την πρόσβαση στις χρονικές σημάνσεις για την ενημέρωση των αρχείων, αλλά την απενεργοποιεί για τους καταλόγους.
relatime (relative atime): Αυτή η επιλογή ενημερώνει τη χρονική σήμανση πρόσβασης μόνο εάν ήταν παλαιότερη από 24 ώρες ή η προηγούμενη ήταν παλαιότερη από τις τρέχουσες τροποποιημένες ή αλλαγμένες χρονικές σημάνσεις. Αυτό επιτυγχάνει μια καλή ισορροπία μεταξύ των χρονικών σημάνσεων πρόσβασης που ενημερώνονται πολύ συχνά ή δεν ενημερώνονται καθόλου.

  Πώς να χρησιμοποιήσετε το FSearch για να βρείτε αρχεία στο Linux

Ας δούμε το αρχείο /etc/fstab για αυτόν τον υπολογιστή και ας δούμε ποιες επιλογές έχουν οριστεί:

less /etc/fstab

ο

Το αρχείο /etc/fstab εμφανίζεται για εμάς, όπως φαίνεται παρακάτω.

ο

Ακολουθεί το περιεχόμενο του αρχείου χωρίς το περιτύλιγμα:

# /etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
# 
# / was on /dev/sda1 during installation
UUID=4a143d08-8695-475b-8243-b13b56050fc2 / ext4 errors=remount-ro 0 1
/swapfile none swap sw 0 0

Υπάρχουν μόνο δύο καταχωρήσεις, και μία από αυτές είναι ένα αρχείο ανταλλαγής, το οποίο μπορούμε να αγνοήσουμε. Το άλλο προσαρτάται στη ρίζα του συστήματος αρχείων ( / ) και ήταν στη συσκευή /dev/sda1 τη στιγμή της εγκατάστασης. Αυτό είναι το πρώτο διαμέρισμα στον πρώτο σκληρό δίσκο και τυχαίνει να περιέχει ένα σύστημα αρχείων ext4.

Η μόνη επιλογή που του έχει περάσει είναι errors=remount-ro, η οποία λέει στο λειτουργικό σύστημα να επανατοποθετήσει αυτό το σύστημα αρχείων ως μόνο για ανάγνωση, εάν υπάρχουν σφάλματα κατά την προσπάθεια προσάρτησής του ως σύστημα αρχείων ανάγνωσης και εγγραφής.

Επομένως, δεν υπάρχει καμία αναφορά για τον τρόπο χειρισμού της χρονικής σήμανσης πρόσβασης. Ας εμβαθύνουμε και ας δούμε τι μπορεί να μας πει το /proc/mounts. Θα διοχετεύσουμε την έξοδο από το /proc/mounts μέσω του grep. Η συμβολοσειρά αναζήτησής μας θα είναι “sda”, το αναγνωριστικό του σκληρού δίσκου.

Πληκτρολογούμε τα εξής:

cat /proc/mounts | grep "sda"

Τώρα βλέπουμε τις ακόλουθες επιλογές:

rw: Το σύστημα αρχείων θα προσαρτηθεί ως σύστημα αρχείων ανάγνωσης και εγγραφής.
relatime: Το σύστημα αρχείων θα χρησιμοποιήσει το σχήμα “relative time” για να ενημερώσει τις χρονικές σημάνσεις πρόσβασης.

Από που προέκυψε αυτό; Λοιπόν, το σχήμα σχετικού χρόνου χρησιμοποιείται στις ακόλουθες περιπτώσεις:

Όταν χρησιμοποιείται η προεπιλεγμένη επιλογή /etc/fstab.
Όταν χρησιμοποιείται η επιλογή relatime /etc/fstab.
Όταν δεν χρησιμοποιούνται επιλογές χρονικής σήμανσης πρόσβασης στο /etc/fstab και χρησιμοποιείτε πυρήνα Linux 2.6.30 ή νεότερη έκδοση.

Η καταχώρισή μας /etc/fstab για το σύστημα αρχείων ext4 δεν καθόριζε καμία επιλογή ενημέρωσης χρονικής σήμανσης πρόσβασης, επομένως το Linux έκανε τη λογική επιλογή και χρησιμοποίησε το relatime.

Οι χρονικές σημάνσεις είναι σημαντικές

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

Η δυνατότητα χειρισμού χρονικών σημάνσεων θα αποδειχθεί χρήσιμη όποτε χρειάζεται να πείσετε βίαια ένα πρόγραμμα να συμπεριλάβει ή να αγνοήσει ένα αρχείο ή ένα σύνολο αρχείων.