web-dev-qa-db-fra.com

Comment monter le support amovible dans / media / <étiquette> automatiquement lorsqu'il est inséré, sans aucun environnement de bureau?

J'ai un système SIM de Debian (Wheezy) (et même pour la voûte pour la voûte), sans aucun environnement de bureau (et pas de Xorg du tout).

Je peux monter mes cartes SD, des bâtons USB, un disque dur externe par l'étiquette dans un répertoire spécifié dans /media/ manuellement avec mount/umount et les entrées appropriées de /etc/fstab, ou automatiquement au démarrage, mais cela est convaincant, de manière restrictive et non dynamique pour mes besoins: si je veux qu'ils soient montés dans /media/<LABEL>, chaque appareil avec une autre <LABEL> a besoin de sa propre entrée et chacun <LABEL> Le sous-répertoire doit être créé/supprimé manuellement dans /media/ également).

Donc, quelle est la meilleure façon de monter automatiquement dans /media/<LABEL> à l'insertion (et pour les démonter du système de fichiers dès qu'ils sont débranchés Peu importe la manière dont il est risqué pour les données)?

La solution idéale ferait:

  1. détecter quand un support amovible est branché (c'est-à-dire une fois ajouté en /dev/ comme sdax, sdbx, ... par udev)
  2. créez un répertoire dans /media/ Selon son étiquette (étiquette du support amovible)
  3. montez-le dans le répertoire /media/<LABEL> dans le mode RW (si c'est le système de fichiers supporte cela) avec flush option (pour un vfat)
  4. détecter si le support a été débranché
  5. si alors, démontez-le du système de fichiers
  6. supprimer le répertoire correspondant de /media/

(Les appareils doivent être montés de manière synchrone ovleuse, pour éviter toute perte de données lorsqu'il est chaud débranché à cause de la cache Edit:sync est beaucoup trop pour vfat supports amovibles SOflusha été créé comme compromis , moins sécurisé que sync, mais moins risqué en fonction des cycles de vie de Souvenirs flash)

J'ai trouvé des informations sur autofs, HAL, udisks, udisks2, usbmount etc., mais on ne sait pas lequel est obsolète ou préféré, et de toute façon, je n'ai pas compris comment les configurer facilement sur mon système pour le faire, jusqu'à présent ...

18
cedbeu

Ok, ça fait longtemps, mais je vais toujours répondre à ma question avec la meilleure option que j'ai trouvée à partir de maintenant. Pour résumer: Créer une règle udev, associée à certains scripts (qui créera/supprimera des répertoires et des périphériques amovibles de l'ONU/montage) et attaché à udev Type d'événement de périphérique = partition.

1 - Création de scripts Ajouter/Supprimer

Enregistrer le script suivant storage-automount.sh à /lib/udev/ et le rendre exécutable (Sudo chmod a+x /lib/udev/storage-automount.sh):

#!/bin/sh

# set the mountpoint name according to partition or device name
mount_point=$ID_FS_LABEL
if [ -z $mount_point ]; then
    mount_point=${DEVNAME##*/}
fi

# if a plugdev group exist, retrieve it's gid set & it as owner of mountpoint
plugdev_gid="$(grep plugdev /etc/group|cut -f3 -d:)"
if [ -z $plugdev_gid ]; then
    gid=''
else
    chown root:plugdev $mount_point
    gid=",gid=$plugdev_gid"
fi

# create the mountpoint directory in /media/ (if not empty)
if [ -n $mount_point ]; then
    mkdir -p /media/$mount_point
    # other options (breaks POSIX): noatime,nodiratime,nosuid,nodev
    mount -t $ID_FS_TYPE \
      -o rw,flush,user,uid=0$gid,umask=002,dmask=002,fmask=002 \
      $DEVNAME /media/$mount_point
fi

Enregistrer le script suivant storage-autounmount.sh à /lib/udev/ et le rendre exécutable (Sudo chmod a+x /lib/udev/storage-autounmount.sh):

#!/bin/sh

# set the mountpoint name according to partition or device name
mount_point=$ID_FS_LABEL
if [ -z $mount_point ]; then
    mount_point=${DEVNAME##*/}
fi

# remove the mountpoint directory from /media/ (if not empty)
if [ -n $mount_point ]; then
    umount -l /media/$mount_point
    rm -R /media/$mount_point
fi

2 - Création de la règle udev pour joindre ces scripts aux événements

Et enfin, ajoutez une règle udev dans /etc/udev/rules.d/, par exemple 85-storage-automount.rules:

ENV{DEVTYPE}=="partition", RUN+="/lib/udev/storage-automount.sh", ENV{REMOVE_CMD}="/lib/udev/storage-autounmount.sh"

et faire les mêmes autorisations que les autres règles de ce Dir/Dossier

Maintenant, lorsque vous branchez un périphérique de stockage, un répertoire sera créé dans /media/ Selon le nom de la partition (je ne me souviens pas, mais je pense que cela fonctionne avec la partition NTFS aussi) et votre partition sera montée. C'est R/W pour les utilisateurs si vous avez un groupe plugdev sur votre système. De plus, les appareils sont montés en mode synchrones afin de limiter les risques de perte de données en cas de débugication à chaud.

Lorsque l'appareil est supprimé, il est démonté et le répertoire est supprimé de /media

En outre, l'outil pour surveiller les événements udev est udevadm monitor, avec des options comme --env ou --property:

$ udevadm monitor --env

Ceci est testé et fonctionne bien sur Debian et Arch, mais travaille probablement sur toutes les distributions qui s'appuient sur udev.

2
cedbeu

Je pense que vous cherchez pmount .

Si vous voulez un montage automatique lors de l'insertion, voir Autorocalisation des bâtons USB sur Debian .

Si votre système utilise udisks2 , c'est la manière préférée de réagir à l'insertion d'un périphérique de stockage amovible. Voir le Arch Wiki Pour des conseils de configuration pour UDISKS.

Sinon, le programme qui réagit lorsqu'un nouveau périphérique apparaît est udev , le montage automatique est déclenché par a Udev règle . The USBMount Package fournit des règles UDEM pour monter automatiquement des périphériques de stockage USB et quelques autres. Calling mount des règles Udev Ne fonctionne pas pour les systèmes de fichiers fusibles (tel que NTFS-3G), utilisez donc des uDisks si vous en avez besoin.

Vous ne pouvez pas automatiquement démonter les médias quand ils sont supprimés car la causalité ne fonctionne pas de cette façon. Le support doit être démonté avant il est supprimé. Pour les supports en lecture seule, vous pouvez vous éloigner avec démontage après la suppression, bien que cela puisse confondre certaines applications s'ils disposent de fichiers ouverts sur le système de fichiers soudainement disparu. Pour les médias écrits, si vous débranchez un système de fichiers monté, la corruption des données est probable.

Voici comment je l'ai récemment fait et je suis assez content de cette approche maintenant. C'est pour Ubuntu 12.04 + Gentoo, mais je suppose que toute distribution, ce qui permet d'installer udev et les autofs devraient fonctionner.

Prérequis: vous devez avoir installé Udev + Autofs.

Étape 1)

Créez le fichier suivant "/etc/udiev/ruules.d/90-usbsd-auto.rules" (bien sûr, vous pouvez utiliser n'importe quel nom aussi longtemps que cela se termine par ".rules"). :

# Add symlink /dev/usbdisks/<label> to /dev/sd[a-z][1-9] 
# if partition has a label
# Add symlink /media/usb/<label> to /media/autousb/<label>
# for automounter support
ACTION=="add", KERNEL=="sd*", ENV{DEVTYPE}=="partition", \
    ENV{ID_BUS}=="usb", ENV{ID_FS_LABEL_ENC}=="?*", \
    SYMLINK+="usbdisks/$env{ID_FS_LABEL_ENC}", MODE:="0660", \
    RUN+="/bin/rm /media/usb/$env{ID_FS_LABEL_ENC}", \
    RUN+="/bin/ln -sf /media/autousb/$env{ID_FS_LABEL_ENC} /media/usb/$env{ID_FS_LABEL_ENC}"

# Fallback: If partition has a NO label, use kernel name (sd[a-z][1-9])
ACTION=="add", KERNEL=="sd*", ENV{DEVTYPE}=="partition", \
    ENV{ID_BUS}=="usb", ENV{ID_FS_LABEL_ENC}!="?*", \
    SYMLINK+="usbdisks/%k", MODE:="0660", \
    RUN+="/bin/rm /media/usb/%k", \
    RUN+="/bin/ln -sf /media/autousb/%k /media/usb/%k"

# Some FileSystems emit a "change" event when they are unmounted.
# UDEV seems to delete the device symlink in this case :-(
# So we need to re-create it here
ACTION=="change", KERNEL=="sd*", ENV{DEVTYPE}=="partition", \
    ENV{ID_BUS}=="usb", ENV{ID_FS_LABEL_ENC}=="?*", \
    SYMLINK+="usbdisks/$env{ID_FS_LABEL_ENC}", MODE:="0660"

# Fallback: If partition has NO label, use kernel name
ACTION=="change", KERNEL=="sd*", ENV{DEVTYPE}=="partition", \
    ENV{ID_BUS}=="usb", ENV{ID_FS_LABEL_ENC}!="?*", \
    SYMLINK+="usbdisks/%k", MODE:="0660"


# When device is removed, also remove /media/usb/<label>
ACTION=="remove", KERNEL=="sd*", ENV{DEVTYPE}=="partition", \
    ENV{ID_BUS}=="usb", ENV{ID_FS_LABEL_ENC}=="?*", \
    RUN+="/bin/rm /media/usb/$env{ID_FS_LABEL_ENC}"

# Fallback: If partition has no label, remove /media/usb/%k
ACTION=="remove", KERNEL=="sd*", ENV{DEVTYPE}=="partition", \
    ENV{ID_BUS}=="usb", ENV{ID_FS_LABEL_ENC}!="?*", \
    RUN+="/bin/rm /media/usb/%k"

Qu'est-ce que cela fait: il crée deux symboles de symboles, une pour la partition de périphérique de stockage USB sous "/ dev/usbdisks/<...>". Il utilisera l'étiquette de la partition de stockage USB ou du nom du noyau, s'il n'y a pas d'étiquette. Le second symbolique liera de "/ Media/USB/<...>" à "/ Media/Autoousb/<...>" Ceci est fait pour la prise en charge de l'automobile (voir l'étape 2).

Remarque: je n'avais initialement pas utilisé les règles avec les variables id_fs_label_enc, car cela est dangereux à mon avis. Que se passe-t-il si vous branchez deux bâtons USB qui utilisent la même étiquette?

Mais l'affiche souhaitait spécifiquement utiliser l'étiquette du disque USB. J'ai donc modifié les règles en conséquence.

Pour vous assurer que udev lit ces règles d'utilisation

Sudo udevadm control --reload-rules

Avec ce fichier de règles UDEM, tout est configuré pour allocaliser la partition de périphérique de stockage USB. Notez que cela en ce moment, l'appareil ne sera pas automobile (intentionnellement). Il sera automobile une fois que vous l'utiliserez avec

Étape 2)

Configurez AUTOFS à Automount/Media/Autoousb/<...>: J'ai ajouté la ligne suivante à mon fichier "/etc/auto.master" (pour Ubuntu 12.04):

/media/autousb /etc/auto.usb --timeout=60

Cela signifie que les AUTOFS démonteront l'appareil après 60 secondes d'inactivité. Vous voudrez peut-être utiliser moins ou plus, dépendant de votre goût.

Pour gentoo, vous devez modifier "/etc/autofs/auto.master", donc il est logique d'utiliser

/media/autousb /etc/autofs/auto.usb --timeout=60

Maintenant, j'ai créé "auto.usb" avec le contenu suivant:

#!/bin/bash

key=${1}
fstype=$(/sbin/blkid -o value -s TYPE /dev/usbdisks/${key})
if [ "${fstype}" = "vfat" ] ; then
  echo "-fstype=vfat,sync,uid=0,gid=plugdev,umask=007 :/dev/usbdisks/${key}"
  exit 0
fi
if [ "${fstype}" = "ntfs" ] ; then
  echo "-fstype=Fuse.ntfs-3g,sync,uid=0,gid=plugdev,umask=007 :/dev/usbdisks/${key}"
  exit 0
fi
if [ "${fstype}" = "ext4" ] ; then
  echo "-fstype=ext4,sync,nocheck :/dev/usbdisks/${key}"
  exit 0
fi

exit 1

Cette auto.usb doit être exécutable, de sorte que Autofs utilise cela comme script (Bash). Donc, par exemple

Sudo chmod 0755 /etc/auto.usb

Qu'est-ce que cela fait: ce script dira des autofs (/ usr/sbin/automne) comment monter la partition de périphérique de stockage USB.

Le script utilisera d'abord "/ sbin/blkid" pour déterminer le type de système de fichiers sur la partition.

Le script fournira ensuite les options de montage droit en fonction de la partition de périphérique.

Remarque: j'ai inclus un exemple de code pour "VFAT" (probablement le plus courant des sticks USB), des systèmes de fichiers "NTFS" et "XFS". Bien sûr, il est assez facile de l'étendre pour prendre en charge plus de systèmes de fichiers.

Étape 3) Facultatif ... Pour "Eject" == Démontez votre clé USB (ou partitions sur votre clé USB), créez un script sous/SBIN/USBEJECT:

#!/bin/bash
killall -s SIGUSR1 /usr/sbin/automount

Avec ce script, vous pouvez utiliser "sudo USBeject" pour démonter toutes les partitions de périphériques USB montées (en disant à l'automobile de les démonter).

Bien sûr, vous pouvez simplement vous assurer que la partition n'est utilisée nulle part; L'automointer démontera alors la partition après la période de 60 secondes ...

L'astuce réelle ici est d'utiliser des liens symboliques à partir de "/ media/USB" à "/ media/autoutb":

  • Les Symlinks "/ Media/USB" seront créés par UDev, donnant à un utilisateur un aperçu simple que les partitions de périphériques de stockage USB sont là.
  • AUTOFS allumera ensuite la partition à la demande si vous l'utilisez via/Media/USB
  • Avec le fichier "auto.usb" scripté, vous pouvez prendre en charge tout type de système de fichiers et, en plus, vous pouvez également prendre en charge tout type de schéma de dénomination.
  • Cette approche prend en charge des bâtons USB avec plusieurs partitions, même si ces partitions utilisent différents types de systèmes de fichiers.
2
Ingo Blackman

S'il vous plaît voir la page Archwiki UDev . Vous n'êtes pas censé exécuter mount des règles UDev ou des scripts exécutés par les règles UDEV.

Cependant, comme indiqué dans le projet Dev-Media-Media-Automount , il est assez simple de le faire en invoquant une unité SystemD à partir de la règle UDev, qui appelle ensuite un script qui fait le montage. Contrairement à UDISKS2 et à d'autres solutions, Udev-Media-Automount est orienté vers le cas simple où vous souhaitez monter quelque chose en tant qu'utilisateur root sans attendre nécessairement un environnement de bureau ou une "session d'utilisateur". Il semble que ce soit exactement ce que l'OP demande, et je l'ai trouvé fonctionnel et facile à comprendre.

1
Metamorphic

Je pense que c'est assez tard, mais je posterai ceci si quelqu'un en a besoin: (aussi ma première réponse Stackexchange)

Après avoir vérifié la solution dans de nombreux endroits, j'ai trouvé une solution simple dans Arch Wiki:

Lien vers - Arch Wiki .

Nous pouvons ajouter une règle UDISKS2 pour modifier le répertoire de montage par défaut de /run/media/$USER/ à /media/<Label>.

Ajoutez la règle suivante dans /etc/udev/rules.d/ avec nom comme 99-udisks2.rules:

ENV{ID_FS_USAGE}=="filesystem|other|crypto", ENV{UDISKS_FILESYSTEM_SHARED}="1"

Ensuite, nous pouvons simplement installer un outil simple comme diskie pour Automount.

1

J'ai trouvé un moyen de le faire en modifiant/etc/fstab fichier. Une simple entrée ressemble à:

/dev/sdb1 /media/robot/hdd1 ntfs defaults 0 0

<file system> <mount point> <type> <options> <dump> <pass>

0
Peter