web-dev-qa-db-ja.com

pcmanfmの「USBドライブの取り出し」アクション

LubuntuでUSBドライブを取り出すためのカスタムpcmanfmアクションを作成する方法があるのだろうか? disksctl でこれを実行しようとしましたが、--object-pathオプションでこのエラーが表示されます。

(udisksctl unmount:10926): GLib-GIO-CRITICAL **: g_dbus_object_manager_get_object: assertion 'g_variant_is_object_path (object_path)' failed
Error looking up object with path /media/user/Flash-Drive

また、単純なフォルダーとマウントされたドライブの間にMIMEタイプの違いはないため、すべてのフォルダーで「取り出し」アクションが表示されます。

更新

まあ、それは何らかの解決策を見つけたようです。これにより、USBドライブのマウントが解除され、電源がオフになります

[Desktop Entry]
Type=Action
Tooltip=Eject selected flash drive
Name=Eject flash drive
Profiles=profile-zero;
Icon=media-eject

[X-Action-Profile profile-zero]
MimeTypes=inode/directory;
Exec=gksudo eject %f
Name=Default profile

また、setuid/usr/bin/ejectに追加した後、gksudoプロンプトなしで使用できます。

[Desktop Entry]
Type=Action
Tooltip=Eject selected flash drive
Name=Eject flash drive
Profiles=profile-zero;
Icon=media-eject

[X-Action-Profile profile-zero]
MimeTypes=inode/directory;
Exec=eject %f
Name=Default profile

ただし、このアクションはすべてのフォルダーに表示されます。 usb-driveディレクトリとflash-driveディレクトリをどのように区別するかはまだわかりません。選択したファイル名( 空のゴミ箱アクション で使用)を指定する.desktopエントリの仕様Basenamesを見てきましたので、ファイルの配置を指定する方法はありますか?

更新2

さて、 MIME-infoデータベース -inode/mount-pointに従って適切なMIMEタイプを見つけましたが、現在、どのディレクトリでもアクションは表示されません。何が問題を引き起こす可能性がありますか?

[Desktop Entry]
Type=Action
Tooltip=Eject selected drive
Name=Eject drive
Profiles=profile-zero;
Icon=media-eject

[X-Action-Profile profile-zero]
MimeTypes=inode/mount-point
Exec=eject %f
Name=Default profile
2
Nicholas V.

私はこれについてさらに進歩しましたが、解決策はまだ理想的ではありません:
PCManFM 1.24でLubuntu 16.04を使用しています。 USBペンドライブの場合、「リムーバブルメディアの取り出し」が表示されますが、USBディスクドライブの場合、Nautilusのように「ドライブの安全な取り外し」は表示されません(マウント解除のみが表示されます)。
最初の問題は、デバイスの右クリックコンテキストを取得することです。残念ながら、PCManFMの左ペインのデバイスではアクションがサポートされていないようです(またはNautilus。ただし、アクションはNemoの左ペインで機能しますが、 Nemoでは異なる方法で実装されています)。これを回避するには、左ペインに「デバイス」アイコンを表示し、「編集」-「設定」-「レイアウト」で「場所に表示」の下の「デバイス」にチェックマークを付け、右ペインでデバイスを右クリックします。添付のリンクに示されているように: pcmanfmデバイスの右クリック画像

2番目の問題は、ドライブを安全に削除するためのスクリプトです。上記の例でアクションスクリプトに渡される引数は次のとおりです。computer:///ST1000LM010-9YH146.drive(または%wを含むST1000LM010-9YH146のみ)これは理想的ではありません。シリアル番号が含まれていないため、ドライブを均等に一意に識別すると考えてください。以下は、「udisksctl status」からの出力です。

$ udisksctl status
MODEL                     REVISION  SERIAL               DEVICE
--------------------------------------------------------------------------
WDC WD5000BEVT-22ZAT0     01.01A01  WD-WX70A9903180      sda
Kingston DataTraveler G3  1.00      001CC0EC31D0F081F6071284 sdb
ST1000LM010-9YH146        CC9F      W2M076TD             sdc 

したがって、私のスクリプトはモデルと一致するため、デバイスをピックアップするために2つの同一のデバイスが接続されていないことを想定しています。スクリプト作成ファイル〜/ .local/share/filemanager/actions/eject.desktopを実装するには
含む:

[Desktop Entry]
Type=Action
Name=Safely Remove Drive
Icon=drive-harddisk-usb
Profiles=profile-zero;

[X-Action-Profile profile-zero]
MimeTypes=inode/mount-point
Exec=/home/mike/.local/share/file-manager/actions/eject.sh %w 
Name=Default profile

〜/ .local/share/filemanager/actionsの「Exec」で指定されたスクリプト、eject.shを配置しましたが、デスクトップファイルで「〜」または「$ HOME」を使用できないことに注意してください。上でやったようなパス

