Automatycznie montujesz dyski zewnętrzne w katalogu / media / LABEL podczas rozruchu bez zalogowanego użytkownika?


73

To pytanie jest podobne, ale jest przeciwieństwem tego, czego chcę. Chcę, aby zewnętrzne dyski USB były montowane automatycznie podczas rozruchu, bez zalogowania się, w lokalizacjach takich jak /media/<label>.

Nie chcę wprowadzać wszystkich danych do fstab, częściowo dlatego, że jest to żmudne i denerwujące, ale głównie dlatego, że nie mogę przewidzieć, co będę w nim podłączać ani jak zmieni się partycja w przyszłości.

Chcę, aby dyski były dostępne dla rzeczy takich jak MPD i dostępne po zalogowaniu się za pomocą SSH. gnome-mountwydaje się montować tylko wtedy, gdy jesteś lokalnie zalogowany do graficznej sesji Gnome.


4
Świetne pytanie, chciałbym mieć dla ciebie odpowiedź, teraz jestem ciekawy, jak to rozwiązać.
inwertowanie

1
Zaktualizowałem swoją odpowiedź.
Ryan Thompson

1
A ja, dla przypomnienia, nie mam problemu z zainstalowaniem Gnome'a, tak jak już to robię, ale najlepsze byłoby rozwiązanie dla bezgłowych serwerów bez GUI.
endolith,

1
ARRRGHH ... błąd w mojej odpowiedzi. w RUN. /usr/local/sbin/udev-automounter.sh mount %kpowinno być /usr/local/sbin/udev-automounter.sh %k. Przepraszam.
quack quixote

1
OK, począwszy od aktualizacji 3, działa ze spacjami. robi to za pomocą „zakodowanej” wersji <LABEL>, która konwertuje spacje na \x20„s”. więc to nie jest ładne, ale zadziała. udev nie radzi sobie dobrze z etykietami ze spacjami, ale jest też inna opcja, która używa podkreślników zamiast \x20'(więc przynajmniej ładnie wygląda). wygląda na to, że obsługa przestrzeni musi przejść do skryptów powłoki.
quack quixote

Odpowiedzi:


74
  • Uwaga dla Ubuntu Server 11.10: Ten skrypt nie działa na Ubuntu Server 11.10 z powodu przestarzałego vol_idpolecenia. vol_idzostał zastąpiony przez blkid. Aby naprawić skrypt, zamień „vol_id” na „blkid -o udev” w udev-auto-mount.shskrypcie.

Od jakiegoś czasu macham głową i myślę, że znalazłem działające rozwiązanie. Jest to rozwijane i testowane na systemie opartym na Debianie, więc powinno działać na Ubuntu. Zwrócę uwagę na przyjęte przez niego założenia, dzięki czemu można go dostosować również do innych systemów.

  • Automatycznie zamontuje dyski USB na wtyczce i nie powinno wiele wymagać adaptacji do Firewire.
  • Używa UDEV, więc nie ma małpowania z HAL / DeviceKit / GNOME-Anything.
  • Automatycznie tworzy /media/LABELkatalog, w którym można zamontować urządzenie.

  • Może to jednak zakłócać działanie innych automatów liczących; Nie mogę tego przetestować. Spodziewam się, że przy aktywnym Gnome-VFS obaj mogą próbować wykonać podłączenie ... jeśli Gnome-VFS nie powiedzie się, nie może skonfigurować ikony pulpitu. Odłączanie od Gnome powinno być możliwe, ale może wymagać gksudolub podobnie.

Nie testowałem tego podczas uruchamiania systemu, ale widzę, że może nie działać, jeśli spróbuje zamontować dysk USB, zanim system będzie gotowy do zamontowania. W takim przypadku prawdopodobnie potrzebna będzie dodatkowa modyfikacja skryptu montowania. ( Sprawdzam za pomocą ServerFault, czy jest jakaś rada, ale nie ma tam większego zainteresowania).

A więc do tego.


Referencje UDEV:


Tło (UDEV? Whuzzat?)

UDEV to system hotplug jądra. To właśnie automatycznie konfiguruje odpowiednie urządzenia i dowiązania symboliczne urządzeń (np. /dev/disk/by-label/<LABEL>), Zarówno w czasie uruchamiania, jak i dla urządzeń dodawanych podczas działania systemu.

D-Bus i HAL są używane do wysyłania zdarzeń sprzętowych do słuchaczy, takich jak środowiska pulpitu. Kiedy więc zalogujesz się do GNOME i włożysz płytę CD lub podłączysz napęd USB, zdarzenie to będzie przebiegać następująco:

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

