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

Я использую 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?


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


Ответы (1)


Получается, что я пытался извлечь раздел, а не сам диск, поэтому «Устройство не является ошибкой диска». (То есть вызов извлечения 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([])
person mark    schedule 25.02.2011