Updfstab

Ce script a été rendu obsolète par l'amélioration de hal, fam, udev, gnome-volume-manager, etc... ; je ne l'utilise plus mais il peut encore servir.


Gestion automatique des périphériques de stockage USB

(clic here for english version)

1) Contexte et objectif

Ceci s'applique aux périphériques pris en charge par le module usb_storage, c'est-à-dire les clefs USB, les disques durs USB, et de nombreux appareils photo numériques. Votre noyau doit être en version 2.6.x et vos périphériques doivent être gérés par Udev (pas DevFS, ni un /dev statique).

Lors du branchement d'un tel périphérique, le but est de :

  • créer un point de montage avec un nom explicite correspondant au périphérique (/media/IntelligentStick). Pour ça les infos sont récupérées dans le label de la partition, ou sinon dans /sys (modèle ou fabricant)
  • ajouter la ligne correspondante dans /etc/fstab

Lors du débranchement, on retire simplement la ligne de /etc/fstab et le point de montage.

De cette façon, sous Gnome, en ayant FAM ou GAMIN installé et actif, le périphérique apparaît automatiquement dans la liste des périphériques montables (clic droit sur le bureau -> volumes, ou dans le poste de travail sous gnome >=2.6). On peut ainsi le monter ou le démonter à la souris très simplement.

2) Le script

La dernière version est updfstab-17 Les autres versions sont ici : http://ccomb.gorfou.fr/static/usbstorage/

Merci à toutes les personnes qui m'ont aidé à améliorer ce script (Stefan Illner, Thomas Jahns, Elia Yehuda, Iain Mac Donald, Jan Schulz, Peter Kolloch, Christian Perrier, Eric Freyens, Yth., Florian Iragne, Gurvan huiban, Benoit-Pierre Demaine, Emmanuel Bouthenot, Christophe Jenaux, gpe92, Yannick Torres, Christophe Thiesset)

Je n'ai pour l'instant par assez de temps pour maintenir ce script, je place ci-dessous les versions ultérieures et contributions :

Voici une préversion 18rc (amélioration de détection de l'utilisateur, gestion de l'icône KDE, correction pour les lecteurs Zip USB) updfstab-18rc

Voici un port vers perl 5.6, fait par Thomas Jahns, et qui crée une autofs map au lieu de modifier le fstab : hotplug-mount.pl, et son README

Voici une version 17+ modifiée par Christophe Thiesset avec gestion de l'icône KDE, message d'avertissement en cas de débranchement sans démontage, et autres modifications : updfstab-17.chthiesset.dev (et daemon associé : updfstab-sync.chthiesset.c)

Voici un paquet Debian de la version modifiée (déc 2005), contenant le script et le daemon, et qui a été déployée à l'INSA Toulouse pour les salles de cours et les postes utilisateurs. Les améliorations apportées sont les messages d'avertissement pour l'utilisateurs, l'ouverture de konqueror sur le contenu du péripherique automatisée et le démontage à chaud possible sans (trop) de perte de données. Le point négatif étant une baisse du taux de transfert (le démon synchronise toutes les 10 secondes).

Voici une autre version 17+ par Yannick Torres avec gestion de l'icône KDE : updfstab-17.yannick

Christian Gatzemeier suggère de modifier les options de montage. Voir en bas de page.

3) Prérequis

Vous devez avoir installé :

  • un noyau 2.6
  • Udev
  • hotplug
  • fam ou Gamin
  • hal (si vous utilisez un lecteur de cartes flash CF, SD, MS, etc.)
  • facultatif pour gnome : gnome-volume-manager et hal permettent de faire de l'automontage et d'ouvrir automatiquement nautilus lors de l'insertion du périphérique. (il faut l'activer dans le gnome-volume-properties).

4) Installation

Le script doit être simplement copié comme /etc/dev.d/default/updfstab.dev, et rendu exécutable :

  • Ouvrez un terminal et devenez root en tapant su <Enter>, puis votre mot de passe root.
  • Collez la ligne suivante dans votre terminal :
