사용자 로그인없이 부팅시 외장 드라이브를 / media / LABEL에 자동으로 마운트 하시겠습니까?


73

이 질문 은 비슷하지만 내가 원하는 것과 반대입니다. 부팅 할 때 외부 USB 드라이브를 아무도 로그인하지 않고 자동으로 같은 위치에 마운트하고 싶습니다 /media/<label>.

모든 데이터를 fstab에 입력하고 싶지는 않습니다. 부분적으로 지루하고 성가신 일이지만 대부분 연결하려는 내용이나 향후 파티션이 어떻게 변경 될지 예측할 수 없기 때문입니다.

MPD 와 같은 것들에 드라이브를 액세스 하고 SSH로 로그인 할 때 사용할 수 있기를 원합니다 . gnome-mountGnome 그래픽 세션에 로컬로 로그인 한 경우에만 마운트하는 것 같습니다.


4
좋은 질문입니다. 대답을 드리겠습니다. 이제 이것이 어떻게 해결되는지 궁금합니다.
반전

1
답변을 업데이트했습니다.
Ryan Thompson

1
그리고 기록 상으로는 이미 Gnome을 설치하는 데 문제가 없지만 헤드리스 GUI가없는 서버를위한 솔루션이 가장 좋습니다.
endolith 2009

1
ARRRGHH ... 내 대답에 버그가 있습니다. RUN. /usr/local/sbin/udev-automounter.sh mount %k이어야합니다 /usr/local/sbin/udev-automounter.sh %k. 죄송합니다.
quack quixote

1
OK-3부터는 공백과 함께 작동합니다. 공백을로 변환하는 "인코딩 된"버전의 <LABEL>을 사용하면 \x20됩니다. 예쁘지는 않지만 작동합니다. udev는 공백이있는 레이블을 잘 처리하지 않지만의 대신 밑줄을 사용하는 다른 옵션이 있습니다 \x20(적어도 멋지게 보입니다). 공간 처리가 쉘 스크립트로 들어가야하는 것처럼 보입니다.
quack quixote

답변:


74
  • Ubuntu Server 11.10 참고 : 이 스크립트는 사용되지 않는 vol_id명령 으로 인해 Ubuntu Server 11.10에서 실패합니다 . vol_id님이 대신했습니다 blkid. 스크립트를 수정하려면 스크립트에서 "vol_id"를 "blkid -o udev"로 바꾸십시오 udev-auto-mount.sh.

나는 이것에 대해 잠시 동안 내 머리를 두드리고 있었고, 나는 해결책을 찾았다 고 생각한다. 이것은 데비안 기반 시스템에서 개발 및 테스트되었으므로 우분투에서 작동합니다. 다른 시스템에도 적용 할 수있는 가정을 지적하겠습니다.

  • 플러그인에 USB 드라이브를 자동으로 마운트하므로 Firewire에 적응하는 데 많은 시간이 걸리지 않습니다.
  • UDEV를 사용하므로 HAL / DeviceKit / GNOME-Anything을 사용하는 원숭이가 없습니다.
  • 자동으로 /media/LABEL장치를 마운트 할 디렉토리를 만듭니다 .

  • 그러나 다른 자동 마운터를 방해 할 수 있습니다 . 나는 그것을 테스트 할 수 없습니다. Gnome-VFS가 활성화되어 있으면 둘 다 마운트를 시도 할 수 있습니다. Gnome-VFS가 마운트에 실패하면 데스크탑 아이콘을 구성하지 않을 수 있습니다. 그놈에서 마운트 해제가 가능해야하지만 필요 gksudo하거나 유사 할 수 있습니다 .

시스템 부팅시 이것을 테스트하지는 않았지만 시스템이 마운트 준비가되기 전에 USB 드라이브를 마운트하려고 시도하는 것이 작동하지 않을 수있는 유일한 이유입니다. 이 경우 마운트 스크립트를 한 번 더 조정해야 할 수도 있습니다. (나는 조언이 있는지 확인하기 위해 ServerFault확인하고 있지만 그에 대한 관심은별로 없습니다.)

그런 다음에.


UDEV 참조 :


배경 (UDEV? Whuzzat?)

UDEV는 커널의 핫 플러그 ​​시스템입니다. /dev/disk/by-label/<LABEL>부팅시와 시스템이 실행되는 동안 추가 된 장치에 대해 적절한 장치와 장치 심볼릭 링크 (예 :)를 자동으로 구성합니다 .

D-Bus 및 HAL은 데스크톱 환경과 같은 리스너에 하드웨어 이벤트를 보내는 데 사용됩니다. 따라서 그놈에 로그인하여 CD를 넣거나 USB 드라이브를 연결하면 다음과 같은 이벤트가 발생합니다.

kernel -> udev -> dbus -> hal -> gnome-vfs/nautilus (mount)

그리고 presto, 당신의 드라이브가 마운트됩니다. 그러나 헤드리스 시스템에서는 자동 마운팅의 이점을 얻기 위해 로그인 할 필요가 없습니다.

