通过 udev 忽略 USB 驱动器的两个分区中的一个

通过 udev 忽略 USB 驱动器的两个分区中的一个

我有一个有两个分区的 USB 盘。插入后,我使用以下命令来查找设备。

dmesg

示例输出

[11195.236020] usb 2-2: new high-speed USB device number 9 using ehci-pci
[11195.375432] usb 2-2: New USB device found, idVendor=058f, idProduct=6387
[11195.375436] usb 2-2: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[11195.375439] usb 2-2: Product: Mass Storage
[11195.375441] usb 2-2: Manufacturer: Generic
[11195.375444] usb 2-2: SerialNumber: 605DD851
[11195.375968] usb-storage 2-2:1.0: USB Mass Storage device detected
[11195.376732] scsi host10: usb-storage 2-2:1.0
[11196.377830] scsi 10:0:0:0: Direct-Access     Generic  Flash Disk       8.07 PQ: 0 ANSI: 4
[11196.378159] sd 10:0:0:0: Attached scsi generic sg3 type 0
[11196.379647] sd 10:0:0:0: [sdc] 15769600 512-byte logical blocks: (8.07 GB/7.51 GiB)
[11196.381548] sd 10:0:0:0: [sdc] Write Protect is off
[11196.381552] sd 10:0:0:0: [sdc] Mode Sense: 23 00 00 00
[11196.383579] sd 10:0:0:0: [sdc] Write cache: disabled, read cache: enabled, doesn't support DPO or FUA
[11196.390454]  sdc: sdc1 sdc2
[11196.394696] sd 10:0:0:0: [sdc] Attached SCSI removable disk

因此,我的设备是/sdc和我的分区/dev/sdc1/dev/sdc2


我使用了这两个命令来获取它们的 UUID

udevadm info /dev/sdc1 | grep ID_FS_UUID=

示例输出

E: ID_FS_UUID=dbf323e9-8d63-444c-9c11-76b9b9a0fed4

udevadm info /dev/sdc2 | grep ID_FS_UUID=

示例输出

E: ID_FS_UUID=0eeb7004-8955-4358-a205-07d7376adb8c

因此我的 UUID 是dbf323e9-8d63-444c-9c11-76b9b9a0fed40eeb7004-8955-4358-a205-07d7376adb8c

或每个分区

/dev/sdc1>>dbf323e9-8d63-444c-9c11-76b9b9a0fed4
/dev/sdc2>>0eeb7004-8955-4358-a205-07d7376adb8c


现在我创建了一个文件/etc/udev/rules.d/100-myusb.rules

sudo nano /etc/udev/rules.d/100-myusb.rules

并添加以下规则

KERNEL=="sd??", ENV{ID_FS_UUID}=="0eeb7004-8955-4358-a205-07d7376adb8c", ENV{UDISKS_IGNORE}="1"

并重新启动udev

sudo service udev restart

但再次插入后,两个分区都显示在FilesakaNautilus

我做错了什么?


编辑于 2015 年 9 月 6 日 21:07:50 CEST

规则

KERNEL=="sd??", ENV{ID_FS_UUID}=="0eeb7004-8955-4358-a205-07d7376adb8c", RUN+="/bin/mkdir /tmp/folder1"

创建文件夹/tmp/folder1

对于@Sneetsher

KERNEL=="sd??", ENV{ID_FS_UUID}=="0eeb7004-8955-4358-a205-07d7376adb8c", RUN+="/usr/bin/env > /tmp/udev-partition-env.log"

有效,但输出文件是env_root.output?o_O


编辑时间:2015 年 9 月 7 日星期一 20:31:06 CEST

测试过,无效

KERNEL=="sd??", ENV{ID_FS_UUID}=="0eeb7004-8955-4358-a205-07d7376adb8c", ENV{UDISKS_AUTO}="0", ENV{UDISKS_SYSTEM}="0"

KERNEL=="sd??", ENV{ID_FS_UUID}=="0eeb7004-8955-4358-a205-07d7376adb8c", ENV{UDISKS_AUTO}="0"

答案1

  • 最后,我在 VirtualBox 机器中设置了相同的环境 Ubuntu 15.04。

    ACTION=="add", ENV{ID_FS_UUID}=="bf50cb5d-60bf-44de-9a8f-1bf74850a5a1", ENV{UDISKS_IGNORE}="1"
    

    它的运行正如预期的那样完美。

  • :DI 讨厌 3 位数字前缀100-(通用/标准是 2),所以我使用99-大部分时候都是这样。我以前从未尝试过,将其重命名为类似于您的:

    # mv /etc/udev/rules.d/99-sneetsher-tests.rules /etc/udev/rules.d/100-myusb-sneetsher-tests.rules
    

    瞧!现在它不起作用了。

    该规则被其他规则覆盖,很确定系统规则来自/lib/udev/rules.d/

    您可以尝试列出所有规则文件来检查:

    find /etc/udev/rules.d/ /lib/udev/rules.d/ -iname "*.rules" -printf "%f\n" | sort
    

    规则文件

    udev 规则从位于系统规则目录 /lib/udev/rules.d、易失性运行时目录 /run/udev/rules.d 和本地管理目录 /etc/udev/rules.d 中的文件中读取。所有规则文件都按词汇顺序集体排序和处理,无论它们位于哪个目录中。但是,文件名相同的文件会互相替换。/etc 中的文件具有最高优先级,/run 中的文件优先于 /lib 中同名的文件。如果需要,这可用于用本地文件覆盖系统提供的规则文件;/etc 中与 /lib 中的规则文件同名的符号链接指向 /dev/null,将完全禁用规则文件。规则文件必须具有扩展名 .rules;其他扩展名将被忽略。

    来源: man udev

  • 也许这是检查的最佳方法udevadm test <path>, 例子:

    udevadm test /sys/devices/pci0000:00/0000:00:06.0/usb1/1-2/1-2:1.0/host9/target9:0:0/9:0:0:0/block/sdb/sdb2
    

    对名称100-myusb.rules&进行测试99-myusb.rules,您将看到规则文件读取的顺序以及触发了哪些规则。

    参考: 哪条 udev 规则触发?

相关内容