Externe Laufwerke beim Booten automatisch in / media / LABEL einbinden, ohne dass ein Benutzer angemeldet ist?


73

Diese Frage ist ähnlich, aber das Gegenteil von dem, was ich will. Ich möchte, dass externe USB-Laufwerke beim Booten automatisch ohne Anmeldung an Speicherorten wie bereitgestellt werden /media/<label>.

Ich möchte nicht alle Daten in fstab eingeben müssen, zum Teil, weil es mühsam und nervig ist, aber zum größten Teil, weil ich nicht vorhersagen kann, was ich daran anschließen werde oder wie sich die Partitionen in Zukunft ändern werden.

Ich möchte, dass auf Laufwerke wie MPD zugegriffen werden kann und sie verfügbar sind, wenn ich mich mit SSH anmelde. gnome-mountScheint, Dinge nur einzuhängen, wenn Sie lokal in einer grafischen Gnome-Sitzung angemeldet sind.


4
Tolle Frage, wünschte ich hätte eine Antwort für dich, jetzt bin ich gespannt wie das gelöst wird.
invertieren

1
Ich habe meine Antwort aktualisiert.
Ryan Thompson

1
Und ich habe kein Problem damit, Gnome zu installieren, wie ich es bereits getan habe, aber eine Lösung für kopflose GUI-lose Server wäre am besten.
Endolith

1
ARRRGHH ... Fehler in meiner Antwort. in der RUN. /usr/local/sbin/udev-automounter.sh mount %ksollte sein /usr/local/sbin/udev-automounter.sh %k. Es tut uns leid.
Quack Quijote

1
OK, ab Update-3 funktioniert es mit Leerzeichen. Dazu wird eine "codierte" Version von <LABEL> verwendet, die Leerzeichen in \x20"s " konvertiert . Also ist es nicht schön, aber es wird funktionieren. udev geht nicht gut mit Labels mit Leerzeichen um, aber es gibt eine andere Option, bei der Unterstriche anstelle von \x20's verwendet werden (so sieht es zumindest gut aus). Es sieht so aus, als müsste das Space-Handling in die Shellscripts gehen.
Quack Quijote

Antworten:


74
  • Hinweis für Ubuntu Server 11.10: Dieses Skript schlägt unter Ubuntu Server 11.10 aufgrund des veralteten vol_idBefehls fehl . vol_idwurde ersetzt durch blkid. Um das Skript zu reparieren, ersetzen Sie "vol_id" durch "blkid -o udev" im udev-auto-mount.shSkript.

Ich habe mich schon eine Weile damit beschäftigt und ich denke, ich habe eine funktionierende Lösung gefunden. Dies wurde auf einem Debian-basierten System entwickelt und getestet, daher sollte es auf Ubuntu funktionieren. Ich werde auf die Annahmen hinweisen, die es macht, damit es auch an andere Systeme angepasst werden kann.

  • Es wird automatisch USB-Laufwerke beim Plugin einbinden und sollte nicht viel Zeit in Anspruch nehmen, um sich an Firewire anzupassen.
  • Es verwendet UDEV, also kein Affe mit HAL / DeviceKit / GNOME-Anything.
  • Es erstellt automatisch ein /media/LABELVerzeichnis, in das das Gerät eingehängt werden soll.

  • Es kann jedoch zu Interferenzen mit anderen Automountern kommen. Das kann ich nicht testen. Ich gehe davon aus, dass beide bei aktivem Gnome-VFS versuchen können, den Mount durchzuführen. Wenn Gnome-VFS den Mount nicht erfolgreich durchführt, wird möglicherweise kein Desktopsymbol konfiguriert. Das Abmelden von Gnome sollte möglich sein, erfordert aber möglicherweise etwas gksudoÄhnliches.