Udev 규칙

UDEV를 사용하면 장치 삽입시 규칙을 작성하고 프로그램을 실행할 수 있으므로 이상적인 선택입니다. 데비안 / 우분투의 기존 규칙을 활용하여 /dev/disk/by-label/<LABEL>심볼릭 링크를 설정 하고 장치를 마운트 할 다른 규칙을 추가하겠습니다.

UDEV의 규칙은 /etc/udev/rules.d(및 /lib/udev/rules.dKarmic에) 유지 되며 숫자 순서대로 처리됩니다. 숫자로 시작하지 않는 파일은 번호가 매겨진 파일 다음에 처리됩니다. 내 시스템에서 HAL 규칙은이라는 파일 90-hal.rules89-local.rules있으므로 HAL에 도달하기 전에 처리되도록 규칙을 넣습니다 . 기본적으로이 규칙이 다음에 발생하는지 확인해야합니다 60-persistent-storage.rules. local.rules충분할 수 있습니다.

이것을 새 규칙 파일에 넣으십시오.

# /etc/udev/rules.d/local.rules 
# /etc/udev/rules.d/89-local.rules
# ADD rule: if we have a valid ID_FS_LABEL_ENC, and it's USB, mkdir and mount
ENV{ID_FS_LABEL_ENC}=="?*",   ACTION=="add",      SUBSYSTEMS=="usb", \
         RUN+="/usr/local/sbin/udev-automounter.sh %k"
  • 뒤에 공백이없고 \단지 newline( \n) 만 있는지 확인하십시오 .

  • 변경 SUBSYSTEMS=="usb"SUBSYSTEMS=="usb|ieee1394"파이어 와이어 지원.

  • 특정 사용자가 항상 장치를 소유하려면 OWNER="username"조항을 추가하십시오 . 특정 사용자가 소유 한 파일이 필요한 경우 대신 마운트 스크립트를 조정하십시오.

규칙을 읽고

이것은 실행할 프로그램을 장치의 프로그램 목록에 추가합니다. 로 USB 파티션 장치를 식별 <LABEL>한 다음이 정보를 마운트를 수행하는 스크립트로 전달합니다. 특히이 규칙은 다음과 일치합니다.

  1. ENV{ID_FS_LABEL_ENC}=="?*"-이전 시스템 규칙에 의해 설정된 환경 변수 파일 시스템 이외의 시스템에는 존재하지 않으므로 확인해야합니다. 실제로 ID_FS_LABEL마운트 지점 에 사용하고 싶지만 UDEV가 이스케이프를 이스케이프하도록 설득하지 않았으므로 마운트 스크립트에서 처리하도록하겠습니다.

    이 환경 변수와 다른 환경 변수는 udev에서 vol_id명령 ( deprecated )을 사용하여 얻습니다 . 파티션에 대한 빠른 세부 정보를 볼 수있는 편리한 도구입니다.

    $ sudo vol_id /dev/sdc1
    ID_FS_TYPE=ext2
    ID_FS_UUID=a40d282a-4a24-4593-a0ab-6f2600f920dd
    ID_FS_LABEL=Travel Dawgs
    ID_FS_LABEL_ENC=Travel\x20Dawgs
    ID_FS_LABEL_SAFE=Travel_Dawgs
    
  2. ACTION=="add"- add이벤트 만 일치 ...

  3. SUBSYSTEMS=="usb"-USB 버스에있는 장치와 만 일치합니다. SUBSYSTEMS여기에서는 기기의 부모와 일치하기 때문에 사용 합니다. 우리가 관심있는 장치는 실제로 SUBSYSTEM == "scsi"입니다. 부모 USB 장치와 일치하면 내부 드라이브에 프로그램을 추가하지 않아도됩니다.

  4. RUN+="..."-일치하는 것이 아니라 조치 : 실행할 프로그램 목록에이 프로그램을 추가하십시오. 프로그램의 인수 %k에서 장치 이름으로 확장되고 (예 : sdc1not /dev/sdc1) $env{FOO}환경 변수 FOO의 내용을 가져옵니다.

규칙 테스트

위의 첫 번째 참조 링크는 훌륭한 UDEV 튜토리얼이지만 약간 오래된 것입니다. 규칙을 테스트하기 위해 실행되는 프로그램 ( udevtest특히)이 범용 udevadm유틸리티 로 대체되었습니다 .

규칙을 추가 한 후 장치를 연결하십시오. 몇 초 정도 지난 다음 어떤 장치에 할당되어 있는지 확인하십시오.

