Linux에서 완전한 자동 마운트 솔루션을 위한 udev, udisks, autofs, 알림 설정에 필요한 조언

Linux에서 완전한 자동 마운트 솔루션을 위한 udev, udisks, autofs, 알림 설정에 필요한 조언

계속하다Linux에 연결된 장치를 자동으로 마운트, 그러면 일이 좀 더 쉬워집니다. 젠투를 실행할 때 autofs-5.0.4-r5를 사용하여 랩탑에 로컬 및 네트워크 장치 조합을 자동으로 마운트합니다. autofs만 실행하면 몇 가지 문제가 발생합니다.

  • 각 장치의 마운트 지점에 대한 이름을 미리 정의해야 하지만 때로는 MMC 카드 리더를 다시 시작한 후 부팅 가능한 USB 스틱 위치가 전환됩니다.
  • LABEL 기반 자동 마운트 지점이 나타나기를 원합니다. autofs만으로는 AFAIK가 이를 수행할 수 없습니다.

이것이 바로 udev와 udisks가 할 수 있는 일입니다. 하지만:

  • 장치가 연결될 때 파일 시스템이 자동으로 마운트되는 것을 원하지 않습니다. LABEL이라는 고스트 마운트 지점을 제공하면 됩니다.

실제 파일 시스템 마운트는 autofs 섀도잉이 작동하는 것처럼 마운트 지점에 처음 액세스할 때만 발생해야 합니다. 이렇게 하면 실수로 장치의 플러그를 뽑음으로써 파일 시스템이 더러워지는 위험을 줄이는 동시에 우수한 접근성을 제공해야 합니다.

그 외에도 DE에서 무슨 일이 일어나고 있는지 추적할 수 있습니다.

  • 모든 자동 마운트의 상태(예: 녹색 = 아무것도 설치되지 않음, 빨간색 = 무언가 설치됨)를 나타내는 시스템 트레이 앱이 있습니까?
  • 예를 들어 알림 전송을 사용하여 파일 시스템(마운트 해제) 마운트 작업에 대한 알림을 제공하는 배포에 구애받지 않는 방법이 있습니까? Gentoo의 경우는 어떻습니까? 저에게도 효과적입니다. udev 스크립트를 작성하는 것은 NFS 및 CIFS에 도움이 되지 않습니다. 그렇죠?

이 조합이 최종 자동 설치 설정이어야 합니다. 아니면 뭔가 빠졌나요?

답변1

이것은 모두 가능합니다 udev. 구경하다도시항공교통국, 이는 귀하가 언급한 대부분의 문제를 해결하는 것처럼 보이지만 실제로는하다자동으로 마운트됩니다. 원하는 경우 제공되는 뛰어난 기능을 활용할 수 있지만 미디어가 자동으로 마운트되지 않도록 수정할 수 있습니다. 작성자에게 연락하여 자동화되지 않은 설치 방법을 새로운 기능으로 제안할 수도 있습니다. 동시에 해당 기능에 대한 간략한 소개는 다음과 같습니다.

  • 이는 그 위에서 작동하여 udevDE를 독립적이고 이벤트 기반으로 만듭니다. (또한 감지되지 않을 수 있는 광학 미디어에 대한 해결 방법도 제안합니다 udev.)
  • MOUNTPOINT_TEMPLATES언급한 명명 문제를 해결할 수 있는 다양한 사용자 정의를 정의할 수 있습니다 (참조:uam 구성 파일)를 사용할 수도 있습니다 LABEL(원하는 경우).
  • 알림 메커니즘이 지원되므로 DE 특정 요구 사항에 맞게 조정하기만 하면 됩니다.
  • 각 작업이 어디서, 언제, 어떻게 실행되는지 쉽게 찾을 수 있도록 디자인이 명확한 것 같습니다.

답변2

이것이 제가 최근에 해왔던 일이고 지금은 이 방법에 매우 만족하고 있습니다. 이것은 Ubuntu 12.04 + gentoo용이지만 udev 및 autofs 설치를 허용하는 모든 배포판이 작동할 것이라고 생각합니다.

전제조건: udev+autofs가 설치되어 있어야 합니다.

1 단계)