of=/etc/dev.d/default/updfstab.dev; wget ccomb.gorfou.fr/static/usbstorage/updfstab-latest -O $of; chmod 755 $of

5) Désinstallation

  • Ouvrez un terminal et devenez root en tapant su <Enter>, puis votre mot de passe root.
  • Effacez simplement le script en tapant : rm -f /etc/dev.d/default/updfstab*

6) Historique des modifications

  • updfstab-17 (23-Jan-2005) - gestion des périphériques sans partition (formattés tels quels) - modification du choix pour le nom du point de montage. (label->model->vendor->"usb-disk") - utilisation de ext2, ext3 et xfs à la place de auto pour le montage de ces systèmes de fichiers
  • updfstab-2.6-16 (14-Jan-2005) - améliorations et corrections mineures - prise en charge du noyau 2.6.10 - suppression de la dépendance avec procmail (/usr/bin/lockfile) - meilleur comportement avec plusieurs périphériques - utilisation de "vfat" au lieu de "auto" pour les périphériques FAT - automontage à l'insertion (désactivé par défaut. Voir la fin du script)
  • updfstab-2.6-15 (13-Déc-2004) - correction d'un bogue pour le cas du débranchement d'un périphérique monté. - autres modification mineure
  • updfstab-2.6-14 (24-Nov-2004) - prise en charge d'udev 0.46 qui ne semble plus fournir DEVNAME au débranchement
  • updfstab-2.6-13 (02-Nov-2004) - retrait de l'option "sync", qui divisait par 10 les taux de transfert. Il faudrait trouver un moyen d'activer "sync" tout en pouvant spécifier le blocksize au montage (l'option -o blocksize n'a aucun effet).
  • updfstab-2.6-12 (11-Oct-2004) - gestion du label des partitions EXT2/3 (via e2label) - ajout de l'option de montage "noatime" pour éviter d'écrire lors d'une simple lecture
  • updfstab-2.6-11 (27-Aug-2004) - gestion du label des partitions XFS (via xfs_admin) - protection du script entier par lockfile (pour éviter les accès conrurrents au périphérique) - les partitions étendues ne sont plus prises en compte (car non montables) - le numéro de partition n'est plus ajouté au nom du point de montage
  • updfstab-2.6-10 (08-Jul-2004) - arrêt immédiat si /usr/bin n'est pas disponible (sinon erreurs pendant le démarrage si /usr est une partition séparée.) - utilisation d'un lockfile pour protéger les accès à /etc/fstab - utilisation du syslog
  • updfstab-2.6-9 (03-Jul-2004) - utilisation de iocharset=utf-8 seulement pour FAT et NTFS - si on débranche un périphérique monté, les processus y accédant sont tués et le périphérique est démonté. (accessoirement on redémarre famd s'il était lancé et s'il a été tué, parce qu'il bloque souvent le démontage à cause de nautilus)
  • updfstab-2.6-8 (03-Jul-2004) - ajout d'une option de debug (décommenter DEBUG=1) - correction d'un bug qui empêchait le retrait de la ligne fstab et du point de montage - suppression des erreurs non fatale (option -q à modprobe et ajout de >/dev/null à ls) - effacement de la ligne fstab et du point de montage avant ajout s'ils existent au branchement (pour purger) - autres corrections de bug
  • updfstab-2.6-7 (06-Jun-2004) - Réécriture complète du script - Le script utilise maintenant les variables passées par udevd (ACTION, DEVNAME, DEVPATH) - Le point de montage est aussi retiré au débranchement - Ca devrait fonctionner quelles que soient les règles de udev (avec /dev/scsi ou /dev/sda) - le /dev n'est pas écrit en dur, donc ça doit marcher aussi avec /udev - remplacement de modprobe par /sbin/modprobe au cas où /sbin n'est pas dans le PATH. - protection contre l'execution pour des périphériques non usb (erreurs au boot)
  • updfstab-2.6-6 (05-Jun-2004) - Le point de montage est maintenant /media au lieu de /mnt (recommandation du standard FHS)
  • updfstab-2.6-5 (05-Jun-2004) - si le point de montage choisi est déjà utilisé dans fstab, un nombre est collé à la fin. (ex: usb-disk => usb-disk-2) - l'utilisation du serial number est retirée. (aucune utilité)
  • updfstab-2.6-4 (05-Jun-2004) - modification du choix pour le nom du point de montage. (label->product->manufacturer->"usb-disk")
  • updfstab-2.6-3 (05-Jun-2004) - modification du choix pour le nom du point de montage. (product->manufacturer->"usb-disk")
  • updfstab-2.6-2 (19-Apr-2004) - modification du choix pour le nom du point de montage. (manufacturer->product->"usb-disk")
  • updfstab-2.6 (18-Mar-2004) - réécriture de la version pour noyau 2.4

7)Version pour noyau 2.4 et ""DevFS""

