Question Monter automatiquement les disques externes sur / media / LABEL au démarrage sans qu'un utilisateur soit connecté?


Cette question est similaire, mais un peu le contraire de ce que je veux. Je veux que les clés USB externes soient montées automatiquement au démarrage, sans que personne ne soit connecté, à des endroits comme /media/<label>.

Je ne veux pas avoir à saisir toutes les données dans fstab, en partie parce qu'il est fastidieux et ennuyeux, mais surtout parce que je ne peux pas prédire ce que je vais brancher dans ou comment les partitions changeront à l'avenir.

Je veux que les lecteurs soient accessibles à des choses comme MPD, et disponible lorsque je me connecte avec SSH. gnome-mount semble seulement monter des choses lorsque vous êtes connecté localement à une session graphique de Gnome.


68
2017-10-11 18:13


origine


Bonne question, j'aimerais avoir une réponse pour toi, maintenant je suis curieux de savoir comment cela est résolu. - invert
J'ai mis à jour ma réponse. - Ryan Thompson
Et pour cause, Gnome n'est pas installé, comme je le fais déjà, mais une solution pour les serveurs sans interface graphique sans tête serait la meilleure. - endolith
ARRRGHH ... bug dans ma réponse. dans la course. /usr/local/sbin/udev-automounter.sh mount %k devrait être /usr/local/sbin/udev-automounter.sh %k. Pardon. - quack quixote
OK, à partir de Update-3, cela fonctionne avec des espaces. il le fait en utilisant une version "encodée" de <LABEL> qui convertit les espaces en \x20's. donc ce n'est pas joli, mais ça va marcher. udev ne gère pas bien les labels-with-spaces, mais il existe une autre option qui utilise des caractères de soulignement au lieu de \x20C'est (donc au moins a l'air sympa). On dirait que la manipulation de l'espace doit aller dans les shellscripts. - quack quixote


Réponses:


  • Note pour Ubuntu Server 11.10: Ce script échoue sur Ubuntu Server 11.10 en raison de la vol_id commander. vol_id a été remplacé par blkid. Pour corriger le script, remplacez "vol_id" par "blkid -o udev" dans le udev-auto-mount.sh scénario.

Je me suis cogné la tête pendant un moment, et je pense avoir trouvé une solution de travail. Ceci est développé et testé sur un système basé sur Debian, il devrait donc fonctionner sur Ubuntu. Je soulignerai les suppositions qu'il fait pour pouvoir également l'adapter à d'autres systèmes.

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

  • Cependant, il mai interférer avec d'autres automounters; Je ne peux pas tester pour cela. Je pense que, avec Gnome-VFS actif, les deux peuvent essayer de faire le montage ... si Gnome-VFS échoue au montage, il se peut qu’il ne configure pas une icône de bureau. Le démontage 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 peux voir que cela pourrait ne pas fonctionner est s'il essaie de monter le lecteur USB avant que le système ne soit prêt pour les montages. Si tel est le cas, vous aurez probablement besoin d'un tweak supplémentaire pour le script de montage. (Je suis vérifier avec ServerFault pour voir s'il y a des conseils, mais pas beaucoup d'intérêt là-bas.)

À cela, alors.


Références UDEV:


Contexte (UDEV? Whuzzat?)

UDEV est le système hotplug du noyau. C'est ce qui configure automatiquement les bons périphériques et les liens symboliques de périphérique (par ex. /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 auditeurs tels que les environnements de bureau. Donc, lorsque vous vous connectez à GNOME et insérez un CD ou branchez un lecteur USB, cet événement suit cette chaîne:

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

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

Règles Udev

Comme 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, les laisser configurer le /dev/disk/by-label/<LABEL> lien symbolique pour nous, et ajouter une autre règle qui montera le périphérique pour nous.

Les règles de l'UDEV sont conservées /etc/udev/rules.d (et /lib/udev/rules.d sur Karmic), et sont traitées dans l'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 sont dans un fichier appelé 90-hal.rules, donc je mets mes règles en 89-local.rules alors ils sont traités avant d'arriver à HAL. Avant tout, vous devez vous assurer que ces règles arrivent après la 60-persistent-storage.rules. local.rules peut être assez bon.

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 un newline (\n).

  • Changement SUBSYSTEMS=="usb" à SUBSYSTEMS=="usb|ieee1394" pour le support Firewire.

  • Si vous souhaitez que l’appareil soit toujours la propriété d’un utilisateur particulier, ajoutez un OWNER="username" clause. Si vous avez juste besoin des fichiers appartenant à un utilisateur particulier, ajustez plutôt le script de montage.

