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

17

J'ai un système Sid Debian (Wheezy) (et même pour arch), sans environnement de bureau (et pas Xorg du tout).

Je peux monter mes cartes SD, clés USB, disque dur externe par étiquette dans un répertoire spécifié /media/manuellement avec mount/ umountet les entrées appropriées dans /etc/fstab, ou automatiquement au démarrage, mais cela est convaincant, trop restrictif et pas assez dynamique pour mes besoins: si je veux qu'ils soient montés /media/<LABEL>, chaque appareil avec un autre a <LABEL>besoin de sa propre entrée, et chaque <LABEL>sous-répertoire doit être créé / supprimé manuellement /media/également).

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

La solution idéale serait:

  1. détecter le moment où est branchée (ie lorsqu'il est ajouté dans un support amovible /dev/comme sdax, sdbx... par udev)
  2. créer un répertoire en /media/fonction de son étiquette (étiquette du support amovible)
  3. le monter dans le répertoire /media/<LABEL>en RWmode (si son système de fichiers le supporte) avec l' flushoption (pour a vfat)
  4. détecter si le média 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 en mode synchrone de façon ovale, pour éviter toute perte de données lorsqu'ils sont débranchés à chaud en raison de la mise en cache : sync c'est beaucoup trop pour les vfatsupports amovibles, donc flush a été créé comme un compromis , moins sécurisé que sync, mais moins risqué selon la durée de vie -des cycles de mémoires flash)

J'ai trouvé quelques informations sur autofs, HAL, udisks, udisks2, usbmountetc., mais on ne sait pas que l' on est dépréciée 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'à maintenant ...

cedbeu
la source
Tout d'abord, avez-vous cherché des questions similaires? Je me souviens que cela a déjà été demandé. Deuxièmement, le démontage doit avoir lieu avant le débranchement.
enzotib
1
Bien sûr, j'ai fait: o] Ici et sur superutilisateur. Le problème est que les outils évoluent (udisks / udev), ou sont obsolètes (HAL?), Autres "non préférés" (udisks2?), Etc. Quoi qu'il en soit, je n'ai trouvé aucune solution fonctionnelle ni claire. La plupart de ce que j'ai découvert repose sur un mécanisme d'environnement de bureau (Gnome, KDE ou XFCE); Je ne veux pas en installer. À propos du démoutage, pas nécessairement. Si l'appareil est défini sur sync, un démon peut démonter l'appareil du fs s'il détecte qu'il a été débranché sans perte de données. Toutes les distributions de bureau font cela. Je veux ça dans le terminal.
cedbeu
Regardez ce remplacement pourhalevt . À propos du démontage, DE attend généralement que vous éjectiez le périphérique du gestionnaire de fichiers avant de le débrancher physiquement.
enzotib
Oui c'est vrai. Mais j'ai vu que certains démons (anciennement utilisés) pouvaient démonter des périphériques de fs qui n'avaient pas été démontés avant de le débrancher, et même supprimer automatiquement leur répertoire correspondant de / media /, et que rester dans la manière normale de faire les choses (si les appareils sont configurés pour être synchrones bien sûr). Merci pour votre lien. Je vais jeter un œil dès que je serai de retour à la maison sur udisksevt. J'ai déjà un aperçu de devmon et udiskie mais ils ne sont pas dans les paquets Debian. Si je peux trouver autre chose, j'essaierai mais je ne peux pas croire qu'il n'y ait pas de solution native sur Debian pour le faire.
cedbeu
1
Je suis sur Debian aussi et j'utiliser fdisk -lpuis mount- qui est deux commandes, mais OK, si vous le voulez automatisé, vous devrez analyser la fdisk -lsortie, puis le mettre dans le mount- je fais une telle substance avec head, tail, tr, cut, etc., mais les professionnels le font généralement avec awkou, mieux encore, recherchent les données au bon endroit. À propos de la suppression, du moins pour moi lorsque je monte sur /mnt, cela se fait automatiquement. À propos du déclencheur (lorsque vous vous connectez), je n'ai aucune idée, mais dites-nous quand vous le résolvez.
Emanuel Berg

Réponses:

10

Je pense que vous cherchez pmount.