I presto, twój napęd zostanie zamontowany. Ale w systemie bezgłowym nie chcemy się logować, aby uzyskać korzyści z automatycznego montażu.

Zasady Udev

Ponieważ UDEV pozwala nam pisać reguły i uruchamiać programy podczas wstawiania urządzeń, jest to idealny wybór. Wykorzystamy istniejące zasady Debian / Ubuntu, pozwolimy im skonfigurować /dev/disk/by-label/<LABEL>dla nas dowiązanie symboliczne i dodamy kolejną regułę, która zamontuje dla nas urządzenie.

Reguły UDEV są przechowywane w /etc/udev/rules.d(i /lib/udev/rules.dKarmic) i są przetwarzane w kolejności numerycznej. Każdy plik, który nie zaczyna się od numeru, jest przetwarzany po plikach numerowanych. W moim systemie reguły HAL znajdują się w pliku o nazwie 90-hal.rules, więc umieszczam je w regułach, 89-local.rulesaby zostały przetworzone, zanim dotrą do HAL. Przede wszystkim musisz upewnić się, że te reguły pojawią się po 60-persistent-storage.rules. local.rulesmoże być wystarczająco dobry.

Umieść to w swoim nowym pliku reguł:

# /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"
  • Upewnij się, że nie ma spacji po \, tylko a newline( \n).

  • Zmieni SUBSYSTEMS=="usb"się SUBSYSTEMS=="usb|ieee1394"o wsparcie Firewire.

  • Jeśli chcesz, aby urządzenie zawsze było własnością konkretnego użytkownika, dodaj OWNER="username"klauzulę. Jeśli potrzebujesz tylko plików należących do określonego użytkownika, dostosuj skrypt montowania.

Czytanie reguły

Dodaje to program do uruchomienia do listy programów do uruchomienia na urządzeniu. Identyfikuje urządzenia partycji USB <LABEL>, a następnie przekazuje te informacje do skryptu, który wykona podłączenie . W szczególności ta reguła jest zgodna:

  1. ENV{ID_FS_LABEL_ENC}=="?*"- zmienna środowiskowa ustawiona na podstawie wcześniejszej reguły systemowej. Nie istnieje dla systemów innych niż pliki, dlatego to sprawdzamy. Właściwie chcemy użyć ID_FS_LABELdla punktu montowania, ale nie przekonałem UDEV, aby uciec z niego, więc pozwolimy skryptowi montować sobie z tym poradzić.

    Ta i inne zmienne środowiskowe są uzyskiwane przez udev za pomocą vol_idpolecenia ( przestarzałe ). Jest to przydatne narzędzie, aby zobaczyć ładne szybkie szczegóły na partycji:

    $ 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"- dopasowuj tylko addwydarzenia ...

  3. SUBSYSTEMS=="usb"- pasuj tylko do urządzeń znajdujących się na magistrali USB. Używamy SUBSYSTEMStutaj, ponieważ odpowiada to rodzicom naszego urządzenia; urządzeniem, którym jesteśmy zainteresowani, w rzeczywistości będzie SUBSYSTEM == "scsi". Dopasowywanie do nadrzędnego urządzenia USB pozwala uniknąć dodawania naszego programu do dysków wewnętrznych.

  4. RUN+="..."- nie pasuje, ale akcja: dodaj ten program do listy programów do uruchomienia. W argumentach programu %kzostaje rozwinięty do nazwy urządzenia (np. sdc1Nie /dev/sdc1) i $env{FOO}otrzymuje zawartość zmiennej środowiskowej FOO.

Testowanie reguły

Pierwszy odnośnik (powyżej) to doskonały samouczek UDEV, ale jest nieco nieaktualny. Programy, które uruchamia do testowania twoich reguł ( udevtestw szczególności) zostały zastąpione narzędziem catch-all udevadm.

Po dodaniu reguły podłącz urządzenie. Daj mu kilka sekund, a następnie sprawdź, do którego urządzenia zostało przypisane:

$ 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

Jeśli twój dysk wymienny zawiera label_Baz, jest na urządzeniu sdc1. Uruchom to i spójrz na wynik pod koniec:

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

Poszukaj nazwy skryptu z naszej RUN+=reguły w ostatnich kilku wierszach (3 od dołu w tym przykładzie). Możesz zobaczyć argumenty, które byłyby użyte dla tego urządzenia. Możesz teraz uruchomić to polecenie, aby sprawdzić, czy argumenty są prawidłowe; jeśli działa w linii poleceń, powinien działać automatycznie po włożeniu urządzenia.

