Извлечение USB-устройств на Linux - PullRequest
2 голосов
/ 22 февраля 2011

Я использую 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 делает это?

1 Ответ

3 голосов
/ 25 февраля 2011

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