Εκτεταμένες ιδιότητες αρχείων

Μια γρήγορη εισαγωγή

Το ξέρετε πως μπορούμε να προσθέσουμε ένα σχόλιο σε οποιοδήποτε αρχείο; Ας δούμε ένα παράδειγμα. Ανοίγουμε ένα :terminal: τερματικό και :

touch afile.txt
setfattr --name user.comment --value "A user comment" afile.txt 
getfattr --dump afile.txt 
# file: afile.txt
user.comment="A user comment"

Και μπορούμε να προσθέσουμε και ότι άλλη πληροφορία θέλουμε. Για παράδειγμα:

setfattr -n user.poetry.title -v "Τα άπαντα του λύκου" poetry.txt 
setfattr -n user.poetry.author -v "Διόνυσος Ασφοδελάκης" poetry.txt
getfattr -d poetry.txt 
# file: poetry.txt
user.poetry.author=0szpTOuc+Mzr3Phc+Dzr/PgiDOkc+Dz4bOv860zrXOu86szrrOt8+C
user.poetry.title=0szqTOsSDOsc+AzrHOvc+EzrEgz4TOv8+FIM67z43Ous6/z4U=

Χμμ κάτι πήγε μάλλον στραβά :rofl:. Μοιάζει να πήραμε ένα base64 με ένα 0s μπροστά.

Γιατί αυτή η τρελή μορφή; Για να μεταφέρετε το αρχείο και οι ιδιότητες σωστά ανάμεσα σε αρχιτεκτονικές που έχουν διαφορετικό endianess αν ξέρεις τι είναι αυτό :stuck_out_tongue:.

Ας ξαναδοκιμάσουμε αυτή την φορά σωστά.

getfattr -e text -d poetry.txt
# file: poetry.txt
user.poetry.author="Διόνυσος Ασφοδελάκης"
user.poetry.title="Τα άπαντα του λύκου"

Εντάξει, όλα καλά. Μόλις είδαμε τις εκτεταμένες ιδιότητες (extended attributes) που είναι ένα σύνολο
κλειδιά/τιμές που μπορούν να προσαρτηθούν σε ένα αρχείο.

Εκτός από τις εντολές setfattr και getxattr θα βρούμε την παλαιότερη εντολή attr που μας έρχεται από το IRIX και το XFS. Αν και έχει μια ποιο απλή σύνταξη αποφύγετε την χρήση της.

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

Ας δούμε πως μπορούμε να πάρουμε την τιμή μιας εκτεταμένης ιδιότητας σε κάποιο shell script.

comment=$(getfattr --name user.comment --only-values afile.txt)
comment $comment

Μπορούμε επίσης να αλλάξουμε την τιμή μιας ιδιότητας.

setfattr -n user.poetry.title -v "Οι μέρες του λύκου" poetry.txt

ή να την σβήσουμε

setfattr -n user.poetry.title  poetry.txt
getfattr -e text -d poetry.txt   
# file: poetry.txt
user.poetry.author="Διόνυσος Ασφοδελάκης"
user.poetry.title=""

Χμμ μάλλον τα κάναμε πάλι σαλάτα :rofl:. Απλά κάναμε την τιμή της κενή, δεν την σβήσαμε. Κάτι που είναι διαφορετικό. Εντάξει ας την σβήσουμε τώρα στα αλήθεια.

setfattr -x user.poetry.title  poetry.txt

Για περισσότερες πληροφορίες δείτε τα man pages seftattr(1) και getfattr(1).

Βοήθεια ! Τίποτα δεν λειτουργεί: Θα πρέπει να το κάνεις αυτό σε ένα σύστημα αρχείων που να έχει υποστήριξη για εκτεταμένες ιδιότητες. Σε κάποια συστήματα αρχείων θα πρέπει να προστεθεί η παράμετρος user_xattr στο /etc/fstab. Στο ubuntu :ubuntu: θα πρέπει να εγκατασταθεί το πακέτο attr.

