Как игнорировать назначение /dev/cdrom конкретному устройству?
У меня есть HDSPA USB-флешка от Vodafone для мобильного широкополосного доступа, модель HUAWEI K3520 (в некоторых местах также обозначенная E169, я думаю), которая прекрасно работает в Ubuntu 10.04 "Lucid" (amd64). Это устройство автоматически монтируется как устройство CD-ROM Ubuntu - предположительно, демоном HAL, hald, а именно - "разделом", содержащим специфическое для устройства программное обеспечение.
Содержимое автоматически смонтированного раздела (после вставки флешки в 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:~$
Символическая ссылка /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
указать на "правильное" устройство.
Я пытался следовать инструкциям из ветки Arch Linux о hald, создавая свою собственную конфигурацию как /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
вместо автонастройки флешки при вставке.
Я понимаю, что я мог бы использовать gconf-editor
переключить ключ /apps/nautilus/preferences/media_automount
, но это затронет все средства массовой информации - что не совсем то, что я ищу, хотя, учитывая низкое влияние этого "раздражения", это может быть приемлемым компромиссом.
Тем не менее, я смотрю на некоторое понимание того, какая конфигурация hald может дать желаемые результаты - игнорирование назначения /dev/sr1
(флешка) для /dev/cdrom
и тем самым поддерживая символическую ссылку /dev/cdrom
в /dev/sr0
(привод CD-ROM).
2 ответа
Именование устройств 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-накопитель, снова подключите его и надейтесь, что он работает.
Это как-то связано с написанием некоторых правил 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
Это все, что я знаю. Надеюсь, поможет.