我需要以只读方式安装某些 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。
任何帮助,将不胜感激。
原来的(预
systemd
)实现udev
被证明太强大了:它引入了竞争条件和其他安全问题。因此,现代版本systemd-udevd
比其前身更加受限制,并且无法执行旧版本所做的所有相同操作。有很多关于如何使用旧版本安装可移动磁盘的信息udev
,但当前的建议是您不应该这样做,并且udevd
在较新的发行版中实施的沙箱和其他安全限制实际上使其变得越来越困难或不切实际。目前的理解本质上是,
udev
主要工作是及时创建和管理具有适当所有权和权限的设备节点,并可选择在设备节点上提供一些额外的元数据供其他服务使用;应避免任何可能损害主要工作的其他事情。因此,任何会导致udev
启动长时间运行的进程的行为都是正确的。挂载文件系统可能需要任意长的时间,特别是在文件系统很大或损坏的情况下,因此
udevd
应该将其留给其他服务,udisks2
而不是直接执行。如果 Mint 21.1 有
udisks2
版本 2.9.0 或更高版本(包名称可能是因为在当前版本之前libudisks2-0
曾经有另一个实现),那么这将是一个更好的地方。udisks
/etc/udisks2/mount_options.conf
你可以这样做:
本文档
mount_options.conf
包含许多示例,包括用于通过设备序列号匹配特定 USB 存储设备的示例 udev 规则,这比使用您想要的文件系统标签更安全:http: //storages.org/doc/udisks2-api/latest/mount_options.html通常,可移动媒体设备会获得
TAG+="uaccess"
udev 规则,该规则为本地登录的用户提供对设备的写访问权限。这意味着他们自动拥有更改任何可移动媒体设备上的文件系统标签所需的所有权限。这意味着您提出的使用文件系统标签来防止恶意更改的策略可以轻松解决,并且不安全。