在 Linux 上弹出 USB 设备
Posted
技术标签:
【中文标题】在 Linux 上弹出 USB 设备【英文标题】:Ejecting USB devices on linux 【发布时间】:2011-07-02 04:16:20 【问题描述】:我在 python 中通过 dbus 使用 Udisk 来卸载 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 设备 有必要发送一个 从桌面通过弹出(1)命令 用户会话将提供此选项 对于可移动设备,无论 它们是否可弹出。如果这 属性未设置,启发式将 用于确定媒体是否 可弹出(使用光驱、Zip 或爵士媒体被考虑 可弹出)。
但没有解释如何从桌面用户会话中执行此操作。
(Nautilus 让我可以很好地从桌面 shell 中弹出。'eject' shell 命令将卸载但不会在没有 sudo 的情况下将弹出信号发送到设备)
是否有任何合法的方法可以用 Udisk 做到这一点,如果没有,nautlius 是如何做到的?
【问题讨论】:
我很想浏览一下 Nautilus 源代码和/或配置... 投票结束的人:显然马克非常了解超级用户,因为他在那里的代表比这里多得多。看来他是专门在这里开户才能问这个问题的。所以我认为可以安全地假设他正在寻找一个需要一些编码的解决方案(在问题中也提到了 dbus)并且在 SU 上会偏离主题。 @Ben 是的,这一切都是通过 python 完成的,也许我没有说清楚,但我认为任何使用 dbus 的解决方案都将与语言无关 【参考方案1】:所以事实证明我试图弹出分区,而不是驱动器本身,因此“设备不是驱动器错误”。 (也就是说,在/dev/sdc1而不是/dev/sdc上调用udisks弹出)
解决方案是先使用 FilesystemUnmount() 卸载分区,然后使用“PartitionSlave”属性找到父驱动器,并在此调用 DriveEject()。
在带有 dbus 的 python 中,假设您已经有一个来自 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([])
【讨论】:
以上是关于在 Linux 上弹出 USB 设备的主要内容,如果未能解决你的问题,请参考以下文章