Możesz także monitorować zdarzenia UDEV w czasie rzeczywistym: uruchom sudo udevadm monitor(zobacz man udevadmszczegóły na temat przełączników). Następnie wystarczy podłączyć nowe urządzenie i oglądać przewijane wydarzenia. (Prawdopodobnie przesada, chyba że interesują Cię szczegóły niskiego poziomu ...)

Ponowne ładowanie reguł

Po upewnieniu się, że reguła jest poprawnie czytana, musisz powiedzieć UDEV, aby przeładowała swoje reguły, aby nowa zaczęła obowiązywać. Użyj dowolnej z tych metod (jeśli pierwsza nie działa, druga powinna ... ale wypróbuj pierwszą pierwszą):

  • biegać sudo udevadm control --reload-rules

  • biegać sudo /etc/init.d/udev reload

  • restart


Scenariusz! Właściwie 2 skrypty ...


Oto pierwszy skrypt. Ponieważ program, który uruchamiamy, musi się szybko zakończyć, powoduje to jedynie wyłączenie drugiego skryptu w tle. Umieść to w /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} &

Oto drugi skrypt. Robi to nieco więcej sprawdzania danych wejściowych. Włóż to /usr/local/sbin/udev-auto-mount.sh. Możesz dostosować poniższe opcje montowania. Ten skrypt obsługuje teraz samodzielne wyszukiwanie LABEL partycji; UDEV wysyła tylko nazwę URZĄDZENIA.

Jeśli podczas uruchamiania wystąpi problem z montażem dysków , możesz sleep 60w tym skrypcie spędzić niezłą chwilę , aby dać systemowi czas na awans, zanim skrypt spróbuje zamontować dysk.

W komentarzach podałem sugestię dotyczącą sposobu sprawdzania (uruchom, psaby sprawdzić, czy serwer WWW działa), ale będziesz chciał dostosować go do swojego systemu. Myślę, że większość serwerów sieciowych, których używasz, wystarczyłaby do tego celu - nfsd, smbd, apache itp. Ryzyko polega oczywiście na tym, że skrypt montowania zawiedzie, jeśli usługa nie działa, więc może testowanie istnienie konkretnego pliku byłoby lepszym rozwiązaniem.

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

Skrypt czyszczenia super bonusów!

Jeszcze jeden skrypt. Wszystko to polega na odmontowaniu urządzenia i usunięciu katalogów mountpoint. Zakłada, że ​​ma do tego uprawnienia, więc musisz go uruchomić sudo. Ten skrypt przyjmuje teraz pełny punkt montowania w wierszu poleceń, np .:

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

Umieść to w /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
Jesteś świetny! :)
kolypto

1
Jeśli uruchomię auto-mount.sh ręcznie, to zadziała, ale nie, jeśli podłączę dysk, a nie podczas uruchamiania. : /
endolith

więc problem dotyczy reguł UDEV. Daj mi trochę rozszerzyć tę sekcję, aby pomóc ci w debugowaniu.
quack quixote

3
Złożyłem wszystkie skrypty na github: github.com/fatso83/Code-Snippets/tree/master/system-utils/... Działają dobrze na Ubuntu 10.10, a także zawierają auto-odmontowanie
oligofren

1
Odwołanie: udev_237 - man udev (Ubuntu_18.04) Należy pamiętać, że uruchamianie programów uzyskujących dostęp do sieci lub montowanie / odmontowywanie systemów plików nie jest dozwolone w regułach udev , ze względu na domyślny obszar izolowany wymuszany w usłudze systemd-udevd.service. źródło: unix.stackexchange.com/questions/200194/... Aby znaleźć rozwiązanie, zajrzyj na serverfault.com/questions/766506/…
Pro Backup

9

Ostatnią opcją, którą inni sugerowali w sieci, jest ivman, ale wydaje się, że zależy od tego pmount, co już powiedziałeś, nie działa. pmountjest opuszczony i ivmanjest prawie taki sam.

Zamiennik ivmanjest halevti jest dostępny w Karmic. Jest to ponowna implementacja ivman(czytaj: „utrzymane” i „nie zależy od pmount”). Pakiet nie jest dostępny w Jaunty, chociaż możesz go zbudować samodzielnie, jeśli nie planujesz aktualizacji.

