Używam Debian Squeeze na komputerze z wtyczką (więc tylko SSH, bez GUI) i staram się go zdobyć, aby po podłączeniu pamięci USB podłączał się automatycznie.
To, co zrobiłem, to instalacja, autofs
która z tego, co zbieram, obsługuje automatyczne montowanie, pod warunkiem, że wie, gdzie jest urządzenie /dev
.
Problem polega na tym, że pamięć USB nie zawsze ma tę samą nazwę urządzenia. Czasami to jest /dev/sdc1
, czasami /dev/sdd1
itp.
Rozumiem, że aby temu zaradzić, muszę udev
się upewnić, że pamięć USB ma zawsze tę samą nazwę.
Mam następujące informacje udevadm
:
Udevadm info starts with the device specified by the devpath and then
walks up the chain of parent devices. It prints for every device
found, all possible attributes in the udev rules key format.
A rule to match, can be composed by the attributes of the device
and the attributes from one single parent device.
looking at device '/block/sdd/sdd1':
KERNEL=="sdd1"
SUBSYSTEM=="block"
DRIVER==""
ATTR{partition}=="1"
ATTR{start}=="63"
ATTR{size}=="129339"
ATTR{ro}=="0"
ATTR{alignment_offset}=="0"
ATTR{discard_alignment}=="0"
ATTR{stat}==" 31 244 275 190 0 0 0 0 0 190 190"
ATTR{inflight}==" 0 0"
looking at parent device '/devices/platform/orion-ehci.0/usb1/1-1/1-1.2/1-1.2:1.0/host8/target8:0:0/8:0:0:0/block/sdd':
KERNELS=="sdd"
SUBSYSTEMS=="block"
DRIVERS==""
ATTRS{range}=="16"
ATTRS{ext_range}=="256"
ATTRS{removable}=="1"
ATTRS{ro}=="0"
ATTRS{size}=="129439"
ATTRS{alignment_offset}=="0"
ATTRS{discard_alignment}=="0"
ATTRS{capability}=="51"
ATTRS{stat}==" 56 727 783 520 0 0 0 0 0 520 520"
ATTRS{inflight}==" 0 0"
ATTRS{events}=="media_change"
ATTRS{events_async}==""
ATTRS{events_poll_msecs}=="-1"
looking at parent device '/devices/platform/orion-ehci.0/usb1/1-1/1-1.2/1-1.2:1.0/host8/target8:0:0/8:0:0:0':
KERNELS=="8:0:0:0"
SUBSYSTEMS=="scsi"
DRIVERS=="sd"
ATTRS{device_blocked}=="0"
ATTRS{type}=="0"
ATTRS{scsi_level}=="3"
ATTRS{vendor}==" "
ATTRS{model}=="Flash Disk "
ATTRS{rev}=="2.00"
ATTRS{state}=="running"
ATTRS{timeout}=="30"
ATTRS{iocounterbits}=="32"
ATTRS{iorequest_cnt}=="0x90"
ATTRS{iodone_cnt}=="0x90"
ATTRS{ioerr_cnt}=="0x0"
ATTRS{modalias}=="scsi:t-0x00"
ATTRS{evt_media_change}=="0"
ATTRS{queue_depth}=="1"
ATTRS{queue_type}=="none"
ATTRS{max_sectors}=="240"
looking at parent device '/devices/platform/orion-ehci.0/usb1/1-1/1-1.2/1-1.2:1.0/host8/target8:0:0':
KERNELS=="target8:0:0"
SUBSYSTEMS=="scsi"
DRIVERS==""
looking at parent device '/devices/platform/orion-ehci.0/usb1/1-1/1-1.2/1-1.2:1.0/host8':
KERNELS=="host8"
SUBSYSTEMS=="scsi"
DRIVERS==""
looking at parent device '/devices/platform/orion-ehci.0/usb1/1-1/1-1.2/1-1.2:1.0':
KERNELS=="1-1.2:1.0"
SUBSYSTEMS=="usb"
DRIVERS=="usb-storage"
ATTRS{bInterfaceNumber}=="00"
ATTRS{bAlternateSetting}==" 0"
ATTRS{bNumEndpoints}=="02"
ATTRS{bInterfaceClass}=="08"
ATTRS{bInterfaceSubClass}=="06"
ATTRS{bInterfaceProtocol}=="50"
ATTRS{modalias}=="usb:v1976p6025d0100dc00dsc00dp00ic08isc06ip50"
ATTRS{supports_autosuspend}=="1"
looking at parent device '/devices/platform/orion-ehci.0/usb1/1-1/1-1.2':
KERNELS=="1-1.2"
SUBSYSTEMS=="usb"
DRIVERS=="usb"
ATTRS{configuration}==""
ATTRS{bNumInterfaces}==" 1"
ATTRS{bConfigurationValue}=="1"
ATTRS{bmAttributes}=="80"
ATTRS{bMaxPower}=="100mA"
ATTRS{urbnum}=="383"
ATTRS{idVendor}=="1976"
ATTRS{idProduct}=="6025"
ATTRS{bcdDevice}=="0100"
ATTRS{bDeviceClass}=="00"
ATTRS{bDeviceSubClass}=="00"
ATTRS{bDeviceProtocol}=="00"
ATTRS{bNumConfigurations}=="1"
ATTRS{bMaxPacketSize0}=="64"
ATTRS{speed}=="12"
ATTRS{busnum}=="1"
ATTRS{devnum}=="11"
ATTRS{devpath}=="1.2"
ATTRS{version}==" 1.10"
ATTRS{maxchild}=="0"
ATTRS{quirks}=="0x0"
ATTRS{avoid_reset_quirk}=="0"
ATTRS{authorized}=="1"
looking at parent device '/devices/platform/orion-ehci.0/usb1/1-1':
KERNELS=="1-1"
SUBSYSTEMS=="usb"
DRIVERS=="usb"
ATTRS{configuration}==""
ATTRS{bNumInterfaces}==" 1"
ATTRS{bConfigurationValue}=="1"
ATTRS{bmAttributes}=="e0"
ATTRS{bMaxPower}=="100mA"
ATTRS{urbnum}=="197"
ATTRS{idVendor}=="1a40"
ATTRS{idProduct}=="0101"
ATTRS{bcdDevice}=="0111"
ATTRS{bDeviceClass}=="09"
ATTRS{bDeviceSubClass}=="00"
ATTRS{bDeviceProtocol}=="01"
ATTRS{bNumConfigurations}=="1"
ATTRS{bMaxPacketSize0}=="64"
ATTRS{speed}=="480"
ATTRS{busnum}=="1"
ATTRS{devnum}=="2"
ATTRS{devpath}=="1"
ATTRS{version}==" 2.00"
ATTRS{maxchild}=="4"
ATTRS{quirks}=="0x0"
ATTRS{avoid_reset_quirk}=="0"
ATTRS{authorized}=="1"
ATTRS{product}=="USB 2.0 Hub"
looking at parent device '/devices/platform/orion-ehci.0/usb1':
KERNELS=="usb1"
SUBSYSTEMS=="usb"
DRIVERS=="usb"
ATTRS{configuration}==""
ATTRS{bNumInterfaces}==" 1"
ATTRS{bConfigurationValue}=="1"
ATTRS{bmAttributes}=="e0"
ATTRS{bMaxPower}==" 0mA"
ATTRS{urbnum}=="24"
ATTRS{idVendor}=="1d6b"
ATTRS{idProduct}=="0002"
ATTRS{bcdDevice}=="0206"
ATTRS{bDeviceClass}=="09"
ATTRS{bDeviceSubClass}=="00"
ATTRS{bDeviceProtocol}=="01"
ATTRS{bNumConfigurations}=="1"
ATTRS{bMaxPacketSize0}=="64"
ATTRS{speed}=="480"
ATTRS{busnum}=="1"
ATTRS{devnum}=="1"
ATTRS{devpath}=="0"
ATTRS{version}==" 2.00"
ATTRS{maxchild}=="1"
ATTRS{quirks}=="0x0"
ATTRS{avoid_reset_quirk}=="0"
ATTRS{authorized}=="1"
ATTRS{manufacturer}=="Linux 2.6.38.8 ehci_hcd"
ATTRS{product}=="Marvell Orion EHCI"
ATTRS{serial}=="orion-ehci.0"
ATTRS{authorized_default}=="1"
looking at parent device '/devices/platform/orion-ehci.0':
KERNELS=="orion-ehci.0"
SUBSYSTEMS=="platform"
DRIVERS=="orion-ehci"
ATTRS{modalias}=="platform:orion-ehci"
looking at parent device '/devices/platform':
KERNELS=="platform"
SUBSYSTEMS==""
DRIVERS==""
Próbowałem napisać udev
reguły, aby zmusić pamięć USB do przyjęcia nazwy, /dev/usbstick
ale jak dotąd nie udało mi się.
Czy ktoś może pomóc z jaką zasadą muszę określić w pliku reguł, aby ta pamięć USB zawsze otrzymywała tę samą nazwę?
- Lub czy jest o wiele łatwiejszy sposób na automatyczną instalację pamięci USB, której całkowicie brakuje?
AKTUALIZACJA
OK, więc zrobiłem postęp. Dodałem następującą zasadę:
SUBSYSTEMS=="scsi", ATTRS{model}=="Flash Disk ", DRIVERS=="sd", NAME="usbstick-%k" RUN+="mkdir /mnt/usbstick-%k; mount /dev/usbstick-%k /mnt/usbstick-%k"
Wiem, że nadal wymaga to trochę pracy w zakresie dodawania / usuwania, ale na razie jest to tylko podstawowy test.
Efektem tego jest to, że teraz uda się uzyskać trzy nowe węzły urządzeń w /dev
, a mianowicie /dev/usbstick-sdc
, /dev/usbstick-sdc1
i usbstick-sg2
.
Jednak znalazłem, że kod w RUN
sekcji wykonuje się tylko raz i tworzy katalog mnt/usbstick-sdc
. Przekonałem się również, że katalog jest zawsze pusty, więc najwyraźniej coś nadal idzie nie tak! (chociaż robię postępy).
/dev/sdc1
powinna byćsdd1
? I możesz użyćblkid
do jednoznacznej identyfikacji dysku (cóż, właściwie partycja; zmieni się, jeśli sformatujesz).udev
reguły do tworzenia węzłów urządzeń dla każdej partycji, ale nie jestem pewien, dla jakiego poziomu danychudevadm
wyjściowych należy tworzyć reguły!ACTION==
, jednymKERNEL==
i jednymATTRS{something}==
(jest to całkowicie wykonalne - tego używam). Rozważ także uruchomienie jednego skryptu z łańcuchem poleceń wRUN+=
.KERNEL=="sd??", NAME="%k", RUN+="mkdir /mnt/usbstick-%k; mount /dev/usbstick-%k /mnt/usbstick-%k"
- ale nie, oczywiście to też nie działa. Teraz jestem coraz bardziej sfrustrowany, gdy spędziłem prawie cały dzień po prostu próbując dowiedzieć się, jak uzyskać pamięć USB, która jest podłączona do samego montażu. Czy to naprawdę powinno być takie trudne? Dane wyjścioweudevadm test /sys/block/sdd
są - oczywiście - praktycznie nieczytelne, więc nie mam środków, aby wiedzieć, gdzie się mylę. Czy ktoś może skierować mnie w tym kierunku?Odpowiedzi:
Uznano, że powinien istnieć o wiele łatwiejszy sposób rozwiązania tak powszechnego problemu i tak jest. Oto, co próbowałem na moim serwerze wheezy / sid:
Podłącz pamięć USB, gotowe! Mój kij jest teraz dostępny przez
/media/usb
.Btw, usbmount nie ma strony podręcznika, przeczytaj
/usr/share/doc/usbmount/README.gz
zamiast tego. Wygląda na to, że usbmount domyślnie montuje twój kij z opcją synchronizacji. Może być znacznie lepiej dla twojego kija, aby zamontować go asynchronicznie i uruchomićsync
lubumount
przed odłączeniem go. To jest konfigurowalne.źródło
pumount
usbmount
nie obsługuje już NTFS od czasuZauważ, że nie możesz mieć pojedynczego węzła urządzenia reprezentującego jakikolwiek możliwy pendrive. Co się stanie, jeśli podłączysz dwa z nich? Lub kiedy pendrive ma więcej niż jedną partycję?
Ogólnie rzecz biorąc, używasz tego, aby utworzyć niestandardowy węzeł urządzenia
SYMLINK+=
. grep dla niego w przepisach, aby zobaczyć jak to działa:grep SYMLINK /etc/udev/rules.d/*
. Tak jak we wszystkich poleceniach wyzwalanych przez udev, możesz użyć pewnych znaczących zmiennych, które są opisane wman udev
. Możesz zdać sobie sprawę, że tak naprawdę nie musisz nadawać niestandardowej nazwy urządzeniu, ponieważ możesz podać jej nazwę do skryptu (poprzez%k
zmienną).Jeśli chodzi o rozwiązanie do automatycznego montowania, spójrz na UAM , który opisałem trochę w odpowiedzi na to pytanie .
źródło
udev
reguł z towarzyszącymi im skryptami. Możesz zapoznać się z zasadami i łatwo dostosować je do swoich potrzeb.udevadm
i powiedzieć, które urządzenie jest urządzeniem, na które powinienem kierować moją regułę? Różne przykłady, które widziałem online, wydają się obejmować znacznie krótsze drzewa, a każdy przykład wydaje się być ukierunkowany na inny poziom urządzenia, bez wyjaśnienia, na które z nich należy celować i dlaczego.Oto jak to ostatnio zrobiłem i jestem teraz całkiem zadowolony z tego podejścia. Dotyczy to Ubuntu 12.04 + Gentoo, ale chyba każda dystrybucja, która pozwala zainstalować udev i autofs powinna działać.
Wymagania wstępne: Musisz zainstalować udev + autofs.
Krok 1)
Utwórz następujący plik „/etc/udev/rules.d/90-usbsd-auto.rules” (oczywiście możesz użyć dowolnej nazwy, o ile kończy się ona na „.rules”). :
Co to robi: Tworzy dwa dowiązania symboliczne, jedno dla partycji urządzenia pamięci USB w „/ dev / usbdisks / <...>”.
Drugie dowiązanie symboliczne będzie prowadzić od „/ media / usb / <...>” do „/ media / autousb / <...>” w celu obsługi automountera (patrz krok 2).
Aby upewnić się, że udev czyta te zasady, użyj
Uwaga: Ta sama nazwa dla tej samej pamięci USB: Możliwe, ale może niebezpieczne: Możesz użyć na przykład „$ env {ID_FS_LABEL_ENC}” zamiast „% k” w powyższych regułach UDEV. Spowoduje to użycie etykiety woluminu do utworzenia / media / usb / <...>, ale co się stanie, jeśli podłączysz dwa urządzenia USB i oba użyją tej samej etykiety woluminu ...
W tym pliku reguł udev wszystko jest skonfigurowane do automatycznego zamontowania partycji urządzenia pamięci USB. Pamiętaj jednak, że w tej chwili urządzenie NIE zostanie automatycznie zamontowane (celowo). Zostanie automatycznie zamontowany, gdy go użyjesz
Krok 2)
Skonfiguruj autofs do automount / media / autousb / <...>: Dodałem następujący wiersz do mojego pliku „/etc/auto.master” (dla Ubuntu 12.04):
Oznacza to, że AutoFS odmontuje urządzenie po 60 sekundach braku aktywności. Możesz użyć mniej lub więcej, w zależności od upodobań.
W przypadku Gentoo musisz zmodyfikować plik „/etc/autofs/auto.master”, aby korzystanie z niego miało sens
Teraz utworzyłem plik „auto.usb” o następującej treści:
To auto.usb musi być wykonywalne, aby autofs używał go jako skryptu (bash). Na przykład
Co to robi: ten skrypt powie AutoFS (/ usr / sbin / automount), jak zamontować partycję urządzenia pamięci USB.
Skrypt najpierw użyje „/ sbin / blkid”, aby dowiedzieć się, jaki system plików znajduje się na partycji.
Skrypt zapewni wtedy odpowiednie opcje montowania w zależności od partycji urządzenia.
Uwaga: Dołączyłem przykładowy kod dla systemów plików „vfat” (prawdopodobnie najczęściej spotykany w przypadku pamięci USB), „ntfs” i „ext4”. Oczywiście jest to dość łatwe do rozszerzenia, aby obsługiwać więcej systemów plików.
Krok 3)
Opcjonalnie ... Aby „wysunąć” == odmontować pamięć USB (lub partycje na pamięci USB), utwórz skrypt w katalogu / sbin / usbeject:
Za pomocą tego skryptu możesz użyć polecenia „sudo usbeject”, aby odmontować wszystkie zamontowane partycje urządzeń USB (mówiąc automount, aby je odmontował).
Oczywiście możesz po prostu upewnić się, że partycja nigdzie nie jest używana; automounter odmontuje partycję po upływie 60 sekund ...
Prawdziwą sztuczką jest użycie dowiązań symbolicznych z „/ media / usb” do „/ media / autousb”:
źródło
Przepraszam, że odpowiadam na moje pytanie, a wielkie podziękowania należą się rozcietrzewiaczowi za wkład, ale ostatecznie udało mi się poczynić znaczne postępy, stosując następującą zasadę po godzinach czytania online:
SUBSYSTEMS=="scsi", KERNEL=="sd[a-h]1", SYMLINK+="removable", RUN+="/bin/mount /dev/removable /path/to/mount"
Spowoduje to zamontowanie pierwszej partycji dowolnego urządzenia SCSI. Myślę, że następnym pytaniem będzie, jak zamontować wiele partycji, ale to kolejny problem na inny dzień.
źródło
removable
atrybut, który powinieneś przetestować, a raczejblock
zamiast niegoscsi
.Przekonałem się, że najlepsza odpowiedź faktycznie stała się przestarzała, ponieważ nie jest utrzymywana i nie działa na / z Jessie (patrz komentarz malata)
Dla mnie (na Jessie) rozwiązanie na tym blogu działało jak urok.
Podziękowania dla „ddumont”, ale zamieszczając tutaj przegląd swojego bloga / odpowiedzi, aby poradzić sobie z możliwą zgnilizną linków w przyszłości.
Dodaj następujący wiersz do
/etc/fstab
Możesz to zrobić za pomocą nano:
Wyjaśnienie:
/dev/sr0
to plik urządzenia. Możesz także użyć jednego z dowiązań symbolicznych skonfigurowanych przez udev w / dev / disk / by-id. Będziesz musiał to zmienić zgodnie z plikiem urządzenia (sudo fdisk -l
aby wyświetlić listę urządzeń)/media/bluray
jest punktem montowania. Możesz wybrać inny punkt montowanianofail
jest wymagane, aby uniknąć zgłoszenia awarii podczas uruchamiania bez dysku w napędzie optycznymx-systemd.automount
jest opcja skonfigurowania systemd do automatycznego montowania włożonej płytyNie określaj noauto: zapobiegnie to automatycznemu zamontowaniu płyty przez system, co nie spełni celu.
Test
Uruchom polecenie
journalctl -x -f
w terminalu, aby sprawdzić, co się dzieje z systememdZaładuj ponownie konfigurację systemową za pomocą
sudo systemctl daemon-reload
.włóż dysk do napędu optycznego
Następnie dziennik powinien pokazywać coś takiego:
Dalej
Aby pomyślnie zamontować dyski NTFS, musiałem zainstalować NTFS-3G (stare NTFSSPROGS)
Nie musiałem instalować hfsprogs, aby usb sformatowany w OSX działał, ale powinieneś sam to sprawdzić.
źródło