$ ls -l /dev/disk/by-label/*
lrwxrwxrwx 1 root root 10 2009-10-25 07:27 label_Foo -> ../../sda1
lrwxrwxrwx 1 root root 10 2009-10-25 07:27 label_Bar -> ../../sdb1
lrwxrwxrwx 1 root root 10 2009-10-25 07:27 label_Baz -> ../../sdc1

이동식 드라이브에가 있으면 label_Baz장치에있는 것 sdc1입니다. 이것을 실행하고 끝을 향한 출력을보십시오.

$ sudo udevadm test /sys/block/sdc/sdc1
parse_file: reading (...)                           (many lines about files it reads)
import_uevent_var: import into environment: (...)   (many lines about env variables)
(...)                                               (many lines tracing rule matches & programs run)
update_link: found 1 devices with name 'disk/by-label/LABEL_BAZ'
update_link: found '/block/sdc/sdc1' for 'disk/by-label/LABEL_BAZ'
update_link: compare (our own) priority of '/block/sdc/sdc1' 0 >= 0
update_link: 'disk/by-label/LABEL_BAZ' with target 'sdc1' has the highest priority 0, create it
udevtest: run: '/usr/local/sbin/udev-automounter.sh sdc1 LABEL_BAZ'
udevtest: run: 'socket:/org/freedesktop/hal/udev_event'
udevtest: run: 'socket:@/org/kernel/udev/monitor'

RUN+=마지막 몇 줄 (이 예에서는 아래에서 세 번째)에서 규칙에서 스크립트 이름을 찾으십시오 . 이 장치에 사용될 인수를 볼 수 있습니다. 이제 해당 명령을 실행하여 인수가 올바른지 확인할 수 있습니다. 명령 줄에서 작동하면 장치를 삽입 할 때 자동으로 작동합니다.

실시간으로 UDEV 이벤트를 모니터링 할 수도 있습니다. 실행 sudo udevadm monitor( man udevadm스위치에 대한 자세한 내용 은 참조 ). 그런 다음 새 장치를 연결하고 이벤트가 스크롤되는 것을 지켜보십시오. (실제로 낮은 수준의 세부 사항에 속하지 않는 한 아마 과잉 일 것입니다 ...)

규칙 재로드

규칙을 올바르게 읽고 있음을 확인한 후 UDEV에 규칙을 다시로드하도록 지시하여 새 규칙이 적용되도록해야합니다. 다음 방법 중 하나를 사용하십시오 (첫 번째 방법이 작동하지 않으면 두 번째 방법은 ...하지만 첫 번째 방법을 시도하십시오).

  • 운영 sudo udevadm control --reload-rules

  • 운영 sudo /etc/init.d/udev reload

  • 재부팅


스크립트! 사실, 2 개의 스크립트 ...


첫 번째 스크립트는 다음과 같습니다. 우리가 실행하는 프로그램은 빠르게 완료해야하기 때문에 백그라운드에서 두 번째 스크립트를 회전시킵니다. 이것을 넣으십시오 /usr/local/sbin/udev-automounter.sh:

#!/bin/sh
#
# USAGE: usb-automounter.sh DEVICE 
#   DEVICE   is the actual device node at /dev/DEVICE

/usr/local/sbin/udev-auto-mount.sh ${1} &

두 번째 스크립트는 다음과 같습니다. 이것은 조금 더 입력 확인을 수행합니다. 에 넣으십시오 /usr/local/sbin/udev-auto-mount.sh. 아래의 마운트 옵션을 조정할 수 있습니다. 이 스크립트는 이제 자체적으로 파티션 LABEL 찾기를 처리합니다. UDEV는 DEVICE 이름 만 보냅니다.

부팅시 드라이브를 마운트하는 데 문제가있는 경우sleep 60 , 스크립트가 드라이브를 마운트하려고 시도하기 전에 시스템이 완전히 가동 될 수 있도록이 스크립트에 시간을 오래 투자 할 수 있습니다 .

ps웹 서버가 실행 중인지 확인하는 방법에 대한 의견에 의견을 제시 했지만 시스템에 맞게 조정하고 싶을 것입니다. 필자는 nfsd, smbd, apache 등과 같은 대부분의 네트워크 서버가 이러한 목적으로 충분하다고 생각합니다. 물론 서비스가 실행되고 있지 않으면 마운트 스크립트가 실패 할 가능성이 있습니다. 특정 파일의 존재가 더 나은 솔루션입니다.

#!/bin/sh
#
# USAGE: udev-auto-mount.sh DEVICE
#   DEVICE   is the actual device node at /dev/DEVICE
# 
# This script takes a device name, looks up the partition label and
# type, creates /media/LABEL and mounts the partition.  Mount options
# are hard-coded below.

DEVICE=$1

# check input
if [ -z "$DEVICE" ]; then
   exit 1
fi

# test that this device isn't already mounted
device_is_mounted=`grep ${DEVICE} /etc/mtab`
if [ -n "$device_is_mounted" ]; then
   echo "error: seems /dev/${DEVICE} is already mounted"
   exit 1
fi

# If there's a problem at boot-time, this is where we'd put
# some test to check that we're booting, and then run
#     sleep 60
# so the system is ready for the mount below.
#
# An example to experiment with:
# Assume the system is "booted enough" if the HTTPD server is running.
# If it isn't, sleep for half a minute before checking again.
#
# The risk: if the server fails for some reason, this mount script
# will just keep waiting for it to show up.  A better solution would
# be to check for some file that exists after the boot process is complete.
#
# HTTPD_UP=`ps -ax | grep httpd | grep -v grep`
# while [ -z "$HTTPD_UP" ]; do
#    sleep 30
#    HTTPD_UP=`ps -ax | grep httpd | grep -v grep`
# done


# pull in useful variables from vol_id, quote everything Just In Case
eval `/sbin/vol_id /dev/${DEVICE} | sed 's/^/export /; s/=/="/; s/$/"/'`

if [ -z "$ID_FS_LABEL" ] || [ -z "$ID_FS_TYPE" ]; then
   echo "error: ID_FS_LABEL is empty! did vol_id break? tried /dev/${DEVICE}"
   exit 1
fi


# test mountpoint - it shouldn't exist
if [ ! -e "/media/${ID_FS_LABEL}" ]; then

   # make the mountpoint
   mkdir "/media/${ID_FS_LABEL}"

   # mount the device
   # 
   # If expecting thumbdrives, you probably want 
   #      mount -t auto -o sync,noatime [...]
   # 
   # If drive is VFAT/NFTS, this mounts the filesystem such that all files
   # are owned by a std user instead of by root.  Change to your user's UID
   # (listed in /etc/passwd).  You may also want "gid=1000" and/or "umask=022", eg:
   #      mount -t auto -o uid=1000,gid=1000 [...]
   # 
   # 
   case "$ID_FS_TYPE" in

       vfat)  mount -t vfat -o sync,noatime,uid=1000 /dev/${DEVICE} "/media/${ID_FS_LABEL}"
              ;;

              # I like the locale setting for ntfs
       ntfs)  mount -t auto -o sync,noatime,uid=1000,locale=en_US.UTF-8 /dev/${DEVICE} "/media/${ID_FS_LABEL}"
              ;;

              # ext2/3/4 don't like uid option
       ext*)  mount -t auto -o sync,noatime /dev/${DEVICE} "/media/${ID_FS_LABEL}"
              ;;
   esac

   # all done here, return successful
   exit 0
fi

exit 1

슈퍼 보너스 정리 스크립트!

하나 더 스크립트. 이 모든 것은 장치를 마운트 해제하고 마운트 지점 디렉토리를 제거하는 것입니다. 이를 수행 할 권한이 있다고 가정하므로을 (를) 실행해야합니다 sudo. 이 스크립트는 이제 명령 줄에서 전체 마운트 지점을 사용합니다. 예 :

$ /usr/local/sbin/udev-unmounter.sh "/media/My Random Disk"

이것을 넣으십시오 /usr/local/sbin/udev-unmounter.sh:

#!/bin/sh
#
# USAGE: udev-unmounter.sh MOUNTPT
#   MOUNTPT is a mountpoint we want to unmount and delete.
MOUNTPT="$1"

if [ -z "$MOUNTPT" ]; then
   exit 1
fi


# test mountpoint - it should exist
if [ -e "${MOUNTPT}" ]; then

   # very naive; just run and pray
   umount -l "${MOUNTPT}" && rmdir "${MOUNTPT}" && exit 0

   echo "error: ${MOUNTPT} failed to unmount."
   exit 1
fi

echo "error: ${MOUNTPT} does not exist"
exit 1

3
당신은 훌륭합니다! :)
kolypto 2018

1
auto-mount.sh를 수동으로 실행하면 작동하지만 부팅하지 않고 드라이브를 연결하면 작동하지 않습니다. : /
endolith 2009

따라서 문제는 UDEV 규칙에 있습니다. lemme은 디버깅에 도움이되도록 해당 섹션을 약간 확장합니다.
quck quixote

3
나는 GitHub의 모든 스크립트를 조립했다 : github.com/fatso83/Code-Snippets/tree/master/system-utils/...는 그들은 우분투 10.10에 잘 작동하고, 또한 자동 마운트 해제 포함
oligofren

1
참조 : udev_237-man udev (Ubuntu_18.04) systemd-udevd.service에서 시행 되는 기본 샌드 박스 로 인해 udev 규칙 내 에서 네트워크 또는 마운트 / 언 마운트 파일 시스템에 액세스하는 프로그램을 실행할 수 없습니다 . 출처 : unix.stackexchange.com/questions/200194/… 해결책은 serverfault.com/questions/766506/…을
Pro Backup

9

다른 사람들이 인터넷에서 제안한 마지막 옵션 중 하나는입니다 ivman.하지만에 의존하는 것으로 보입니다 pmount. pmount버리고 ivman거의 같습니다.

의 대체품은 ivman입니다 halevt. Karmic에서 사용할 수 있습니다. ivman"유지"및 "pmount에 의존하지 않음"을 다시 구현 한 것입니다 . Jaunty에서는 패키지를 사용할 수 없지만 업그레이드 할 계획이 없다면 직접 빌드 할 수 있습니다.

이러한 도구는 모두 DBus 및 HAL 레이어 위에 있으며 이벤트에서 응답합니다. 분명히 둘 다 시스템 데몬 또는 사용자 세션 마운트 관리자 (la Gnome-VFS)로 실행할 수 있습니다. /etc/defaults/{ivman,halevt}파일은 시스템 설정을 담당합니다.

다음은 마운트 포인트 ivman사용 을 조정 하기 위한 지침 입니다 /media/<LABEL>. 그것은 가능성이 높습니다 halevt그것을 할 수있는 간단한 방법이 있지만, 아마 그들은 당신이 답을 찾을 수 있습니다.


HALEVT로 작업

업데이트 : 내 UDEV 답변이 제공하지 않는 자동 CD 마운트를 얻는 데 관심이 있기 때문에 더 자세히 살펴 보았습니다 halevt. 프로세스에 대해 많은 것을 설명하는 데 도움 이되는이 블로그 게시물 을 발견했습니다 . halevt데비안 레니 (Debian Lenny) 용 패키지 를 컴파일해야했습니다 (다행히도 모든 의존성은 lenny-backports 섹션에있었습니다). 일단 설치되면 프로세스는 대부분 무시할 수 없습니다.

  1. 시스템 halevt-daemon이 활성화되어 있는지 확인하십시오 /etc/default/halevt
  2. 시스템 halevt 사용자가 장치를 마운트하도록 허용 /etc/PolicyKit/PolicyKit.conf(아래 참조 : source )
  3. 볼륨 레이블을 원하는 마운트 지점에 복사하도록 HAL 정책 수정 /etc/hal/fdi/policy/preferences.fdi(아래 참조)
  4. CD / DVD를 지원 하려면 위 블로그 포스트에서 eject.hal스크립트 를 가져 와서 수정 한 후 저장하십시오 /usr/local/bin.
  5. 마운트를 사용하도록 halevt 시스템 구성 수정 /etc/halevt/halevt.xml
  6. 로그인 관리자의 세션 전후 스크립트에 코드를 추가하여 누군가 로그온 할 때 시스템 halevt- 데몬을 중지하고 로그 오프 할 때 다시 시작하십시오.

새 구성을 확인하기 위해 HAL 및 HALEVT 데몬을 다시 시작해야하는 경우이를 사용하여 올바른 순서로 가져 오십시오.

sudo sh -c "/etc/init.d/halevt stop ; /etc/init.d/hal restart ; /etc/init.d/halevt start"

1 단계

그 확인 START_DAEMON=yes/etc/default/halevt.

2 단계

에서 /etc/PolicyKit/PolicyKit.conf,이 추가 내부<config></config> 섹션 :

<match action="org.freedesktop.hal.storage.mount-removable">
   <match user="halevt">
      <return result="yes"/>
   </match>
</match>

3 단계

에서 /etc/hal/fdi/policy/preferences.fdi,이 추가 안쪽 은`섹션 :

<match key="volume.label" empty="false">
    <match key="volume.label" is_absolute_path="false">
        <merge key="volume.policy.desired_mount_point" type="copy_property">volume.label</merge>
    </match>
</match>

4 단계

스크립트는 훌륭하지만 실행해야합니다 /bin/bash. 일부 시스템은 실제로 호출 /bin/dash될 때 사용할 수 있습니다 /bin/sh. 따라서 스크립트에서 맨 위 줄을 변경하여 올바른 줄을 얻습니다.

#!/bin/sh         <------ old first line

#!/bin/bash       <------ new first line

5 단계

이것은 재미있는 부분입니다. 시스템은 /etc/halevt/halevt.xml이미 기본 사항을 제공 할 수 있으므로 자신의 용도에 맞게 조정해야합니다. 필자의 경우 시스템은 이미 기본 탈착식 마운트를 제공했지만 CDROM 마운트 및 꺼내기 버튼에 대한 지원을 추가해야했습니다.

내가 언급 한 블로그 게시물에는 사용자 자신의 조정을 살펴볼 수 있는 좋은 XML 구성 예가 있습니다. 주로 저자 fluxbox환경을 위한 그놈 마운트 대체를 설정하는 것에 관한 것이기 때문에 그의 예제 XML이 원하는 것보다 더 많은 것을 수행하지만, 당신이 할 수있는 일에 대한 느낌을 얻는 좋은 방법입니다. 의 좋은 예도 있습니다 /usr/share/doc/halevt/examples.

나는 또한 sudo sh -c "mkdir /var/halevt ; chown halevt:plugdev /var/halevt"모든 것이 작동하기 전에 달렸다 .

다음은 자동 마운트 CD / DVD 작동을위한 추가 사항입니다.

<!-- CD/DVD mount -->
<halevt:Device match="hal.block.device &amp; hal.block.is_volume = true  &amp; hal.volume.is_disc = true &amp; hal.volume.disc.has_data = true">
   <halevt:Property name="hal.volume.is_mounted">
      <halevt:Action value="true" exec="halevt-mount -u $hal.udi$ -p $hal.volume.policy.desired_mount_point$ -m 002"/>
   </halevt:Property>
</halevt:Device>

<!-- CD/DVD eject button support -->
<halevt:Device match="hal.storage.drive_type = cdrom">
   <halevt:Condition name="EjectPressed" exec='/usr/local/bin/eject.hal $hal.block.device$'/>
</halevt:Device>

6 단계

시스템 halevt-daemon이 작동하면 GNOME에 로그인 할 때 비활성화하고 로그 아웃 할 때 다시 시작해야합니다. ( GDM 아닌 로그인 관리자의 경우이 질문에 대한 답변을 참조하십시오 .)

/etc/gdm/PreSession/Defaulthalevt-daemon 시스템을 중지하려면 다음을 추가하십시오.

/etc/init.d/halevt stop

/etc/gdm/PostSession/Defaulthalevt-daemon 시스템을 다시 시작하려면 다음을 추가하십시오.

/etc/init.d/halevt start

3
2013 년에이 글을 읽는 사람들은 이제 HAL이 더 이상 사용되지 않는다는 것을 알아야하고 위에서 언급 한 퀵소트와 같은 udev 기반 솔루션을 사용해야합니다.
oligofren

6

시간이 지남에 따라 더 쉬운 솔루션이 나타납니다.

이 솔루션은이 목적으로 작성된 udevil 소프트웨어 패키지에 의존하며 udev 규칙을 다루지 않아도됩니다. 간단한 솔루션으로 (신규 및 기존 사용자에게) 바람직합니다.

devmonudevil 의 스크립트는 udev와 glib에만 의존하면서 모든 마법을 수행합니다. 초기 구성없이 거의 즉시 사용할 수 있습니다.

내 워크 스테이션에서 수행 한 모든 작업은 다음 rc.local과 같이 devmon을 호출하는 것입니다.
devmon 2>&1 >> /var/log/devmon &
편의 rc.local를 위해 자동화 도구 pleaserun를 만드는 대신 https://unix.stackexchange.com/ a / 124609 / 42673

실행 한 후 연결 한 스토리지를 검사 한 후 (파티션을 찾고 파일 시스템 레이블을 찾은 경우) 파일을 마운트합니다 /media/FILESYSTEM_LABEL.
(유명한) 시스템이 미래에 어느 시점에서이 기능을 통합 할 수 있다는 점을 제외하고는 그보다 단순한 것을 상상할 수 없었습니다.

udevil At A Glance ( github.io/udevil )
스크립트 : devmon ( igurublog / script-devmon )


3

quack quixote의 답변은 Ubuntu Lucid Lynx (10.04)에서 작동하지 않습니다 /sbin/vol_id. 명령 이 없습니다 .

화려하고 udev를 사용하는 대신 이것을 /etc/rc.local에 넣고 완료하십시오.

for dev in $(ls -1 /dev/disk/by-label/* | grep -v EFI) ; do
  label=$(basename $dev)
  mkdir -p /media/$label
  $(mount | grep -q /media/$label) || mount $dev /media/$label
done

1
감사합니다 .. 이것이 내가 달성하고자하는 가장 간단한 방법이었습니다. 심지어 NTFS 볼륨 우분투 서버 16 일
ChrisPrime

3

데비안 기반 시스템 (예 : Ubuntu 등)에는 USB 드라이브를 자동으로 마운트 하는 usbmount 패키지가 있습니다. 기본적으로 이미 설명한대로 udev 기반 접근 방식을 사용합니다. 단지 간단한 패키지 설치 일뿐입니다. 패키지 의 원래 작성자가 부족한 것으로 보이지만 우분투 / 데비안은 여전히 ​​그것을 유지하는 것처럼 보입니다.

설치된 스크립트는 적절한 마운트 지점을 제공하도록 구성 될 수 있습니다 (/etc/usbmount/usbmount.conf).


1
구성 파일의 레이블 목록을 채우지 않으면 Usbmount는 레이블별로 마운트 할 수 없습니다.
Gilles

1
목록을 유지하지 않고 usbmount에 레이블에 마운트를 추가하려면 post esite.ch/2014/04/11/…을 참조하십시오 .
Oliver Sauder

3

quack quixote의 탁월한 제거 지침을 플러시하려면 :

이전에 작성한 udev 규칙 파일 (/etc/udev/rules.d)에 다음 행을 추가하십시오. "

ENV{ID_FS_LABEL_ENC}=="?*",   ACTION=="remove",      SUBSYSTEMS=="usb", \
         RUN+="/usr/local/sbin/udev-autounmounter.sh %k"

다음 스크립트를 작성하고 다음 내용으로 chmod it 실행 파일 (/usr/local/sbin/udev-autounmounter.sh)을 실행하십시오.

#!/bin/sh
#
# USAGE: usb-autounmounter.sh DEVICE 
#   DEVICE   is the actual device node at /dev/DEVICE

/usr/local/sbin/udev-auto-unmount.sh ${1} &

마지막으로 마운트 해제 스크립트 자체 (udev-auto-unmount.sh) :

#!/bin/sh
#
# USAGE: udev-auto-unmount.sh DEVICE
#   DEVICE   is the actual device node at /dev/DEVICE
# 
# This script takes a device name, looks up the partition label and
# type, creates /media/LABEL and mounts the partition.  Mount options
# are hard-coded below.

DEVICE=$1

# check input
if [ -z "$DEVICE" ]; then
   exit 1
fi

#test that the device is already mounted
MOUNTPT=`mount | grep ${DEVICE} | cut -d ' ' -f 3`
if [ -z "${MOUNTPT}" ]; then
   echo "error: the device is not already mounted"
   exit 1
fi

# test mountpoint - it should exist
if [ -e "${MOUNTPT}" ]; then

   # very naive; just run and pray
   umount -l "${MOUNTPT}" && rmdir "${MOUNTPT}" && exit 0

   echo "error: ${MOUNTPT} failed to unmount."
   exit 1
fi

echo "error: ${MOUNTPT} does not exist"
exit 1

따라서 다른 지침과 함께 디렉토리는 udev 이벤트에서 자동으로 나타나고 사라집니다.


if [ -n "$device_is_mounted" ]; then해야 한다고 생각 if [ -z "${MOUNTPT}" ]; then하지 않습니까?
eresonance

2

Pysdm 을 사용 해보고 싶을 수도 있습니다.


그것은 다른 fstab 편집기 일 뿐입니 까?
endolith

네,하지만 "또한 저장 장치의 동적 구성에 대한 udev 규칙을 만들 수 있습니다"
Sathyajith 바트가

"udev 규칙 생성"이 어떤 식 으로든 도움이됩니까? 나는 그것이 무엇을 의미하는지 전혀 모른다. 사용자가 로컬로 로그인하지 않고 이전에 알려지지 않은 이동식 장치를 마운트합니까?
endolith 2009

죄송합니다, udev 규칙에 대한 단서가 없습니다. 당신은 한 번 봐 가질 수 fredericiana.com/2006/03/15/writing-udev-rules-short-notesreactivated.net/writing_udev_rules.html을
Sathyajith 바트가

2

su username -c gnome-volume-manager/etc/rc.local을 넣어보십시오 . gnome-volume-manager를 실행하는 것으로 충분할 수 있습니다.

편집 : gnome-volume-manager는 더 이상 Ubuntu 데스크탑에서도 기본 배포의 일부가 아닌 것 같습니다.

wajig policy  gnome-volume-manager
gnome-volume-manager:
  Installed: (none)
  Candidate: 2.24.0-0ubuntu1
  Version table:
     2.24.0-0ubuntu1 0
        500 http://ubuntu.secs.oakland.edu jaunty/universe Packages

그러나 설치해도 여전히 작동합니다. 시도해 볼 가치가 있습니다. 작동하지 않으면 다시 제거하십시오.

usbmount원하는 것을 수행하지만 정상적인 자동 마운팅을 방해 할 수 있는 패키지 도 있습니다.


알 수없는 명령“gnome-volume-manager”. 나는 우분투 Jaunty에있다.
endolith

/ usr / lib / gnome-volume-manager / gnome-volume-manager가 있지만 아무 것도 수행하지 않습니다.
endolith

아 알 겠어요 gnome-volume-manager라는 패키지도 있습니다. 관련 : crunchbanglinux.org/forums/topic/239/…
endolith

gnome-volume-manager가 HAL을 사용하여 마운트하는 것처럼 보입니까? 그리고 "2009 년 현재 HAL은 DeviceKit을 위해 더 이상 사용되지 않습니다." 왜 Linux의 모든 것이 항상 이런 식입니까? 그들은 거의 제대로 작동하는 것을 시작한 다음 그것을 꺼내어 작동하지 않는 새로운 것으로 대체합니다.
endolith

pmount는 더 이상 작동하지 않습니다. > pmount는 / dev / 디스크 /별로 라벨 / 저장 오류 : / sdc1과 이동식 장치 / dev하지 togaware.com/linux/survivor/Using_Gnome_Volume_Manager.html은
endolith

2

quack quixote의 udev 기반 솔루션에 대한 편집 된 부록이 거부되었으므로 여기에 넣겠습니다. 먼저 그의 게시물을 참조하십시오.

당신이 때 udev에 규칙이 작동하려면 우선, 어떤 장치 (USB, FireWire 및 eSATA를 모두 포함)를 SCSI 서브 시스템을 통해 연결되어,에있는 udev 규칙의 서브 매치를 변경 SUBSYSTEMS=="scsi".

그러나 시스템 실행 중에 핫 플러그 ​​할 경우 내장 드라이브를 포함하여 거의 모든 것이 자동으로 마운트되므로 원하는 것이 아닐 수도 있습니다.

두 번째로, 다음은 해당 게시물의 모든 스크립트를 대체하는 스크립트입니다. 또한 마운트 된 블록 장치가 제거 되 자마자 수동으로 개입 할 필요없이 / media /에서 생성 된 마운트 지점을 자동으로 정리합니다. 또한 백그라운드에서 실행하기 위해 다른 스크립트를 호출하는 대신 터미널에서 실행되지 않을 때 (예 : udev를 통해 실행되는 경우) 백그라운드에 자신을 배치합니다.

inotifywait를 사용하여 마운트 된 장치가 사라질 때까지 기다렸다가 만든 디렉토리를 제거합니다. 따라서 시스템에 inotify-tools가 설치되어 있어야합니다. 데비안 기반 배포판 (우분투 포함)에서는 sudo apt-get install inotify-tools충분합니다.

#!/bin/bash
#
# Auto-mounter script, to be executed by udev on the addition of a
# mass storage device.
#
# Takes one argument; the base block device partition, e.g. "sdb3".
#
# Creates a mountpoint for the partition using its FS label, in
# /media/{fslabel} and mounts it there, read-only, unsynced.
#
# If the filesystem has no label, "Untitled" is used instead.
#
# If another filesystem is already mounted at that location, the
# newcomer will be mounted with an integer number appended to its
# label.

MOUNT_OPTS="ro,noatime,nodiratime"



# If we're called from a non-tty and not explicitly told to continue,
# we call ourselves in a subshell and thus return immediately (udev
# gets impatient):
if [[ "$2" != "backgrounded" ]] && ! tty &> /dev/null; then
    ($0 $1 backgrounded &)
    exit
fi



# Determine the desired mountpoint from the label of the fs on the partition:
MOUNTPOINT="/media/$(blkid /dev/$1 | grep LABEL | sed -E 's:^.+LABEL="([^"]+).+:\1:')"

# If it had no label, use "Untitled":
[[ "$MOUNTPOINT" = "/media/" ]] && MOUNTPOINT="/media/Untitled"

# If something's already mounted there, append a number:
if [[ -e "$MOUNTPOINT" ]] && mountpoint "$MOUNTPOINT" &> /dev/null; then
    NUM=1
    while mountpoint "$MOUNTPOINT $NUM" &> /dev/null; do NUM=$((NUM+1)); done
    MOUNTPOINT="$MOUNTPOINT $NUM"
fi

# Create the mountpoint and mount there:
mkdir "$MOUNTPOINT" && mount -o $MOUNT_OPTS /dev/$1 "$MOUNTPOINT"



# Wait until the device is removed (the block device is "deleted"):
inotifywait -e delete /dev/$1

# Then clean up. If it fails, retry every second for up to 5 mins:
TRIES=0
while [[ -e "$MOUNTPOINT" ]] && [[ $TRIES -lt 300 ]]; do
    rmdir "$MOUNTPOINT"
    sleep 1s
    TRIES=$((TRIES+1))
done

동기화 및 읽기 전용없이 장치를 마운트합니다. 그것은 단지 99 %의 시간, 나의 유스 케이스가 외장 드라이브에서 읽고 있기 때문이며, 쓸 필요가있을 때마다 서버에서 활동할 것이고, mount -o remount,rw <mountpoint>명령을 쉽게 발행 할 수 있습니다 . 필요에 맞게 편집하십시오. :)


이 스크립트를 어떻게 실행합니까? 최신 버전 halevt의 현재 apt-get가능한 패키지 가 아닌 것 같습니다 .
Campbeln

아아 ... 어쩌면 내가
ck ote 소테

1

수동으로 데이터를 입력 할 필요가 없도록 mountmanager를 통해 구성 해보십시오.

우분투 저장소의 일부 여야합니다.


유니버스 섹션을 사용하도록 설정해야합니다.
quack quixote

apt : mountmanager? section = universe;)
endolith

저에게 fstab을 설정합니까?
endolith

@endolith : apt : universe? install = mountmanager가 더 논리적이지 않습니까? ;)
Bobby

해당 형식이 작동합니까?
endolith 2009

-5

한 번에 하나의 드라이브 만 마운트 된 경우 /etc/fstab파일 로 간단히 편집 할 수 있습니다 . 다음과 같은 내용이 있습니다.

/dev/sdb1     /mnt/usbdrive     ext3     defaults 0   0

부팅 할 때 마운트해야하며 권한이있는 모든 사용자가 액세스 할 수 있어야합니다. 하나 이상의 드라이브가있는 경우에도 다음을 사용하여이 작업을 수행 할 수 있습니다.

/dev/sdb1     /mnt/usbdrive1     ext3     defaults 0   0
/dev/sdc1     /mnt/usbdrive2     ext3     defaults 0   0

6
분명히 질문이 묻는 것이 아닙니다.
quck quixote
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.