Vorschläge für udev, udisks, autofs und Benachrichtigungs-Setup für eine vollständige Automounting-Lösung unter Linux

9

Weiter mit Automounting von angeschlossenen Geräten unter Linux , was die Dinge ein wenig grundlegend machte. Unter Gentoo stelle ich eine Kombination aus lokalen und Netzwerkgeräten auf meinem Laptop mit autofs-5.0.4-r5 automatisch bereit. Wenn ich alleine Autofs mache, habe ich ein paar Probleme:

  • Ich muss Namen für Mountpunkte pro Gerät vordefinieren, aber gelegentlich wechselt mein MMC-Kartenleser nach dem Neustart die Position mit meinem bootfähigen USB-Stick
  • Ich möchte, dass automatische LABEL-basierte Mountpunkte angezeigt werden. Autofs allein AFAIK kann das nicht

Welches ist, was udev und udisks sicherlich können. Aber:

  • Ich möchte nicht, dass das Dateisystem beim Anschließen des Geräts automatisch gemountet wird. Geben Sie mir einfach den Ghost-Mount-Punkt mit dem Namen LABEL

Das tatsächliche Mounten des Dateisystems sollte nur beim ersten Zugriff auf den Mountpoint erfolgen, genau wie das automatische Ghosting funktioniert. Dies sollte das Risiko verringern, dass Dateisysteme durch versehentliches Herausziehen von Geräten verschmutzt werden, und gleichzeitig eine gute Zugänglichkeit bieten.

Darüber hinaus könnte ich in meiner DE jederzeit wissen, was los ist.

  • Gibt es eine Taskleisten-App, die den Status aller Automounts anzeigen kann, dh grün = nichts ist gemountet, rot = etwas ist gemountet?
  • Gibt es eine verteilungsunabhängige Möglichkeit, Benachrichtigungen über Dateisystemoperationen (nicht) bereitzustellen, z. B. mithilfe von notify-send? Was ist mit Gentoo-spezifisch, das funktioniert auch bei mir. Scripting udev hilft nicht bei NFS und CIFS, oder?

Diese Kombination sollte das ultimative Automount-Setup sein, oder fehlt mir etwas?

lkraav
quelle
Ich bin jetzt seit ein paar Jahren bei Gnome, daher ist es nicht mehr so ​​relevant, meine eigenen zu rollen.
lkraav

Antworten:

4

Das ist alles machbar mit udev. Werfen Sie einen Blick auf UAM , die die meisten Probleme zu lösen scheint , die Sie erwähnt haben, aber eigentlich nicht automatisch montieren. Wenn Sie möchten, können Sie die hervorragenden Funktionen nutzen, diese jedoch so ändern, dass die Medien nicht automatisch bereitgestellt werden. Sie können sich auch an den Autor wenden und Ihren nicht automatischen Montageansatz als neue Funktion vorschlagen. In der Zwischenzeit werfen Sie einen kurzen Blick auf seine Fähigkeiten:

  • Es funktioniert zusätzlich udevund ist DE-unabhängig und ereignisbasiert. (Es wird auch eine Problemumgehung für optische Medien vorgeschlagen, die möglicherweise nicht erkannt werden udev.)
  • Hier können Sie festlegen, MOUNTPOINT_TEMPLATESdass das von Ihnen erwähnte Namensproblem auf verschiedene benutzerdefinierte Arten gelöst werden kann (siehe uam.conf ), möglicherweise auch mithilfe LABEL(wie gewünscht).
  • Benachrichtigungsmechanismen werden unterstützt, Sie müssen sie nur an Ihre DE-spezifischen Anforderungen anpassen.
  • Es scheint ein klares Design zu haben, mit dem Sie leicht feststellen können, wo, wann und wie jede Aktion ausgelöst wird.
rozcietrzewiacz
quelle
Heute wurde ich auf tinymount auf #awesome verwiesen, diejenigen, die sich für dieses Thema interessieren, sollten es sich wahrscheinlich
ansehen
In der Zwischenzeit habe ich hauptsächlich bashmount verwendet.
lkraav
2

Hier ist, wie ich es kürzlich gemacht habe, und ich bin jetzt ziemlich zufrieden mit diesem Ansatz. Dies ist für Ubuntu 12.04 + Gentoo, aber ich denke, jede Distribution, die die Installation von udev und autofs ermöglicht, sollte funktionieren.

Voraussetzungen: Sie müssen udev + autofs installiert haben.

Schritt 1)

