web-dev-qa-db-fra.com

Monter automatiquement les lecteurs externes sur / media / LABEL

Cette question est similaire, mais un peu à l'opposé de ce que je veux. Je souhaite que les lecteurs USB externes soient montés automatiquement au démarrage, sans que quiconque soit connecté, à des emplacements tels que /media/<label>.

Je ne veux pas avoir à entrer toutes les données dans fstab, en partie parce que c'est fastidieux et ennuyeux, mais surtout parce que je ne peux pas prédire ce que je vais y brancher ni comment les partitions vont changer à l'avenir.

Je veux que les lecteurs soient accessibles à des éléments tels que MPD et disponibles lorsque je me connecte avec SSH. gnome-mount semble ne monter que lorsque vous êtes connecté localement à une session graphique Gnome.

72
endolith
  • Remarque pour Ubuntu Server 11.10: Ce script échoue sur Ubuntu Server 11.10 en raison de la commande obsolète vol_id. vol_id a été remplacé par blkid. Pour corriger le script, remplacez "vol_id" par "blkid -o udev" dans le script udev-auto-mount.sh.

Cela fait un moment que je bouscule la tête et je pense avoir trouvé une solution efficace. Ceci est développé et testé sur un système basé sur Debian, il devrait donc fonctionner sur Ubuntu. Je ferai remarquer les hypothèses sur lesquelles il repose afin que celui-ci puisse également être adapté à d'autres systèmes.

  • Il montera automatiquement les clés USB sur le plug-in et ne devrait pas demander beaucoup d'efforts pour s'adapter à Firewire.
  • Il utilise UDEV, donc pas de singe avec HAL/DeviceKit/GNOME-Anything.
  • Il crée automatiquement un répertoire /media/LABEL sur lequel monter le périphérique.

  • Cependant, il peut interférer avec d'autres monteurs automatiques; Je ne peux pas tester pour ça. Je suppose que, lorsque Gnome-VFS est actif, les deux peuvent essayer de faire le montage ... Si Gnome-VFS échoue, il risque de ne pas configurer une icône de bureau. Démonter de Gnome devrait être possible, mais pourrait nécessiter gksudo ou similaire.

Je n'ai pas testé cela au démarrage du système, mais la seule raison pour laquelle je vois que cela pourrait ne pas fonctionner est si le système essaie de monter le lecteur USB avant que le système ne soit prêt pour le montage. Si c'est le cas, vous aurez probablement besoin d'un Tweak supplémentaire pour le script de montage. (Je vérifie avec ServerFault pour voir s'il y a un conseil, mais pas beaucoup d'intérêt là-bas.)

Sur, alors.


Références UDEV:


Contexte (UDEV? Whuzzat?)

UDEV est le système hotplug du noyau. C'est ce qui configure automatiquement les périphériques et les liens symboliques appropriés (par exemple, /dev/disk/by-label/<LABEL>), à la fois au démarrage et pour les périphériques ajoutés pendant le fonctionnement du système.

D-Bus et HAL sont utilisés pour envoyer des événements matériels à des écouteurs tels que Desktop Environments. Ainsi, lorsque vous vous connectez à GNOME et insérez un CD ou branchez une clé USB, cet événement suit cette chaîne:

kernel -> udev -> dbus -> hal -> gnome-vfs/nautilus (mount)

Et hop, votre disque est monté. Mais dans un système sans tête, nous ne voulons pas avoir à nous connecter pour profiter des avantages du montage automatique.

Règles d'Udev

Puisque UDEV nous permet d’écrire des règles et d’exécuter des programmes lors de l’insertion de périphériques, c’est un choix idéal. Nous allons tirer parti des règles existantes de Debian/Ubuntu, leur laisser configurer le lien symbolique /dev/disk/by-label/<LABEL> pour nous et ajouter une autre règle qui montera le périphérique pour nous.