Γραφική διαχείριση με το eiciel

Υπάρχει ένα μικρό utility που μπορεί να εγκαταταθεί για να κάνεις τα παραπάνω με γραφικό τρόπο με το κομψό σικ) όνομα eiciel.

To eiciel μπορεί να διαχειριστεί και ACL οπότε το όνομα τελικά ίσως να μην είναι τόσο άσχημο :stuck_out_tongue:. To eiciel μπορεί να προστεθεί στο caja (και πιθανά και σε κλώνους του) με την προσθήκη του αντίστοιχου πακέτου.

Και λίγη γκρίνια : Στο παρελθόν το είχα προσθέσει με επιτυχία στο nautilus αλλά πλέον δεν είναι δυνατόν. Σκαλίζοντας το λίγο με έκπληξη είδα πως δεν έχουμε πλέον κάποιο gui για το gesstings :worried:. Κάπου σιγά σιγά χάνουμε δυνατότητες. Τα emplems στο gnome τα χάσαμε, τις σημειώσεις το ίδιο. Κάποιες φορές πάμε προς τα πίσω
Το gnome-gfvs έχει τα προβλήματα του και το καταλαβαίνω, αλλά δεν είναι τα extended attributes το μέρος για να αποθηκευτούν αυτά, τα εικονίδια των εφαρμογών, οι σημειώσεις, και τα thumbnails; Ας μην τα έχουμε σε συστήματα αρχείων που δεν τα υποστηρίζουν. Το καταλαβαίνω αυτό, αλλά ας κάνουμε επιτέλους χρήση αυτών που μας παρέχει το Linux. Ας πάμε επιτέλους μπροστά.

Αρκετά όμως με την γκρίνια. Ας δούμε κάποια πράγματα για το τι συμβαίνει κάτω από το καπάκι και τι περιορισμοί υπάρχουν.

Μεταδομένα και εκτεταμένες ιδιότητες αρχείων

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

Για παράδειγμα τα Windows τυπικά δεν κάνουν διάκριση ανάμεσα σε κεφαλαία και πεζά γράμματα σε ονόματα αρχείων, κάτι που προκαλεί άπειρες ενοχλήσεις όταν μεταφέρεις κώδικα από τα Windows στο Linux. Αλλά αυτό είναι σε επίπεδο λειτουργικού και όχι σε επίπεδο συστήματος αρχείων. Αντίθετα με το τι πιστεύει ο περισσότερος κόσμος τα Windows έχουν POSIX συμβατότητα και το NTFS υποστηρίζει δικαιώματα τύπου UNIX, αλλά απαιτεί κάποια βήματα και δεν ξέρω κάποια διανομή να το κάνει. Θα πρέπει να γίνει μια αντιστοίχηση ανάμεσα στους χρήστες. Για ένα πρακτικό παράδειγμα δες εδώ και εδώ.

Εκτός από τα τυπικά μεταδομένα τα μοντέρνα λειτουργικά συστήματα υποστηρίζουν και εκτεταμένες ιδιότητες για κάθε αρχείο (τα λεγόμενα Extended file attributes [link]). Αυτά είναι επιπλέον δεδομένα προσαρμοσμένα σε κάθε αρχείο που έχουν το νόημα που θα τους δώσει μια εφαρμογή.

Τέτοιες ιδιότητες μπορεί να είναι ο συγγραφέας ενός κειμένου, ο τίτλος ενός τραγουδιού mp3 και το άλμπουμ που ανήκει, κάποιο άθροισμα ελέγχου (checksum) ή κάποιο ψηφιακό πιστοποιητικό, το URL απο όπου κατέβηκε ένα αρχείο, η κωδικοποίηση των χαρακτήρων, και ότι άλλο θέλουμε. Στο Linux τα Access Control List υλοποιούνται σαν εκτεταμένες ιδιότητες (Ναι έχουμε και είναι κομμάτι του POSIX αλλά δεν τα χρησιμοποιούμε πολύ). To SELinux επίσης αποθηκεύει δεδομένα εκεί. Τα file capabilities επίσης.