Ich habe dies nicht beim Systemstart getestet, aber der einzige Grund, warum ich feststellen kann, dass es möglicherweise nicht funktioniert, ist der Versuch, das USB-Laufwerk zu mounten, bevor das System zum Mounten bereit ist. Wenn dies der Fall ist, benötigen Sie wahrscheinlich eine zusätzliche Optimierung des Mount-Skripts. (Ich wende mich an ServerFault, um zu sehen, ob es Ratschläge gibt, aber nicht viel Interesse daran.)

Also weiter so.


UDEV Referenzen:


Hintergrund (UDEV? Whuzzat?)

UDEV ist das Hotplug-System des Kernels. Dies konfiguriert automatisch die richtigen Geräte und Geräte-Symlinks (z. B. /dev/disk/by-label/<LABEL>), sowohl beim Booten als auch für Geräte, die hinzugefügt werden, während das System ausgeführt wird.

D-Bus und HAL werden zum Senden von Hardware-Ereignissen an Listener wie Desktop-Umgebungen verwendet. Wenn Sie sich bei GNOME anmelden und eine CD einlegen oder ein USB-Laufwerk anschließen, folgt dieses Ereignis dieser Kette:

kernel -> udev -> dbus -> hal -> gnome-vfs/nautilus (mount)

Und schon wird Ihr Laufwerk montiert. In einem kopflosen System müssen wir uns jedoch nicht anmelden, um die Vorteile des automatischen Einbaus nutzen zu können.

Udev-Regeln

Da wir mit UDEV Regeln schreiben und Programme beim Einfügen von Geräten ausführen können, ist dies eine ideale Wahl. Wir werden die vorhandenen Regeln von Debian / Ubuntu nutzen, sie den /dev/disk/by-label/<LABEL>Symlink für uns einrichten lassen und eine weitere Regel hinzufügen, die das Gerät für uns bereitstellt.

Die UDEV-Regeln werden in /etc/udev/rules.d(und /lib/udev/rules.dauf Karmic) aufbewahrt und in numerischer Reihenfolge verarbeitet. Jede Datei, die nicht mit einer Nummer beginnt, wird nach den nummerierten Dateien verarbeitet. Auf meinem System befinden sich HAL-Regeln in einer Datei mit dem Namen 90-hal.rules. Ich habe meine Regeln 89-local.rulesso eingefügt, dass sie verarbeitet werden, bevor sie zu HAL gelangen. In erster Linie müssen Sie sicherstellen, dass diese Regeln nach dem auftreten 60-persistent-storage.rules. local.ruleskann gut genug sein.

Fügen Sie dies in Ihre neue Regeldatei ein:

# /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"
  • Stellen Sie sicher, dass nach \, nur ein newline( \n) keine Leerzeichen stehen .

  • Wechseln Sie SUBSYSTEMS=="usb"zu SUBSYSTEMS=="usb|ieee1394"für die Firewire-Unterstützung.

  • Wenn das Gerät immer einem bestimmten Benutzer gehören soll, fügen Sie eine OWNER="username"Klausel hinzu. Wenn Sie nur die Dateien eines bestimmten Benutzers benötigen, optimieren Sie stattdessen das Mount-Skript.

Die Regel lesen