Erstellen Sie die folgende Datei "/etc/udev/rules.d/90-usbsd-auto.rules" (natürlich können Sie einen beliebigen Namen verwenden, solange dieser mit ".rules" endet). ::

# 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"

Was dies bewirkt: Es werden zwei Symlinks erstellt, einer für die USB-Speichergerätepartition unter "/ dev / usbdisks / <...>". Es wird entweder die Bezeichnung der USB-Speicherpartition oder der Kernelname verwendet, wenn keine Bezeichnung vorhanden ist. Der zweite Symlink wird von "/ media / usb / <...>" zu "/ media / autousb / <...>" verlinkt. Dies erfolgt zur Unterstützung von Automountern (siehe Schritt 2).

Hinweis: Ich habe die Regeln ursprünglich nicht mit den Variablen ID_FS_LABEL_ENC verwendet, da dies meiner Meinung nach gefährlich ist. Was passiert, wenn Sie zwei USB-Sticks mit demselben Etikett anschließen?

Da das Poster jedoch speziell das Etikett des USB-Laufwerks verwenden wollte, habe ich die Regeln entsprechend geändert.

Um sicherzustellen, dass udev diese Regeln liest, verwenden Sie

sudo udevadm control --reload-rules

Mit dieser udev-Regeldatei wird alles so eingerichtet, dass die USB-Speichergerätepartition automatisch bereitgestellt wird. Beachten Sie jedoch, dass das Gerät derzeit NICHT (absichtlich) automatisch bereitgestellt wird. Es wird automatisch bereitgestellt, sobald Sie es mit verwenden

Schritt 2)

Richten Sie autofs auf automount / media / autousb / <...> ein: Ich habe meiner Datei "/etc/auto.master" (für Ubuntu 12.04) die folgende Zeile hinzugefügt:

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

Dies bedeutet, dass AutoFS das Gerät nach 60 Sekunden Inaktivität deaktiviert. Je nach Geschmack möchten Sie möglicherweise weniger oder mehr verwenden.

Für Gentoo müssen Sie "/etc/autofs/auto.master" ändern, damit die Verwendung sinnvoll ist

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

Jetzt habe ich "auto.usb" mit folgendem Inhalt erstellt:

#!/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

Diese auto.usb muss ausführbar sein, damit autofs dies als (Bash-) Skript verwendet. So zum Beispiel

sudo chmod 0755 /etc/auto.usb

Was bewirkt das: Dieses Skript teilt AutoFS (/ usr / sbin / automount) mit, wie die USB-Speichergerätepartition gemountet werden soll.

Das Skript verwendet zuerst "/ sbin / blkid", um herauszufinden, welche Art von Dateisystem sich auf der Partition befindet.

Das Skript bietet dann abhängig von der Gerätepartition die richtigen Mount-Optionen.

Hinweis: Ich habe Beispielcode für die Dateisysteme "vfat" (wahrscheinlich am häufigsten für USB-Sticks), "ntfs" und "xfs" eingefügt. Natürlich ist es ziemlich einfach, dies zu erweitern, um mehr Dateisysteme zu unterstützen.

Schritt 3) Optional ... Um Ihre USB-Sticks (oder Partitionen auf Ihrem USB-Stick) "auszuwerfen" == zu entfernen, erstellen Sie ein Skript unter / sbin / usbeject:

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

Mit diesem Skript können Sie "sudo usbeject" verwenden, um die Bereitstellung aller gemounteten USB-Gerätepartitionen aufzuheben (indem Sie automount anweisen, die Bereitstellung aufzuheben).

Natürlich können Sie einfach sicherstellen, dass die Partition nirgendwo verwendet wird. Der Automounter hebt dann die Partition nach dem 60-Sekunden-Timeout auf ...

Der eigentliche Trick besteht darin, Symlinks von "/ media / usb" zu "/ media / autousb" zu verwenden:

  • Die Symlinks "/ media / usb" werden von udev erstellt und geben dem Benutzer einen einfachen Überblick darüber, welche Partitionen von USB-Speichergeräten vorhanden sind
  • AutoFS stellt die Partition dann bei Bedarf automatisch bereit, wenn Sie sie über / media / usb verwenden
  • Mit der Skriptdatei "auto.usb" unterstützen Sie möglicherweise jede Art von Dateisystem und zusätzlich jede Art von Namensschema.
  • Dieser Ansatz unterstützt USB-Sticks mit mehreren Partitionen, auch wenn diese Partitionen unterschiedliche Dateisystemtypen verwenden.
Ingo Blackman
quelle