You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过udev规则将指定USB端口设为只读挂载端口?

实现指定USB端口的强制只读挂载

核心思路

通过udev规则匹配特定USB端口的块设备,同时从内核层面设置块设备为只读模式,既实现自动只读挂载,也能阻止root用户通过dd等工具直接写入设备。

步骤1:定位目标USB端口的唯一标识

  1. 将任意U盘插入目标USB端口,通过lsblk或dmesg找到对应的块设备名(比如/dev/sdb)。
  2. 运行以下命令获取该端口的udev匹配属性:
    udevadm info -a -n /dev/sdb | grep -E "KERNELS|busnum|devpath"
    
    输出中找最接近USB端口的层级(比如KERNELS=="1-2",或ATTRS{busnum}=="1"、ATTRS{devpath}=="2"),这些属性可以唯一识别目标端口,不会随插入的U盘变化。

步骤2:编写udev规则

  1. 创建udev规则文件:
    sudo nano /etc/udev/rules.d/90-usb-readonly.rules
    
  2. 写入以下规则(根据步骤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:生效并验证规则

  1. 重新加载udev规则:
    sudo udevadm control --reload-rules
    
  2. 拔出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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 00:50:06