Dadurch wird ein auszuführendes Programm zur Liste der auszuführenden Programme des Geräts hinzugefügt. Es identifiziert USB-Partitionsgeräte anhand von <LABEL>und leitet diese Informationen an ein Skript weiter, das die Bereitstellung durchführt. Im Einzelnen entspricht diese Regel:

  1. ENV{ID_FS_LABEL_ENC}=="?*"- eine Umgebungsvariable, die von einer früheren Systemregel festgelegt wurde. Existiert nicht für Nicht-Dateisysteme, deshalb suchen wir danach. Eigentlich möchten wir ID_FS_LABELden Mount-Punkt verwenden, aber ich habe UDEV nicht davon überzeugt, ihn für mich zu entziehen. Deshalb lassen wir das Mount-Skript damit umgehen.

    Diese und andere Umgebungsvariablen werden von udev mit dem vol_idBefehl ( veraltet ) abgerufen . Es ist ein praktisches Tool, mit dem Sie schnell Details zu einer Partition anzeigen können:

    $ 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
    
  2. ACTION=="add"- nur Spielereignisse add...

  3. SUBSYSTEMS=="usb"- stimmen Sie nur mit Geräten überein, die sich am USB-Bus befinden. Wir verwenden SUBSYSTEMShier, weil dies mit den Eltern unseres Geräts übereinstimmt. Das Gerät, an dem wir interessiert sind, wird tatsächlich SUBSYSTEM == "scsi" sein. Durch die Zuordnung zu einem übergeordneten USB-Gerät wird vermieden, dass unser Programm den internen Laufwerken hinzugefügt wird.

  4. RUN+="..."- Keine Übereinstimmung, sondern eine Aktion: Fügen Sie dieses Programm zur Liste der auszuführenden Programme hinzu. Wird in den Programmargumenten %kauf den Gerätenamen erweitert (z. B. sdc1nicht /dev/sdc1) und $env{FOO}ruft den Inhalt der Umgebungsvariablen FOO ab.

Regel testen

Der erste Referenzlink (oben) ist ein exzellentes UDEV-Tutorial, aber etwas veraltet. Die Programme, die ( udevtestinsbesondere) zum Testen Ihrer Regeln ausgeführt werden, wurden durch das udevadmDienstprogramm catch-all ersetzt .

Nachdem Sie die Regel hinzugefügt haben, schließen Sie Ihr Gerät an. Nehmen Sie sich ein paar Sekunden Zeit und überprüfen Sie, welchem ​​Gerät es zugewiesen wurde:

$ 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

Wenn Ihr Wechsellaufwerk enthält label_Baz, befindet es sich auf dem Gerät sdc1. Führen Sie dies aus und schauen Sie sich die Ausgabe gegen Ende an:

$ 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'

Suchen Sie RUN+=in den letzten Zeilen nach dem Skriptnamen aus unserer Regel (in diesem Beispiel der dritte von unten). Sie können die Argumente sehen, die für dieses Gerät verwendet werden würden. Sie können diesen Befehl jetzt ausführen, um zu überprüfen, ob die Argumente korrekt sind. Wenn es in Ihrer Befehlszeile funktioniert, sollte es automatisch funktionieren, wenn ein Gerät eingefügt wird.

Sie können UDEV-Ereignisse auch in Echtzeit überwachen: ausführen sudo udevadm monitor( man udevadmEinzelheiten zu den Schaltern siehe ). Dann schließen Sie einfach ein neues Gerät an und schauen Sie sich die Ereignisse an. (Wahrscheinlich übertrieben, es sei denn, Sie interessieren sich für wirklich einfache Details ...)

Regeln neu laden

Sobald Sie überprüft haben, dass die Regel richtig gelesen wird, müssen Sie UDEV anweisen, die Regeln neu zu laden, damit die neue wirksam wird. Wenden Sie eine der folgenden Methoden an (wenn die erste nicht funktioniert, sollte die zweite ... aber versuchen Sie die erste zuerst):

  • Lauf sudo udevadm control --reload-rules

  • Lauf sudo /etc/init.d/udev reload

  • neustarten


Skript! Eigentlich 2 Skripte ...


Hier ist das erste Skript. Da das von uns ausgeführte Programm schnell ausgeführt werden muss, wird das zweite Skript nur im Hintergrund ausgeführt. Setzen Sie dies in /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} &

Hier ist das zweite Skript. Dies führt zu einer etwas stärkeren Eingabeprüfung. Setzen Sie dies in /usr/local/sbin/udev-auto-mount.sh. Möglicherweise möchten Sie die folgenden Mount-Optionen optimieren. Dieses Skript kann jetzt die Partition LABEL selbstständig finden. UDEV sendet nur den DEVICE-Namen.

Wenn beim Hochfahren Probleme beim Mounten von Laufwerken auftreten , können Sie sleep 60in dieses Skript einen langen Zeitraum einfügen, damit das System Zeit hat, bis das Skript versucht, das Laufwerk zu mounten.

Ich habe in den Kommentaren einen Vorschlag zur Überprüfung (Ausführen ps, um festzustellen, ob ein Webserver ausgeführt wird) gemacht, aber Sie sollten diesen Vorschlag für Ihr System anpassen. Ich denke, die meisten Netzwerkserver, die Sie möglicherweise verwenden, würden für diesen Zweck ausreichen - nfsd, smbd, apache usw. Das Risiko besteht natürlich darin, dass das Mount-Skript fehlschlägt, wenn der Dienst nicht ausgeführt wird Die Existenz einer bestimmten Datei wäre eine bessere Lösung.

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

Super Bonus Cleanup Script!

Noch ein Drehbuch. Dazu müssen Sie nur das Gerät aushängen und die Mountpoint-Verzeichnisse entfernen. Es wird davon ausgegangen, dass es über Privilegien verfügt, mit denen Sie es ausführen müssen sudo. Dieses Skript übernimmt jetzt den vollständigen Mountpunkt in der Befehlszeile, z. B .:

$ /usr/local/sbin/udev-unmounter.sh "/media/My Random Disk"

Setzen Sie dies in /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

3
Du bist toll! :)
kolypto

1
Wenn ich auto-mount.sh manuell starte, funktioniert es, aber nicht, wenn ich ein Laufwerk einstecke und nicht beim Booten. : /
Endolith

Das Problem liegt also bei den UDEV-Regeln. Erweitern Sie diesen Abschnitt ein wenig, um Ihnen beim Debuggen zu helfen.
Quack Quijote

3
Ich habe alle Skripte auf github zusammengestellt: github.com/fatso83/Code-Snippets/tree/master/system-utils/… Sie funktionieren einwandfrei unter Ubuntu 10.10 und beinhalten auch die automatische
Deinstallation

1
Referenz: udev_237 - ein Mann udev (Ubuntu_18.04) Beachten Sie, dass Programme ausgeführt wird, die auf das Netzwerk zugreifen oder mount / unmount Dateisysteme wird nicht innerhalb von udev - Regeln erlaubt , aufgrund der Standard - Sandbox , die auf systemd-udevd.service erzwungen wird. Quelle: unix.stackexchange.com/questions/200194/… Eine Lösung finden Sie unter serverfault.com/questions/766506/…
Pro Backup

9

Eine letzte Option, die andere im Internet vorgeschlagen haben, ist ivman, aber das scheint davon abzuhängen pmount, was Sie bereits angegeben haben, funktioniert nicht. pmountist aufgegeben und ivmanist fast gleich.

Der Ersatz für ivmanist halevtund ist in Karmic verfügbar. Es ist eine Neuimplementierung von ivman(zu lesen: "beibehalten" und "hängt nicht von pmount ab"). Das Paket ist auf Jaunty nicht verfügbar, obwohl Sie es möglicherweise selbst erstellen können, wenn Sie kein Upgrade planen.

Beide Tools befinden sich über den DBus- und HAL-Layern und reagieren auf Ereignisse von diesen. Anscheinend können beide als System-Daemon oder als Mount-Manager für Benutzersitzungen (a la Gnome-VFS) ausgeführt werden. Die /etc/defaults/{ivman,halevt}Dateien sind für die Systemeinstellungen zuständig.

Hier sind einige Anweisungen zum Optimieren ivmander Verwendung von /media/<LABEL>Mountpunkten. Das geht wahrscheinlich halevteinfacher, aber vielleicht helfen sie Ihnen, eine Antwort zu finden.


Arbeit mit HALEVT

