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”). :
# 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"
Co to robi: Tworzy dwa dowiązania symboliczne, jedno dla partycji urządzenia pamięci USB w „/ dev / usbdisks / <...>”. Użyje etykiety partycji pamięci USB lub nazwy jądra, jeśli nie ma etykiety. Drugie dowiązanie symboliczne będzie prowadzić od „/ media / usb / <...>” do „/ media / autousb / <...>” w celu obsługi automountera (patrz krok 2).
Uwaga: Początkowo nie używałem reguł ze zmiennymi ID_FS_LABEL_ENC, ponieważ moim zdaniem jest to niebezpieczne. Co się stanie, jeśli podłączysz dwie pamięci USB, które mają tę samą etykietę?
Ale plakat specjalnie chciał użyć etykiety dysku USB, więc odpowiednio zmodyfikowałem reguły.
Aby upewnić się, że udev czyta te zasady, użyj
sudo udevadm control --reload-rules
W tym pliku reguł udev wszystko jest skonfigurowane do automatycznego montażu 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 na automount / media / autousb / <...>: Dodałem następujący wiersz do mojego pliku „/etc/auto.master” (dla Ubuntu 12.04):
/media/autousb /etc/auto.usb --timeout=60
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 jego użycie było sensowne
/media/autousb /etc/autofs/auto.usb --timeout=60
Teraz utworzyłem plik „auto.usb” o następującej treści:
#!/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
To auto.usb musi być wykonywalne, aby autofs używał go jako skryptu (bash). Na przykład
sudo chmod 0755 /etc/auto.usb
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 „xfs”. 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:
#!/bin/bash
killall -s SIGUSR1 /usr/sbin/automount
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”:
- Udev utworzy dowiązania symboliczne „/ media / usb”, dając użytkownikowi prosty przegląd, które partycje urządzeń pamięci USB znajdują się
- AutoFS następnie automatycznie zamontuje partycję na żądanie, jeśli użyjesz jej przez / media / usb
- Za pomocą skryptu „auto.usb” możesz obsługiwać dowolny system plików, a dodatkowo możesz obsługiwać dowolny schemat nazewnictwa.
- To podejście obsługuje pamięć USB z wieloma partycjami, nawet jeśli partycje te używają różnych typów systemów plików.