在linux上弹出USB设备

时间:2011-02-22 17:21:20

标签: linux ubuntu dbus udev

我在python中通过dbus使用Udisks卸载USB设备(在这种情况下是Kindle),但是我想向它发送弹出信号,因为这会将Kindle从USB模式恢复到通常状态接口

Udisks不会让我DriveEject,因为它不是一个真正的驱动器,我认为这是一个功能。给出的错误是:

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

Udisks documentation提到了可弹出属性:

  

ID_DRIVE_EJECTABLE

     

驱动器中的介质是否正常   物理弹射。只将此设置为   1(或0)如果驱动器真正使用(或   没有)可弹出的媒体。在   特别是,没有必要设置   这对于例如iPod或Kindle设备   哪里有必要发送   自桌面起通过eject(1)命令   用户会话将提供此选项   适用于可移动设备   它们是否可以弹射。如果这   属性没有设置,一个启发式的意志   用于确定媒体是否   可弹出(使用光学驱动器,Zip   或Jaz媒体被考虑   可弹出)。

但没有解释如何从桌面用户会话中执行此操作。

(Nautilus让我从桌面shell中弹出很好.'reject'shell命令将卸载,但不会在没有sudo的情况下将弹出信号发送到设备)

有没有合法的方法可以使用Udisks,如果没有,nautlius如何去做呢?

1 个答案:

答案 0 :(得分:3)

所以事实证明我试图弹出分区,而不是驱动器本身,因此“设备不是驱动器错误”。 (也就是说,调用udisks弹出/ dev / sdc1而不是/ dev / sdc)

解决方案是首先使用FilesystemUnmount()卸载分区,然后使用“PartitionSlave”属性找到父驱动器,并在此处调用DriveEject()。

在使用dbus的python中,假设你已经有来自Udisks的设备对象用于parition,这看起来像是:

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([])