저는 플러그 앤 플레이 시스템(GUI가 아닌 SSH만 있음)에서 Debian Squeeze를 실행하고 있는데 USB 스틱을 삽입하면 자동으로 설치되도록 하는 것뿐입니다.
내가 하는 일은 autofs
장치가 어디에 있는지 알고 있다는 가정 하에 내가 수집한 정보를 기반으로 자동 설치를 처리하는 것 입니다 /dev
.
문제는 USB 스틱이 항상 동일한 장치 이름에 있지 않다는 것입니다. 때로는 그렇습니다 /dev/sdc1
, 때로는 /dev/sdd1
등.
이 문제를 해결하려면 이를 사용하여 udev
USB 스틱이 항상 동일한 이름을 갖도록 해야 한다고 생각합니다.
나는 그것으로부터 다음 정보를 얻습니다 udevadm
.
Udevadm info starts with the device specified by the devpath and then
walks up the chain of parent devices. It prints for every device
found, all possible attributes in the udev rules key format.
A rule to match, can be composed by the attributes of the device
and the attributes from one single parent device.
looking at device '/block/sdd/sdd1':
KERNEL=="sdd1"
SUBSYSTEM=="block"
DRIVER==""
ATTR{partition}=="1"
ATTR{start}=="63"
ATTR{size}=="129339"
ATTR{ro}=="0"
ATTR{alignment_offset}=="0"
ATTR{discard_alignment}=="0"
ATTR{stat}==" 31 244 275 190 0 0 0 0 0 190 190"
ATTR{inflight}==" 0 0"
looking at parent device '/devices/platform/orion-ehci.0/usb1/1-1/1-1.2/1-1.2:1.0/host8/target8:0:0/8:0:0:0/block/sdd':
KERNELS=="sdd"
SUBSYSTEMS=="block"
DRIVERS==""
ATTRS{range}=="16"
ATTRS{ext_range}=="256"
ATTRS{removable}=="1"
ATTRS{ro}=="0"
ATTRS{size}=="129439"
ATTRS{alignment_offset}=="0"
ATTRS{discard_alignment}=="0"
ATTRS{capability}=="51"
ATTRS{stat}==" 56 727 783 520 0 0 0 0 0 520 520"
ATTRS{inflight}==" 0 0"
ATTRS{events}=="media_change"
ATTRS{events_async}==""
ATTRS{events_poll_msecs}=="-1"
looking at parent device '/devices/platform/orion-ehci.0/usb1/1-1/1-1.2/1-1.2:1.0/host8/target8:0:0/8:0:0:0':
KERNELS=="8:0:0:0"
SUBSYSTEMS=="scsi"
DRIVERS=="sd"
ATTRS{device_blocked}=="0"
ATTRS{type}=="0"
ATTRS{scsi_level}=="3"
ATTRS{vendor}==" "
ATTRS{model}=="Flash Disk "
ATTRS{rev}=="2.00"
ATTRS{state}=="running"
ATTRS{timeout}=="30"
ATTRS{iocounterbits}=="32"
ATTRS{iorequest_cnt}=="0x90"
ATTRS{iodone_cnt}=="0x90"
ATTRS{ioerr_cnt}=="0x0"
ATTRS{modalias}=="scsi:t-0x00"
ATTRS{evt_media_change}=="0"
ATTRS{queue_depth}=="1"
ATTRS{queue_type}=="none"
ATTRS{max_sectors}=="240"
looking at parent device '/devices/platform/orion-ehci.0/usb1/1-1/1-1.2/1-1.2:1.0/host8/target8:0:0':
KERNELS=="target8:0:0"
SUBSYSTEMS=="scsi"
DRIVERS==""
looking at parent device '/devices/platform/orion-ehci.0/usb1/1-1/1-1.2/1-1.2:1.0/host8':
KERNELS=="host8"
SUBSYSTEMS=="scsi"
DRIVERS==""
looking at parent device '/devices/platform/orion-ehci.0/usb1/1-1/1-1.2/1-1.2:1.0':
KERNELS=="1-1.2:1.0"
SUBSYSTEMS=="usb"
DRIVERS=="usb-storage"
ATTRS{bInterfaceNumber}=="00"
ATTRS{bAlternateSetting}==" 0"
ATTRS{bNumEndpoints}=="02"
ATTRS{bInterfaceClass}=="08"
ATTRS{bInterfaceSubClass}=="06"
ATTRS{bInterfaceProtocol}=="50"
ATTRS{modalias}=="usb:v1976p6025d0100dc00dsc00dp00ic08isc06ip50"
ATTRS{supports_autosuspend}=="1"
looking at parent device '/devices/platform/orion-ehci.0/usb1/1-1/1-1.2':
KERNELS=="1-1.2"
SUBSYSTEMS=="usb"
DRIVERS=="usb"
ATTRS{configuration}==""
ATTRS{bNumInterfaces}==" 1"
ATTRS{bConfigurationValue}=="1"
ATTRS{bmAttributes}=="80"
ATTRS{bMaxPower}=="100mA"
ATTRS{urbnum}=="383"
ATTRS{idVendor}=="1976"
ATTRS{idProduct}=="6025"
ATTRS{bcdDevice}=="0100"
ATTRS{bDeviceClass}=="00"
ATTRS{bDeviceSubClass}=="00"
ATTRS{bDeviceProtocol}=="00"
ATTRS{bNumConfigurations}=="1"
ATTRS{bMaxPacketSize0}=="64"
ATTRS{speed}=="12"
ATTRS{busnum}=="1"
ATTRS{devnum}=="11"
ATTRS{devpath}=="1.2"
ATTRS{version}==" 1.10"
ATTRS{maxchild}=="0"
ATTRS{quirks}=="0x0"
ATTRS{avoid_reset_quirk}=="0"
ATTRS{authorized}=="1"
looking at parent device '/devices/platform/orion-ehci.0/usb1/1-1':
KERNELS=="1-1"
SUBSYSTEMS=="usb"
DRIVERS=="usb"
ATTRS{configuration}==""
ATTRS{bNumInterfaces}==" 1"
ATTRS{bConfigurationValue}=="1"
ATTRS{bmAttributes}=="e0"
ATTRS{bMaxPower}=="100mA"
ATTRS{urbnum}=="197"
ATTRS{idVendor}=="1a40"
ATTRS{idProduct}=="0101"
ATTRS{bcdDevice}=="0111"
ATTRS{bDeviceClass}=="09"
ATTRS{bDeviceSubClass}=="00"
ATTRS{bDeviceProtocol}=="01"
ATTRS{bNumConfigurations}=="1"
ATTRS{bMaxPacketSize0}=="64"
ATTRS{speed}=="480"
ATTRS{busnum}=="1"
ATTRS{devnum}=="2"
ATTRS{devpath}=="1"
ATTRS{version}==" 2.00"
ATTRS{maxchild}=="4"
ATTRS{quirks}=="0x0"
ATTRS{avoid_reset_quirk}=="0"
ATTRS{authorized}=="1"
ATTRS{product}=="USB 2.0 Hub"
looking at parent device '/devices/platform/orion-ehci.0/usb1':
KERNELS=="usb1"
SUBSYSTEMS=="usb"
DRIVERS=="usb"
ATTRS{configuration}==""
ATTRS{bNumInterfaces}==" 1"
ATTRS{bConfigurationValue}=="1"
ATTRS{bmAttributes}=="e0"
ATTRS{bMaxPower}==" 0mA"
ATTRS{urbnum}=="24"
ATTRS{idVendor}=="1d6b"
ATTRS{idProduct}=="0002"
ATTRS{bcdDevice}=="0206"
ATTRS{bDeviceClass}=="09"
ATTRS{bDeviceSubClass}=="00"
ATTRS{bDeviceProtocol}=="01"
ATTRS{bNumConfigurations}=="1"
ATTRS{bMaxPacketSize0}=="64"
ATTRS{speed}=="480"
ATTRS{busnum}=="1"
ATTRS{devnum}=="1"
ATTRS{devpath}=="0"
ATTRS{version}==" 2.00"
ATTRS{maxchild}=="1"
ATTRS{quirks}=="0x0"
ATTRS{avoid_reset_quirk}=="0"
ATTRS{authorized}=="1"
ATTRS{manufacturer}=="Linux 2.6.38.8 ehci_hcd"
ATTRS{product}=="Marvell Orion EHCI"
ATTRS{serial}=="orion-ehci.0"
ATTRS{authorized_default}=="1"
looking at parent device '/devices/platform/orion-ehci.0':
KERNELS=="orion-ehci.0"
SUBSYSTEMS=="platform"
DRIVERS=="orion-ehci"
ATTRS{modalias}=="platform:orion-ehci"
looking at parent device '/devices/platform':
KERNELS=="platform"
SUBSYSTEMS==""
DRIVERS==""
udev
나는 USB 스틱이 그 이름을 갖도록 강제하는 규칙을 작성하려고 노력해 왔지만 /dev/usbstick
지금까지는 성공하지 못했습니다.
이 USB 스틱이 항상 같은 이름을 갖도록 규칙 파일에 어떤 규칙을 지정해야 하는지 도와줄 수 있는 사람이 있나요?
-- 아니면 완전히 분실된 USB 스틱을 자동으로 마운트하는 더 쉬운 방법이 있습니까?
고쳐 쓰다
좋아, 좀 진전이 있었어. 다음 규칙을 추가했습니다.
SUBSYSTEMS=="scsi", ATTRS{model}=="Flash Disk ", DRIVERS=="sd", NAME="usbstick-%k" RUN+="mkdir /mnt/usbstick-%k; mount /dev/usbstick-%k /mnt/usbstick-%k"
추가/제거를 처리하는 데 여전히 약간의 작업이 필요하다는 것을 알고 있지만 현재로서는 이것은 단지 기본적인 테스트일 뿐입니다.
그 결과 이제 , , 및 /dev
에서 3개의 새로운 장치 노드를 얻을 수 있게 되었습니다 ./dev/usbstick-sdc
/dev/usbstick-sdc1
usbstick-sg2
그러나 RUN
해당 섹션의 코드는 한 번만 실행되고 하나의 디렉터리만 생성된다는 것을 발견했습니다 mnt/usbstick-sdc
. 나는 또한 디렉토리가 항상 비어 있다는 것을 알았습니다. 그래서 분명히 뭔가가 여전히 잘못되었습니다! (그래도 나는 진전을 보이고 있습니다).
답변1
저는 이 일반적인 문제를 해결하는 더 쉬운 방법이 있어야 한다고 생각했고, 실제로 그렇습니다. 이것이 내가 wheezy/sid 서버에서 시도한 것입니다:
sudo apt-get install usbmount
USB 플래시 드라이브를 삽입하면 완료됩니다! 이제 내 지팡이에 액세스할 수 있습니다 /media/usb
.
그런데 usbmount에는 매뉴얼 페이지가 없습니다. 읽어보세요 /usr/share/doc/usbmount/README.gz
. 기본적으로 usbmount는 동기화 옵션을 사용하여 스틱을 마운트하는 것 같습니다. 스틱을 비동기식으로 설치 및 실행 하거나 플러그를 뽑기 전에 실행하는 것이 sync
더 나을 수 있습니다 umount
. 이는 구성 가능합니다.
답변2
단 하나의 장치 노드로만 표현할 수는 없습니다.어느플래시 드라이브가 연결될 수 있습니다. 2개가 삽입되면 어떻게 되나요? 아니면 펜 드라이브에 여러 개의 파티션이 있는 경우?
일반적으로 사용자 정의 명명된 장치 노드를 생성하는 데 사용하는 것은 SYMLINK+=
규칙에서 사용 방법을 확인하기 위한 .Grep입니다. grep SYMLINK /etc/udev/rules.d/*
모든 udev 트리거 명령과 마찬가지로 에 설명된 대로 몇 가지 의미 있는 변수를 사용할 수 있습니다 man udev
. 변수를 통해 스크립트에 이름을 제공하기만 하면 되므로 실제로 장치에 사용자 정의 이름을 지정할 필요가 없다는 것을 알 수 있습니다 %k
.
자동 마운트 솔루션에 대해서는 살펴보십시오.도시항공교통국, 제가 조금 설명했습니다.이 질문에 대한 대답.
답변3
이것이 제가 최근에 해왔던 일이고 지금은 이 방법에 매우 만족하고 있습니다. 이것은 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]
# for automounter support
ACTION=="add", KERNEL=="sd*", ENV{DEVTYPE}=="partition", \
ENV{ID_BUS}=="usb", \
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", \
SYMLINK+="usbdisks/%k", MODE:="0660"
# When device is removed, also remove /media/usb/<...>
ACTION=="remove", KERNEL=="sd*", ENV{DEVTYPE}=="partition", \
ENV{ID_BUS}=="usb", \
RUN+="/bin/rm /media/usb/%k"
기능: 두 개의 심볼릭 링크를 생성합니다. 하나는 "/dev/usbdisks/<...>" 아래의 USB 저장 장치 파티션에 대한 것입니다.
두 번째 심볼릭 링크는 자동 설치 프로그램 지원을 위해 "/media/usb/<...>"에서 "/media/autousb/<...>"로 연결됩니다(2단계 참조).
udev가 이러한 규칙을 읽도록 하려면 다음을 사용하세요.
sudo udevadm control --reload-rules
참고: 동일한 이름을 가진 동일한 USB 스틱에 대해서는 가능하지만 위험할 수 있습니다. 예를 들어 위의 UDEV 규칙에서 "%k" 대신 "$env{ID_FS_LABEL_ENC}"를 사용할 수 있습니다. 이렇게 하면 볼륨 레이블이 있는 /media/usb/<...>가 생성되지만 두 개의 USB 스틱을 삽입하고 둘 다 동일한 볼륨 레이블을 사용하면 어떻게 될까요?
이 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" 및 "ext4" 파일 시스템에 대한 샘플 코드를 포함했습니다. 물론 더 많은 파일 시스템을 지원하도록 확장하는 것도 쉽습니다.
3단계)
선택 사항... USB 스틱(또는 USB 스틱의 파티션)을 "꺼내기" == 마운트 해제하려면 /sbin/usbeject 아래에 스크립트를 만듭니다.
#!/bin/bash
# make sure everything is written to USB disk(s)
sync
# sending SIUGSR1 to automount will unmount the media
killall -s SIGUSR1 /usr/sbin/automount
이 스크립트를 사용하면 "sudo usbeject"를 사용하여 마운트된 모든 USB 장치 파티션을 마운트 해제할 수 있습니다(자동 마운트에 마운트 해제하도록 지정).
물론, 파티션이 어느 곳에서도 사용되지 않는지 확인할 수 있습니다. 자동 마운트는 60초 시간 초과 후 파티션을 마운트 해제합니다.
여기서 진짜 비결은 "/media/usb"에서 "/media/autousb"로의 심볼릭 링크를 사용하는 것입니다.
- "/media/usb" 심볼릭 링크는 사용자에게 어떤 USB 저장 장치 파티션이 있는지에 대한 간단한 개요를 제공하기 위해 udev에 의해 생성됩니다.
- /media/usb를 통해 파티션을 사용하는 경우 AutoFS는 요청 시 파티션을 자동으로 마운트합니다.
- 스크립트된 "auto.usb" 파일을 사용하면 모든 유형의 파일 시스템을 지원할 수 있을 뿐만 아니라 모든 유형의 명명 체계도 지원할 수 있습니다.
- 이 방법은 파티션이 서로 다른 파일 시스템 유형을 사용하는 경우에도 여러 파티션이 있는 USB 메모리 스틱을 지원합니다.
답변4
내가 찾은 가장 좋은 답변은 Jessie에서 유지 관리되지 않고 작동하지 않기 때문에 실제로 더 이상 사용되지 않습니다 (malat의 의견 참조)
나 (Jesse)에게 해결책은 다음과 같습니다.이 블로그매력처럼 작동합니다.
"ddumont"에게 감사드립니다. 하지만 향후 링크 깨짐 문제가 발생할 경우를 대비해 여기에 그의 블로그/답변 개요를 게시하세요.
다음 줄을 추가하십시오./etc/fstab
/dev/sr0 /media/bluray auto defaults,nofail,x-systemd.automount 0 2
nano를 사용하면 다음과 같이 할 수 있습니다.
sudo nano /etc/fstab
설명하다:
/dev/sr0
장치 파일입니다. /dev/disk/by-id에 설정된 udev 심볼릭 링크 중 하나를 사용할 수도 있습니다. 장치 파일에 따라 이 설정을 변경해야 합니다( sudo fdisk -l
장치 목록을 표시하려면).
/media/bluray
마운트 지점입니다. 다른 마운트 지점을 선택할 수 있습니다
nofail
CD-ROM 드라이브에 CD 없이 부팅할 때 오류 보고를 피해야 합니다.
x-systemd.automount
삽입된 디스크를 자동으로 마운트하도록 systemd를 구성하는 옵션입니다.
noauto를 지정하지 마십시오. 이렇게 하면 systemd가 자동으로 디스크를 마운트하지 못하게 되어 목적이 무산됩니다.
시험
journalctl -x -f
터미널에서 명령을 실행하여 systemd에서 무슨 일이 일어나고 있는지 확인하십시오.
시스템 구성 다시 로드를 사용하십시오 sudo systemctl daemon-reload
.
디스크를 광학 드라이브에 넣습니다.
Journalctl은 다음과 같은 내용을 표시해야 합니다.
Sept. 27 16:07:01 frodo systemd[1]: Mounted /media/bluray.
더 멀리
NTFS 드라이브를 성공적으로 마운트하려면 ntfs-3g(이전 ntfsprogs)를 설치해야 했습니다.
sudo apt-get install ntfs-3g
OSX 형식의 USB가 작동하도록 하기 위해 hfsprogs를 설치할 필요는 없었지만 직접 확인해야 합니다.