Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Извлечение USB-устройств в Linux

Автор вопроса: markОтветов: 1

Я использую Udisks через dbus в python для размонтирования USB-устройства (в данном случае Kindle), но я хотел бы отправить на него сигнал извлечения, так как это возвращает Kindle из режима USB в его обычный интерфейс.

Udisks не позволит мне использовать DriveEject, так как это не настоящий диск, и я понимаю, что это функция. Указана ошибка:

dbus.exceptions.DBusException: org.freedesktop.UDisks.Error.Failed: Device is not a drive

В документации Udisks упоминается свойство извлечения:

ID_DRIVE_EJECTABLE

Является ли носитель в дисководе физически извлекаемым. Установите это значение на 1 (или 0), только если диск действительно использует (или не использует) извлекаемый носитель. В частности, нет необходимости устанавливать это, например, для Устройства iPod или Kindle, где необходимо отправить команду через eject(1), так как сеанс пользователя рабочего стола предложит эту опцию для съемных устройств независимо от того, являются ли они извлекаемыми. Если это свойство не установлено, будет использоваться эвристика для определения возможности извлечения носителя (диски, использующие оптические носители, Zip или Jaz, считаются извлекаемыми).

но не объясняет, как это сделать из пользовательского сеанса рабочего стола.

(Nautilus позволяет мне нормально извлекаться из оболочки рабочего стола. Команда оболочки "eject" отключится, но не отправит сигнал извлечения на устройство без sudo)

Есть ли законный способ сделать это с Udisks, и если нет, то как это делает nautlius?

  • У меня возникло бы искушение просмотреть исходный код и/или конфигурацию Nautilus... Chris Stratton 22.02.2011
  • Кто бы ни проголосовал за закрытие: очевидно, что Марк очень хорошо знает о Суперпользователе, так как у него гораздо больше представителей там, чем здесь. Похоже, он открыл здесь аккаунт специально, чтобы иметь возможность задать этот вопрос. Поэтому я думаю, можно с уверенностью предположить, что он ищет решение, которое требует некоторого кодирования (также упоминает dbus в вопросе) и будет не по теме SU. Ben Voigt 22.02.2011
  • @Ben Правильно, все это делается с помощью python, возможно, я не ясно выразил это, но я предполагал, что любое решение с использованием dbus будет независимым от языка. mark 22.02.2011

ubuntulinuxdbusudev

Ответы

Ответ 1 · рейтинг 3 · mark

Получается, что я пытался извлечь раздел, а не сам диск, поэтому "Устройство не является ошибкой диска". (То есть вызов извлечения udisk на /dev/sdc1, а не на /dev/sdc)

Решение заключалось в том, чтобы сначала размонтировать раздел с помощью FilesystemUnmount(), затем найти родительский диск с помощью свойства "PartitionSlave" и вызвать для него DriveEject().

В python с dbus, если у вас уже есть объект устройства из Udisks для раздела, это выглядит примерно так:

dev_if = dbus.Interface(device_object, 'org.freedesktop.UDisks.Device')
dev_if.FilesystemUnmount([])
device_props = dbus.Interface(device_object, dbus.PROPERTIES_IFACE)
drive = device_props.Get('org.freedesktop.UDisks.Device', "PartitionSlave")
drive_obj = self.bus.get_object("org.freedesktop.UDisks", drive)
drive_if = dbus.Interface(drive_obj, 'org.freedesktop.UDisks.Device')
drive_if.DriveEject([])

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы