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
を見てきましたので、ファイルの配置を指定する方法はありますか?
さて、 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
私はこれについてさらに進歩しましたが、解決策はまだ理想的ではありません:
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
私の提案は、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
この回答ではpcmanfmを使用していますが、最も便利なものであることがわかりました。 TL; DR; lxpanelを使用して、アイコンをgnome-disksに追加します。
詳細に:
Lxpanelを右クリックして、[パネルアイテムの追加/削除]を選択します。新しい「アプリケーション起動バー」を追加し、すでにあるはずの「デジタル時計」の前(またはその前後)に配置します。新しく追加された「アプリケーション起動バー」で、「設定/ディスク」をアプリケーションとして追加します。これはLubuntuに付属のgnome-disksアプリケーションです。
ディスクで何かする必要がある場合は、パネルの[ディスク]アイコンをクリックします。トップメニューからディスクを選択し、電源を切ります。
これは、Windows OSの「ハードウェアを安全に取り外す」と同じように便利であり、上記はWindowsがデスクトップにあるのとほぼ同じ場所に配置します。
あなたの命令
udisksctl unmount --object-path /media/user/Flash-Drive
間違っている。
/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="};" '/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';
次の方法でノード/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
でアンマウントします
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 []