데스크탑 환경없이 / media / <LABEL>에 이동식 미디어를 자동으로 마운트하는 방법은 무엇입니까? 레이블로 지정된 디렉토리에

데스크탑 환경이없고 Xorg가없는 데비안 sid 시스템 (Wheezy) (아치와 동일)이 있습니다.

SD 카드, USB 스틱, 외장 HDD를 레이블로 지정된 디렉토리에 / 와 함께 적절한 디렉토리에 /media/수동으로 또는 부팅시 자동으로 마운트 할 수 있지만, 요구 사항에 맞게 제한적이고 역동적이지 않습니다. 에 마운트하려면 다른 장치가있는 각 장치마다 고유 한 항목이 필요 하며 각 하위 디렉토리도 수동으로 생성 / 제거해야 합니다).mountumount/etc/fstab/media/<LABEL><LABEL><LABEL>/media/

그래서 그들을 마운트하는 가장 좋은 방법은 무엇입니까 자동 으로 /media/<LABEL> 삽입에서 (그들은 분리 없습니다 즉시 파일 시스템에서 마운트를 해제하는 상관없이 데이터에 대해 얼마나 위험 )?

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

  1. 검출 이동식 매체가 꽂혀있을 때 (예를 첨가 할 때 /dev/
    sdax, sdbx…에 의해 udev)
  2. /media/레이블 (이동식 매체의 레이블) 에 따라 디렉토리를 작성하십시오.
  3. 옵션으로 (a ) 모드로 디렉토리 /media/<LABEL>에 마운트하십시오 RW(파일 시스템이 지원하는 flush경우 vfat)
  4. 미디어가 분리되었는지 감지
  5. 그렇다면 파일 시스템에서 마운트를 해제하십시오
  6. 해당 디렉토리를 제거하십시오 /media/

(장치 때문에 캐시의 핫 언 플러그 할 때 데이터 손실을 방지하기 위해, oviously 동기 모드로 설치되어야한다 : 편집 sync 이다 방법은 너무 많은 vfat이동식 미디어 그래서 flush 타협으로 만들어졌습니다 미만 확보 sync수명에 따라,하지만 덜 위험 플래시 메모리 사이클)

나는에 대한 몇 가지 정보를 발견 autofs, HAL, udisks, udisks2, usbmount등,하지만 하나가되지 않거나 바람직하고, 어쨌든, 지금까지, 그렇게 내 시스템에 쉽게 구성하는 방법을 알아 냈하지 않은 불분명 …



답변

찾고 계신 것 같습니다 pmount.

삽입시 자동 마운트를하려면 데비안에서 USB 스틱 자동 마운트를 참조하십시오 .

시스템이 udisks2를 사용하는 경우 이는 이동식 저장 장치 삽입에 반응하는 선호되는 방법입니다. Udisk 구성 팁 은 Arch Wiki 를 참조하십시오 .

그렇지 않으면 새 장치가 나타날 때 반응하는 프로그램은 udev 이므로 자동 마운트는 udev 규칙 에 의해 트리거됩니다 . usbmount의 패키지는 자동으로 USB 저장 장치와 몇 가지 다른 마운트 udev에 규칙을 제공합니다. FUSE 파일 시스템 (예 : ntfs-3g)에서는 mountudev 규칙에서 호출 할 수 없으므로 필요한 경우 udisk를 사용하십시오.

인과 관계가 작동하지 않기 때문에 미디어를 제거하면 자동으로 마운트 해제 할 수 없습니다. 미디어를 제거 하기 전에 마운트를 해제해야합니다 . 읽기 전용 미디어의 경우, 갑자기 종료 된 파일 시스템에서 파일을 열면 일부 응용 프로그램이 혼동 될 수 있지만 제거 후 마운트 해제를 피할 수 있습니다. 쓰기 가능한 미디어의 경우 마운트 된 파일 시스템을 분리하면 데이터가 손상 될 수 있습니다.


답변

최근에 내가 한 일이 있습니다.이 접근법에 매우 만족합니다. 이것은 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 단계)

automedia / media / autousb / <…>를 자동 마운트하도록 설정 autofs : “/etc/auto.master”파일 (Ubuntu 12.04)에 다음 줄을 추가했습니다.

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

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

젠투에서는 “/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

이 auto.usb는 실행 가능해야하므로 autofs는 이것을 (bash) 스크립트로 사용합니다. 예를 들어

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”심볼릭 링크는 udev에 의해 생성되어 사용자에게 USB 저장 장치 파티션이있는 간단한 개요를 제공합니다
  • Automedia는 / media / usb를 통해 파티션을 사용할 경우 요청시 파티션을 자동 마운트합니다.
  • 스크립트 된 “auto.usb”파일을 사용하면 모든 종류의 파일 시스템을 지원할 수 있으며 또한 모든 종류의 명명 체계를 지원할 수도 있습니다.
  • 이 방법은 파티션이 다른 파일 시스템 유형을 사용하더라도 다중 파티션이있는 USB 스틱을 지원합니다.

답변

좋아, 오랜 시간이 지났지 만 지금까지 내가 찾은 최고의 옵션으로 내 질문에 대답 할 것입니다. 요약 : udev일부 스크립트 (디렉토리 작성 / 제거 및 이동식 장치 마운트 해제 / 마운트)와 연관된 규칙을 작성하고 udevdevice event type =에 첨부하십시오 partition.

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시스템에 그룹 이 있으면 사용자를위한 R / W입니다 . 또한 핫 플러그를 뽑을 경우 데이터 손실 위험을 제한하기 위해 디바이스를 동기 모드로 마운트합니다.

장치가 제거되면 장치가 마운트 해제되고 디렉토리가 /media

또한, 모니터링 할 수있는 도구 udev이벤트는 udevadm monitor같은 옵션, --env또는 --property:

$ udevadm monitor --env

이것은 데비안과 아치 모두에서 테스트되고 잘 작동하지만에 의존하는 모든 배포판에서 작동합니다 udev.


답변

나는 그것이 늦게 생각하지만 누군가가 필요하면 이것을 게시 할 것입니다 : (또한 내 첫 번째 Exchange Exchange 답변)

여러 곳에서 솔루션을 확인한 후 Arch Wiki에서 간단한 솔루션을 찾았습니다.

아치 위키에 연결하십시오 .

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

다음과 같은 /etc/udev/rules.d/이름으로 다음 규칙을 추가하십시오 99-udisks2.rules.

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

그런 다음 자동 마운트를 위해 Udiskie 와 같은 간단한 도구를 설치할 수 있습니다 .


답변

참조하십시오 ArchWiki의 udev 페이지를 . mountUdev 규칙 또는 Udev 규칙에 의해 실행되는 스크립트에서는 실행되지 않아야합니다 .

그러나 udev-media-automount 프로젝트에서 볼 수 있듯이 Udev 규칙에서 Systemd 장치를 호출하여 마운트하는 스크립트를 호출하여 간단하게 수행 할 수 있습니다. udisks2 및 기타 솔루션과 달리 udev-media-automount는 root데스크탑 환경이나 “사용자 세션”이 나타날 때까지 기다리지 않고 사용자 로 무언가를 마운트하려는 간단한 경우에 맞춰져 있습니다. OP가 요구하는 것과 정확히 일치하는 것으로 보이며 기능적이고 이해하기 쉬운 것으로 나타났습니다.


답변

/ etc / fstab 파일을 편집하여이 작업을 수행하는 방법을 찾았습니다. 간단한 항목은 다음과 같습니다.

/dev/sdb1 /media/robot/hdd1 ntfs defaults 0 0

<file system> <mount point> <type> <options> <dump> <pass>