2

Pythonでdbusを介してUdiskを使用してusbデバイス(この場合はKindle)をアンマウントしていますが、KindleをUSBモードから通常のインターフェイスに戻すため、イジェクト信号を送信したいと思います。

Udiskは、実際のドライブではないため、DriveEjectを許可しません。これは、機能であると私は考えています。与えられたエラーは次のとおりです。

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

Udisksのドキュメントには、排出可能なプロパティが記載されています。

ID_DRIVE_EJECTABLE

ドライブ内のメディアが物理的に排出可能かどうか。ドライブが本当にイジェクト可能なメディアを使用する(または使用しない)場合にのみ、これを1(または0)に設定します。特に、eject(1)を介してコマンドを送信する必要があるiPodやKindleデバイスなどでは、これを設定する必要はありません。デスクトップユーザーセッションでは、リムーバブルデバイスがイジェクト可能かどうかに関係なく、このオプションが提供されるためです。このプロパティが設定されていない場合、ヒューリスティックを使用してメディアがイジェクト可能かどうかを判断します(オプティカル、Zip、またはJazメディアを使用するドライブはイジェクト可能と見なされます)。

ただし、デスクトップユーザーセッションからこれを行う方法については説明していません。

(Nautilusを使用すると、デスクトップシェルから問題なくイジェクトでき​​ます。「eject」シェルコマンドはアンマウントされますが、sudoがないとイジェクト信号をデバイスに送信しません)

Udisksを使用してこれを行うための合法的な方法はありますか?そうでない場合、nautliusはどのようにそれを実行しますか?

4

1 に答える 1

3

そのため、ドライブ自体ではなくパーティションを取り出しようとしていたことがわかりました。したがって、「デバイスはドライブエラーではありません」。(つまり、udiskを呼び出すと/ dev/sdcではなく/dev/ sdc1でイジェクトされます)

解決策は、最初に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([])
于 2011-02-25T20:18:25.130 に答える