Oba te narzędzia znajdują się nad warstwami DBus i HAL i reagują na zdarzenia z nich. Najwyraźniej oba mogą działać jako demon systemowy lub jako menedżer montowania sesji użytkownika (a la Gnome-VFS) - /etc/defaults/{ivman,halevt}pliki są odpowiedzialne za ustawienia systemowe.

Oto kilka instrukcji dotyczących poprawiania ivmanużywania /media/<LABEL>punktów montowania. Prawdopodobnie halevtjest to prostszy sposób, ale może pomogą ci znaleźć odpowiedź.


Praca z HALEVT

Aktualizacja : W celu uzyskania również automatycznych montowań CD, czego nie zapewnia moja odpowiedź UDEV, przyjrzałem się głębiej halevt. Znalazłem ten post na blogu, który pomógł wiele wyjaśnić ten proces. Musiałem skompilować własny halevtpakiet dla Debiana Lenny'ego (na szczęście wszystkie zależności były w sekcji lenny-backports). Po zainstalowaniu proces nie był w większości okropny:

  1. Upewnij się, że system halevt-daemon jest włączony w /etc/default/halevt
  2. Zezwól użytkownikowi halevt na system na montowanie urządzeń /etc/PolicyKit/PolicyKit.conf(patrz poniżej; źródło )
  3. Zmodyfikuj zasady HAL, aby skopiować etykietę woluminu do preferowanego punktu montowania w /etc/hal/fdi/policy/preferences.fdi(patrz poniżej)
  4. Jeśli chcesz obsługiwać dyski CD / DVD, pobierz eject.halskrypt z powyższego wpisu na blogu, zmodyfikuj i zapisz /usr/local/bin.
  5. Zmodyfikuj konfigurację systemu halevt, aby umożliwić podłączanie /etc/halevt/halevt.xml
  6. Dodaj kod do skryptów przed i po sesji menedżera logowania, aby zatrzymać systemowego demona halevt, gdy ktoś się zaloguje, i zrestartuj go, gdy się wyloguje.

Jeśli musisz ponownie uruchomić demony HAL i HALEVT, aby sprawdzić nowe konfiguracje, użyj tego, aby ustawić je we właściwej kolejności:

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

Krok 1

Sprawdź to START_DAEMON=yesw /etc/default/halevt.

Krok 2

W /etc/PolicyKit/PolicyKit.confdodaj to wewnątrz tej <config></config>sekcji:

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

Krok 3

W /etc/hal/fdi/policy/preferences.fdidodaj to w sekcji `:

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

Krok 4

Skrypt jest dobry, ale musi zostać uruchomiony /bin/bash; Niektóre systemy mogą faktycznie używać /bin/dash, gdy /bin/shjest tzw. Więc zmień górny wiersz skryptu, aby upewnić się, że otrzymujesz właściwy:

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

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

Krok 5

To jest fajna część. Twój system może już zapewniać podstawową /etc/halevt/halevt.xml, więc będziesz musiał dostosować to do własnego użytku. W moim przypadku mój system zapewniał już podstawowy montaż wymiennych elementów, ale musiałem dodać obsługę montażu CD-ROM i przycisku wysuwania.

Wpis na blogu, o którym wspomniałem, zawiera dobrą przykładową konfigurację XML do sprawdzenia własnych poprawek. Chodzi głównie o skonfigurowanie zamiennika gnome dla środowiska autora fluxbox, więc jego przykładowy kod XML robi więcej, niż chcesz, ale jest to świetny sposób na sprawdzenie, co możesz zrobić. Istnieje również kilka dobrych przykładów /usr/share/doc/halevt/examples.

Musiałem także biec, sudo sh -c "mkdir /var/halevt ; chown halevt:plugdev /var/halevt"zanim wszystko zadziała.

Oto moje dodatki, które umożliwiają automatyczne instalowanie dysków CD / DVD:

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

Krok 6

Kiedy już uruchomisz systemowego demona halevt, musisz go wyłączyć podczas logowania do GNOME i uruchomić go ponownie po wylogowaniu. (Zobacz moją odpowiedź na to pytanie dla menedżerów logowania spoza GDM). Te rzeczy są teoretyczne, ponieważ ich nie używam, ale powinny działać.

W /etc/gdm/PreSession/Default, dodać to do zatrzymania systemu halevt-demona:

/etc/init.d/halevt stop

W /etc/gdm/PostSession/Default, dodać to, aby ponownie uruchomić system halevt-demona:

/etc/init.d/halevt start

3
Osoby czytające to w 2013 r. Powinny teraz wiedzieć, że poziom HAL jest przestarzały i powinni skorzystać z rozwiązań opartych na udev, takich jak podany wyżej quixote.
oligofren

6

Z biegiem czasu pojawiają się łatwiejsze rozwiązania.

To rozwiązanie opiera się na pakiecie oprogramowania udevil, który został napisany w tym celu i nie wymaga majstrowania przy regułach udev. Jest to prawdopodobnie lepsze (dla nowych i starych użytkowników) jako proste rozwiązanie.

devmonSkrypt z udevil wykonuje całą magię, podczas gdy tylko w zależności od udev i wygadany. Działa niemal natychmiast po wyjęciu z pudełka, bez potrzeby wstępnej konfiguracji.

Wszystko, co zrobiłem na mojej stacji roboczej, to wywołanie devmon z rc.localtego w następujący sposób:
devmon 2>&1 >> /var/log/devmon &
Dla wygody możesz chcieć osadzić to w skrypcie init zamiast rc.localkorzystać z automatycznego narzędzia, takiego jak pleaseruntworzenie: https://unix.stackexchange.com/ a / 124609/42673

Po uruchomieniu, pamięć, którą podłączam, jest sprawdzana (szuka partycji, a jeśli zostanie znaleziona, patrzy na etykiety systemu plików), a następnie podłączana do niej /media/FILESYSTEM_LABEL.
Nie wyobrażam sobie nic prostszego niż to, że (nie) słynny system wprowadził tę funkcjonalność w pewnym momencie w przyszłości.

udevil At A Glance ( github.io/udevil )
Skrypt: devmon ( igurublog / script-devmon )


3

quack Odpowiedź quixote nie działa na Ubuntu Lucid Lynx (10.04) - nie ma /sbin/vol_idpolecenia.

Zamiast być fantazyjnym i używać udev, umieść to w swoim /etc/rc.local i gotowe:

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
DZIĘKUJĘ ... to był najprostszy sposób na to, co chciałem osiągnąć. Pracował nawet na Ubuntu Server 16 z woluminem NTFS
ChrisPrime

3

Dla systemów opartych na Debianie (np. Ubuntu itp.) Istnieje pakiet usbmount , który automatycznie montuje dyski USB. Zasadniczo wykorzystuje podejście udev, jak już wspomniano - tylko prosta instalacja pakietu. Wygląda na to, że oryginalnemu autorowi pakietu zabrakło pary, ale Ubuntu / Debian nadal wydaje się go utrzymywać (wydaje mi się, że nie jest tak skomplikowany) - więc nadal jest dostępny w najnowszych wydaniach.

Zainstalowane skrypty można skonfigurować (/etc/usbmount/usbmount.conf) w celu zapewnienia odpowiednich punktów montowania.


1
Usbmount nie może jednak montować według etykiety, chyba że wypełnisz listę etykiet w pliku konfiguracyjnym.
Gilles

1
Zobacz post esite.ch/2014/04/11/…, jeśli chcesz dodać montaż do etykiety na usbmount bez utrzymywania listy.
Oliver Sauder

3

Aby wypłukać doskonałe instrukcje usuwania Quack Quixote:

Dodaj następujący wiersz do wcześniej utworzonego pliku reguł udev (/etc/udev/rules.d) „

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

Następnie utwórz następujący skrypt i wykonaj jego plik wykonywalny (/usr/local/sbin/udev-autounmounter.sh) o następującej treści:

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

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

Wreszcie sam odmontowany skrypt (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

Tak więc z innymi instrukcjami, katalog pojawi się automatycznie i zniknie po zdarzeniach udev.


Myślę, że if [ -n "$device_is_mounted" ]; thenpowinno być if [ -z "${MOUNTPT}" ]; then, prawda?
eresonans

2

To tylko kolejny edytor fstab, prawda?
endolith,

Tak, ale „Umożliwia także tworzenie reguł udev do dynamicznej konfiguracji urządzeń pamięci”
Sathyajith Bhat

Czy „tworzenie reguł udev” pomogłoby mi w jakiś sposób? Nie mam pojęcia, co to w ogóle oznacza. Czy montuje nieznane wcześniej urządzenia wymienne bez lokalnego zalogowania użytkownika?
endolith


2

Możesz spróbować umieścić su username -c gnome-volume-managerplik /etc/rc.local. Może być wystarczające uruchomienie gnome-volume-managera.

Edycja: Wygląda na to, że gnome-volume-manager nie jest już częścią domyślnej dystrybucji, nawet na pulpicie Ubuntu.

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

Może jednak po zainstalowaniu nadal będzie działać. Warto spróbować. Jeśli to nie działa, usuń go ponownie.

Jest też usbmountpakiet, który robi to, co chcesz, ale może zakłócać normalne automatyczne montowanie.


Nieznane polecenie „gnome-volume-manager”. Jestem w Ubuntu Jaunty.
endolith

Istnieje / usr / lib / gnome-volume-manager / gnome-volume-manager, ale nic nie robi.
endolith,

Rozumiem. Jest też pakiet o nazwie gnome-volume-manager. Powiązane: crunchbanglinux.org/forums/topic/239/…
endolith

Wygląda na to, że gnome-volume-manager używa HAL do montowania rzeczy? I „Od 2009 r. HAL jest obecnie wycofywany na korzyść DeviceKit”. Dlaczego wszystko w Linuksie jest zawsze takie? Po prostu zaczynają sprawiać, że coś działa prawie właściwie, a następnie wypatroszą i zastępują to czymś nowym, co nie działa.
endolith

pmount już nawet nie działa. > Pmount / dev / disk / by-label / STORAGE Błąd: Urządzenie / dev / sdc1 nie jest wymienny togaware.com/linux/survivor/Using_Gnome_Volume_Manager.html
endolit

2

Moje edytowane dodatki do rozwiązania opartego na udev quix quixote zostały odrzucone, więc umieszczę je tutaj. Najpierw zapoznaj się z jego postem.

Przede wszystkim, jeśli chcesz, aby reguła udev działała po podłączeniu dowolnego urządzenia za pośrednictwem podsystemu SCSI (który obejmuje zarówno USB, FireWire i eSATA), zmień dopasowanie SUBSYSTEMS w regule udev na SUBSYSTEMS=="scsi".

Pamiętaj jednak, że to automatycznie zamontuje prawie wszystko, w tym dyski wewnętrzne, jeśli podłączysz je podczas pracy systemu, więc może nie być to, czego chcesz.

Po drugie, oto skrypt, którego używam, który zastępuje wszystkie skrypty w tym poście. Automatycznie usuwa również utworzone punkty montowania w / media /, gdy tylko zamontowane urządzenie blokowe zostanie usunięte - nie ma potrzeby ręcznej interwencji. Co więcej, zamiast wywoływania innego skryptu, aby działał w tle, umieszcza się w tle, gdy nie jest wykonywany z terminala (np. Gdy jest wykonywany przez udev).

Używa inotifywait, aby poczekać, aż podłączone urządzenie zniknie, a następnie usunie utworzony katalog. Dlatego musisz mieć zainstalowane w systemie narzędzia inotify-tools. W przypadku dystrybucji opartych na Debianie (w tym Ubuntu) sudo apt-get install inotify-toolspowinno wystarczyć.

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

Zauważysz, że montuję urządzenia bez synchronizacji i tylko do odczytu. To tylko dlatego, że w 99% przypadków mój przypadek użycia jest odczytywany z zewnętrznego dysku, a ilekroć muszę na nim pisać, i tak będę aktywny na serwerze i mogę łatwo wydać mount -o remount,rw <mountpoint>polecenie. Edytuj według własnych potrzeb :)


Jak uruchomić ten skrypt? halevtnie wydaje się być aktualnym apt-getpakietem dla nowoczesnych wersji.
Campbeln

Agh ... może gdybym podążał za wpisem TOP / Accepted Answer od quack quixote ... Nadal miło byłoby uzyskać pełniejszą odpowiedź tutaj :)
Campbeln

1

Spróbuj skonfigurować za pomocą mountmanager, aby nie trzeba było ręcznie wprowadzać danych.

Powinien być częścią repozytorium ubuntu.


Aby go zdobyć, musisz włączyć sekcję wszechświata.
quack quixote

apt: mountmanager? sekcja = wszechświat;)
endolith

Czy to po prostu przygotuje dla mnie fstab?
endolith

@endolith: Czy apt: universe? install = mountmanager nie byłby bardziej logiczny? ;)
Bobby

Czy ten format działa? Tak nie jest napisane na
endolith

-5

Jeśli masz tylko jeden dysk podłączony na raz, możesz po prostu edytować to w swoim /etc/fstabpliku. Coś w stylu:

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

Powinno to zamontować go podczas rozruchu i udostępnić każdemu, kto ma perms. Jeśli masz więcej niż jeden dysk, nadal możesz to zrobić za pomocą:

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

6
wyraźnie nie to, o co pyta pytanie.
quack quixote
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.