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


73

Cette question est similaire, mais un peu à l’opposé de ce que je veux. Je veux que les lecteurs USB externes soient montés automatiquement au démarrage, sans que personne ne 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-mountsemble ne monter que lorsque vous êtes connecté localement à une session graphique Gnome.


4
Excellente question, j'aimerais avoir une réponse pour vous, maintenant je suis curieux de savoir comment cela est résolu.
inverser

1
J'ai mis à jour ma réponse.
Ryan Thompson

1
Et pour l’instant, je n’ai pas de problème avec l’installation de Gnome, comme je l’ai déjà fait, mais une solution pour des serveurs sans interface graphique sans interface serait préférable.
endolith

1
ARRRGHH ... bug dans ma réponse. dans le RUN. /usr/local/sbin/udev-automounter.sh mount %kdevrait être /usr/local/sbin/udev-automounter.sh %k. Pardon.
Quack Quichotte

1
OK, à partir de la mise à jour 3, cela fonctionne avec des espaces. il le fait en utilisant une version "codée" de <LABEL> qui convertit les espaces en \x20. donc ce n'est pas joli, mais ça va marcher. udev ne gère pas bien les étiquettes avec espaces, mais il existe une autre option qui utilise des traits de soulignement au lieu de \x20's (donc au moins, ça a l'air sympa). semble que la gestion de l'espace doit aller dans les scripts de shell.
Quack Quichotte

Réponses:


74
  • Remarque pour Ubuntu Server 11.10: Ce script échoue sous Ubuntu Server 11.10 en raison de la vol_idcommande obsolète . vol_ida été remplacé par blkid. Pour corriger le script, remplacez "vol_id" par "blkid -o udev" dans le udev-auto-mount.shscript.

Cela fait un moment que je me cogne 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 /media/LABELrépertoire sur lequel monter le périphérique.

  • Cependant, il peut interférer avec d’autres montages automatiques; Je ne peux pas tester pour ça. J'imagine que, lorsque Gnome-VFS est actif, les deux peuvent essayer de faire le montage ... Si Gnome-VFS échoue, il risque de ne pas configurer d'icône de bureau. Démonter de Gnome devrait être possible, mais peut nécessiter gksudoou 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 tel est le cas, vous aurez probablement besoin d'un ajustement supplémentaire pour le script de montage. (Je vérifie avec ServerFault pour voir s'il y a un conseil, mais cela ne suscite pas beaucoup d'intérêt.)

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 de périphérique appropriés (par exemple /dev/disk/by-label/<LABEL>), à la fois au moment du démarrage et pour les périphériques ajoutés lorsque le système est en cours d'exécution.

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 /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 UDEV sont conservées dans /etc/udev/rules.d(et /lib/udev/rules.dsur le karmique) 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 se trouvent dans un fichier appelé 90-hal.rules. J'ai donc inséré mes règles 89-local.rulespour qu'elles soient traitées avant d'arriver à HAL. Avant tout, vous devez vous assurer que ces règles se produisent après la 60-persistent-storage.rules. local.rulespeut ê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).

  • Passez SUBSYSTEMS=="usb"à l' SUBSYSTEMS=="usb|ieee1394"assistance Firewire.

  • Si vous souhaitez que le périphérique appartienne toujours à un utilisateur particulier, ajoutez une OWNER="username"clause. 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_LABELle 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, ainsi que d’autres, est obtenue par udev à l’aide de la vol_idcommande ( 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"- seulement les addévénements de match ...

  3. SUBSYSTEMS=="usb"- correspond uniquement aux périphériques présents sur le bus USB. Nous utilisons SUBSYSTEMSici parce que cela correspond aux parents de notre appareil; 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, %kest étendu au nom de périphérique (par exemple sdc1, not /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 tutoriel UDEV, mais il est légèrement obsolète. Les programmes qu'il exécute pour tester vos règles ( udevtesten particulier) ont été remplacés par l' udevadmutilitaire catch-all .

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, c'est 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 de script de notre RUN+=règle 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, 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écutez sudo udevadm monitor(voir man udevadmpour 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 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. Comme 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. Cela fait un peu plus de vérification d'entrée. 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 lors du montage des lecteurs au démarrage , vous pouvez en ajouter un long sleep 60dans 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é dans les commentaires une suggestion sur la façon de vérifier (exécuter pspour 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 - nfsd, smbd, apache, etc. Le risque, bien sûr, est que le script de montage échoue 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

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

3
Tu es genial! :)
kolypto

1
Si je lance auto-mount.sh manuellement, cela fonctionne, mais pas si je connecte un lecteur, et non au démarrage. : /
endolith

le problème vient donc des règles UDEV. Permettez-moi d’étendre un peu cette section pour vous aider à déboguer.
Quack Quackote

3
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 auto-unmount
oligofren,

1
Référence: udev_237 - man udev (Ubuntu_18.04) Notez que l'exécution de programmes qui accèdent au réseau ou aux systèmes de fichiers montés / démontés n'est pas autorisée dans les règles udev , en raison du sandbox par défaut appliqué à systemd-udevd.service. source: unix.stackexchange.com/questions/200194/… Pour une solution, consultez serverfault.com/questions/766506/…
Sauvegarde pro

9

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

Le remplacement pour ivmanis halevtest disponible en karmique. C'est 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 /etc/defaults/{ivman,halevt}fichiers sont chargés des paramètres système.

Voici quelques instructions pour peaufinage ivmand'utiliser les /media/<LABEL>points de montage. Il est probable que la halevtsolution soit plus simple, mais peut-être qu’ils vous aideront à trouver une réponse.


Travailler avec HALEVT

Mise à jour : Dans l’intérêt d’obtenir des montages de CD automagiques, ce que ma réponse UDEV ne fournit pas, j’ai jeté un œil plus profond 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 halevtpaquet pour Debian Lenny (heureusement, toutes les dépendances se trouvaient dans la section lenny-backports). Une fois installé, le processus était généralement pas-horrible:

  1. Assurez-vous que system halevt-daemon est activé dans /etc/default/halevt
  2. Autoriser l'utilisateur ayant un système à monter des périphériques /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é /etc/hal/fdi/policy/preferences.fdi(voir ci-dessous)
  4. Si vous voulez le support CD / DVD, saisir le eject.halscénario du blogpost ci - dessus, modifier et enregistrer en /usr/local/bin.
  5. Modifier la configuration du système optimisé pour permettre 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=yesdans /etc/default/halevt.

Étape 2

Dans /etc/PolicyKit/PolicyKit.conf, ajoutez ceci à l' intérieur de 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, 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 être exécuté /bin/bash; certains systèmes peuvent réellement utiliser /bin/dashquand /bin/shest 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 /etc/halevt/halevt.xmldéjà fournir une base , vous devrez donc l’adapter à votre usage personnel. Dans mon cas, mon système offrait 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é présente un bon exemple de configuration XML à consulter pour vos propres modifications. Il s'agit principalement de mettre en place un remplacement gnome-mount pour l' fluxboxenvironnement de l'auteur . Son exemple XML en fait plus que vous ne le souhaitez, mais constitue un excellent moyen de vous faire une idée de ce que vous pouvez faire. Il y a aussi de 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 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.) Ceci est théorique puisque 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

3
Les personnes qui liront ceci en 2013 doivent savoir maintenant que HAL est obsolète et recourir à des solutions basées sur udev telles que celle proposée par quack quixote ci-dessus.
oligofren

6

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 devmonscript 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 de la manière rc.localsuivante:
devmon 2>&1 >> /var/log/devmon &
pour votre confort, vous pouvez l'intégrer à un script d'init au lieu d' rc.localutiliser un outil automatisé permettant pleaserunde 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.
Vous ne pouvez imaginer rien de plus simple que cela, si ce n’est peut-être le fameux système (in) célèbre d’incorporer cette fonctionnalité à un moment donné dans l’avenir.

Udevil At A Glance ( github.io/udevil )
Script: devmon ( igurublog / script-devmon )


3

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

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

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

3

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é expliqué, il utilise une approche basée sur udev, à la différence qu’il s’agit simplement d’une installation de paquet. Il semble que l' auteur original du paquet soit à 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.


1
Cependant, Usbmount ne peut pas monter par étiquette, à moins que vous ne remplissiez la liste des étiquettes dans le fichier de configuration.
Gilles 'SO- arrête d'être méchant'

1
Voir l'article esite.ch/2014/04/11/… si vous souhaitez ajouter un montage sur label à usbmount sans en conserver une liste.
Oliver Sauder

3

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 Unmount 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.


Je pense que if [ -n "$device_is_mounted" ]; thendevrait être if [ -z "${MOUNTPT}" ]; then, ne devrait pas?
eresonance

2

Vous voudrez peut-être essayer Pysdm


C'est juste un autre éditeur de fstab, n'est-ce pas?
endolithe

Oui, mais "Cela permet également la création de règles udev pour la configuration dynamique des périphériques de stockage"
Sathyajith Bhat

Est-ce que "la création de règles udev" m'aiderait d'une certaine manière? Je n'ai aucune idée de ce que cela signifie même. Monte-t-il des périphériques amovibles précédemment inconnus sans utilisateur connecté localement?
endolithe

Désolé, je n'ai aucune idée des règles d'udev. Vous pouvez consulter fredericiana.com/2006/03/15/writing-udev-rules-short-notes and reactivated.net/writing_udev_rules.html
Sathyajith Bhat

2

Vous pouvez essayer de mettre su username -c gnome-volume-manager/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 usbmountpaquet, qui fait ce que vous voulez, mais peut éventuellement interférer avec le montage automatique.


Commande inconnue "gnome-volume-manager". Je suis dans Ubuntu Jaunty.
endolith

Il existe un répertoire / usr / lib / gnome-volume-manager / gnome-volume-manager, mais il ne fait rien.
endolith

Oh je vois. Il existe également un paquet appelé gnome-volume-manager. Connexes: crunchbanglinux.org/forums/topic/239/…
endolith,

Il semble que gnome-volume-manager utilise HAL pour monter des choses? Et "A partir de 2009, HAL est en train de devenir obsolète au profit de DeviceKit." Pourquoi est-ce que tout dans Linux est toujours comme ça? Ils commencent juste à avoir quelque chose qui fonctionne presque bien, puis ils le vident et le remplacent par quelque chose de nouveau qui ne fonctionne pas.
endolith

pmount ne fonctionne même plus. > Pmount / dev / disque / par étiquette / STOCKAGE Erreur: / dev / sdc1 n'est pas amovible togaware.com/linux/survivor/Using_Gnome_Volume_Manager.html
endolith

2

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, si vous voulez d' abord votre règle udev d'agir lorsque tout appareil est connecté via le sous - système SCSI (qui inclut à la fois USB, FireWire et eSATA), changer le match de la règle dans SUBSYSTEMS udev à 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 est donc possible 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 autre script à exécuter en arrière-plan, il se met en arrière-plan s’il n’est pas exécuté à partir d’un terminal (par exemple, s’il est exécuté via udev).

Il utilise inotifywait pour attendre que le périphérique monté disparaisse, puis supprime le répertoire créé. Par conséquent, vous devez avoir installé inotify-tools sur votre système. Sur les distributions basées sur Debian (y compris Ubuntu), cela sudo apt-get install inotify-toolsdevrait 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 passer une mount -o remount,rw <mountpoint>commande. Modifier pour répondre à vos besoins :)


Comment exécutez-vous ce script? halevtne semble pas être un apt-getpaquet capable actuel pour les versions modernes.
Campbeln le

Agh ... peut-être que si je suis l'entrée TOP / Accepted Answer de quack quixote ... serait toujours agréable d'avoir une réponse plus complète ici :)
Campbeln

1

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

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


Vous devrez activer la section univers pour l'obtenir.
Quack Quichotte

apt: mountmanager? section = universe;)
endolith

Est-ce que cela va juste mettre en place un fstab pour moi?
endolith

@endolith: apt: universe? install = mountmanager ne serait-il pas plus logique? ;)
Bobby

Est-ce que ce format fonctionne? Ce n'est pas ce que dit la page de manuel manpages.ubuntu.com/manpages/karmic/fr/man8/apturl.8.html
endolith

-5

Si vous n'avez qu'un seul lecteur monté à la fois, vous pouvez simplement le modifier dans votre /etc/fstabfichier. Quelque chose dans le genre de:

/dev/sdb1     /mnt/usbdrive     ext3     defaults 0   0

Cela devrait le monter au démarrage et le rendre accessible à toute personne ayant une permanente. Si vous avez plusieurs lecteurs, vous pouvez toujours le faire avec:

/dev/sdb1     /mnt/usbdrive1     ext3     defaults 0   0
/dev/sdc1     /mnt/usbdrive2     ext3     defaults 0   0

6
clairement pas ce que la question demande.
Quack Quichotte
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.