Οι πληροφορίες για τα extended attributes δεν χωράνε μέσα στο inode όπου μπαίνουν τυπικά όλα τα μεταδομένα εκτός από το όνομα και χρησιμοποιείτε ο μηχανισμός των extends.

Αν και δεν είναι κομμάτι του POSIX υποστήριξη θα βρούμε σχεδόν σε όλα τα Linux filesystems καθώς και στο NFSv4. Επίσης θα τα βρούμε σε BSD, OS/2, Mac OS/X, Solaris και Windows. Το NTFS έχει μια φτωχή υποστήριξη, αλλά μπορούν να χρησιμοποιηθούν τα forks/ADS που έχει για αυτό τον σκοπό (ένα χαρακτηριστικό που απουσιάζει από κάθε filesystem του Linux).

Οι εκτεταμένες ιδιότητες αρχείων στο Linux

Οι εκτεταμένες ιδιότητες οργανώνονται σε χώρους ονομάτων και μοιάζουν με namespace.app.key το όνομα μπορεί να είναι μέχρι 256 χαρακτήρες και μπορούμε να έχουμε όσα επίπεδα θέλουμε. Η τιμή μπορεί να έχει μέγεθος μέχρι 64ΚΒ. Αλλά ένα filesystem μπορεί να έχει επιπλέον περιορισμούς. Στα extX το συνολικό μέγεθος τιμών και δεδομένων δεν μπορεί να είναι μεγαλύτερο από ένα block. Δηλαδή 1024, 20148 ή 4096 bytes ανάλογα με το πως έχει μορφοποιηθεί η κατάτμηση. Στο btrfs το μέγεθος είναι 16ΚΒ αλλά μπορεί να ρυθμιστεί. Για περισσότερα xattr(7).

Υπάρχουν τέσσερεις χώροι ονομάτων.

  • Χρήστη (user), που είναι αυτοί που μας ενδιαφέρουν εδώ και τους έχουμε δει ήδη. Η πρόσβαση για ανάγνωση η εγραφή είναι ίδια με αυτή του αρχείου.
  • Trusted, εξυπηρετούν την ίδια χρήση με αυτές επιπέδου χρήστη, αλλά μπορούν να επεξεργαστούν μόνο απο προγράμματα που έχουν το CAP_SYS_ADMIN capability.
  • System, για χρήση απο τον kernel. Για την ώρα τους χρησιμοποιούν μόνο τα ACL.
  • Security, για χρήση με συστήματα ασφάλειας του kernel όπως το SELinux και τα capabilities.

Ο παρακάτω πίνακας συνοψίζει τα δικαιώματα που απαιτούνται :

setfattr getfattr
trusted root root
security read access root
system read access owner
user read access write access

Περιορισμοί:

  • Για symbolic links όλοι οι χρήστες έχουν πλήρη πρόσβαση και η πρόσβαση δεν μπορεί να ανακληθεί. Έτσι και αλλιώς δεν έχει καμία σημασία, ούτε νόημα να έχεις σε ένα symbolic link.
  • Επίσης δεν έχουν νόημα και δεν υποστηρίζονται σε κάτι άλλο πέραν από αρχεία και καταλόγους.
  • Δεν υποστηρίζονται σε κατάλογους με ενεργό το sticky bit όπως το \tmp.

Κόλπα, προδιαγραφές και προβλήματα

Πολλά αρχεία περιέχουν μέσα τους μεταδεδομένα. Οι φωτογραφίες τα EXIF, τα pdf, τα αρχεία του LibreOffice. Αλλά δεν ξέρω κανένα πρόγραμμα που να διαβάζει αυτά τα δεδομένα και να τα μεταφέρει σαν εκτεταμένες ιδιότητες. Προγράμματα σαν το calibre καταφεύγουν σε εξωτερικά αρχεία και βάσεις δεδομένων.

