루트 이외의 사용자가 USB 장치에 쓸 수 있도록 설정

루트 이외의 사용자가 USB 장치에 쓸 수 있도록 설정

FAT32로 포맷된(최대한 호환성을 위해) USB 장치를 CentOS 5를 실행하는 시스템에 연결했습니다(예, 오래되었다는 것을 알고 있습니다).

삽입하는 목적은 다른 두 시스템에서 전송된 백업 파일을 수신하는 것입니다.

그러나 (분명히) UDEV 기본 동작으로 인해 해당 하위 디렉토리는 "drwxr-xr-x 5 루트 루트"로 설치되고 전송된 모든 항목을 거부하며 "chown"(오류 메시지와 함께)도 거부합니다. 또는 "chmod"(자동으로 실패함).

USB FAT32 장치의 기본 설치 동작을 변경하는 방법이 있습니까? 이 상자의 /etc/udev/rules.d에는 다음이 포함되어 있습니다.

05-udev-early.rules  60-pcmcia.rules         90-alsa.rules
40-multipath.rules   60-raw.rules            90-dm.rules
50-udev.rules        60-wacom.rules          90-hal.rules
51-hotplug.rules     61-uinput-stddev.rules  95-pam-console.rules
60-libsane.rules     61-uinput-wacom.rules   98-kexec.rules
60-net.rules         85-pcscd_ccid.rules     bluetooth.rules

