我有一个沃达丰的 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/cdrom
USB 记忆棒,而不是在插入时自动安装 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 规则有关。我不是这个主题的专家,但您可能想研究这些链接:
- http://blog.pucp.edu.pe/item/88256
- http://www.reactivated.net/writing_udev_rules.html
- http://en.wikipedia.org/wiki/Udev
- http://noenieto.com/blog/udev-en-linux
这就是我所知道的。希望对您有帮助。