November 22, 2009

Brève de code #3: fichiers et attributes étendus sous Linux

Les attributs étendus permettent d'ajouter des informations à un fichier ou un répertoire, par exemple l'auteur d'un document ou la position géographique d'une photo.
Techniquement, les informations ne sont pas contenues dans le fichiers, mais dans son descripteur. Il est donc nécessaire de prendre quelques précautions pour ne pas perdre les informations lors de la copie du fichier sur un autre système de fichier ou lors de son archivage.
La plupart des systèmes de fichiers linux (au moins reiserfs et ext3) supportent les attributs étendus, mais nécessitent de spécifier l'option au montage du système de fichier.

Voici la commande pour activer les attributes étendus sur une partition déja montée (requiers les droits root)

$> sudo mount -oremount,user_xattr /ma/partition

Pour vérifier que l'option est bien activée, utilisez mount sans options:

$> mount
...
rootfs on / type rootfs (rw,user_xattr)  
...

Vous remarquerez la chaîne user_xattr entre parenthèses. Sa présence indique que l'option est active sur la partition racine (/). En cas d'absence, soit l'activation a échouée, soit le système de fichier de la partition ne supporte pas les attributs étendus (le noyau n'a pas été compilé avec la bonne option par exemple).

Vous pouvez également activer l'option de manière permanente en modifiant le fichier /etc/fstab (décrit les partitions à monter au démarrage du système):

$> vim /etc/fstab
/dev/sda2   /   reiserfs defaults,user_xattr        0       1

Installation du programme xattr

xattr va nous permettre d'accéder au attributs étendus des fichiers. Sous debian, il faut installer le paquetage python-xattr:

$> sudo apt-get install python-xattr

Manipulation des d'attributs étendus

xattr s'utilise de la manière suivante:

$> mkdir /tmp/PLOP
$> xattr /tmp/PLOP auteur 'Guillaume Bour'
Traceback (most recent call last):  
  File "/usr/bin/xattr", line 8, in <module>
    load_entry_point('xattr==0.4', 'console_scripts', 'xattr')()
  File "/usr/lib/pymodules/python2.5/xattr/tool.py", line 70, in main
    attrs[attr_name] = attr_value
  File "/usr/lib/pymodules/python2.5/xattr/__init__.py", line 115, in __setitem__
    self.set(item, value)
  File "/usr/lib/pymodules/python2.5/xattr/__init__.py", line 81, in set
    self._set(name, value, 0, options | self.options)
  File "/usr/lib/pymodules/python2.5/xattr/__init__.py", line 16, in _func
    return func(first, *args)
IOError: [Errno 95] Operation not supported: 'PLOP'  

Pourquoi ce message d'erreur? En fait, Linux n'autorise les utilisateurs qu'a définir des attributes étendus contenus dans l'espace de nommage user. L'espace de nommage vient en amont du nom de l'attribut, les deux étant séparés par un point. Ainsi la commande correctement réécrite devient:

$> xattr /tmp/PLOP user.auteur 'Guillaume Bour'

Et elle s'exécute sans erreur. Vérifions en affichant les attribut du fichier:

$> xattr -l /tmp/PLOP
user.auteur: Guillaume Bour  

Voilà, à vous de jouer.