H χρήση των εκτεταμένων ιδιοτήτων των αρχείων είναι αυτή την στιγμή αρκετά περιορισμένη. Κάποια προγράμματα όπως το Beagle το Dropbox, το Baloo του KDE, το Chromium το wget, το cURL και το recoll τα χρησιμοποιούν. Οι διαχειριστές των αρχείων δεν κάνουν χρήση αυτών των πληροφοριών.

Προδιαγραφές

Υπάρχει ένα προσχέδιο προδιαγραφής στο freedesktop που ορίζει κάποια από αυτά. Ενδεικτικά

Κλειδί Χρήση
user.xdg.comment Ένα σχόλιο για το αρχείο
user.xdg.origin.url Η προέλευση του αρχείου
user.xdg.origin.email.subject Το μήνυμα που ηταν atttachment
user.xdg.language H γλώσσα
user.mime_type Ο τύπος mime
user.charset H κωδικοποίηση των χαρακτήρων

Προβλήματα

Ο λόγος που δεν έχουμε μεγάλη χρήση είναι πως θα πρέπει να εξελιχθούν και τα εργαλεία που τα χρησιμοποιούν. Θέλεις όταν κάνεις συμπίεση ένα αρχείο τα δεδομένα αυτά να αποθηκευτούν. Αυτή την στιγμή υπάρχει υποστήριξη για το gnu tar και για το tar του BSD αλλά δεν είναι συμβατά μεταξύ τους :worried:. Πιθανά να έχει βελτιωθεί η κατάσταση.

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

Πείτε μας τι έχετε δοκιμάσει και τι δούλεψε.

Πολλά εργαλεία έχουν υποστήριξη αλλά θέλουν συχνά να προσθέσεις σημαίες. Παρακάτω είναι κάποιες σημαίες που πρέπει να προστεθούν στις εντολές

Εντολή Σημαία
cp -a ή -preserve=mode,ownership,timestamps,xattr
rsync -X ή --xattrs
fsarchiver :ok_hand:
mv :ok_hand:
tar --xattrs
bsdtar -p κατά την εξαγωγή

Χρήσιμο είναι να φτιαχνούν aliases στις παραπάνω εντολές. Για επεξεργαστές κειμένου θα πρέπει να γίνει ρύθμιση ώστε να γράφουν πάνω στο αρχείο αντί να κάνουν rename.

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

Αναζήτηση

Κάτι που είναι χρήσιμο είναι να βρούμε τα αρχεία που έχουν μια ιδιότητα. Θα φτιάξουμε καταρχάς μια δική μας εντολή:

#!/bin/bash 
# ~/.local/bin/findattrs

attr=$1
val=$2
shift 2
IFS=' ' 

for file in "$@" ; do
    result=$(getfattr -e text -n "user.${attr}" --only-values "${file}" 2> /dev/null)
     if [ "$result" = "$val" ] ; then
        echo "${file}"
     fi     
done

και στην συνέχεια θα χρησιμοποιήσουμε την find.

find . -exec findattrs poetry.subject "Πάμε για Nobel" {} \;

Περισσότερα για την εντολή find υπάρχουν εδώ:

Εξαγωγή και επαναφορά

Ένας τρόπος να διατηρήσουμε τις ιδιότητες όταν όλλα τα άλλα αποτύχουν είναι να τις εξάγουμε σε ένα αρχείο κειμένου

getfattr --dump * > xfatrrts.txt

και να τις προσθέσουμε μαζικά στην συνέχεια

setfattr --restore=xfatrrts.txt