J'avais commencé ce script avec le noyau 2.4 et devfs. Le script que j'avais écrit est ici : http://ccomb.gorfou.fr/static/usbstorage/updfstab-2.4 Il doit simplement être copié en tant que /usr/sbin/updfstab, et être rendu exécutable. C'est hotplug qui s'occupe de l'appeler automatiquement. (En fait il remplace le script updfstab normalement installé par le paquet kudzu.) Il est expérimental, et peut ne pas fonctionner dans de nombreux cas. Étant donné que j'ai migré définitivement vers le noyau 2.6 et que j'ai remplacé devfs par udev, je ne m'occupe plus de ce script.

Ce script a été modifié ou recréé par d'autres personnes : http://ccomb.gorfou.fr/static/usbstorage/updfstab.florian http://ccomb.gorfou.fr/static/usbstorage/updfstab.gurvan_huiban


Commentaires :

proposition de Christian Gatzemeier :

Pour une meilleure integration avec vfat pour les systèmes qui utilisent un umask 002, vous pouvez ajouter à la ligne 225 : ",quiet,shortname=mixed,dmask=0002,fmask=0113" aux options de montage. Utilisez ",quiet,shortname=mixed,dmask=0022,fmask=0133" pour les systèmes avec umask 022. Les systèmes non-anglais peuvent bénéficier de l'option ",codepage=850".

",iocharset=utf8" devrait être ajouté par le script uniquement pour les systèmes en UTF8. J'ai donc remplacé ",iocharset=utf8" à la ligne 225 par les options ci-dessus. Je ne sais pas comment pourrait être déterminé le umask par défaut. Il pourrait être réglé différemment pour root, et donc pour le script en cours d'execution.


Quelques problèmes rencontrés lors du passage à udev :

  • J'ai perdu les terminaux texte (les VT, accessibles avec Alt-Ctrl-F1, ...-F2, etc.)

-> Remplacer compat.rules par compat-full.rules dans /etc/udev/rules.d/ :

cd /etc/udev/rules.d; rm -f compat.rules; ln -s ../compat-full.rules

-> ou mieux : ne garder que compat.rules dans /etc/udev/rules.d

cd /etc/udev/rules.d; rm -f *; ln -s ../compat.rules
  • J'ai perdu le son (alsa ne trouve plus de carte son) ...

MW: Pourquoi ne pas utiliser autofs ? J'ai écrit un script (en perl) pour hotplug qui reconnait ce qui est inséré dans le port USB, lui trouve un nom intelligent, et ajoute une ligne dans la config d'autofs et crée un lien symbolique vers le futur point de montage. Ainsi, lorsqu'on lit le lien symbolique, autofs crée le point de montage et monte la partition idoine. Avec un timeout de 3 secondes dans autofs, la parition est démontée automatiquement lorsqu'on cesse d'utiliser le répertoire pendant plus de 3 secondes. J'utilise ca sur une machine qui met sert de magnétoscope, et où je ne peux pas facilement monter et démonter une partition.


Pourquoi ne pas créer automatiquement le lien vers la clé USB sur un bureau KDE ? Les liens de type "périphériques" sous KDE ne sont que de simples fichiers textes. Il est à mon avis très facile de réaliser ça pour avoir un comportement vaguement ressemblant au gnome-volume-manager.