Lire la règle

Cela ajoute un programme à exécuter sur la liste des programmes du périphérique à exécuter. Il identifie les périphériques de partition USB par <LABEL>, puis transmet cette information à 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 autres que les fichiers, c'est pourquoi nous vérifions cela. Nous voulons réellement utiliser ID_FS_LABEL pour le point de montage, mais je n'ai pas convaincu UDEV d'y échapper, nous allons donc laisser le script de montage gérer cela.

    Ceci et d'autres variables d'environnement sont obtenus par udev en utilisant le vol_id commande (déconseillé). C'est un outil pratique pour voir de bons 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" - seulement match add événements...

  3. SUBSYSTEMS=="usb" - ne correspondent qu'aux appareils qui se trouvent sur le bus USB. Nous utilisons SUBSYSTEMS ici parce que cela correspond aux parents de notre appareil; Le dispositif qui nous intéresse sera en fait SUBSYSTEM == "scsi". La correspondance avec un périphérique USB parent évite d'ajouter notre programme aux disques internes.

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

Tester la règle

Le premier lien de référence (ci-dessus) est un excellent didacticiel 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 le fourre-tout udevadm utilitaire.

Après avoir ajouté la règle, branchez votre appareil. Donnez-lui quelques secondes, puis vérifiez quel appareil a été assigné avec:

$ 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, c'est sur l'appareil sdc1. Exécutez ceci et regardez la sortie 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 de notre RUN+= règle dans les dernières lignes (3ème en 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 sains; Si cela fonctionne sur votre ligne de commande, il devrait fonctionner automatiquement lorsqu'un périphérique est inséré.

Vous pouvez également surveiller les événements UDEV en temps réel: exécuter 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é à moins que vous n'ayez vraiment des détails de bas niveau ...)

Rechargement des règles

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

  • courir sudo udevadm control --reload-rules

  • courir 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, cela ne fait que repousser le second script en arrière-plan. Mettez ça 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.  Cela fait un peu plus de vérification des entrées. Mettez ça 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 seule; UDEV n'envoie que le nom de DEVICE.

S'il y a un problème de montage des disques au démarrage, vous pouvez mettre un bon long sleep 60 dans ce script, donnez au système l'heure nécessaire pour que le script tente de monter le lecteur.

J'ai donné une suggestion dans les commentaires pour savoir comment vérifier (exécuter 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 utilisez pourraient suffire à cette fin - nfsd, smbd, apache, etc. Le risque, bien sûr, est que le script de montage échouera si le service ne fonctionne 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

Super Bonus Script de nettoyage!

Un script de plus Il suffit de démonter le périphérique et de supprimer les répertoires de 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 ça 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

70
2017-11-03 12:38



Tu es genial! :) - kolypto
Si je lance auto-mount.sh manuellement, cela fonctionne, mais pas si je branche un lecteur et pas au démarrage. : / - endolith
le problème concerne donc les règles UDEV. Lemme développez un peu cette section pour vous aider à déboguer. - quack quixote
ARRRGHH ... bug dans le RUN. tour /usr/local/sbin/udev-automounter.sh mount %k dans /usr/local/sbin/udev-automounter.sh %k. Pardon. - quack quixote
J'ai assemblé tous les scripts sur github: github.com/fatso83/Code-Snippets/tree/master/system-utils/ ...  Ils fonctionnent bien sur Ubuntu 10.10, et incluent également le démontage automatique - oligofren


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

Le remplacement de ivman est halevt, et il est disponible dans Karmic. C'est une réimplémentation de ivman (lire: "entretenu" et "ne dépend pas de pmount"). Le paquet n'est pas disponible sur Jaunty, bien que vous puissiez le construire vous-même si vous ne prévoyez pas de mise à niveau.

Ces deux outils se situent au-dessus des couches DBus et HAL et répondent aux événements. Apparemment, les deux peuvent être exécutés en tant que démon système ou en tant que gestionnaire de montage de session utilisateur (à la Gnome-VFS). /etc/defaults/{ivman,halevt}les fichiers sont en charge des paramètres du système.

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