Update : Um auch automagische CD-Mounts zu erhalten, die meine UDEV-Antwort nicht bietet, habe ich mir das genauer angesehen halevt. Ich habe diesen Blog-Beitrag gefunden, der mir geholfen hat, viel über den Prozess zu erklären. Ich musste mein eigenes halevtPaket für Debian Lenny kompilieren (zum Glück befanden sich alle Abhängigkeiten im Abschnitt Lenny-Backports). Einmal installiert, war der Prozess meistens nicht schrecklich:

  1. Stellen Sie sicher, dass der System-Halevt-Daemon in aktiviert ist /etc/default/halevt
  2. Ermöglichen Sie dem System halevt Benutzer, Geräte in zu mounten /etc/PolicyKit/PolicyKit.conf(siehe unten; Quelle )
  3. Ändern Sie die HAL-Richtlinie, um die Datenträgerbezeichnung in den bevorzugten Bereitstellungspunkt zu kopieren /etc/hal/fdi/policy/preferences.fdi(siehe unten).
  4. Wenn Sie CD / DVD-Unterstützung wünschen, rufen Sie das eject.halSkript aus dem obigen Blogpost auf, ändern Sie es und speichern Sie es in /usr/local/bin.
  5. Ändern Sie die halevt-Systemkonfiguration, um Einhängevorgänge zu aktivieren /etc/halevt/halevt.xml
  6. Fügen Sie Code zu den Skripten vor und nach der Sitzung Ihres Anmeldemanagers hinzu, um den System-Halevt-Daemon zu stoppen, wenn sich jemand anmeldet, und starten Sie ihn neu, wenn er sich abmeldet.

Wenn Sie die HAL- und HALEVT-Dämonen neu starten müssen, um Ihre neuen Konfigurationen zu überprüfen, verwenden Sie diese, um sie in der richtigen Reihenfolge abzurufen:

sudo sh -c "/etc/init.d/halevt stop ; /etc/init.d/hal restart ; /etc/init.d/halevt start"

Schritt 1

Überprüfen Sie das START_DAEMON=yesin /etc/default/halevt.

Schritt 2

In /etc/PolicyKit/PolicyKit.conf, fügen Sie diese innerhalb der <config></config>Sektion:

<match action="org.freedesktop.hal.storage.mount-removable">
   <match user="halevt">
      <return result="yes"/>
   </match>
</match>

Schritt 3