Les règles de UDEV sont conservées dans /etc/udev/rules.d (et /lib/udev/rules.d sur Karmic) et sont traitées par ordre numérique. Tout fichier ne commençant pas par un numéro est traité après les fichiers numérotés. Sur mon système, les règles HAL se trouvent dans un fichier appelé 90-hal.rules. Je mets donc mes règles dans 89-local.rules pour qu'elles soient traitées avant d'arriver à HAL. Avant tout, vous devez vous assurer que ces règles se produisent après le 60-persistent-storage.rules. local.rules peut être suffisant.

Mettez ceci dans votre nouveau fichier de règles:

# /etc/udev/rules.d/local.rules 
# /etc/udev/rules.d/89-local.rules
# ADD rule: if we have a valid ID_FS_LABEL_ENC, and it's USB, mkdir and mount
ENV{ID_FS_LABEL_ENC}=="?*",   ACTION=="add",      SUBSYSTEMS=="usb", \
         RUN+="/usr/local/sbin/udev-automounter.sh %k"
  • Assurez-vous qu'il n'y a pas d'espace après le \, juste une newline (\n).

  • Modifiez SUBSYSTEMS=="usb" en SUBSYSTEMS=="usb|ieee1394" pour la prise en charge Firewire.

  • Si vous voulez que le périphérique appartienne toujours à un utilisateur particulier, ajoutez une clause OWNER="username". Si vous avez juste besoin des fichiers appartenant à un utilisateur particulier, modifiez le script de montage à la place.

Lire la règle

Cela ajoute un programme à exécuter à la liste des programmes à exécuter du périphérique. Il identifie les périphériques de partition USB par <LABEL>, puis transmet ces informations à un script qui effectue le montage. Plus précisément, cette règle correspond:

  1. ENV{ID_FS_LABEL_ENC}=="?*" - une variable d'environnement définie par une règle système antérieure. N'existe pas pour les systèmes non-fichiers, c'est pourquoi nous le vérifions. Nous voulons en fait utiliser ID_FS_LABEL pour le point de montage, mais je n’ai pas convaincu UDEV de le lui échapper, nous allons donc laisser le script de montage le gérer.

    Cette variable et d’autres variables d’environnement sont obtenues par udev à l’aide de la commande vol_id ( , obsolète ). C'est un outil pratique pour voir de jolis détails rapides sur une partition:

    $ Sudo vol_id /dev/sdc1
    ID_FS_TYPE=ext2
    ID_FS_UUID=a40d282a-4a24-4593-a0ab-6f2600f920dd
    ID_FS_LABEL=Travel Dawgs
    ID_FS_LABEL_ENC=Travel\x20Dawgs
    ID_FS_LABEL_SAFE=Travel_Dawgs
    
  2. ACTION=="add" - ne correspond qu'aux événements add ...

  3. SUBSYSTEMS=="usb" - ne fait correspondre que les périphériques présents sur le bus USB. Nous utilisons SUBSYSTEMS ici car cela correspond aux parents de notre périphérique; le dispositif qui nous intéresse sera en réalité SOUS-SYSTÈME == "scsi". La correspondance avec un périphérique USB parent évite d’ajouter notre programme aux lecteurs internes.

  4. RUN+="..." - pas une correspondance, mais une action: ajoutez ce programme à la liste des programmes à exécuter. Dans les arguments du programme, %k devient étendu au nom de périphérique (par exemple, sdc1 et non pas /dev/sdc1) et $env{FOO} récupère le contenu de la variable d'environnement FOO.

Tester la règle

Le premier lien de référence (ci-dessus) est un excellent tutoriel UDEV, mais il est légèrement obsolète. Les programmes qu'il exécute pour tester vos règles (udevtest en particulier) ont été remplacés par l'utilitaire catch-all udevadm.

Après avoir ajouté la règle, branchez votre appareil. Donnez-lui quelques secondes, puis vérifiez le périphérique auquel il est affecté:

$ ls -l /dev/disk/by-label/*
lrwxrwxrwx 1 root root 10 2009-10-25 07:27 label_Foo -> ../../sda1
lrwxrwxrwx 1 root root 10 2009-10-25 07:27 label_Bar -> ../../sdb1
lrwxrwxrwx 1 root root 10 2009-10-25 07:27 label_Baz -> ../../sdc1

Si votre lecteur amovible contient label_Baz, il se trouve sur le périphérique sdc1. Exécutez ceci et regardez le résultat vers la fin:

$ Sudo udevadm test /sys/block/sdc/sdc1
parse_file: reading (...)                           (many lines about files it reads)
import_uevent_var: import into environment: (...)   (many lines about env variables)
(...)                                               (many lines tracing rule matches & programs run)
update_link: found 1 devices with name 'disk/by-label/LABEL_BAZ'
update_link: found '/block/sdc/sdc1' for 'disk/by-label/LABEL_BAZ'
update_link: compare (our own) priority of '/block/sdc/sdc1' 0 >= 0
update_link: 'disk/by-label/LABEL_BAZ' with target 'sdc1' has the highest priority 0, create it
udevtest: run: '/usr/local/sbin/udev-automounter.sh sdc1 LABEL_BAZ'
udevtest: run: 'socket:/org/freedesktop/hal/udev_event'
udevtest: run: 'socket:@/org/kernel/udev/monitor'

Recherchez le nom du script dans notre règle RUN+= dans les dernières lignes (3ème à partir du bas dans cet exemple). Vous pouvez voir les arguments qui seraient utilisés pour ce périphérique. Vous pouvez exécuter cette commande maintenant pour vérifier que les arguments sont corrects. si cela fonctionne sur votre ligne de commande, cela devrait fonctionner automatiquement quand un périphérique est inséré.

Vous pouvez également surveiller les événements UDEV en temps réel: exécutez Sudo udevadm monitor (voir man udevadm pour plus de détails sur les commutateurs). Ensuite, branchez simplement un nouvel appareil et regardez les événements défiler. (Probablement exagéré, sauf si vous êtes dans les détails vraiment bas ...)

Recharger les règles

Une fois que vous avez vérifié que la règle est lue correctement, vous devez dire à UDEV de recharger ses règles pour que la nouvelle prenne effet. Utilisez l’une des méthodes suivantes (si la première ne fonctionne pas, la seconde devrait ... mais essayez la première):

  • exécuter Sudo udevadm control --reload-rules

  • exécuter Sudo /etc/init.d/udev reload

  • redémarrer


Scénario! En fait, 2 scripts ...


Voici le premier script. Étant donné que le programme que nous exécutons doit être terminé rapidement, le second script est alors lancé en arrière-plan. Mettez ceci dans /usr/local/sbin/udev-automounter.sh:

#!/bin/sh
#
# USAGE: usb-automounter.sh DEVICE 
#   DEVICE   is the actual device node at /dev/DEVICE

/usr/local/sbin/udev-auto-mount.sh ${1} &

Voici le deuxième script. Ceci effectue un peu plus de vérification des entrées. Mettez ceci dans /usr/local/sbin/udev-auto-mount.sh. Vous voudrez peut-être modifier les options de montage ci-dessous. Ce script gère maintenant la recherche de la partition LABEL par elle-même; UDEV n'envoie que le nom DEVICE.

En cas de problème de montage des lecteurs au démarrage , vous pouvez insérer un long sleep 60 Nice dans ce script, afin de laisser le temps système de se dérouler avant que le script ne tente de monter le lecteur.

J'ai donné une suggestion dans les commentaires sur la manière de vérifier (lancez ps pour voir si un serveur Web est en cours d'exécution), mais vous voudrez modifier cela pour votre système. Je pense que la plupart des serveurs de réseau que vous utiliseriez suffiraient à cette fin (nfsd, smbd, Apache, etc.). Le risque, bien sûr, est que le script de montage échoue si le service ne s'exécute pas. L'existence d'un fichier particulier serait une meilleure solution.

#!/bin/sh
#
# USAGE: udev-auto-mount.sh DEVICE
#   DEVICE   is the actual device node at /dev/DEVICE
# 
# This script takes a device name, looks up the partition label and
# type, creates /media/LABEL and mounts the partition.  Mount options
# are hard-coded below.

DEVICE=$1

# check input
if [ -z "$DEVICE" ]; then
   exit 1
fi

# test that this device isn't already mounted
device_is_mounted=`grep ${DEVICE} /etc/mtab`
if [ -n "$device_is_mounted" ]; then
   echo "error: seems /dev/${DEVICE} is already mounted"
   exit 1
fi

# If there's a problem at boot-time, this is where we'd put
# some test to check that we're booting, and then run
#     sleep 60
# so the system is ready for the mount below.
#
# An example to experiment with:
# Assume the system is "booted enough" if the HTTPD server is running.
# If it isn't, sleep for half a minute before checking again.
#
# The risk: if the server fails for some reason, this mount script
# will just keep waiting for it to show up.  A better solution would
# be to check for some file that exists after the boot process is complete.
#
# HTTPD_UP=`ps -ax | grep httpd | grep -v grep`
# while [ -z "$HTTPD_UP" ]; do
#    sleep 30
#    HTTPD_UP=`ps -ax | grep httpd | grep -v grep`
# done


# pull in useful variables from vol_id, quote everything Just In Case
eval `/sbin/vol_id /dev/${DEVICE} | sed 's/^/export /; s/=/="/; s/$/"/'`

if [ -z "$ID_FS_LABEL" ] || [ -z "$ID_FS_TYPE" ]; then
   echo "error: ID_FS_LABEL is empty! did vol_id break? tried /dev/${DEVICE}"
   exit 1
fi


# test mountpoint - it shouldn't exist
if [ ! -e "/media/${ID_FS_LABEL}" ]; then

   # make the mountpoint
   mkdir "/media/${ID_FS_LABEL}"

   # mount the device
   # 
   # If expecting thumbdrives, you probably want 
   #      mount -t auto -o sync,noatime [...]
   # 
   # If drive is VFAT/NFTS, this mounts the filesystem such that all files
   # are owned by a std user instead of by root.  Change to your user's UID
   # (listed in /etc/passwd).  You may also want "gid=1000" and/or "umask=022", eg:
   #      mount -t auto -o uid=1000,gid=1000 [...]
   # 
   # 
   case "$ID_FS_TYPE" in

       vfat)  mount -t vfat -o sync,noatime,uid=1000 /dev/${DEVICE} "/media/${ID_FS_LABEL}"
              ;;

              # I like the locale setting for ntfs
       ntfs)  mount -t auto -o sync,noatime,uid=1000,locale=en_US.UTF-8 /dev/${DEVICE} "/media/${ID_FS_LABEL}"
              ;;

              # ext2/3/4 don't like uid option
       ext*)  mount -t auto -o sync,noatime /dev/${DEVICE} "/media/${ID_FS_LABEL}"
              ;;
   esac

   # all done here, return successful
   exit 0
fi

exit 1

Script de nettoyage super bonus!

Un autre script. Tout cela consiste à démonter le périphérique et à supprimer les répertoires du point de montage. Il suppose qu'il a des privilèges pour le faire, vous devrez donc l'exécuter avec Sudo. Ce script prend maintenant le point de montage complet sur la ligne de commande, par exemple:

$ /usr/local/sbin/udev-unmounter.sh "/media/My Random Disk"

Mettez ceci dans /usr/local/sbin/udev-unmounter.sh:

#!/bin/sh
#
# USAGE: udev-unmounter.sh MOUNTPT
#   MOUNTPT is a mountpoint we want to unmount and delete.
MOUNTPT="$1"

if [ -z "$MOUNTPT" ]; then
   exit 1
fi


# test mountpoint - it should exist
if [ -e "${MOUNTPT}" ]; then

   # very naive; just run and pray
   umount -l "${MOUNTPT}" && rmdir "${MOUNTPT}" && exit 0

   echo "error: ${MOUNTPT} failed to unmount."
   exit 1
fi

echo "error: ${MOUNTPT} does not exist"
exit 1
73
quack quixote

Une dernière option suggérée par d’autres sur le réseau est ivman, mais cela semble dépendre de pmount, ce que vous avez déjà indiqué ne fonctionne pas. pmount est abandonné et ivman est presque identique.

Le remplacement de ivman est halevt et il est disponible en karmique. Il s'agit d'une réimplémentation de ivman (lire: "maintenu" et "ne dépend pas de pmount"). Le paquet n'est pas disponible sur Jaunty, mais vous pourrez peut-être le construire vous-même si vous ne prévoyez pas de mise à niveau.

Ces deux outils sont situés au-dessus des couches DBus et HAL et répondent aux événements qui en découlent. Apparemment, les deux peuvent s’exécuter en tant que démon système ou en tant que gestionnaire de montage de session utilisateur (à la manière de Gnome-VFS) - les fichiers /etc/defaults/{ivman,halevt} sont chargés des paramètres système.

Voici quelques instructions pour ajuster ivman afin d'utiliser /media/<LABEL> points de montage. Il est probable que halevt dispose d'un moyen plus simple de le faire, mais peut-être qu'ils vous aideront à trouver une réponse.


Travailler avec HALEVT

Update : Pour obtenir également des montages de CD automatiques, ce que ma réponse UDEV ne fournit pas, j'ai jeté un œil plus profond sur halevt. J'ai trouvé cet article de blog qui a permis d'expliquer beaucoup de choses sur le processus. J'ai dû compiler mon propre paquet halevt pour Debian Lenny (heureusement, toutes les dépendances se trouvaient dans la section lenny-backports). Une fois installé, le processus était généralement non-horrible:

  1. Assurez-vous que le système halevt-daemon est activé dans /etc/default/halevt
  2. Autoriser l'utilisateur système à monter des périphériques dans /etc/PolicyKit/PolicyKit.conf (voir ci-dessous; source )
  3. Modifier la politique HAL pour copier l'étiquette du volume dans le point de montage préféré dans /etc/hal/fdi/policy/preferences.fdi (voir ci-dessous)
  4. Si vous souhaitez une prise en charge des CD/DVD, prenez le script eject.hal de l'article blog ci-dessus, modifiez-le et enregistrez-le dans /usr/local/bin.
  5. Modifier la configuration du système optimisé pour activer les montages dans /etc/halevt/halevt.xml
  6. Ajoutez du code aux scripts pré et post-session de votre gestionnaire de connexion pour arrêter le démon halevt du système lorsque quelqu'un se connecte et le redémarrer lorsqu'il se déconnecte.

Si vous devez redémarrer les démons HAL et HALEVT pour vérifier vos nouvelles configurations, utilisez ceci pour les obtenir dans le bon ordre:

Sudo sh -c "/etc/init.d/halevt stop ; /etc/init.d/hal restart ; /etc/init.d/halevt start"

Étape 1

Vérifiez que START_DAEMON=yes dans /etc/default/halevt.

Étape 2

Dans /etc/PolicyKit/PolicyKit.conf, ajoutez ceci à l'intérieur de la section <config></config>:

<match action="org.freedesktop.hal.storage.mount-removable">
   <match user="halevt">
      <return result="yes"/>
   </match>
</match>

Étape 3

Dans /etc/hal/fdi/policy/preferences.fdi, ajoutez ceci à l'intérieur de la section `:

<match key="volume.label" empty="false">
    <match key="volume.label" is_absolute_path="false">
        <merge key="volume.policy.desired_mount_point" type="copy_property">volume.label</merge>
    </match>
</match>

Étape 4

Le script est bon mais doit exécuter /bin/bash; Certains systèmes peuvent en fait utiliser /bin/dash lorsque /bin/sh est appelé. Changez donc la première ligne du script pour vous assurer d’obtenir la bonne:

#!/bin/sh         <------ old first line

#!/bin/bash       <------ new first line

Étape 5

C'est la partie amusante. Votre système peut déjà fournir un /etc/halevt/halevt.xml de base, vous devrez donc l'adapter à votre usage personnel. Dans mon cas, mon système fournissait déjà un montage amovible de base, mais je devais ajouter un support pour le montage sur CD-ROM et le bouton d’éjection.

Le billet de blog que j'ai mentionné a un bon exemple de configuration XML à consulter pour vos propres modifications. Il s'agit principalement de configurer un remplacement de gnome-mount pour l'environnement fluxbox de l'auteur. Son exemple XML fait plus que vous ne le souhaitez, mais constitue un excellent moyen de vous familiariser avec ce que vous pouvez faire. Il y a aussi de bons exemples dans /usr/share/doc/halevt/examples.

Je devais aussi exécuter Sudo sh -c "mkdir /var/halevt ; chown halevt:plugdev /var/halevt" avant que tout fonctionne.

Voici mes ajouts pour faire fonctionner le montage automatique de CD/DVD:

<!-- CD/DVD mount -->
<halevt:Device match="hal.block.device &amp; hal.block.is_volume = true  &amp; hal.volume.is_disc = true &amp; hal.volume.disc.has_data = true">
   <halevt:Property name="hal.volume.is_mounted">
      <halevt:Action value="true" exec="halevt-mount -u $hal.udi$ -p $hal.volume.policy.desired_mount_point$ -m 002"/>
   </halevt:Property>
</halevt:Device>

<!-- CD/DVD eject button support -->
<halevt:Device match="hal.storage.drive_type = cdrom">
   <halevt:Condition name="EjectPressed" exec='/usr/local/bin/eject.hal $hal.block.device$'/>
</halevt:Device>

Étape 6

Une fois que le démon halevt-system fonctionne, vous devez le désactiver lorsque vous vous connectez à GNOME et le redémarrer à nouveau lorsque vous vous déconnectez. (Voir ma réponse à cette question pour les gestionnaires de connexion non-GDM.) Ce sujet est théorique puisque je ne l'utilise pas, mais cela devrait fonctionner.

Dans /etc/gdm/PreSession/Default, ajoutez ceci pour arrêter le démon halevt-daemon du système:

/etc/init.d/halevt stop

Dans /etc/gdm/PostSession/Default, ajoutez ceci pour redémarrer le système halevt-daemon:

/etc/init.d/halevt start
9
quack quixote

Au fil du temps, des solutions plus faciles apparaissent.

Cette solution repose sur le progiciel udevil qui a été écrit à cette fin et ne nécessite aucun bricolage avec les règles udev. C'est probablement préférable (aux nouveaux et anciens utilisateurs) comme solution simple.

Le script devmon de udevil fait toute la magie en ne dépendant que de udev et de glib. Fonctionne presque hors de la boîte sans avoir besoin de configuration initiale.

Tout ce que j'ai fait sur mon poste de travail a été d'appeler devmon depuis rc.local comme ceci:
devmon 2>&1 >> /var/log/devmon &
Pour votre confort, vous voudrez peut-être l'intégrer dans un script d'initialisation au lieu de rc.local à l'aide d'un outil automatisé tel que pleaserun pour le créer: https://unix.stackexchange.com/a/124609/42673

Après l'avoir exécuté, le stockage que je connecte est inspecté (il recherche les partitions et, le cas échéant, examine leurs étiquettes de système de fichiers), puis monté dans /media/FILESYSTEM_LABEL.
Je n’imaginais rien de plus simple que cela, si ce n’était peut-être le fameux système (in) célèbre d’intégrer cette fonctionnalité à un moment donné dans l’avenir.

udevil en un coup d’œil ( github.io/udevil )
Script: devmon ( igurublog/script-devmon )

6
Costin Gușă

Pour les systèmes basés sur Debian (p. Ex. Ubuntu, etc.), le paquet usbmount / monte automatiquement les clés USB pour vous. Comme il a déjà été décrit, il utilise une approche basée sur udev, à la différence qu’il s’agit simplement d’une simple installation de paquet. Il semble que le original l'auteur du paquet soit à court de Steam, mais Ubuntu/Debian semble toujours le maintenir (je suppose que ce n'est pas si complexe) - il est donc toujours disponible dans les dernières versions.

Les scripts installés peuvent être configurés (/etc/usbmount/usbmount.conf) pour fournir les points de montage appropriés.

3
Pierz

la réponse de quack quixote ne fonctionne pas sous Ubuntu Lucid Lynx (10.04) - il n'y a pas de commande /sbin/vol_id.

Plutôt que d’être chic et d’utiliser udev, mettez ceci dans votre /etc/rc.local et faites-le:

for dev in $(ls -1 /dev/disk/by-label/* | grep -v EFI) ; do
  label=$(basename $dev)
  mkdir -p /media/$label
  $(mount | grep -q /media/$label) || mount $dev /media/$label
done
3
mrm

Pour éliminer les excellentes instructions de retrait de quack quixote:

Ajoutez la ligne suivante au fichier de règles udev que vous avez créé précédemment (/etc/udev/rules.d) "

ENV{ID_FS_LABEL_ENC}=="?*",   ACTION=="remove",      SUBSYSTEMS=="usb", \
         RUN+="/usr/local/sbin/udev-autounmounter.sh %k"

Créez ensuite le script suivant et exécutez-le (/usr/local/sbin/udev-autounmounter.sh) avec le contenu suivant:

#!/bin/sh
#
# USAGE: usb-autounmounter.sh DEVICE 
#   DEVICE   is the actual device node at /dev/DEVICE

/usr/local/sbin/udev-auto-unmount.sh ${1} &

Enfin, le script démontable lui-même (udev-auto-unmount.sh):

#!/bin/sh
#
# USAGE: udev-auto-unmount.sh DEVICE
#   DEVICE   is the actual device node at /dev/DEVICE
# 
# This script takes a device name, looks up the partition label and
# type, creates /media/LABEL and mounts the partition.  Mount options
# are hard-coded below.

DEVICE=$1

# check input
if [ -z "$DEVICE" ]; then
   exit 1
fi

#test that the device is already mounted
MOUNTPT=`mount | grep ${DEVICE} | cut -d ' ' -f 3`
if [ -z "${MOUNTPT}" ]; then
   echo "error: the device is not already mounted"
   exit 1
fi

# test mountpoint - it should exist
if [ -e "${MOUNTPT}" ]; then

   # very naive; just run and pray
   umount -l "${MOUNTPT}" && rmdir "${MOUNTPT}" && exit 0

   echo "error: ${MOUNTPT} failed to unmount."
   exit 1
fi

echo "error: ${MOUNTPT} does not exist"
exit 1

Donc, avec les autres instructions, le répertoire apparaîtra automatiquement et disparaîtra sur les événements udev.

3
chotchki

Vous voudrez peut-être essayer Pysdm

2
Sathyajith Bhat

Vous pouvez essayer de mettre su username -c gnome-volume-manager dans /etc/rc.local. Il suffirait peut-être simplement de lancer gnome-volume-manager.

Edit: Il semble que gnome-volume-manager ne fait plus partie de la distribution par défaut, même sur le bureau Ubuntu.

wajig policy  gnome-volume-manager
gnome-volume-manager:
  Installed: (none)
  Candidate: 2.24.0-0ubuntu1
  Version table:
     2.24.0-0ubuntu1 0
        500 http://ubuntu.secs.oakland.edu jaunty/universe Packages

Cependant, peut-être que si vous l'installez, cela fonctionnera toujours. Ça vaut la peine d'essayer. Si cela ne fonctionne pas, supprimez-le à nouveau.

Il y a aussi le paquetage usbmount, qui fait ce que vous voulez, mais peut éventuellement interférer avec le montage automatique.

2
Ryan Thompson

Mes addenda modifiés pour la solution basée sur udev de quack quixote ont été rejetés, je vais donc les mettre ici. S'il vous plaît se référer à son poste en premier.

Tout d'abord, si vous souhaitez que votre règle udev agisse lorsque un périphérique est connecté via le sous-système SCSI (qui inclut à la fois USB, FireWire et eSATA). , remplacez la correspondance SUBSYSTEMS dans la règle udev par SUBSYSTEMS=="scsi".

Cependant, gardez à l’esprit que cela montera automatiquement à peu près tout, y compris les lecteurs internes, si vous les branchez à chaud pendant que le système est en cours d’exécution, il se peut donc que ce ne soit pas ce que vous voulez.

Deuxièmement, voici le script que j'utilise, qui remplace tous les scripts de ce post. Il nettoie également automatiquement les points de montage créés dans/media/dès que le périphérique de bloc monté est supprimé - aucune intervention manuelle n'est nécessaire. En outre, plutôt que d’appeler un script différent pour s’exécuter en arrière-plan, il se place lui-même en arrière-plan s’il n’est pas exécuté à partir d’un terminal (par exemple, lorsqu’il est exécuté via udev).

Il utilise inotifywait pour attendre que le périphérique qui a été monté disparaisse, puis supprime le répertoire qu'il a créé. Par conséquent, vous devez avoir installé inotify-tools sur votre système. Sur les distributions basées sur Debian (y compris Ubuntu), Sudo apt-get install inotify-tools devrait suffire.

#!/bin/bash
#
# Auto-mounter script, to be executed by udev on the addition of a
# mass storage device.
#
# Takes one argument; the base block device partition, e.g. "sdb3".
#
# Creates a mountpoint for the partition using its FS label, in
# /media/{fslabel} and mounts it there, read-only, unsynced.
#
# If the filesystem has no label, "Untitled" is used instead.
#
# If another filesystem is already mounted at that location, the
# newcomer will be mounted with an integer number appended to its
# label.

MOUNT_OPTS="ro,noatime,nodiratime"



# If we're called from a non-tty and not explicitly told to continue,
# we call ourselves in a subshell and thus return immediately (udev
# gets impatient):
if [[ "$2" != "backgrounded" ]] && ! tty &> /dev/null; then
    ($0 $1 backgrounded &)
    exit
fi



# Determine the desired mountpoint from the label of the fs on the partition:
MOUNTPOINT="/media/$(blkid /dev/$1 | grep LABEL | sed -E 's:^.+LABEL="([^"]+).+:\1:')"

# If it had no label, use "Untitled":
[[ "$MOUNTPOINT" = "/media/" ]] && MOUNTPOINT="/media/Untitled"

# If something's already mounted there, append a number:
if [[ -e "$MOUNTPOINT" ]] && mountpoint "$MOUNTPOINT" &> /dev/null; then
    NUM=1
    while mountpoint "$MOUNTPOINT $NUM" &> /dev/null; do NUM=$((NUM+1)); done
    MOUNTPOINT="$MOUNTPOINT $NUM"
fi

# Create the mountpoint and mount there:
mkdir "$MOUNTPOINT" && mount -o $MOUNT_OPTS /dev/$1 "$MOUNTPOINT"



# Wait until the device is removed (the block device is "deleted"):
inotifywait -e delete /dev/$1

# Then clean up. If it fails, retry every second for up to 5 mins:
TRIES=0
while [[ -e "$MOUNTPOINT" ]] && [[ $TRIES -lt 300 ]]; do
    rmdir "$MOUNTPOINT"
    sleep 1s
    TRIES=$((TRIES+1))
done

Vous noterez que je monte des périphériques sans synchronisation et en lecture seule. C’est parce que, dans 99% des cas, mon cas d’utilisation est la lecture d’un lecteur externe, et chaque fois que j’ai besoin d’écrire sur celui-ci, je vais quand même être actif sur le serveur et pouvoir facilement lancer une commande mount -o remount,rw <mountpoint>. Modifier pour répondre à vos besoins :)

1

Essayez de configurer via mountmanager pour ne pas avoir à saisir les données manuellement.

Cela devrait faire partie du dépôt ubuntu.

1
Abhinav