Si vous souhaitez un montage automatique lors de l'insertion, voir Montage automatique de clés USB sur Debian .

Si votre système utilise udisks2 , c'est la façon préférée de réagir à l'insertion d'un périphérique de stockage amovible. Voir le wiki Arch pour des conseils de configuration pour les Udisks.

Sinon, le programme qui réagit lorsqu'un nouveau périphérique apparaît est udev , donc le montage automatique est déclenché par une règle udev . Le package usbmount fournit des règles udev pour monter automatiquement des périphériques de stockage USB et quelques autres. L'appel à mountpartir des règles udev ne fonctionne pas pour les systèmes de fichiers FUSE (tels que ntfs-3g), utilisez donc les udisks si vous en avez besoin.

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

Gilles 'SO- arrête d'être méchant'
la source
Merci un million pour la réponse. J'essaierai cela dès que possible et je ferai savoir aux gens d'ici. À propos du démoutage. Les gars, s'il vous plaît, arrêtez de me dire que c'est une question de causalité où ce n'est pas le cas: o] Le démontage après que l'appareil est débranché est parfaitement logique (et c'est possible) dès que l'appareil est configuré pour être synchrone. Ensuite, ce n'est qu'une question de système de fichiers. Si les données ont été transférées sans mise en cache (de manière synchrone), aucun problème de débranchement sans démontage. Ensuite, le démontage peut être réalisée et est seulement utile pour informer le système que l'appareil est plus là.
cedbeu
1
@cblab Vous simplifiez trop. Si un fichier est ouvert en écriture et que vous retirez le périphérique, le fichier est susceptible d'être endommagé; le démontage garantit qu'aucun fichier n'est ouvert. Sur de nombreux systèmes de fichiers (pas FAT cependant), le démontage est plus que la mise à 0 du bit sale, ils doivent par exemple vider un journal. Pour les périphériques flash, une préoccupation majeure avec les supports de synchronisation est qu'ils usent le périphérique beaucoup plus rapidement, car ils empêchent le regroupement d'écriture. Voir superuser.com/questions/180722/… et readlist.com/lists/vger.kernel.org/linux-kernel/22/111748.html
Gilles 'SO- arrête d'être méchant'
Salut @ Gilles. Merci pour vos réponses. Je ne pense pas que je simplifie trop. Vous avez raison sur certains points. Mais, l'utilisateur décide s'il veut vivre à risque. Vous seriez d'accord, votre message a 7 ans; maintenant, une flushoption de montage conçue spécialement pour vfatéviter ces problèmes: l'écriture n'est pas effectuée après chaque bloc, mais dès que le périphérique semble inactif. Et les mémoires flash ont également considérablement augmenté leurs cycles de vie sans issue. Maintenant, évidemment, l'utilisateur doit être conscient de ne pas débrancher les appareils lorsque les fichiers sont ouverts ou pendant une copie (ou peu de temps après). Mais c'est le bon compromis.
cedbeu
Quoi qu'il en soit, le port USB aurait pu être la bonne option pour moi, mais malheureusement, il ne monte pas les périphériques sur un dossier en fonction de leurs noms d'étiquette, mais dans /media/usb-*, ce qui ne correspond pas à mes besoins. Je veux pouvoir monter automatiquement les périphériques /media/<DEV_LABEL>avec un flushparamètre lorsqu'ils sont détectés (si possible avec la création dynamique du répertoire), les démonter et supprimer les répertoires de/media/ automatiquement s'ils ne sont plus détectés. Le risque que je prends dépend de moi.
cedbeu
1
Faites attention qui usbmountne supporte plus NTFS depuis jessie: bugs.debian.org/774149
malat
2

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

Prérequis: Vous devez avoir installé udev + autofs.

Étape 1)