Travailler avec HALEVT

Mettre à jour: Dans l’intérêt d’obtenir des montages CD automatiques, que ma réponse UDEV ne fournit pas, j’ai regardé de plus près halevt. j'ai trouvé ça article de blog ce qui a permis d'expliquer beaucoup sur le processus. Je devais compiler le mien halevt package pour Debian Lenny (heureusement, toutes les dépendances étaient dans la section lenny-backports). Une fois installé, le processus n'était généralement pas horrible:

  1. Assurez-vous que le système-halevt-daemon est activé dans /etc/default/halevt
  2. Autoriser l'utilisateur du système à monter des périphériques dans /etc/PolicyKit/PolicyKit.conf (voir ci-dessous; la source)
  3. Modifiez la stratégie HAL pour copier l'étiquette de volume dans le point de montage préféré dans /etc/hal/fdi/policy/preferences.fdi (voir ci-dessous)
  4. Si vous voulez un support CD / DVD, prenez le eject.hal scénario à partir du blogpost ci-dessus, modifier et enregistrer dans /usr/local/bin.
  5. Modifier la configuration du système halevt pour activer les montages dans /etc/halevt/halevt.xml
  6. Ajoutez du code aux scripts de pré-session et de post-session de votre gestionnaire de connexion pour arrêter le démon-halevt-système lorsque quelqu'un se connecte et le redémarrer à la fermeture de session.

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

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

 

Étape 1

Regarde ça START_DAEMON=yes dans /etc/default/halevt.

Étape 2

Dans /etc/PolicyKit/PolicyKit.conf, Ajoute ça à l'intérieur la <config></config> section:

<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, Ajoute ça à l'intérieur 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 être exécuté /bin/bash; certains systèmes peuvent effectivement utiliser /bin/dash quand /bin/sh est appelé. Changez donc la première ligne du script pour vous assurer que vous obtenez la bonne:

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

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

Étape 5

C'est la partie amusante. Votre système peut fournir une base /etc/halevt/halevt.xml déjà, vous devrez donc adapter cela pour votre propre usage. Dans mon cas, mon système offrait déjà un montage de base amovible, mais je devais ajouter un support pour le montage de CDROM et le bouton d'éjection.

Le blog que j'ai mentionné a un bon exemple de configuration XML à regarder pour vos propres réglages. Il s'agit principalement de configurer un remplacement de gnome-mount pour les auteurs fluxbox environnement, donc son exemple XML fait plus que vous ne le voudrez, mais c'est un excellent moyen d'avoir une idée de ce que vous pouvez faire. Il y a aussi quelques bons exemples dans /usr/share/doc/halevt/examples.

Je devais aussi courir sudo sh -c "mkdir /var/halevt ; chown halevt:plugdev /var/halevt" avant que tout ne marche.

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 vous avez activé le système halevt-daemon, vous devez le désactiver lorsque vous vous connectez à GNOME, puis le redémarrer à la déconnexion. (Voir ma réponse à cette question pour les gestionnaires de connexion non-GDM.) Ce genre de choses est théorique car je ne l’utilise pas, mais cela devrait fonctionner.

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

/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
2017-11-03 16:22



Pour ceux qui lisent ceci en 2013, ils devraient maintenant savoir que HAL est obsolète, et ils devraient avoir recours à des solutions basées sur udev, telles que celle donnée ci-dessus. - oligofren


Au fil du temps, des solutions plus simples 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 (pour les nouveaux et les anciens utilisateurs) comme solution simple.

le devmon le script de udevil fait tout le tour du monde en fonction de udev et de glib. Fonctionne presque hors de la boîte sans nécessiter de configuration initiale.

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

Après l'avoir lancé, le stockage que je branche est inspecté (il recherche les partitions et, si elles sont trouvées, examine les étiquettes de leur système de fichiers) puis les monte dans /media/FILESYSTEM_LABEL.
Impossible d'imaginer quelque chose de plus simple que cela, sauf peut-être que le (célèbre) système devrait incorporer cette fonctionnalité dans le futur.

udevil en bref (github.io/udevil)
Script: devmon (igurublog / script-devmon)


5
2017-07-08 23:38





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

