如何以只读方式安装特定 USB 驱动器

如何以只读方式安装特定 USB 驱动器

我需要以只读方式安装某些 USB 驱动器 - 不是每个驱动器,只是那些包含存档数据的驱动器。我想防止意外或恶意更改。

已经写了很多关于udev,这似乎是可能的,但我的规则似乎并未得到执行。我学过如何创建 udev 规则以只读方式挂载 USB 驱动器?- 我没有 gvfs,其他答案没有帮助。

这是我的/etc/udev/rules.d/25-usb-read-only.rules文件。为了进行测试,我使用卷名为 SCRATCH 的驱动器。该驱动器安装在/dev/sda,但始终可写。

#SUBSYSTEM=="usb", ACTION=="add", ENV{ID_FS_LABEL}=="SCRATCH", ENV{UDISKS_MOUNT_OPTIONS}="ro"
SUBSYSTEM=="usb", ACTION=="add", ENV{ID_FS_LABEL}=="SCRATCH", MODE="0550"
#SUBSYSTEMS=="usb", ACTION=="add", ENV{ID_FS_USAGE}=="filesystem", ENV{ID_FS_LABEL}=="SCRATCH", ENV{UDISKS_MOUNT_OPTIONS}="ro"
# The RUN here just to test the rule is executed
#KERNEL=="sd*", SUBSYSTEMS=="usb", ACTION=="add", ENV{ID_FS_USAGE}=="filesystem", ENV{ID_FS_LABEL}=="SCRATCH", RUN+="/home/test-udev.sh"

注释行是之前失败的尝试。我在两次考试之间都记得sudo udevadm control --reload

请注意,即使 RUN 命令也失败了。该脚本仅写入调试文件,并在从命令行执行时起作用。

我已经启用了调试并进行了检查/var/log/syslog——仅在测试的几秒钟内就有数万行。我找不到任何有用的东西。

我的系统是 Linux Mint 21.1 Cinnamon,但以上所有内容都来自 bash。

任何帮助,将不胜感激。

答案1

原来的(预systemd)实现udev被证明太强大了:它引入了竞争条件和其他安全问题。因此,现代版本systemd-udevd比其前身更加受限制,并且无法执行旧版本所做的所有相同操作。有很多关于如何使用 old 挂载可移动磁盘的信息udev,但当前的建议是你不应该那样做,而udevd在新发行版中实施的沙箱和其他安全限制实际上使其变得越来越困难或不切实际。

目前的理解基本上是这样udev基本的工作是及时创建和管理具有适当所有权和权限的设备节点,以及可选地在设备节点上提供一些额外的元数据供其他服务使用;应避免任何可能损害主要工作的其他事情。因此,任何会导致udev启动长时间运行的进程的行为都是正确的。

挂载文件系统可能需要任意长的时间,特别是在文件系统很大或损坏的情况下,因此udevd应该将其留给其他服务,udisks2而不是直接执行。

如果 Mint 21.1 有udisks2版本 2.9.0 或更高版本(包名称可能是因为在当前版本之前libudisks2-0曾经有另一个实现),那么这将是一个更好的地方。udisks/etc/udisks2/mount_options.conf

你可以这样做:

[/dev/disk/by-label/SCRATCH]
defaults=ro
# removed "rw" from the global default list of allowed mount options
allow=exec,noexec,nodev,nosuid,atime,noatime,nodiratime,ro,sync,dirsync,noload

本文档mount_options.conf包含许多示例,包括用于按设备序列号匹配特定 USB 存储设备的示例 udev 规则,这比使用您想要的文件系统标签更安全: http://storagged.org/doc/udisks2-api/latest/mount_options.html

通常,可移动媒体设备会获得TAG+="uaccess"udev 规则,该规则为本地登录的用户提供对设备的写访问权限。这意味着他们自动拥有更改任何可移动媒体设备上的文件系统标签所需的所有权限。这意味着您提出的使用文件系统标签来防止恶意更改的策略可以轻松解决,并且不安全。

相关内容