ccomb: parce que c'est déjà fait dans KDE. Il suffit de lui dire d'afficher les icônes de disques durs non montés.

  • j ai des disque Firewire ou Ilink ... et ca marche pas :(

remplacer les lignes :

if [ "$WE_ARE" = "PARTITION" ]; then
  device1="`cd -P /sys${DEVPATH}/../device/../../../../ 2> $DEV/null ; /bin/ls 2> /dev/null | grep ':' | head -n 1`"
  device2="`cd -P /sys${DEVPATH}/../device/../../../ 2> $DEV/null ; /bin/ls 2> /dev/null | grep ':' | head -n 1`"
else if [ "$WE_ARE" = "DEVICE" ]; then
[...]
if [ -z "$device1" -o ! -e /sys/bus/usb/drivers/usb-storage/$device1 ]; then
    if [ -z "$device2" -o ! -e /sys/bus/usb/drivers/usb-storage/$device2 ]; then
              exit
      fi; fi;

par :

if [ "$WE_ARE" = "PARTITION" ]; then
  device1="`cd -P /sys${DEVPATH}/../device/../../../../ 2> $DEV/null ; /bin/ls 2> /dev/null | grep ':' | head -n 1`"
  device2="`cd -P /sys${DEVPATH}/../device/../../../ 2> $DEV/null ; /bin/ls 2> /dev/null | grep ':' | head -n 1`"
  device3="`cd -P /sys${DEVPATH}/../device/../../../../ 2> $DEV/null ; /bin/ls 2> /dev/null | grep '-' | head -n 1`"
  device4="`cd -P /sys${DEVPATH}/../device/../../../ 2> $DEV/null ; /bin/ls 2> /dev/null | grep '-' | head -n 1`"
else if [ "$WE_ARE" = "DEVICE" ]; then
[...]
if [ -z "$device1" -o ! -e /sys/bus/usb/drivers/usb-storage/$device1 ]; then
    if [ -z "$device2" -o ! -e /sys/bus/usb/drivers/usb-storage/$device2 ]; then
        if [ -z "$device3" -o ! -e /sys/bus/ieee1394/drivers/sbp2/$device3 ]; then
            if [ -z "$device4" -o ! -e /sys/bus/ieee1394/drivers/sbp2/$device4 ]; then
              exit
      fi; fi; fi; fi;

-- doublehp

  • J ai changé le nom decrivant ma cle USB sous Windows, et updatefstab la mount sous un autre nom.

Il semble que Windows n ecrive pas toujours le nom descripteur a l interieur du peripherique; pour le changer sous Linux, vous pouvez utiliser mlabel du package mtools; il faut au prealable ajouter une ligne du genre:

drive m: file="/dev/sda1"

à /etc/mtools.conf

puis executer:

mlabel m:PLOP

sachez que le script se base si possible sur le résultat de :

file -s /dev/sda1

(sinon il invente un nom comme il peut)

-- doublehp

Bugs :

  • ne fonctionne pas bien avec les lecteurs usb de cartes flash : il faut débrancher et rebrancher le lecteur pour que le périphérique apparaisse.
  • le parametre iocharset=utf8 empeche mes disques d'etre montés (testé avec un Archos et un apn)

--> je n'ai pas compilé le support de l'utf8 comme chartset dans le kernel :

Nov 21 16:02:01 [kernel] Unable to load NLS charset utf8

--> De plus j'ai cette erreur la, et donc ca me fait dire que peut etre on ne devrait pas mettre cette option :

Nov 21 16:02:01 [kernel] FAT: utf8 is not a recommended IO charset for FAT filesystems, filesystem will be case sensitive!

  • Si le device du peripherique est different de la fois precedente ou il a ete monté (car le nom device depend de l'ordre des branchement lorsqu'il y a plusieurs peripheriques) alors la ligne n'est pas retiré du fstab.

À faire :

  • interface graphique de configuration pour :
    • choisir d'activer ou non le montage automatique
    • modifier les points de montage (soit un mapping sur le nom déduit, ou modification directe du label)
  • étudier la possibilité de gestion des partitions de disques durs (autres que celles déjà connues du fstab)

Autres projets similaires

usbmount