如何通过udev规则将指定USB端口设为只读挂载端口?
实现指定USB端口的强制只读挂载
核心思路
通过udev规则匹配特定USB端口的块设备,同时从内核层面设置块设备为只读模式,既实现自动只读挂载,也能阻止root用户通过dd等工具直接写入设备。
步骤1:定位目标USB端口的唯一标识
- 将任意U盘插入目标USB端口,通过
lsblk或dmesg找到对应的块设备名(比如/dev/sdb)。 - 运行以下命令获取该端口的udev匹配属性:
输出中找最接近USB端口的层级(比如udevadm info -a -n /dev/sdb | grep -E "KERNELS|busnum|devpath"KERNELS=="1-2",或ATTRS{busnum}=="1"、ATTRS{devpath}=="2"),这些属性可以唯一识别目标端口,不会随插入的U盘变化。
步骤2:编写udev规则
- 创建udev规则文件:
sudo nano /etc/udev/rules.d/90-usb-readonly.rules - 写入以下规则(根据步骤1获取的属性替换对应值):
# 匹配指定USB端口的块设备,强制设为只读 SUBSYSTEM=="block", SUBSYSTEMS=="usb", KERNELS=="1-2", \ ENV{UDISKS_AUTO_MOUNT_HINT}="ro", \ RUN+="/bin/sh -c 'echo 1 > /sys/block/%k/ro'"- 若用
busnum和devpath匹配,替换为:SUBSYSTEM=="block", SUBSYSTEMS=="usb", ATTRS{busnum}=="1", ATTRS{devpath}=="2", \ ENV{UDISKS_AUTO_MOUNT_HINT}="ro", \ RUN+="/bin/sh -c 'echo 1 > /sys/block/%k/ro'"
SUBSYSTEM=="block":匹配U盘对应的块设备(而非USB控制器)SUBSYSTEMS=="usb":限定为USB来源的设备KERNELS/ATTRS:精准匹配目标USB端口ENV{UDISKS_AUTO_MOUNT_HINT}="ro":告诉udisks自动挂载时使用只读模式RUN命令:直接向块设备的只读控制节点写入1,内核层面禁止所有写入操作
- 若用
步骤3:生效并验证规则
- 重新加载udev规则:
sudo udevadm control --reload-rules - 拔出U盘,重新插入目标端口,进行验证:
- 检查挂载状态:
mount | grep /dev/sdb1,输出中应包含ro - 检查块设备只读属性:
cat /sys/block/sdb/ro,输出应为1 - 测试写入:
sudo dd if=/dev/zero of=/dev/sdb bs=1M count=1,应返回权限错误或只读设备提示
- 检查挂载状态:
注意事项
- 若重启后端口的
busnum或devpath变化,优先使用KERNELS属性(比如1-2),它对应USB端口的物理路径,更稳定。 - 若系统未使用udisks自动挂载,手动挂载时即使指定
rw选项也会失败,因为块设备本身已被内核设为只读。 - 如需临时取消该端口的只读限制,可手动执行
echo 0 > /sys/block/sdb/ro,但重新插拔U盘后会恢复只读。
内容的提问来源于stack exchange,提问作者000
相关产品推荐
相关产品推荐