여기서 객체는 다음과 같습니다.특히 피하세요피묻은 것은 명시적으로 설치되어야 합니다(그리고아니요다른 장치를 연결할 때마다 새로운 fstab 항목을 추가해야 합니다!

"udevmonitor"("udevadm" 제외)를 찾았고 장치를 연결했을 때:

UEVENT[1618003563.847325] add@/devices/pci0000:00/0000:00:1d.7/usb1/1-5
UEVENT[1618003563.847392] add@/devices/pci0000:00/0000:00:1d.7/usb1/1-5/usbdev1.4_ep00
UEVENT[1618003563.849089] add@/devices/pci0000:00/0000:00:1d.7/usb1/1-5/1-5:1.0
UEVENT[1618003563.849130] add@/class/scsi_host/host4
UEVENT[1618003563.849155] add@/devices/pci0000:00/0000:00:1d.7/usb1/1-5/1-5:1.0/usbdev1.4_ep8b
UEVENT[1618003563.849180] add@/devices/pci0000:00/0000:00:1d.7/usb1/1-5/1-5:1.0/usbdev1.4_ep0a
UEVENT[1618003563.849203] add@/class/usb_device/usbdev1.4
UDEV  [1618003563.850150] add@/devices/pci0000:00/0000:00:1d.7/usb1/1-5
UDEV  [1618003564.062789] add@/devices/pci0000:00/0000:00:1d.7/usb1/1-5/usbdev1.4_ep00
UDEV  [1618003564.186813] add@/devices/pci0000:00/0000:00:1d.7/usb1/1-5/1-5:1.0
UDEV  [1618003564.298705] add@/devices/pci0000:00/0000:00:1d.7/usb1/1-5/1-5:1.0/usbdev1.4_ep8b
UDEV  [1618003564.298769] add@/devices/pci0000:00/0000:00:1d.7/usb1/1-5/1-5:1.0/usbdev1.4_ep0a
UDEV  [1618003564.308695] add@/class/scsi_host/host4
UDEV  [1618003564.614084] add@/class/usb_device/usbdev1.4
UEVENT[1618003569.124366] add@/devices/pci0000:00/0000:00:1d.7/usb1/1-5/1-5:1.0/host4/target4:0:0/4:0:0:0
UEVENT[1618003569.124416] add@/class/scsi_disk/4:0:0:0
UEVENT[1618003569.179432] add@/block/sda
UEVENT[1618003569.179466] add@/block/sda/sda1
UEVENT[1618003569.179485] add@/block/sda/sda2
UEVENT[1618003569.179508] add@/class/scsi_device/4:0:0:0
UEVENT[1618003569.179612] add@/class/scsi_generic/sg0
UDEV  [1618003569.290405] add@/devices/pci0000:00/0000:00:1d.7/usb1/1-5/1-5:1.0/host4/target4:0:0/4:0:0:0
UDEV  [1618003569.423752] add@/class/scsi_generic/sg0
UDEV  [1618003569.423806] add@/class/scsi_disk/4:0:0:0
UDEV  [1618003569.474344] add@/class/scsi_device/4:0:0:0
UDEV  [1618003569.505476] add@/block/sda
UDEV  [1618003569.861895] add@/block/sda/sda1
UDEV  [1618003569.919434] add@/block/sda/sda2
UEVENT[1618003570.253329] mount@/block/sda/sda2
UDEV  [1618003570.254399] mount@/block/sda/sda2

udevinfo -p /block/sda/sda2 -q 둘 다 나에게 다음을 제공했습니다.

P: /block/sda/sda2
N: sda2
S: disk/by-id/usb-Seagate_BUP_Slim_BK_NA7LFNNT-part2
S: disk/by-path/pci-0000:00:1d.7-usb-0:5:1.0-scsi-0:0:0:0-part2
S: disk/by-uuid/6D63-17F2
S: disk/by-label/BACKUP
E: ID_VENDOR=Seagate
E: ID_MODEL=BUP_Slim_BK
E: ID_REVISION=0143
E: ID_SERIAL=Seagate_BUP_Slim_BK_NA7LFNNT
E: ID_TYPE=disk
E: ID_BUS=usb
E: ID_PATH=pci-0000:00:1d.7-usb-0:5:1.0-scsi-0:0:0:0
E: ID_FS_USAGE=filesystem
E: ID_FS_TYPE=vfat
E: ID_FS_VERSION=FAT32
E: ID_FS_UUID=6D63-17F2
E: ID_FS_LABEL=BACKUP
E: ID_FS_LABEL_SAFE=BACKUP

udevinfo -p /block/sda2 -1 의 결과는 다음과 같습니다.

  looking at device '/block/sda/sda2':
    KERNEL=="sda2"
    SUBSYSTEM=="block"
    SYSFS{stat}=="      38      329      661      163        1        1        2        4        0      139      167"
    SYSFS{size}=="1952849920"
    SYSFS{start}=="411648"
    SYSFS{dev}=="8:2"

  looking at parent device '/block/sda':
    ID=="sda"
    BUS=="block"
    DRIVER==""
    SYSFS{stat}=="     112     1237     1811      361        1        1        2        4        0      241      365"
    SYSFS{size}=="1953525167"
    SYSFS{removable}=="0"
    SYSFS{range}=="16"
    SYSFS{dev}=="8:0"
. . .

/etc/udev/rules.d/50-udev.rules에 가서 변경해 보았습니다.

# all block devices
SUBSYSTEM=="block",             GROUP="disk", MODE="0640"
KERNEL=="root",                 GROUP="disk", MODE="0640"

도착하다

# all block devices
SUBSYSTEM=="block",             GROUP="disk", MODE="0660"
KERNEL=="root",                 GROUP="disk", MODE="0640"

다시 시작했는데 효과가 없었습니다.

더 아래에서 나는 이것을 발견했습니다("percious_end" 이후):

ACTION=="add", SUBSYSTEM=="usb_device", \
        PROGRAM="/bin/sh -c 'K=%k; K=$${K#usbdev}; printf bus/usb/%%03i/%%03i $${K%%%%.*} $${K#*.}'", \
        NAME="%c", MODE="0644"

그리고 644를 664로 변경해 보았지만 효과가 없었습니다(게다가 하위 시스템은 "블록"이어야 함).

USB 장치 액세스를 여는 MODE 매개변수를 지정하기 위해 뭔가를 넣을 수 있는 다른 곳이 있습니까?

나는 알아차렸다

UEVENT[1618003570.253329] mount@/block/sda/sda2
UDEV  [1618003570.254399] mount@/block/sda/sda2

udevmonitor 출력의 맨 아래에 있습니다. "mount"에 대한 grep이 "mount" 이벤트에 응답하는 단일 규칙을 찾지 못한 것으로 나타났습니다. 이 문제에 대응하여 설치 매개변수를 변경하거나 장치를 다시 설치하는 등 추가할 수 있는 것이 있습니까?

답변1

chownFAT가 이를 구현하지 않기 때문에 작동 chmod하지 않습니다. 하지만 설치 시 umask모든 사람이 FAT에 쓸 수 있도록 지정하거나 uid플래시 드라이브에 있는 모든 항목의 소유자를 설정할 수 있습니다. 설치 기능에 대해 이야기하는 경우 /etc/fstab항목을 추가하고 적절한 옵션을 사용할 수 있습니다 users. CentOS 5에서는 static보다 더 복잡한 것을 보장하기 위해 장치에 연결된 것들이 많지 않은 것 같습니다 fstab.

답변2

자동 마운트를 사용하려면 udevudev 규칙에 다음과 같은 내용을 추가할 수 있습니다.

# Symlinks

SUBSYSTEM=="block", KERNEL=="sd?",       ACTION=="add",    PROGRAM="/etc/udev/scripts/isremovable.sh %k", RESULT=="YES", SYMLINK="usb_flash_raw", RUN+="/etc/udev/scripts/mount.sh %k"
SUBSYSTEM=="block", KERNEL=="sd?[0-9]*", ACTION=="add",    PROGRAM="/etc/udev/scripts/isremovable.sh %k", RESULT=="YES", SYMLINK="usb_flash_p%n", RUN+="/etc/udev/scripts/mount.sh %k"

# umount

SUBSYSTEM=="block", KERNEL=="sd?",       ACTION=="remove", RUN+="/etc/udev/scripts/umount.sh > /dev/null 2> /dev/null"

제거 가능한 영역은 다음과 같습니다.

#!/bin/sh
DEV="`basename "$1" | sed 's|[0-9]*$||'`"
if [ "`find /sys -name "$DEV" | grep usb`" ]; then
        echo "YES"
        exit 0
else
        echo "NO"
        exit 1
fi

마운트/마운트 해제 스크립트는 원하는 대로 지정할 수 있지만 안전한 마운트 해제를 처리하는 것은 쉽지 않습니다.

답변3

나는 결국 다른 접근법을 취하게 되었다.

백업 사용자의 홈 디렉터리에 업로드된 파일을 루트 권한이 있는 USB 드라이브로 전송하고 업로드가 완료될 때까지 해당 파일이 전송되지 않도록 방지하기 위해 5분마다 실행되도록 cron 작업을 설정했습니다. 업로드 클라이언트는 no를 보내도록 설정했습니다. 확장자를 가진 파일을 선택한 다음 이름을 변경하여 업로드가 완료된 후 확장자를 추가하세요.

그러다가 콘솔에서 로그아웃하면 USB 장치가 마운트 해제되는 것을 발견했습니다. 이것이 udev 기반 자동 마운트를 사용하는 것입니다.

그래서 cron 작업을 위한 스크립트가 이미 존재했기 때문에 자체 마운트 지점을 설정한 다음 해당 마운트 지점에 USB 장치가 올바르게 설정되었는지 확인하고 그렇지 않은 경우 마운트를 시도하는 코드를 추가했습니다. 장치.

그런 다음 전체 연습에서 첫 번째 놀라움을 발견했습니다. 마운트 지점에 장치를 마운트하면 /media 아래에 표시되지 않았지만 어떻게든 표시되었습니다.아니요로그인할 때 Gnome이 데스크탑에 서비스를 제공하지 못하도록 합니다.

관련 정보