데스크탑 환경 없이 이동식 미디어를 삽입할 때 /media/에 자동으로 마운트하려면 어떻게 해야 합니까?

데스크탑 환경 없이 이동식 미디어를 삽입할 때 /media/에 자동으로 마운트하려면 어떻게 해야 합니까?

저는 데스크탑 환경이 전혀 없는(Xorg가 전혀 없는) Debian sid 시스템(Wheezy)(arch와 동일)을 가지고 있습니다.

/media/mount/의 태그를 사용하여 SD 카드, USB 스틱, 외장 하드 드라이브를 지정된 디렉터리에 수동으로 마운트 umount하고 에 적절한 항목을 추가 하거나 부팅 시 자동으로 마운트하도록 할 수 있지만 /etc/fstab이는 눈에 띄는 제한 사항이며 정적이며 충분히 동적이지 않습니다. 내 필요에 따라: /media/<LABEL>서로 다른 장치가 있는 각 장치를 <LABEL>설치하려면 자체 항목이 필요하며 각 하위 디렉터리도 <LABEL>수동으로 생성/제거해야 합니다./media/

그렇다면 설치하는 가장 좋은 방법은 무엇입니까?자동으로존재하다/media/<LABEL> 삽입할 때(그리고 플러그를 뽑자마자 파일 시스템에서 마운트를 해제합니다.아무리 위험한 데이터라도)?

이상적인 솔루션은 다음과 같습니다.

  1. 이동식 미디어가 삽입된 경우 감지(예: , , ... /dev/로 추가된 경우 )sdaxsdbxudev
  2. /media/해당 레이블(이동식 미디어의 레이블)을 기반으로 디렉터리를 생성합니다.
  3. 옵션(에 대한)을 사용하여 모드 디렉토리에 마운트합니다 /media/<LABEL>( RW파일 시스템이 모드를 지원하는 경우).flushvfat
  4. 미디어가 분리되었는지 감지
  5. 그렇다면 파일 시스템에서 마운트 해제하십시오.
  6. 해당 디렉토리 삭제/media/

(물론 캐싱으로 인해 핫 언플러그할 때 데이터 손실을 방지하려면 장치를 동기화 모드로 마운트해야 합니다.편집하다: syncvfat이동식 미디어에 비해 너무 많음그래서flush 타협으로 만들어졌다, 덜 안전 sync하지만 플래시 메모리의 수명 주기에 따라 덜 위험함)

autofs, HAL, 등에 대한 일부 정보를 찾았 udisks지만 어느 것이 더 이상 사용되지 않거나 선호되는지 확실하지 않으며 어쨌든 지금까지는 이 작업을 수행하기 위해 내 시스템에서 쉽게 구성하는 방법을 찾지 못했습니다... ...udisks2usbmount

답변1

찾고 계시는 것 같아요pmount.

연결 시 자동으로 설치되도록 하려면 다음을 참조하세요.데비안에 USB 스틱 자동 마운트.

시스템에서 다음을 사용하는 경우USB 2이는 이동식 저장 장치 삽입에 반응하는 바람직한 방법입니다. 보다아치스 위키USB 플래시 드라이브 구성 팁.

그렇지 않으면 새 장치가 나타날 때 반응하는 프로그램은 다음과 같습니다.우데브이므로 자동 설치는 다음과 같이 수행됩니다.udev 규칙. 이것USB 마운트패키지는 USB 저장 장치 및 기타 장치를 자동으로 마운트하는 udev 규칙을 제공합니다. mountudev 규칙에서 호출됨FUSE 파일 시스템에서는 작동하지 않습니다.(예: ntfs-3g), 필요한 경우 udisk를 사용하십시오.

원인과 결과가 그런 방식으로 작동하지 않기 때문에 미디어를 제거할 때 미디어를 자동으로 마운트 해제할 수 없습니다. 미디어를 마운트 해제해야 합니다.앞으로삭제되었습니다. 읽기 전용 미디어의 경우 삭제 후 마운트 해제할 수 있습니다. 단, 갑자기 사라지는 파일 시스템에 열려 있는 파일이 있는 경우 일부 응용 프로그램에 혼란을 줄 수 있습니다. 쓰기 가능한 미디어의 경우 마운트된 파일 시스템을 분리하면 데이터가 손상될 수 있습니다.

답변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 메모리 스틱을 지원합니다.

답변3

