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.
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.
/media/LABEL
sur lequel monter le périphérique.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.
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.
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.
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:
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
ACTION=="add"
- ne correspond qu'aux événements add
...
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.
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.
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 ...)
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
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
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
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.
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:
/etc/default/halevt
/etc/PolicyKit/PolicyKit.conf
(voir ci-dessous; source )/etc/hal/fdi/policy/preferences.fdi
(voir ci-dessous)eject.hal
de l'article blog ci-dessus, modifiez-le et enregistrez-le dans /usr/local/bin
./etc/halevt/halevt.xml
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"
Vérifiez que START_DAEMON=yes
dans /etc/default/halevt
.
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>
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>
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
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 & hal.block.is_volume = true & hal.volume.is_disc = true & 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>
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
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 )
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.
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
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.
Vous voudrez peut-être essayer Pysdm
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.
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 :)
Essayez de configurer via mountmanager pour ne pas avoir à saisir les données manuellement.
Cela devrait faire partie du dépôt ubuntu.