如何忽略将 /dev/cdrom 分配给特定设备?

如何忽略将 /dev/cdrom 分配给特定设备?

我有一个沃达丰的 HDSPA USB 棒,用于移动宽带,华为 型号 K3520(我认为在某些地方也指定了 E169)它在 Ubuntu 10.04“Lucid”中运行良好(amd64)。Ubuntu 会自动将该设备安装为 CD-ROM 设备——据说是由 HAL 守护进程安装的,哈尔德——即包含设备特定软件的“分区”。

自动挂载分区的内容(将记忆棒插入 USB 端口后):

ubuntu@lucid:~$ ls -lh /media/VMC\ LITE*/
total 37M
-r-------- 1 ubuntu ubuntu   70 2008-03-13 19:39 Autorun.inf
-r-------- 1 ubuntu ubuntu  36M 2008-04-14 19:28 helper.exe
-r-------- 1 ubuntu ubuntu 316K 2008-03-13 17:33 setup.exe
ubuntu@lucid:~$ 

在检测到 USB 设备后,符号链接/dev/cdrom将从 CD-ROM 设备分配/dev/sr0给该设备,/dev/sr1

ubuntu@lucid:~$ ls -lh /dev/cdrom
lrwxrwxrwx 1 root root 3 2011-04-27 22:48 /dev/cdrom -> sr1
ubuntu@lucid:~$ ls -lh /dev/sr*
brw-rw----+ 1 root cdrom 11, 0 2011-04-27 22:34 /dev/sr0
brw-rw----+ 1 root cdrom 11, 1 2011-04-27 22:48 /dev/sr1
ubuntu@lucid:~$ 

虽然这不是一个严重的障碍,但仍然很烦人。例如,在控制台中,这强制指定eject -d /dev/sr0打开 CD-ROM 托盘,而不是简单的eject;据说,其他想要使用正版 CD-ROM 驱动器的程序将需要明确指定设备,而不是“假设”符号链接/dev/cdrom指向“正确的”设备。

我尝试遵循关于 hal 的 Arch Linux 线程,通过创建我自己的配置,/etc/hal/fdi/policy/cdrom.fdi内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<deviceinfo version="0.2">
  <device>
    <match key="block.storage_device" string="/org/freedesktop/Hal/devices/storage_model_CDDVDW_SH_S223C">
      <merge key="volume.policy.should_mount" type="bool">true</merge>
      <merge key="volume.policy.desired_mount_point" type="string">cdrom</merge>
    </match>
  </device>
  <device>
    <match key="storage.vendor" string="HUAWEI">
      <match key="storage.model" string="Mass Storage">
        <match key="storage.bus" string="usb">
          <match key="storage.drive_type" string="cdrom">
            <merge key="volume.policy.should_mount" type="bool">false</merge>
          </match>
        </match>
      </match>
    </match>
  </device>
</deviceinfo>

试图“凝聚”但未能成功哈尔德始终分配/dev/sr0/dev/cdromUSB 记忆棒,而不是在插入时自动安装 USB 记忆棒。

我意识到我可以使用gconf-editor切换键/apps/nautilus/preferences/media_automount,但这会影响全部媒体——这并不是我想要的,尽管考虑到这种“烦恼”的影响较小,它可能是一个可以接受的折衷方案。

然而,我正在研究一些哈尔德配置可能会产生预期的结果 - 忽略分配/dev/sr1(USB 记忆棒)到( CD-ROM 驱动器)并从而维持到(CD-ROM 驱动器)/dev/cdrom的符号链接。/dev/cdrom/dev/sr0

答案1

cdrom 设备的命名在 /etc/udev/rules.d/70-persistent-cd.rules 中配置。在我的文件中,有四行创建了 cdrom、cdrw、dvd 和 dvdrw 符号链接,它们都指向同一个驱动器:

SUBSYSTEM=="block", ENV{ID_CDROM}=="?*", ENV{ID_PATH}=="pci-0000:00:1f.2-scsi-2:0:0:0", SYMLINK+="cdrom", ENV{GENERATED}="1"
SUBSYSTEM=="block", ENV{ID_CDROM}=="?*", ENV{ID_PATH}=="pci-0000:00:1f.2-scsi-2:0:0:0", SYMLINK+="cdrw", ENV{GENERATED}="1"
SUBSYSTEM=="block", ENV{ID_CDROM}=="?*", ENV{ID_PATH}=="pci-0000:00:1f.2-scsi-2:0:0:0", SYMLINK+="dvd", ENV{GENERATED}="1"
SUBSYSTEM=="block", ENV{ID_CDROM}=="?*", ENV{ID_PATH}=="pci-0000:00:1f.2-scsi-2:0:0:0", SYMLINK+="dvdrw", ENV{GENERATED}="1"

这些行起什么作用?它们使用==操作员测试一些事情,然后添加(+=)符号链接或设置(=)环境变量 GENERATED。

您想在那里插入一个新测试,以便忽略您的 HSDPA 棒。

因此,您需要找到设备的一个独特属性。您可以 lsusb在终端中运行并查看是否在那里找到了 HSDPA 棒。您也可以询问 udev 本身,例如使用

udevadm info --export-db | less

(在“less”中,您可以使用 / 键进行搜索,然后使用 q 退出。)尝试查找唯一属性,如 ID_SERIAL、ID_VENDOR_ID 或 ID_MODEL_ID。ID_VENDOR_ID 和 ID_MODEL_ID 中的十六进制数字与 的输出中的数字相同lsusb

如果您发现了一些独特的东西,请在 udev 行中插入一个新测试,使用!=运算符比较不等式:

SUBSYSTEM=="block", ENV{ID_CDROM}=="?*", ENV{ID_SERIAL}!="_USB_DISK_Pro_075A06420103-0:1", ENV{ID_PATH}=="pci-0000:00:1f.2-scsi-2:0:0:0", SYMLINK+="cdrom", ENV{GENERATED}="1"

保存文件,弹出 USB 驱动器,重新插入并希望它能正常工作。

答案2

这与为您的设备编写一些 udev 规则有关。我不是这个主题的专家,但您可能想研究这些链接:

这就是我所知道的。希望对您有帮助。

相关内容