「Udisks」の版間の差分

提供: ArchWiki
ナビゲーションに移動 検索に移動
(→‎設定: 情報を更新)
 
(同じ利用者による、間の9版が非表示)
16行目: 16行目:
 
{{Pkg|udisks2}} パッケージを [[インストール]] します。
 
{{Pkg|udisks2}} パッケージを [[インストール]] します。
   
{{man|8|udisksd}} は [[D-Bus]] によってオンデマンドで起動されますので、明示的に有効化する必要はありません。コマンドラインから {{man|1|udisksctl}} で制御することができます。
+
{{man|8|udisksd}} は [[D-Bus]] によってオンデマンドで起動すので、明示的に有効化する必要はありません。コマンドラインから {{man|1|udisksctl}} で制御することができます。
 
{{Note|''udisks'' の開発は終了し、 ''udisks2'' に移行しました [https://davidz25.blogspot.be/2012/03/simpler-faster-better.html]. レガシーバージョンである {{AUR|udisks}} は AUR で利用できます。 ''udisks'' をオンデマンドで起動するには、 {{ic|udisks-daemon}} を使い、制御コマンドは {{ic|udisks}} です。}}
 
   
 
== 設定 ==
 
== 設定 ==
61行目: 59行目:
 
* {{App|bashmount|リムーバブルメディアを一般ユーザーとして ''udisks2'' でマウント・管理する bash スクリプトです。|https://github.com/jamielinux/bashmount|{{AUR|bashmount}}}}
 
* {{App|bashmount|リムーバブルメディアを一般ユーザーとして ''udisks2'' でマウント・管理する bash スクリプトです。|https://github.com/jamielinux/bashmount|{{AUR|bashmount}}}}
 
* {{App|udiskie| ''udisks2'' オートカウンター。オプションで通知機能、トレイアイコン、パスワード保護された [[dm-crypt/デバイスの暗号化|LUKS デバイス]] のサポートを提供。詳しくは [https://github.com/coldfix/udiskie/wiki/Usage udiskie wiki] を見てください|https://github.com/coldfix/udiskie|{{Pkg|udiskie}}}}
 
* {{App|udiskie| ''udisks2'' オートカウンター。オプションで通知機能、トレイアイコン、パスワード保護された [[dm-crypt/デバイスの暗号化|LUKS デバイス]] のサポートを提供。詳しくは [https://github.com/coldfix/udiskie/wiki/Usage udiskie wiki] を見てください|https://github.com/coldfix/udiskie|{{Pkg|udiskie}}}}
  +
* {{App|udiskie-dmenu|'' udiskie '' の dmenu インターフェイス。|https://github.com/fogine/udiskie-dmenu|{{AUR|udiskie-dmenu-git}}}}
 
* {{App|udisksvm|GUI ''udisks2'' のラッパーで Python3 で書かれ、Qt5 フレームワークを使用しています。リムーバブルデバイスのマウント、アンマウント、CD/DVD のイジェクトをマウスクリックで行えます。詳しくは [https://github.com/berbae/udisksvm/blob/master/README README] ファイルを見てください。 |3=https://github.com/berbae/udisksvm|4={{AUR|udisksvm}}}}
 
* {{App|udisksvm|GUI ''udisks2'' のラッパーで Python3 で書かれ、Qt5 フレームワークを使用しています。リムーバブルデバイスのマウント、アンマウント、CD/DVD のイジェクトをマウスクリックで行えます。詳しくは [https://github.com/berbae/udisksvm/blob/master/README README] ファイルを見てください。 |3=https://github.com/berbae/udisksvm|4={{AUR|udisksvm}}}}
 
* {{App|udevil|Includes [https://igurublog.wordpress.com/downloads/script-devmon devmon], が含まれており、''udisks''と''udisks2''に互換性があります。|https://github.com/IgnorantGuru/udevil|{{Pkg|udevil}}}}
 
* {{App|udevil|Includes [https://igurublog.wordpress.com/downloads/script-devmon devmon], が含まれており、''udisks''と''udisks2''に互換性があります。|https://github.com/IgnorantGuru/udevil|{{Pkg|udevil}}}}
   
:{{Note|''devmon'' は ''udevil'' や ''pmount'' が SUID 権限を持っていない場合、マウントに ''udisks'' か ''udisks2'' しか使いませんこの順番で。)このパーミッションを削除するには、root で {{ic|chmod -s /usr/bin/''udevil''}} を実行してください。}}
+
:{{Note|''devmon'' は ''udevil'' や ''pmount'' が SUID 権限を持っていない場合、マウントに ''udisks'' か ''udisks2'' しか使いません (この順番で) このパーミッションを削除するには、root で {{ic|chmod -s /usr/bin/''udevil''}} を実行してください。}}
   
 
==== udevadm モニター ====
 
==== udevadm モニター ====
85行目: 84行目:
 
</nowiki>}}
 
</nowiki>}}
   
=== /media にマウント (udisks2) ===
+
=== /media にマウント ===
   
 
デフォルトで、udisks2 はリムーバブルドライブを {{ic|/media/}} ではなく ACL によって制御される {{ic|/run/media/$USER/}} ディレクトリにマウントします。{{ic|/media}} にマウントしたい場合は、このルールを使って下さい:
 
デフォルトで、udisks2 はリムーバブルドライブを {{ic|/media/}} ではなく ACL によって制御される {{ic|/run/media/$USER/}} ディレクトリにマウントします。{{ic|/media}} にマウントしたい場合は、このルールを使って下さい:
96行目: 95行目:
 
ENV{ID_FS_USAGE}=="filesystem|other|crypto", ENV{UDISKS_FILESYSTEM_SHARED}="1"
 
ENV{ID_FS_USAGE}=="filesystem|other|crypto", ENV{UDISKS_FILESYSTEM_SHARED}="1"
 
</nowiki>}}
 
</nowiki>}}
  +
  +
{{ic|/media}} は {{ic|/run}} とは異なり、デフォルトでは、[[tmpfs]] としてマウントされないため、不要なマウントポイントをブート時に自動的にクリーンアップするために [[systemd#systemd-tmpfiles - 一時ファイル|tmpfiles.d]] スニペットを作成することもお勧めします:
  +
  +
{{hc|/etc/tmpfiles.d/media.conf|
  +
D /media 0755 root root 0 -
  +
}}
   
 
=== ループデバイスのマウント ===
 
=== ループデバイスのマウント ===
   
ISO イメージを簡単にマウントするには、以下のコマンドを使用します
+
ISO イメージを簡単にマウントするには、以下のコマンドを使用します:
   
 
$ udisksctl loop-setup -r -f ''image.iso''
 
$ udisksctl loop-setup -r -f ''image.iso''
   
ループデバイスが作成され、ISO イメージがマウントできる状態で表示されます。アンマウントされ、ループデバイスは [[udev]] によって終了せられます。
+
これにより、読み取り専用のループデバイスが作成され、マウント可能な ISO イメージが表示されます。書き込みを可能にすには{{ic|-r}} フラグを削除してください。作成されたループデバイスの名前、上記の {{ic|loop-setup}} コマンドによって出力されます。
   
  +
特定のループデバイスが存在している限り、イメージをアンマウントして再マウントすることができます。使用が終わったら、次のコマンドを実行してください。
{{Note|これは読み込み専用のイメージをマウントします。[[QEMU]] のような生のディスクイメージをマウントするには、{{ic|-r}} フラグを削除し、{{ic|udisksctl loop-delete -b ''/dev/loop0''}} で使用後にイメージを解放してください。ループデバイスの名前に {{ic|/dev/loop0}} を代入してください}}
 
   
  +
$ udisksctl loop-delete -b ''/dev/loop0''
=== 特定のパーティションを隠匿する ===
 
   
  +
削除するには、{{ic|/dev/loop0}} を特定のループデバイスの名前に置き換えて実行してください。
デスクトップ上に特定のパーティションまたはドライブを表示しないようにするには、udev ルールを作成します (例: {{ic|/etc/udev/rules.d/10-local.rules}}):
 
   
  +
ループデバイスは軽量なため、サービス拒否の問題を心配せずに多数作成することができます。詳しくは [https://unix.stackexchange.com/questions/554438/what-is-maximum-loop-devices-for-linux-kernel] を参照してください。
KERNEL=="sda1", ENV{UDISKS_PRESENTATION_HIDE}="1"
 
  +
KERNEL=="sda2", ENV{UDISKS_PRESENTATION_HIDE}="1"
 
  +
=== 特定のパーティションを隠匿する ===
   
  +
デスクトップ上に特定のパーティションまたはドライブを表示しないようにするには、[[udev#udev ルールについて|udev ルール]] を作成します (例: {{ic|/etc/udev/rules.d/10-local.rules}}):
上記のルールを作成するとデスクトップに {{ic|sda1}} と {{ic|sda2}} が表示されなくなります。{{Pkg|udisks2}} を使っている場合、上記のルールは使えないので注意してください。{{ic|UDISKS_PRESENTATION_HIDE}} がサポートされていないためです。代わりに、以下のように {{ic|UDISKS_IGNORE}} を使って下さい:
 
   
 
KERNEL=="sda1", ENV{UDISKS_IGNORE}="1"
 
KERNEL=="sda1", ENV{UDISKS_IGNORE}="1"
 
KERNEL=="sda2", ENV{UDISKS_IGNORE}="1"
 
KERNEL=="sda2", ENV{UDISKS_IGNORE}="1"
   
ブロックバイ名はリブー変更されるこがあるため、UUID ({{ic|blkid /dev/sdX}} コマンド実行し得られたも) を使用してパーティションやデバイス全体隠すことも可能です。
+
デスップ上 {{ic|sda1}} と {{ic|sda}} を除くすべてのパーティションを表示します。
   
  +
ブロックデバイスの名前は再起動のたびに変わる可能性があるため、パーティションやデバイス全体を非表示にする際に [[UUID]] を使用することもできます。UUID によるマッチングは {{ic|/usr/lib/udev/rules.d/60-persistent-storage.rules}} が処理された後でのみ可能なので、それより後に処理されるファイル名を選択してください。例えば:
{{hc|# blkid /dev/sdX|2=
 
  +
/dev/sdX: LABEL="Filesystem Label" UUID="XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXXX" UUID_SUB="YYYYYYYY-YYYY-YYYY-YYYY-YYYYYYYYYYYY" TYPE="btrfs"
 
  +
{{hc|/etc/udev/rules.d/61-hide-partitions.rules|2=
  +
SUBSYSTEM=="block", ENV{ID_FS_UUID}=="XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXXX", ENV{UDISKS_IGNORE}="1"
 
}}
 
}}
   
  +
上記の行は、マルチデバイスの Btrfs ファイルシステムを非表示にする際にも便利です。単一の Btrfs ファイルシステムに属するすべてのデバイスは同じ UUID を共有しますが、各デバイスには異なる SUB_UUID が割り当てられます。
そうすると、次のような行が使えるようになります。
 
 
SUBSYSTEM=="block", ENV{ID_FS_UUID}=="XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXXX", ENV{UDISKS_IGNORE}="1"
 
 
上の行はマルチデバイスの btrfs ファイルシステムを隠すのにも便利です。単一の btrtfs ファイルシステムからの全てのデバイスはデバイス間で同じ UUID を共有しますが、個々のデバイスごとに異なる SUB_UUID を持つことになります。
 
   
=== ATA 設定の適用 (udisks2) ===
+
=== ATA 設定の適用 ===
   
 
起動時とドライブ接続時に、udisksd はファイル {{ic|/etc/udisks2/''IDENTIFIER''.conf}} に保存されている設定を適用します。ここで {{ic|''IDENTIFIER''}} はそのドライブの Drive:Id プロパティの値です。現在、ATA 設定がサポートされています。利用可能なオプションについては、{{man|8|udisks}} を参照してください。これらの設定は基本的に [[hdparm]] と同じ効果を持ちますが、 udisks デーモンが自動起動されている間は永続的になります。
 
起動時とドライブ接続時に、udisksd はファイル {{ic|/etc/udisks2/''IDENTIFIER''.conf}} に保存されている設定を適用します。ここで {{ic|''IDENTIFIER''}} はそのドライブの Drive:Id プロパティの値です。現在、ATA 設定がサポートされています。利用可能なオプションについては、{{man|8|udisks}} を参照してください。これらの設定は基本的に [[hdparm]] と同じ効果を持ちますが、 udisks デーモンが自動起動されている間は永続的になります。
148行目: 152行目:
 
== トラブルシューティング ==
 
== トラブルシューティング ==
   
=== デバイスの隠匿の無効化 (udisks2) ===
+
=== 非表示のデバイス ===
   
 
Udisks2 はデフォルトで特定のデバイスをユーザーから遮蔽します。この挙動が望ましくない、または問題になる場合は、{{ic|/usr/lib/udev/rules.d/80-udisks2.rules}} を {{ic|/etc/udev/rules.d/80-udisks2.rules}} にコピーしてから、ファイルを編集し以下のセクションを削除してください:
 
Udisks2 はデフォルトで特定のデバイスをユーザーから遮蔽します。この挙動が望ましくない、または問題になる場合は、{{ic|/usr/lib/udev/rules.d/80-udisks2.rules}} を {{ic|/etc/udev/rules.d/80-udisks2.rules}} にコピーしてから、ファイルを編集し以下のセクションを削除してください:
159行目: 163行目:
 
}}
 
}}
   
=== デバイがアンマウントされない (udisks) ===
+
=== スバイタイーの破損 ===
 
一定期間後 ''udisks'' はデバイスを再マウントしたりデバイスに''ポーリング''します。このことによって、ドライブをフォーマットしたり、[[仮想マシン]]でドライブを共有したり、{{ic|--detach}} でデタッチしてなかったドライブを取り除くときに、予期しない動作が発生することがあります。
 
 
特定のデバイスのポーリングを無効化するには、次を実行 (CD/DVD デバイスの場合):
 
 
# udisks --inhibit-polling /dev/sr''0''
 
 
全てのデバイスで無効化するには:
 
 
# udisks --inhibit-all-polling
 
 
詳しくは {{ic|man udisks}} を参照。
 
 
=== スタンバイタイマーの破損(udisks2)===
 
   
 
udisks デーモンは、ドライブから定期的に [[S.M.A.R.T.]] データをポーリングしています。ポーリング間隔よりも長いスタンバイタイムアウトを持つハードディスクは、スタンバイに失敗することがあります。すでにスピンダウンしているドライブは、通常、影響を受けません。現在、{{Pkg|udisks2}} のようにポーリングを無効化したり間隔を変更する方法はないようです。[https://bugs.launchpad.net/ubuntu/+source/udisks2/+bug/1281588], [https://bugs.freedesktop.org/show_bug.cgi?id=26508] を参照してください。
 
udisks デーモンは、ドライブから定期的に [[S.M.A.R.T.]] データをポーリングしています。ポーリング間隔よりも長いスタンバイタイムアウトを持つハードディスクは、スタンバイに失敗することがあります。すでにスピンダウンしているドライブは、通常、影響を受けません。現在、{{Pkg|udisks2}} のようにポーリングを無効化したり間隔を変更する方法はないようです。[https://bugs.launchpad.net/ubuntu/+source/udisks2/+bug/1281588], [https://bugs.freedesktop.org/show_bug.cgi?id=26508] を参照してください。
189行目: 179行目:
 
この問題は、udisks がカーネルの ntfs ドライバを使おうとしていることで、この (デフォルトの) マウントオプションを認識していないことです。
 
この問題は、udisks がカーネルの ntfs ドライバを使おうとしていることで、この (デフォルトの) マウントオプションを認識していないことです。
 
これを動作させるには、オプションの依存関係 [[NTFS-3G]] がインストールされている必要があります。
 
これを動作させるには、オプションの依存関係 [[NTFS-3G]] がインストールされている必要があります。
  +
  +
=== NTFS ファイルの作成に失敗する (ファイル名に依存) ===
  +
  +
udisks 2.8.2 では NTFS マウントオプションに {{ic|windows_names}} が追加され、{{ic|nul}} や {{ic|screenshot 23-08-21 19:22.jpg}} のような Win32 と互換性のないファイル名が作成できないようになりました。特に、[https://wiki.archlinux.org/title/Steam/Troubleshooting#Steam_Library_in_NTFS_partition Steam Proton が初期化されなくなる] 原因となります。この動作を元に戻すには
  +
  +
{{hc|/etc/udisks2/mount_options.conf|2=
  +
[defaults]
  +
ntfs:ntfs_defaults=uid=$UID,gid=$GID
  +
}}
  +
  +
通常、ファイル名が間違っていても、アクセスしない限り Windows で問題が発生することはありません。''chkdsk'' はこれらの名前をエラーとして扱い、名前を変更したファイルをファイルシステムのルートの下にある {{ic|found.nnn}} フォルダーに移動します。
  +
  +
=== シャットダウン時に自動で外部 HDD の電源を切る ===
  +
  +
もしシステムのシャットダウン時に外部 HDD の電源が正常に切れない場合は、その問題を修正することが望ましいでしょう。電源を切る最も便利な方法は [[udisks]] を使用することです。
  +
  +
{{ic|udisks2.service}} を [[有効化]] します。
  +
  +
スクリプトを実行するサービスは以下のようになります。
  +
  +
{{hc|/etc/systemd/system/handle_external_hdds.service|2=
  +
[Unit]
  +
Requires=udisks2.service
  +
Requires=graphical.target
  +
After=graphical.target
  +
[Service]
  +
Type=oneshot
  +
RemainAfterExit=yes
  +
ExecStop=/usr/local/bin/handle_external_hdds.sh
  +
[Install]
  +
WantedBy=graphical.target
  +
}}
  +
  +
{{ic|handle_external_hdds.service}} を [[有効化]] します。
  +
  +
systemd の [[daemon-reload]] を実行して、新しい設定を適用します。
  +
  +
再起動するか {{ic|graphical.target}} をリスタートして、正常に動作するか確認します。
  +
  +
1つのディスクの任意の量のパーティションを扱うスクリプトの例は以下のようになります。
  +
  +
{{hc|/usr/local/bin/handle_external_hdds.sh|2=
  +
#!/bin/bash -u
  +
  +
declare -a uuids=(''uuid_list'')
  +
  +
# Only proceed if the drive is present.
  +
if <nowiki>[[ ! -L "/dev/disk/by-uuid/${uuids[0]}" ]]</nowiki>; then
  +
exit 0
  +
fi
  +
  +
for uuid in "${uuids[@]}"; do
  +
if findmnt "/dev/disk/by-uuid/$uuid"; then
  +
umount "/dev/disk/by-uuid/$uuid"
  +
fi
  +
done
  +
  +
# udisksctl powers off proper drive even if its partition is supplied
  +
udisksctl power-off -b "/dev/disk/by-uuid/${uuids[0]}"
  +
}}
  +
  +
''uuid_list'' はスペース区切りの UUID リストで、例えば {{ic|"''uuid_1''" "''uuid_2''"}} のように、チェックするデバイスのパーティションに対応します。
   
 
== 参照 ==
 
== 参照 ==
   
 
* [https://wiki.gentoo.org/wiki/Udisks gentoo wiki: udisks]
 
* [https://wiki.gentoo.org/wiki/Udisks gentoo wiki: udisks]
* [http://blog.fpmurphy.com/2011/08/introduction-to-udisks.html?output=pdf Introduction to udisks]
 

2025年3月3日 (月) 19:38時点における最新版

関連記事

udisks には、ストレージデバイスに問い合わせたり制御を行うために使われる D-Bus インターフェイスを実装した udisksd というデーモンと、デーモンを利用したりクエリを送るのに使われる udisksctl というコマンドラインツールが含まれています。

インストール

udisks2 パッケージを インストール します。

udisksd(8)D-Bus によってオンデマンドで起動するので、明示的に有効化する必要はありません。コマンドラインから udisksctl(1) で制御することができます。

設定

パーミッション

ユーザーが udisk を使用して実行できるアクションは、polkit で制限されます。ユーザーセッション が有効でない、または存在しない場合 (例えば systemd/ユーザー サービスから udisk を制御する場合)、polkit ルールを調整してください。

storage グループに対する一般的な udisks のパーミッションについては https://github.com/coldfix/udiskie/wiki/Permissions を、より限定的な例については [1] を参照してください。Dolphin を使用している場合は、[2] を参照してください。

デフォルトのマウントオプション

/etc/udisks2/mount_options.conf でデフォルトのマウントオプションを定義できます。ファイルが存在しない場合は作成します。組み込みのデフォルトといくつかの例は、/etc/udisks2/mount_options.conf.example で確認できます。[3]

オプションは、特定のファイルシステムタイプをターゲットにすることができます。たとえば、zstd 圧縮を有効にして btrfs ファイルシステムをマウントします。

[defaults]
btrfs_defaults=compress=zstd
ノート: これは、対応する組み込みのデフォルトをオーバーライドします。この方法で誤ってマウントオプションを削除しないようにしてください。

使用方法

リムーバブルドライブを手動でマウントする場合、例えば /dev/sdc のようにします。

$ udisksctl mount -b /dev/sdc1

アンマウントするには

$ udisksctl unmount -b /dev/sdc1

詳しくは udisksctl help をご覧ください。

ヒントとテクニック

マウントヘルパー

デバイスの自動マウントは、udisks のラッパーを使えば簡単に実現できます。アプリケーション一覧/ユーティリティ#マウントツールもご覧ください。

ノート: GNOMEKDE などの デスクトップ環境 も、udisks ラッパーを提供しているかもしれません
  • bashmount — リムーバブルメディアを一般ユーザーとして udisks2 でマウント・管理する bash スクリプトです。
https://github.com/jamielinux/bashmount || bashmountAUR
  • udiskieudisks2 オートカウンター。オプションで通知機能、トレイアイコン、パスワード保護された LUKS デバイス のサポートを提供。詳しくは udiskie wiki を見てください
https://github.com/coldfix/udiskie || udiskie
  • udiskie-dmenu udiskie の dmenu インターフェイス。
https://github.com/fogine/udiskie-dmenu || udiskie-dmenu-gitAUR
  • udisksvm — GUI udisks2 のラッパーで Python3 で書かれ、Qt5 フレームワークを使用しています。リムーバブルデバイスのマウント、アンマウント、CD/DVD のイジェクトをマウスクリックで行えます。詳しくは README ファイルを見てください。
https://github.com/berbae/udisksvm || udisksvmAUR
  • udevil — Includes devmon, が含まれており、udisksudisks2に互換性があります。
https://github.com/IgnorantGuru/udevil || udevil
ノート: devmonudevilpmount が SUID 権限を持っていない場合、マウントに udisksudisks2 しか使いません (この順番で) このパーミッションを削除するには、root で chmod -s /usr/bin/udevil を実行してください。

udevadm モニター

udevadm monitor を使ってブロックイベントを監視し、新しいブロックデバイスが作成されたときにドライブをマウントすることができます。古いマウントポイントは udisksd によって自動的に削除されるので、削除の際に特別な操作は必要ありません。

#!/bin/sh

pathtoname() {
    udevadm info -p /sys/"$1" | awk -v FS== '/DEVNAME/ {print $2}'
}

stdbuf -oL -- udevadm monitor --udev -s block | while read -r -- _ _ event devpath _; do
        if [ "$event" = add ]; then
            devname=$(pathtoname "$devpath")
            udisksctl mount --block-device "$devname" --no-user-interaction
        fi
done

/media にマウント

デフォルトで、udisks2 はリムーバブルドライブを /media/ ではなく ACL によって制御される /run/media/$USER/ ディレクトリにマウントします。/media にマウントしたい場合は、このルールを使って下さい:

/etc/udev/rules.d/99-udisks2.rules
# UDISKS_FILESYSTEM_SHARED
# ==1: mount filesystem to a shared directory (/media/VolumeName)
# ==0: mount filesystem to a private directory (/run/media/$USER/VolumeName)
# See udisks(8)
ENV{ID_FS_USAGE}=="filesystem|other|crypto", ENV{UDISKS_FILESYSTEM_SHARED}="1"

/media/run とは異なり、デフォルトでは、tmpfs としてマウントされないため、不要なマウントポイントをブート時に自動的にクリーンアップするために tmpfiles.d スニペットを作成することもお勧めします:

/etc/tmpfiles.d/media.conf
D /media 0755 root root 0 -

ループデバイスのマウント

ISO イメージを簡単にマウントするには、以下のコマンドを使用します:

$ udisksctl loop-setup -r -f image.iso

これにより、読み取り専用のループデバイスが作成され、マウント可能な ISO イメージが表示されます。書き込みを可能にするには、-r フラグを削除してください。作成されたループデバイスの名前は、上記の loop-setup コマンドによって出力されます。

特定のループデバイスが存在している限り、イメージをアンマウントして再マウントすることができます。使用が終わったら、次のコマンドを実行してください。

$ udisksctl loop-delete -b /dev/loop0

削除するには、/dev/loop0 を特定のループデバイスの名前に置き換えて実行してください。

ループデバイスは軽量なため、サービス拒否の問題を心配せずに多数作成することができます。詳しくは [4] を参照してください。

特定のパーティションを隠匿する

デスクトップ上に特定のパーティションまたはドライブを表示しないようにするには、udev ルール を作成します (例: /etc/udev/rules.d/10-local.rules):

KERNEL=="sda1", ENV{UDISKS_IGNORE}="1"
KERNEL=="sda2", ENV{UDISKS_IGNORE}="1"

デスクトップ上に sda1sda を除くすべてのパーティションを表示します。

ブロックデバイスの名前は再起動のたびに変わる可能性があるため、パーティションやデバイス全体を非表示にする際に UUID を使用することもできます。UUID によるマッチングは /usr/lib/udev/rules.d/60-persistent-storage.rules が処理された後でのみ可能なので、それより後に処理されるファイル名を選択してください。例えば:

/etc/udev/rules.d/61-hide-partitions.rules
SUBSYSTEM=="block", ENV{ID_FS_UUID}=="XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXXX", ENV{UDISKS_IGNORE}="1"

上記の行は、マルチデバイスの Btrfs ファイルシステムを非表示にする際にも便利です。単一の Btrfs ファイルシステムに属するすべてのデバイスは同じ UUID を共有しますが、各デバイスには異なる SUB_UUID が割り当てられます。

ATA 設定の適用

起動時とドライブ接続時に、udisksd はファイル /etc/udisks2/IDENTIFIER.conf に保存されている設定を適用します。ここで IDENTIFIER はそのドライブの Drive:Id プロパティの値です。現在、ATA 設定がサポートされています。利用可能なオプションについては、udisks(8) を参照してください。これらの設定は基本的に hdparm と同じ効果を持ちますが、 udisks デーモンが自動起動されている間は永続的になります。

例えば、ドライブのスタンバイ・タイムアウトを 240 (20 分) に設定するには、以下を追加します。

/etc/udisks2/DriveId.conf
[ATA]
StandbyTimeout=240

ドライブの DriveId を取得するには、 udevadm info --query=all --name=sdx | grep ID_SERIAL | sed "s/_/-/g" を使用してください。

また、gnome-disk-utility などの GUI ユーティリティを使用して設定ファイルを管理することもできます。

トラブルシューティング

非表示のデバイス

Udisks2 はデフォルトで特定のデバイスをユーザーから遮蔽します。この挙動が望ましくない、または問題になる場合は、/usr/lib/udev/rules.d/80-udisks2.rules/etc/udev/rules.d/80-udisks2.rules にコピーしてから、ファイルを編集し以下のセクションを削除してください:

# ------------------------------------------------------------------------
# ------------------------------------------------------------------------
# ------------------------------------------------------------------------
# Devices which should not be display in the user interface
[...]

スタンバイタイマーの破損

udisks デーモンは、ドライブから定期的に S.M.A.R.T. データをポーリングしています。ポーリング間隔よりも長いスタンバイタイムアウトを持つハードディスクは、スタンバイに失敗することがあります。すでにスピンダウンしているドライブは、通常、影響を受けません。現在、udisks2 のようにポーリングを無効化したり間隔を変更する方法はないようです。[5], [6] を参照してください。

ただし、udisks2 が適用しているスタンバイタイムアウトには影響がないようです。udisks でスタンバイタイムアウトを設定するには、ATA 設定の適用 (udisks2) を参照してください。

他の回避策として、タイムアウトをポーリング間隔 (10分) 以下に設定するか、 hdparm -y /dev/sdx を使って手動でスピンダウンを強制的に実行することも考えられます。

NTFS のマウントに失敗する

ntfs パーティションのマウントに失敗し、エラーが発生した場合。

Error mounting /dev/sdXY at [...]: wrong fs type, bad option, bad superblock on /dev/sdXY, missing codepage or helper program, or other error.

と、root で実行した journalctl/dmesg のカーネルログに記載されています。

ntfs: (device sdXY): parse_options(): Unrecognized mount option windows_names.

この問題は、udisks がカーネルの ntfs ドライバを使おうとしていることで、この (デフォルトの) マウントオプションを認識していないことです。 これを動作させるには、オプションの依存関係 NTFS-3G がインストールされている必要があります。

NTFS ファイルの作成に失敗する (ファイル名に依存)

udisks 2.8.2 では NTFS マウントオプションに windows_names が追加され、nulscreenshot 23-08-21 19:22.jpg のような Win32 と互換性のないファイル名が作成できないようになりました。特に、Steam Proton が初期化されなくなる 原因となります。この動作を元に戻すには

/etc/udisks2/mount_options.conf
[defaults]
ntfs:ntfs_defaults=uid=$UID,gid=$GID

通常、ファイル名が間違っていても、アクセスしない限り Windows で問題が発生することはありません。chkdsk はこれらの名前をエラーとして扱い、名前を変更したファイルをファイルシステムのルートの下にある found.nnn フォルダーに移動します。

シャットダウン時に自動で外部 HDD の電源を切る

もしシステムのシャットダウン時に外部 HDD の電源が正常に切れない場合は、その問題を修正することが望ましいでしょう。電源を切る最も便利な方法は udisks を使用することです。

udisks2.service有効化 します。

スクリプトを実行するサービスは以下のようになります。

/etc/systemd/system/handle_external_hdds.service
[Unit]
Requires=udisks2.service
Requires=graphical.target
After=graphical.target
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStop=/usr/local/bin/handle_external_hdds.sh
[Install]
WantedBy=graphical.target

handle_external_hdds.service有効化 します。

systemd の daemon-reload を実行して、新しい設定を適用します。

再起動するか graphical.target をリスタートして、正常に動作するか確認します。

1つのディスクの任意の量のパーティションを扱うスクリプトの例は以下のようになります。

/usr/local/bin/handle_external_hdds.sh
#!/bin/bash -u

declare -a uuids=(uuid_list)

# Only proceed if the drive is present.
if [[ ! -L "/dev/disk/by-uuid/${uuids[0]}" ]]; then
  exit 0
fi

for uuid in "${uuids[@]}"; do
  if findmnt "/dev/disk/by-uuid/$uuid"; then
    umount "/dev/disk/by-uuid/$uuid"
  fi
done

# udisksctl powers off proper drive even if its partition is supplied
udisksctl power-off -b "/dev/disk/by-uuid/${uuids[0]}"

uuid_list はスペース区切りの UUID リストで、例えば "uuid_1" "uuid_2" のように、チェックするデバイスのパーティションに対応します。

参照