Plutôt que d’être sophistiqué et d’utiliser udev, mettez ceci dans votre fichier /etc/rc.local et soyez fait:

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
2017-08-15 01:06



MERCI .. c'était le moyen le plus simple pour ce que je voulais accomplir. Même travaillé sur Ubuntu Server 16 avec un volume ntfs - ChrisPrime


Pour les systèmes basés sur Debian (par exemple, Ubuntu, etc.), il y a le usbmount package qui monte automatiquement les clés USB pour vous. En gros, il utilise une approche basée sur udev, comme cela a déjà été décrit, mais seulement une installation simple. Il semble que le original auteur du paquet est à bout de souffle 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
2018-05-20 09:36



Cependant, Usbmount ne peut pas être monté par étiquette, sauf si vous remplissez la liste des étiquettes dans le fichier de configuration. - Gilles
Voir l'article esite.ch/2014/04/11/ si vous souhaitez ajouter un montage à label à usbmount sans conserver de liste. - Oliver Sauder


Pour débusquer les excellentes instructions de suppression de Quack Quichote:

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"

Ensuite, créez le script suivant et chmod le exécutable (/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 de démontage 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

Ainsi, avec les autres instructions, le répertoire apparaîtra automatiquement et disparaîtra lors des événements udev.


3
2017-10-30 16:24



je pense if [ -n "$device_is_mounted" ]; then devrait être if [ -z "${MOUNTPT}" ]; thenn'est-ce pas? - eresonance
@eresonance, merci pour le heads-up, corrigé! - chotchki


Tu pourrais vouloir essayez Pysdm


2
2017-10-29 05:42



C'est juste un autre éditeur de fstab, n'est-ce pas? - endolith
Oui, mais "Cela permet également la création de règles udev pour la configuration dynamique des périphériques de stockage" - Sathya♦
La "création de règles udev" m'aiderait-elle d'une certaine manière? Je n'ai aucune idée de ce que cela signifie même. Est-ce qu'il monte des périphériques amovibles précédemment inconnus sans qu'un utilisateur soit connecté localement? - endolith
Désolé, je n'ai aucune idée des règles d'udev. Vous pourriez regarder fredericiana.com/2006/03/15/writing-udev-rules-short-notes et reactivated.net/writing_udev_rules.html - Sathya♦


Vous pouvez essayer de mettre su username -c gnome-volume-manager dans /etc/rc.local. Il suffit peut-être que gnome-volume-manager soit lancé.

Edit: Il semble que gnome-volume-manager ne fasse 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, retirez-le à nouveau.

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


2
2017-10-11 19:29



Commande inconnue "gnome-volume-manager". Je suis dans Ubuntu Jaunty. - endolith
Il y a un / usr / lib / gnome-volume-manager / gnome-volume-manager, mais il ne fait rien. - endolith
Oh je vois. Il y a aussi un paquet appelé gnome-volume-manager. En relation: crunchbanglinux.org/forums/topic/239/... - endolith
Il semble que gnome-volume-manager utilise HAL pour monter des choses? Et "À partir de 2009, HAL est en train d'être déprécié en faveur de DeviceKit." Pourquoi tout dans Linux est-il toujours comme ça? Ils commencent tout juste à faire quelque chose qui fonctionne presque correctement, puis ils le détruisent et le remplacent par quelque chose de nouveau qui ne fonctionne pas. - endolith
pmount ne fonctionne même plus. > pmount / dev / disk / by-label / STORAGE Erreur: le périphérique / dev / sdc1 n'est pas amovible togaware.com/linux/survivor/Using_Gnome_Volume_Manager.html - endolith


Essayez de configurer via mountmanager, afin de ne pas avoir à saisir de données manuellement.

Cela devrait faire partie du référentiel Ubuntu.


1
2017-10-11 19:13



Vous devrez activer la section univers pour l'obtenir. - quack quixote
apt: mountmanager? section = universe;) - endolith
Est-ce que ça va juste mettre en place un fstab pour moi? - endolith
@endolith: Ne serait pas apte: univers? install = mountmanager serait plus logique? ;) - Bobby
Est-ce que ce format fonctionne? Il ne le dit pas dans la page de manuel manpages.ubuntu.com/manpages/karmic/en/man8/apturl.8.html - endolith