Suggestions nécessaires pour udev, udisks, autofs, configuration des notifications pour une solution complète de montage automatique sur Linux


9

Poursuivant l' automontage des appareils connectés sous Linux , ce qui a laissé les choses un peu basiques. En exécutant Gentoo, je monte automatiquement une combinaison de périphériques locaux et réseau sur mon ordinateur portable avec autofs-5.0.4-r5. Faire des autofs seul me donne quelques reproches:

  • Je dois prédéfinir les noms des points de montage par périphérique, mais parfois après le redémarrage de mon lecteur de carte MMC, il change de position avec ma clé USB de démarrage
  • J'aimerais que les points de montage automatiques basés sur LABEL apparaissent, les autofs seuls AFAIK ne peuvent pas le faire

C'est ce que udev et udisks sont certainement capables de faire. Mais:

  • Je ne veux pas que le système de fichiers soit monté automatiquement lors du branchement de l'appareil, donnez-moi simplement le point de montage fantôme nommé LABEL

Le montage du système de fichiers réel ne doit se produire que lors du premier accès au point de montage, tout comme le fonctionnement des images fantômes autofs. Cela devrait réduire le risque de salir les systèmes de fichiers en débranchant accidentellement les appareils, tout en offrant une grande accessibilité.

En plus de cela, je pourrais utiliser savoir à tout moment ce qui se passe, dans mon DE.

  • Existe-t-il une application dans la barre d'état système capable d'indiquer l'état de tous les montages automatiques, c'est-à-dire verte = rien n'est monté, rouge = quelque chose est monté?
  • Existe-t-il un moyen indépendant de la distribution de fournir des notifications d'opérations de (dé) montage du système de fichiers, par exemple en utilisant notify-send? Qu'en est-il de Gentoo, cela fonctionne aussi pour moi. Script udev n'aide pas avec NFS et CIFS, non?

Ce combo devrait être la configuration de montage automatique ultime, ou manque-t-il quelque chose?


Je suis avec Gnome depuis quelques années, donc rouler le mien n'est plus aussi pertinent.
lkraav

Réponses:


4

Tout cela est possible avec udev. Jetez un œil à l' UAM , qui semble résoudre la plupart des problèmes que vous avez mentionnés, mais qui se monte automatiquement. Si vous le souhaitez, vous pouvez utiliser les grandes capacités qu'il offre, mais le modifier pour que les supports ne soient pas montés automatiquement. Vous pouvez également contacter l'auteur et suggérer votre approche de montage non automatique comme nouvelle fonctionnalité. En attendant, jetez un œil à ses capacités:

  • Il fonctionne par dessus udev, ce qui le rend indépendant de DE et basé sur les événements. (Il suggère également une solution de contournement pour les supports optiques qui pourraient ne pas être repérés par udev.)
  • Vous permet de définir MOUNTPOINT_TEMPLATESqui peut résoudre le problème de dénomination que vous avez mentionné de plusieurs façons personnalisées (voir uam.conf ), éventuellement en utilisant également LABEL(comme vous le souhaitez)
  • Les mécanismes de notification sont pris en charge, il vous suffit de les adapter à vos besoins spécifiques à DE.
  • Il semble avoir une conception claire, vous permettant de localiser facilement où, quand et comment chaque action est déclenchée.

Aujourd'hui, j'ai été référé à tinymount sur #awesome, ceux qui s'intéressent à ce sujet devraient probablement le vérifier
lkraav

En attendant, j'ai surtout utilisé bashmount.
lkraav

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 les systèmes de fichiers "vfat" (probablement les plus courants 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 ...

La vraie astuce 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.
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.