Как игнорировать назначение /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 для вашего устройства. Я не эксперт по этой теме, но вы можете изучить эти ссылки:

Это все, что я знаю. Надеюсь, поможет.

Другие вопросы по тегам