Créez le fichier "/etc/udev/rules.d/90-usbsd-auto.rules" suivant (vous pouvez bien sûr utiliser n'importe quel nom tant qu'il 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 liens symboliques, un pour la partition du périphérique de stockage USB sous "/ dev / usbdisks / <...>". Il utilisera soit l'étiquette de la partition de stockage USB, soit le nom du noyau, s'il n'y a pas d'étiquette. Le deuxième lien symbolique reliera de "/ media / usb / <...>" à "/ media / autousb / <...>" ceci est fait pour la prise en charge des montages automatiques (voir l'étape 2).

Remarque: à l'origine, je n'ai 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 clés USB qui utilisent la même étiquette?

Mais l'affiche voulait 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, utilisez

sudo udevadm control --reload-rules

Avec ce fichier de règles udev, tout est configuré pour monter automatiquement la partition du périphérique de stockage USB. Notez cependant que pour le moment, l'appareil ne sera PAS monté automatiquement (intentionnellement). Il sera monté automatiquement une fois que vous l'utiliserez avec

Étape 2)

Configurer autofs pour monter automatiquement / media / autousb / <...>: J'ai ajouté la ligne suivante à mon fichier "/etc/auto.master" (pour Ubuntu 12.04):

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

Cela signifie qu'AutoFS démontera l'appareil après 60 secondes d'inactivité. Vous voudrez peut-être en utiliser moins ou plus, selon votre goût.

Pour Gentoo, vous devez modifier "/etc/autofs/auto.master" afin qu'il soit 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

Ce fichier auto.usb doit être exécutable, afin que autofs l'utilise comme un script (bash). Donc par exemple

sudo chmod 0755 /etc/auto.usb

Qu'est-ce que cela fait: ce script indiquera à AutoFS (/ usr / sbin / automount) comment monter la partition du périphérique de stockage USB.

Le script utilisera d'abord "/ sbin / blkid" pour savoir quel type de système de fichiers se trouve sur la partition.

Le script fournira alors les bonnes options de montage en fonction de la partition du périphérique.

Remarque: J'ai inclus un exemple de code pour "vfat" (probablement le plus courant pour les clés USB), "ntfs" et "xfs". Bien sûr, il est assez facile de l'étendre pour prendre en charge davantage de systèmes de fichiers.

Étape 3) Facultatif ... Pour "éjecter" == démonter votre clé USB (ou vos 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érique USB montées (en disant à automount de les démonter).

Bien sûr, vous pouvez simplement vous assurer que la partition n'est utilisée nulle part; automounter démontera ensuite la partition après l'expiration du délai de 60 secondes ...

Le vrai truc ici est d'utiliser des liens symboliques de "/ media / usb" vers "/ media / autousb":

  • Les liens symboliques "/ media / usb" seront créés par udev, donnant à l'utilisateur un aperçu simple des partitions des périphériques de stockage usb présentes
  • AutoFS montera ensuite automatiquement la partition à la demande si vous l'utilisez via / media / usb
  • Avec le fichier scripté "auto.usb", vous pouvez prendre en charge tout type de système de fichiers et vous pouvez également prendre en charge tout type de schéma de dénomination.
  • Cette approche prend en charge les clés USB avec plusieurs partitions, même si ces partitions utilisent différents types de système de fichiers.
Ingo Blackman
la source
2

D'accord, cela fait longtemps, mais je vais quand même répondre à ma question avec la meilleure option que j'ai trouvée à partir de maintenant. Pour résumer: créez une udevrègle, associée à certains scripts (qui va créer / supprimer des répertoires et démonter / monter des périphériques amovibles), et attachée au udevtype d'événement de périphérique = partition.

1 - Création de scripts d'ajout / suppression

Enregistrez le script suivant storage-automount.shdans /lib/udev/et rendez-le 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

Enregistrez le script suivant storage-autounmount.shdans /lib/udev/et rendez-le 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 udevrègle pour attacher ces scripts aux événements

Et enfin, ajoutez une udevrègle /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 lui faire avoir les mêmes autorisations que les autres règles dans ce dossier dir /

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

Lorsque le périphérique est supprimé, il est démonté et le répertoire est supprimé de /media

De plus, l'outil pour surveiller les udevévénements est udevadm monitor, avec des options comme --envou --property:

$ udevadm monitor --env

Ceci est testé et fonctionne très bien sur Debian et Arch, mais fonctionne probablement sur toutes les distributions qui en dépendent udev.

cedbeu
la source
Je pense que + r devrait être remplacé par + x dans "définissez-le sur exécutable (sudo chmod + r /lib/udev/storage-autounmount.sh)"
Jeremy
J'ai une nouvelle installation de jessie sur laquelle j'ai suivi de près vos instructions, mais je ne peux pas faire de montage automatique à partir de tty1, même après le redémarrage (ce qui n'est pas dans vos instructions, mais je n'ai pas non plus de pré-redémarrage de montage automatique). L'insertion de la clé USB est détectée (j'obtiens des messages de console), mais rien n'est visible dans / media / (sauf cdrom). Je peux monter manuellement la clé USB, donc je sais que ça marche aussi. [suite dans le commentaire suivant]
TomRoche
[suite du commentaire précédent] J'ai package = udev installé, j'ai dirs = {/ etc / udev / rules.d /, / lib / udev /} pré-rempli et j'ai executable = udevadm dans $ PATH. J'aimerais savoir (1) dans quelle version de Debian avez-vous fait fonctionner cela? (Je suppose Wheezy) (2) quels paquets Debian avez-vous installés en plus udev?
TomRoche
@TomRoche était Wheezy, à l'époque, en effet, et je n'avais aucun package spécial installé, j'essayais de faire une configuration minimaliste et j'essayais d'éviter autant que possible d'utiliser des packages qui n'étaient pas fournis par l'installation minimale. Je n'ai pas eu besoin de redémarrer, c'est pourquoi ce n'est pas dans mes instructions. Cela fait longtemps que je ne me suis pas plongé dedans… Je pourrais réessayer bientôt.
cedbeu
1

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 changer le répertoire de montage par défaut de /run/media/$USER/à/media/<Label> .

Ajoutez la règle suivante /etc/udev/rules.d/avec un 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 Udiskie pour le montage automatique .

Abhijeet Bhattacharjee
la source
Bonjour et bienvenu. Merci pour votre option. Pour Udiskie, je voulais en fait une option de ligne de commande complète (pas de Xorg ni d'interface graphique disponible sur le système). Et… La question a 6,5 ​​ans (oh, ça alors!), Je suppose que les choses ont changé maintenant :) Mais de toute façon, +1 pour votre première réponse, merci.
cedbeu le
1

Veuillez consulter la page ArchWiki Udev . Vous n'êtes pas censé exécutermount partir de règles Udev ou à partir de scripts exécutés par des règles Udev.

Cependant, comme le montre le projet udev-media-automount , il est assez simple de le faire en appelant 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 conçu pour le cas simple où vous souhaitez monter quelque chose en tant rootqu'utilisateur sans nécessairement attendre qu'un environnement de bureau ou une "session utilisateur" soit présent. Cela semble être exactement ce que le PO demande, et je l'ai trouvé fonctionnel et facile à comprendre.

Métamorphique
la source
Bien merci. C'est une assez vieille question que j'ai posée (il y a presque 7 ans… ne me fait pas me sentir plus jeune ^^). Mais encore, je vais jeter un oeil à votre proposition. Je suppose que l'environnement systemd est devenu beaucoup plus mature depuis lors. Merci, je vais vérifier ça!
cedbeu
0

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

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

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

Peter
la source
Les montages /etc/fstabne sont montés automatiquement qu'au démarrage.
Graeme
@Graeme, j'ai une carte SD que je monte via / etc / fstab. À titre de test, j'ai essayé de démonter et de retirer physiquement la carte SD de mon ordinateur. J'ai vérifié que la monture n'apparaissait plus via 'df'. Lorsque j'ai réinséré ma carte SD, le support est ensuite réapparu même si je ne l'avais pas explicitement remonté. C'est sur Ubuntu 16.04.
Gino
@Gino, Ubuntu a fait le montage automatique par défaut depuis un certain temps maintenant.
Graeme
@Graeme, il semble que le monteur automatique Ubuntu sélectionne le bon montage dans / etc / fstab, s'il existe là-bas. Donc, au moins sur Ubuntu 16.04, le support est automatiquement monté au démarrage et après réinsertions ultérieures dans le port USB, s'il y en a ..
Gino
@Gino Je n'ai pas utilisé Ubuntu depuis un moment, mais je suis quasiment sûr qu'il montera automatiquement votre carte SD indépendamment de ce qui se trouve dans le fstab. Fstab concerne davantage la configuration des éléments du système central que les disques supplémentaires des systèmes modernes.
Graeme