![使 USB 设备对 root 以外的用户可写](https://linux22.com/image/14421/%E4%BD%BF%20USB%20%E8%AE%BE%E5%A4%87%E5%AF%B9%20root%20%E4%BB%A5%E5%A4%96%E7%9A%84%E7%94%A8%E6%88%B7%E5%8F%AF%E5%86%99.png)
我有一个 USB 设备,格式为 FAT32(为了尽可能广泛的兼容性),插入运行 CentOS 5 的系统(是的,我知道它已经过时了)。
插入它的全部目的是接收从其他两个系统发送的备份文件。
但由于(显然)UDEV 默认行为,它(及其子目录)安装为“drwxr-xr-x 5 root root”,拒绝接受发送给它的任何内容,并拒绝任何“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"
并重新启动;没有效果
再往下我发现了这个(在“persistent_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
chown
并且chmod
不起作用,因为 FAT 没有实现它们,但是在安装时,您可以指定umask
允许每个人写入它或uid
设置闪存驱动器上所有内容的所有者。如果您正在谈论安装它的能力,您可以/etc/fstab
使用适当的选项添加条目 和users
。我想在 CentOS 5 中,你没有那么多东西连接到设备来保证比静态更复杂的东西fstab
。
答案2
如果您想使用自动挂载,udev
您可以将类似的内容添加到您的 udev 规则中:
# 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
我最终采取了不同的方法。
我设置了一个 cron 作业,每五分钟运行一次,以在 root 权限下将上传到备份用户主目录的文件传输到 USB 驱动器,并防止它们在上传完成之前传输,我有上传客户端设置为发送不带扩展名的文件,然后在上传完成后重命名它们以添加扩展名。
然后我发现注销控制台会卸载 USB 设备。使用基于 udev 的自动挂载就到此为止了。
因此,由于 cron 作业的脚本已经存在,我设置了自己的挂载点,然后添加代码来查看挂载点是否存在正确设置的 USB 设备,如果不存在,它会尝试挂载该设备。
然后我发现了整个练习的第一个惊喜:虽然将设备安装在我的安装点使其无法显示在 /media 下,但它以某种方式确实出现了不是当我登录时,阻止 Gnome 在桌面上提供它。