다음 "/etc/udev/rules.d/90-usbsd-auto.rules" 파일을 생성합니다(물론 ".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"

기능: 두 개의 심볼릭 링크를 생성합니다. 하나는 "/dev/usbdisks/<...>" 아래의 USB 저장 장치 파티션에 대한 것입니다. 레이블이 없으면 USB 저장 파티션의 레이블이나 커널 이름을 사용합니다. 두 번째 심볼릭 링크는 자동 설치 프로그램 지원을 위해 "/media/usb/<...>"에서 "/media/autousb/<...>"로 연결됩니다(2단계 참조).

참고: 처음에는 ID_FS_LABEL_ENC 변수와 함께 규칙을 사용하지 않았습니다. 위험하다고 생각했기 때문입니다. 동일한 레이블이 있는 두 개의 USB 드라이브를 삽입하면 어떻게 됩니까?

하지만 포스터에서는 특별히 USB 드라이브의 라벨을 사용하고 싶었기 때문에 이에 맞게 규칙을 수정했습니다.

udev가 이러한 규칙을 읽도록 하려면 다음을 사용하세요.

sudo udevadm control --reload-rules

이 udev 규칙 파일을 사용하면 USB 저장 장치 파티션을 자동으로 마운트하도록 모든 것이 설정됩니다. 그러나 이제 장치는 (의도적으로) 자동으로 설치되지 않습니다. 사용하시면 자동으로 설치됩니다

2 단계)

autofs를 automount /media/autousb/<...>로 설정합니다. "/etc/auto.master" 파일(Ubuntu 12.04의 경우)에 다음 줄을 추가했습니다.

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

즉, AutoFS는 60초 동안 활동이 없으면 장치를 마운트 해제합니다. 취향에 따라 더 적게 또는 더 많이 사용해야 할 수도 있습니다.

젠투의 경우 "/etc/autofs/auto.master"를 수정하여 사용하기에 적합하도록 해야 합니다.

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

이제 다음 내용으로 "auto.usb"를 만들었습니다.

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

autofs가 이를 (bash) 스크립트로 사용하려면 이 auto.usb를 실행할 수 있어야 합니다. 예를 들어

sudo chmod 0755 /etc/auto.usb

역할: 이 스크립트는 AutoFS(/usr/sbin/automount)에 USB 저장소 파티션을 마운트하는 방법을 알려줍니다.

스크립트는 먼저 "/sbin/blkid"를 사용하여 파티션의 파일 시스템 유형을 찾습니다.

그러면 스크립트는 장치 파티션에 따라 올바른 설치 옵션을 제공합니다.

참고: "vfat"(아마도 가장 일반적인 USB 스틱), "ntfs" 및 "xfs" 파일 시스템에 대한 샘플 코드를 포함했습니다. 물론 더 많은 파일 시스템을 지원하도록 확장하는 것도 쉽습니다.

3단계) ​​선택 사항... USB 스틱(또는 USB 스틱의 파티션)을 "꺼내기" == 마운트 해제하려면 /sbin/usbeject 아래에 스크립트를 만듭니다.

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

이 스크립트를 사용하면 "sudo usbeject"를 사용하여 마운트된 모든 USB 장치 파티션을 마운트 해제할 수 있습니다(자동 마운트에 마운트 해제하도록 지정).

물론, 파티션이 어느 곳에서도 사용되지 않는지 확인할 수 있습니다. 자동 마운트는 60초 시간 초과 후 파티션을 마운트 해제합니다.

여기서 진짜 비결은 "/media/usb"에서 "/media/autousb"로의 심볼릭 링크를 사용하는 것입니다.

  • "/media/usb" 심볼릭 링크는 사용자에게 어떤 USB 저장 장치 파티션이 있는지에 대한 간단한 개요를 제공하기 위해 udev에 의해 생성됩니다.
  • /media/usb를 통해 파티션을 사용하는 경우 AutoFS는 요청 시 파티션을 자동으로 마운트합니다.
  • 스크립트된 "auto.usb" 파일을 사용하면 모든 유형의 파일 시스템을 지원할 수 있을 뿐만 아니라 모든 유형의 명명 체계도 지원할 수 있습니다.
  • 이 방법은 파티션이 서로 다른 파일 시스템 유형을 사용하는 경우에도 여러 파티션이 있는 USB 메모리 스틱을 지원합니다.

관련 정보