In /etc/hal/fdi/policy/preferences.fdi, fügen Sie diese innerhalb der `Abschnitt:

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

Schritt 4

Das Skript ist gut, muss aber ausgeführt werden /bin/bash. Einige Systeme können tatsächlich verwenden, /bin/dashwenn /bin/shaufgerufen wird. Ändern Sie daher die oberste Zeile im Skript, um sicherzustellen, dass Sie die richtige erhalten:

#!/bin/sh         <------ old first line

#!/bin/bash       <------ new first line

Schritt 5

Das ist der lustige Teil. Möglicherweise stellt Ihr System /etc/halevt/halevt.xmlbereits eine Basisversion bereit , sodass Sie diese für Ihren eigenen Gebrauch anpassen müssen. In meinem Fall hat mein System bereits grundlegende Removeables bereitgestellt, aber ich musste die Unterstützung für die CD-ROM-Bereitstellung und die Auswurftaste hinzufügen.

Der Blog-Beitrag, den ich erwähnte, enthält ein gutes Beispiel für eine XML-Konfiguration , mit der Sie nach eigenen Optimierungen suchen können. Es geht hauptsächlich darum, einen Gnome-Mount-Ersatz für die fluxboxUmgebung des Autors einzurichten , damit sein XML-Beispiel mehr kann, als Sie möchten, aber es ist eine großartige Möglichkeit, ein Gefühl dafür zu bekommen, was Sie tun können. Es gibt auch einige gute Beispiele in /usr/share/doc/halevt/examples.

Ich musste auch rennen, sudo sh -c "mkdir /var/halevt ; chown halevt:plugdev /var/halevt"bevor alles funktionieren würde.

Hier sind meine Ergänzungen, damit das automatische Laden von CDs / DVDs funktioniert:

<!-- CD/DVD mount -->
<halevt:Device match="hal.block.device &amp; hal.block.is_volume = true  &amp; hal.volume.is_disc = true &amp; 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>

Schritt 6

Sobald der System-Halevt-Daemon funktioniert, müssen Sie ihn deaktivieren, wenn Sie sich bei GNOME anmelden, und ihn erneut starten, wenn Sie sich abmelden. (Siehe meine Antwort auf diese Frage für Nicht-GDM-Anmeldemanager.) Dieses Zeug ist theoretisch, da ich es nicht verwende, aber es sollte funktionieren.

In /etc/gdm/PreSession/Default, fügen Sie diese das System halevt-Daemon zu stoppen:

/etc/init.d/halevt stop

In /etc/gdm/PostSession/Default, fügen Sie diese das System halevt-Daemon neu zu starten:

/etc/init.d/halevt start

3
Personen, die dies im Jahr 2013 lesen, sollten nun wissen, dass HAL veraltet ist, und auf udev-basierte Lösungen wie das oben angegebene Quacksalber-Quixote zurückgreifen.
Oligofren

6

Mit der Zeit erscheinen einfachere Lösungen.

Diese Lösung basiert auf dem udevil-Softwarepaket, das für diesen Zweck geschrieben wurde und keine Änderungen an den udev-Regeln erfordert. Es ist wahrscheinlich vorzuziehen (für neue und alte Benutzer) als eine einfache Lösung.

Das devmonSkript von udevil macht die ganze Magie, während es nur von udev und glib abhängt. Funktioniert fast sofort, ohne dass eine Erstkonfiguration erforderlich ist.

Alles, was ich auf meiner Workstation getan habe, war, devmon folgendermaßen aufzurufen rc.local:
devmon 2>&1 >> /var/log/devmon &
Zu Ihrer Bequemlichkeit möchten Sie dies möglicherweise in ein Init-Skript einbetten, anstatt rc.localein automatisiertes Tool pleaserunzu verwenden, um es zu erstellen: https://unix.stackexchange.com/ a / 124609/42673

Nachdem es ausgeführt wurde, wird der Speicher, den ich einstecke, überprüft (es wird nach Partitionen gesucht und wenn gefunden, werden die Dateisystembezeichnungen überprüft) und dann in bereitgestellt /media/FILESYSTEM_LABEL.
Konnte sich nichts Einfacheres vorstellen, als vielleicht, dass das (in) berühmte System diese Funktionalität irgendwann in die Zukunft integrieren würde.

udevil Auf einen Blick ( github.io/udevil )
Skript: devmon ( igurublog / script-devmon )


3

Die Antwort von quack quixote funktioniert unter Ubuntu Lucid Lynx (10.04) nicht - es gibt keinen /sbin/vol_idBefehl.

Anstatt ausgefallen zu sein und udev zu verwenden, fügen Sie dies in Ihre /etc/rc.local ein und machen Sie Folgendes:

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

1
DANKE .. das war der einfachste Weg für das, was ich erreichen wollte. Sogar auf Ubuntu Server 16 mit einem NTFS-Volume gearbeitet
ChrisPrime

3

Für Debian-basierte Systeme (z. B. Ubuntu usw.) gibt es das Paket usbmount , das USB-Laufwerke automatisch für Sie bereitstellt . Grundsätzlich wird ein udev-basierter Ansatz verwendet, wie bereits beschrieben. Es handelt sich lediglich um eine einfache Paketinstallation. Es scheint, dass der ursprüngliche Autor des Pakets keinen Dampf mehr hat, aber Ubuntu / Debian scheint es immer noch zu warten (ich denke, es ist nicht so komplex) - es ist also immer noch in den neuesten Releases verfügbar.

Die installierten Skripts können so konfiguriert werden (/etc/usbmount/usbmount.conf), dass die entsprechenden Mountpunkte bereitgestellt werden.


1
Usbmount kann jedoch nicht nach Label gemountet werden, es sei denn, Sie füllen die Liste der Labels in der Konfigurationsdatei aus.
Gilles

1
Siehe post esite.ch/2014/04/11/…, wenn Sie dem usbmount eine Markierung hinzufügen möchten, ohne eine Liste zu führen.
Oliver Sauder

3

So spülen Sie die ausgezeichneten Anweisungen von quack quixote zum Entfernen aus:

Fügen Sie der zuvor erstellten udev-Regeldatei (/etc/udev/rules.d) die folgende Zeile hinzu. "

ENV{ID_FS_LABEL_ENC}=="?*",   ACTION=="remove",      SUBSYSTEMS=="usb", \
         RUN+="/usr/local/sbin/udev-autounmounter.sh %k"

Als nächstes erstellen Sie das folgende Skript und chmod es ausführbar (/usr/local/sbin/udev-autounmounter.sh) mit dem folgenden Inhalt:

#!/bin/sh
#
# USAGE: usb-autounmounter.sh DEVICE 
#   DEVICE   is the actual device node at /dev/DEVICE

/usr/local/sbin/udev-auto-unmount.sh ${1} &

Zum Schluss das Unmount-Skript selbst (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

Bei den anderen Anweisungen wird das Verzeichnis bei udev-Ereignissen automatisch angezeigt und ausgeblendet.


Ich denke if [ -n "$device_is_mounted" ]; thensollte sein if [ -z "${MOUNTPT}" ]; then, sollte es nicht?
Eresonance

2

Vielleicht möchten Sie Pysdm ausprobieren


Das ist doch nur ein weiterer Fstab-Editor, oder?
Endolith

Ja, aber "Es ermöglicht auch die Erstellung von udev-Regeln für die dynamische Konfiguration von Speichergeräten"
Sathyajith Bhat

Würde mir die "Erstellung von udev-Regeln" irgendwie helfen? Ich habe keine Ahnung, was das überhaupt bedeutet. Mounten zuvor unbekannte Wechselmedien, ohne dass ein Benutzer lokal angemeldet ist?
Endolith

Entschuldigung, ich habe keine Ahnung, was die udev-Regeln angeht. Sie können sich fredericiana.com/2006/03/15/writing-udev-rules-short-notes und reactivated.net/writing_udev_rules.html
Sathyajith Bhat

2

Sie können versuchen, su username -c gnome-volume-manager/etc/rc.local einzugeben. Es könnte ausreichen, einfach den Gnome-Volume-Manager laufen zu lassen.

Bearbeiten: Es scheint, dass der Gnome-Volume-Manager nicht mehr Teil der Standarddistribution ist, selbst auf dem Ubuntu-Desktop.

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

Wenn Sie es jedoch installieren, funktioniert es möglicherweise weiterhin. Es ist einen Versuch wert. Wenn es nicht funktioniert, entfernen Sie es erneut.

Es gibt auch das usbmountPaket, das macht, was Sie wollen, aber möglicherweise normale Automounting stören.


Unbekannter Befehl "gnome-volume-manager". Ich bin in Ubuntu Jaunty.
Endolith

Es gibt ein / usr / lib / gnome-Volume-Manager / gnome-Volume-Manager, aber es tut nichts.
Endolith

Oh ich verstehe. Es gibt auch ein Paket namens gnome-volume-manager. Siehe auch
endolith

Es sieht so aus, als ob der Gnome-Volume-Manager HAL verwendet, um Dinge zu mounten. Und "Ab 2009 wird HAL zugunsten von DeviceKit nicht mehr weiterentwickelt." Warum ist alles in Linux immer so? Sie fangen gerade an, etwas fast richtig zum Laufen zu bringen, und dann entkernen sie es und ersetzen es durch etwas Neues, das nicht funktioniert.
Endolith

pmount funktioniert nicht mehr. > Pmount / dev / disk / by-label / STORAGE Fehler: Gerät / dev / ist sdc1 nicht abnehmbar togaware.com/linux/survivor/Using_Gnome_Volume_Manager.html
Endolithe

2

Meine bearbeiteten Nachträge für die auf udev basierende Lösung von quack quixote wurden abgelehnt, deshalb werde ich sie hier einfügen. Bitte beziehen Sie sich zuerst auf seinen Beitrag.

Wenn Sie möchten, dass Ihre udev-Regel funktioniert, wenn ein Gerät über das SCSI-Subsystem angeschlossen ist (das sowohl USB- als auch FireWire- und eSATA-Geräte enthält), ändern Sie zunächst die SUBSYSTEMS-Übereinstimmung in der udev-Regel in SUBSYSTEMS=="scsi".

Bedenken Sie jedoch, dass dies so ziemlich alles automatisch mounten wird, einschließlich interner Laufwerke, wenn Sie diese während des Systembetriebs per Hotplug verbinden, sodass es möglicherweise nicht Ihren Wünschen entspricht.

Zweitens ist hier das Skript, das ich verwende und das alle Skripte in diesem Beitrag ersetzt. Es bereinigt auch automatisch erstellte Mountpunkte in / media /, sobald das gemountete Block-Gerät entfernt wird - es sind keine manuellen Eingriffe erforderlich. Anstatt ein anderes Skript aufzurufen, um es im Hintergrund auszuführen, stellt es sich selbst in den Hintergrund, wenn es nicht von einem Terminal ausgeführt wird (z. B. wenn es über udev ausgeführt wird).

Es verwendet inotifywait, um zu warten, bis das gemountete Gerät verschwindet, und entfernt dann das von ihm erstellte Verzeichnis. Daher müssen inotify-tools auf Ihrem System installiert sein. Auf Debian basierende Distributionen (einschließlich Ubuntu) sudo apt-get install inotify-toolssollten ausreichen.

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

Sie werden feststellen, dass ich Geräte ohne Synchronisierung einbinde und schreibgeschützt bin. Das liegt nur daran, dass mein Anwendungsfall in 99% der Fälle das Lesen von einem externen Laufwerk ist. Wenn ich darauf schreiben muss, bin ich trotzdem auf dem Server aktiv und kann problemlos einen mount -o remount,rw <mountpoint>Befehl ausgeben . Bearbeiten Sie nach Ihren Wünschen :)


Wie führen Sie dieses Skript aus? halevtscheint kein aktuelles apt-getfähiges Paket für moderne Versionen zu sein.
Campbeln

Agh ... vielleicht, wenn ich dem TOP / Accepted Answer-Eintrag von quack quixote's folge ... Wäre immer noch nett, wenn ich hier eine ausführlichere Antwort hätte :)
Campbeln

1

Versuchen Sie, die Konfiguration über den Mountmanager vorzunehmen, damit Sie die Daten nicht manuell eingeben müssen.

Es sollte ein Teil des Ubuntu-Repository sein.


Sie müssen den Universumsabschnitt aktivieren, um ihn abzurufen.
Quack Quijote

apt: mountmanager? section = universe;)
endolith

Wird das nur eine fstab für mich einrichten?
Endolith

@endolith: Wäre apt: universe? install = mountmanager nicht logischer? ;)
Bobby

Funktioniert das Format? Dies wird
endolith vom

-5

Wenn Sie jeweils nur ein Laufwerk aktiviert haben, können Sie dies einfach in Ihrer /etc/fstabDatei bearbeiten . Etwas in der Art von:

/dev/sdb1     /mnt/usbdrive     ext3     defaults 0   0

Dies sollte es beim Booten einhängen und für alle mit Dauerwellen zugänglich machen. Wenn Sie mehr als ein Laufwerk haben, können Sie dies dennoch tun mit:

/dev/sdb1     /mnt/usbdrive1     ext3     defaults 0   0
/dev/sdc1     /mnt/usbdrive2     ext3     defaults 0   0

6
klar nicht was die frage stellt.
Quack Quijote
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.