スクリプトのeject.shには次が含まれている必要があります。

device=`udisksctl status | awk -v d=$1 '
BEGIN {
    gsub("%20"," ",d)
    sub("$"," ",d)  # Add a space on the end to give a more exact match
    sub("^","^",d) # Add ^ to start to give a more exact match
    }
$0 ~ d {
    print "/dev/"$NF
    }' `
if [ "$device" == "/dev" ]
then
    echo "Removable device not found"
else
    for dev in `df | awk -v device=$device '$1 ~ device {print $1}' `
    do
        echo "Unmounting "$dev
        udisksctl unmount -b $dev
    done

    echo "Powering off: "$device
    udisksctl power-off -b $device
fi
1
Mike Bounds

私の提案は、umountコマンドを使用することです。

fdisk -lコマンドを使用して、識別されたと判断された異なるusbドライブを挿入すると、それらは/dev/sdd1

アクション(file.desktop)を作成する前に、そのディレクトリを作成します。

mkdir -p ~/.local/share/file-manager/actions

次の端末コマンドを1つずつ使用して、アクションファイル(umount.desktop)を作成および編集します。

touch ~/.local/share/file-manager/actions/umount.desktop
nano ~/.local/share/file-manager/actions/umount.desktop

以下のコンテンツをumount.desktopに貼り付けます。

[Desktop Entry]
Type=Action
Name=Eject Usb-Drive
Icon=dialog-password
Profiles=profile-zero;

[X-Action-Profile profile-zero]
Exec=umount /dev/sdd1
Name=Default profile
1
kyodake

この回答ではpcmanfmを使用していますが、最も便利なものであることがわかりました。 TL; DR; lxpanelを使用して、アイコンをgnome-disksに追加します。

詳細に:

Lxpanelを右クリックして、[パネルアイテムの追加/削除]を選択します。新しい「アプリケーション起動バー」を追加し、すでにあるはずの「デジタル時計」の前(またはその前後)に配置します。新しく追加された「アプリケーション起動バー」で、「設定/ディスク」をアプリケーションとして追加します。これはLubuntuに付属のgnome-disksアプリケーションです。

ディスクで何かする必要がある場合は、パネルの[ディスク]アイコンをクリックします。トップメニューからディスクを選択し、電源を切ります。

これは、Windows OSの「ハードウェアを安全に取り外す」と同じように便利であり、上記はWindowsがデスクトップにあるのとほぼ同じ場所に配置します。

0
ppp

あなたの命令

udisksctl unmount --object-path /media/user/Flash-Drive

間違っている。

/media/user/Flash-Driveはオブジェクトパスではありません。


  1. 次のコマンドでオブジェクトパスを見つけます。

    $ gdbus introspect --system --dest org.freedesktop.UDisks --object-path /org/freedesktop/UDisks/devices --recurse --only-properties | grep -E "(readonly .+ (Device(IsMounted|IsDrive|File|MountPaths) ).*|\}|.*\{)" | awk -v RS="};" '/Flash-Drive/'
    
      node /org/freedesktop/UDisks/devices/sdc1 {
        interface org.freedesktop.UDisks.Device {
            readonly as DeviceMountPaths = ['/media/user/Flash-Drive'];
            readonly b DeviceIsMounted = true;
            readonly b DeviceIsDrive = false;
            readonly s DeviceFile = '/dev/sdc1';
    
  2. 次の方法でノード/org/freedesktop/UDisks/devices/sdc1を取得します。

    '/\/media\/user\/Flash-Drive/'をパスに置き換えてください)。

    $ gdbus introspect --system --dest org.freedesktop.UDisks --object-path /org/freedesktop/UDisks/devices --recurse --only-properties | grep -E "(readonly .+ (Device(IsMounted|IsDrive|File|MountPaths) ).*|\}|.*\{)" | awk -v RS="};" '/\/media\/user\/Flash-Drive/' | awk '/node/ {print $2}'
    
    /org/freedesktop/UDisks/devices/sdc1
    
  3. でアンマウントします

    gdbus call --system --dest org.freedesktop.UDisks --object-path /org/freedesktop/UDisks/devices/sdc1 --method org.freedesktop.UDisks.Device.FilesystemUnmount []
    

    またはAllInOneとして('/\/media\/user\/Flash-Drive/'をパスに置き換えてください):

    gdbus call --system --dest org.freedesktop.UDisks --object-path $(gdbus introspect --system --dest org.freedesktop.UDisks --object-path /org/freedesktop/UDisks/devices --recurse --only-properties | grep -E "(readonly .+ (Device(IsMounted|IsDrive|File|MountPaths) ).*|\}|.*\{)" | awk -v RS="};" '/\/media\/user\/Flash-Drive/' | awk '/node/ {print $2}') --method org.freedesktop.UDisks.Device.FilesystemUnmount []
    
0
A.B.