Μια άλλη χρήση αυτού του αρχείου είναι να μας βοηθά στις αναζητήσεις αντί για την προηγούμενη μέθοδο. Χρήσιμη είναι η παρακάτω συνάρτηση του bash :bash:. [Πηγή]

 ea_query() {
    a=$1; v=$2
    shift 3
    getfattr -n $a $* |
    awk "BEGIN  {
      RS="# file: "
      FS="n"
    }/="$v"/ { print $1 }"
  }

H συνάρτηση μπορεί να χρησιμοποιηθεί για παράδειγμα για να αντιγράψει “σημαντικά” αρχεία σε ένα φάκελο.

cp `ea_query user.important yes *.txt` important_texts/

Κόλπα με το zsh

Θα χρειαστεί να προσθέσουμε τα παρακάτω στο αρχείο ~/.zshrc [Πηγή]

 fattr() {
  local val=$(getfattr -e text -n user.$1 --only-values $REPLY 2>/dev/null)
  [[ -n $val && ( -z $2 || $val = $2 ) ]]
}

Ας δούμε ποιες φωτογραφίες έχουν το user.year με την εντολή

ls *(e:fattr year:)

καθώς και ποιες έχουν τραβηχτεί το 2020

ls *(e:fattr year 2020:)

Ένα μέλλον που δεν ήρθε ακόμα

To 1995 πριν 25 χρόνια! είχαμε ένα λειτουργικό σύστημα το BeOS

το οποίο έβλεπε τον δίσκο σαν μια μεγάλη βάση δεδομένων. Ερωτήματα μπορούσαν να γίνουν και να εμφανιστούν σαν εικονικούς φακέλους. Δυστυχώς δεν άντεξε τον ανταγωνισμό. Σήμερα υπάρχει το Haiku μια υλοποίηση του σε ανοικτό κώδικα. Η Microsoft το 2002-2006 είχε ξεκινήσει μια προσπάθεια για ένα σύστημα αρχείων σαν μια βάση δεδομένων, αλλά την εγκατέλειψε. Μιλάω για το WinFS.

Στον κόσμο του Linux περιμένω χρόνια κάτι ανάλογο, από τότε που μπήκε υποστήριξη για εκτεταμένες ιδιότητες στον πυρήνα. Ακόμα το περιμένω όπως περιμένω την κυριαρχία του στο desktop. Και πως να γίνει αυτή αν δεν φτιάχνουμε κάτι που να το κάνει να ξεχωρίζει και να μην υπάρχει αλλού;

Να οργανώνουμε τα αρχεία σε φακέλους είναι το ίδιο βολικό όσο να βάζουμε τα θέματα σε κατηγορίες και υποκατηγορίες σε ένα φόρουμ. Και στο παρόν βλέπουμε την δύναμη των “ετικετών” (tags) και πόσο βοηθάνε στο να βρεις αυτό που θες.

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

Αποτυχημένες προσπάθειες: Το oyepa προσπάθησε να κάνει κάτι τέτοιο κωδικοποιώντας την πληροφορία στο όνομα του αρχείου. Καθόλου βολικό. Κάτι ποιο χρήσιμο προσπάθησε να κάνει το Tagsistant και άλλα. Εδώ θα βρείτε μια λίστα με πολλά άλλα projects τα περισσότερα νεκρά.

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

Βιβλιογραφία

Οι κύριες πηγές του άρθρου ήταν δυο βιβλία

https://www.amazon.com/Linux-Programming-Interface-System-Handbook-dp-1593272200/dp/1593272200/ref=mt_other?_encoding=UTF8&me=&qid=

https://www.amazon.com/Linux-Server-Hacks-Two-Troubleshooting/dp/B00YDJX164

To Stack Overflow καθώς και τα άρθρα [1], [2] του συγγραφέα του Recoll έχουν πολύτιμες πληροφορίες. Κάποιες πληροφορίες υπάρχουν και στο Arch wiki. Για χρήση με το NTFS κάποιες σημειώσεις μπορούν να βρεθούν εδώ.

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

Κάνεις φοβερούς οδηγούς, ευχαριστούμε πολύ!

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