글쎄, 오랜 시간이 지났지만 지금까지 찾은 최고의 옵션으로 내 질문에 답하겠습니다. 요약하자면, 규칙을 생성하고 이를 일부 스크립트(디렉터리 생성/삭제 및 이동식 장치 마운트 해제/마운트)와 연결하고 type= 을 사용하여 장치 이벤트 udev에 연결합니다 .udevpartition

1 - 추가/제거 스크립트 만들기

다음 스크립트를 storage-automount.sh에 저장 /lib/udev/하고 실행 가능하게 만듭니다( sudo chmod a+x /lib/udev/storage-automount.sh).

#!/bin/sh

# set the mountpoint name according to partition or device name
mount_point=$ID_FS_LABEL
if [ -z $mount_point ]; then
    mount_point=${DEVNAME##*/}
fi

# if a plugdev group exist, retrieve it's gid set & it as owner of mountpoint
plugdev_gid="$(grep plugdev /etc/group|cut -f3 -d:)"
if [ -z $plugdev_gid ]; then
    gid=''
else
    chown root:plugdev $mount_point
    gid=",gid=$plugdev_gid"
fi

# create the mountpoint directory in /media/ (if not empty)
if [ -n $mount_point ]; then
    mkdir -p /media/$mount_point
    # other options (breaks POSIX): noatime,nodiratime,nosuid,nodev
    mount -t $ID_FS_TYPE \
      -o rw,flush,user,uid=0$gid,umask=002,dmask=002,fmask=002 \
      $DEVNAME /media/$mount_point
fi

다음 스크립트를 storage-autounmount.sh에 저장 /lib/udev/하고 실행 가능하게 만듭니다( sudo chmod a+x /lib/udev/storage-autounmount.sh).

#!/bin/sh

# set the mountpoint name according to partition or device name
mount_point=$ID_FS_LABEL
if [ -z $mount_point ]; then
    mount_point=${DEVNAME##*/}
fi

# remove the mountpoint directory from /media/ (if not empty)
if [ -n $mount_point ]; then
    umount -l /media/$mount_point
    rm -R /media/$mount_point
fi

2 - udev이러한 스크립트를 이벤트에 연결하는 규칙 만들기

마지막으로 에 udev규칙을 추가합니다 . /etc/udev/rules.d/85-storage-automount.rules:

ENV{DEVTYPE}=="partition", RUN+="/lib/udev/storage-automount.sh", ENV{REMOVE_CMD}="/lib/udev/storage-autounmount.sh"

해당 디렉터리/폴더의 다른 규칙과 동일한 권한을 부여합니다.

이제 저장 장치를 삽입하면 파티션 이름을 기반으로 디렉터리가 생성되고 /media/(기억은 안 나지만 NTFS 파티션에서도 작동하는 것 같습니다) 해당 디렉터리에 파티션이 마운트됩니다. plugdev시스템에 그룹이 있으면 사용자가 그룹을 읽고 쓸 수 있습니다 . 또한 이러한 장치는 핫 플러그 ​​시 데이터 손실 위험을 제한하기 위해 동기화 모드로 설치됩니다.

장치가 제거되면 마운트가 해제되고 디렉터리가 삭제됩니다./media

또한 이벤트 모니터링을 위한 도구는 다음 옵션과 함께 또는 udev입니다 .udevadm monitor--env--property

$ udevadm monitor --env

이는 테스트되었으며 Debian 및 Arch에서 잘 작동하지만 모든 종속성에 적용될 수 있습니다 udev.

답변4

꽤 늦은 것 같지만 필요한 사람이 있으면 게시하겠습니다. (또한 내 첫 번째 StackExchange 답변이기도 합니다.)

여러 곳에서 해결책을 찾은 후 Arch Wiki에서 간단한 해결책을 찾았습니다.

다음으로 연결아치스 위키.

udisks2 규칙을 추가하여 기본 마운트 디렉터리를 /run/media/$USER/에서 변경할 수 있습니다 /media/<Label>.

/etc/udev/rules.d/다음 이름으로 다음 규칙을 추가합니다 99-udisks2.rules.

ENV{ID_FS_USAGE}=="filesystem|other|crypto", ENV{UDISKS_FILESYSTEM_SHARED}="1"

그런 다음 다음과 같은 간단한 도구를 설치할 수 있습니다.우디스키자동 마운트에 사용됩니다.

관련 정보