「Udisks」の版間の差分
(→/media にマウント: 同期) |
(→トラブルシューティング: 同期) |
||
(同じ利用者による、間の3版が非表示) | |||
104行目: | 104行目: | ||
=== ループデバイスのマウント === |
=== ループデバイスのマウント === |
||
− | ISO イメージを簡単にマウントするには、以下のコマンドを使用します |
+ | ISO イメージを簡単にマウントするには、以下のコマンドを使用します: |
$ udisksctl loop-setup -r -f ''image.iso'' |
$ udisksctl loop-setup -r -f ''image.iso'' |
||
− | ループデバイスが作成され、ISO イメージが |
+ | これにより、読み取り専用のループデバイスが作成され、マウント可能な 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" |
||
− | + | デスクトップ上に {{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 設定の適用 === |
=== ATA 設定の適用 === |
||
191行目: | 190行目: | ||
通常、ファイル名が間違っていても、アクセスしない限り Windows で問題が発生することはありません。''chkdsk'' はこれらの名前をエラーとして扱い、名前を変更したファイルをファイルシステムのルートの下にある {{ic|found.nnn}} フォルダーに移動します。 |
通常、ファイル名が間違っていても、アクセスしない限り 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 というコマンドラインツールが含まれています。
目次
インストール
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 のラッパーを使えば簡単に実現できます。アプリケーション一覧/ユーティリティ#マウントツールもご覧ください。
- bashmount — リムーバブルメディアを一般ユーザーとして udisks2 でマウント・管理する bash スクリプトです。
- udiskie — udisks2 オートカウンター。オプションで通知機能、トレイアイコン、パスワード保護された LUKS デバイス のサポートを提供。詳しくは udiskie wiki を見てください
- udiskie-dmenu — udiskie の dmenu インターフェイス。
- udisksvm — GUI udisks2 のラッパーで Python3 で書かれ、Qt5 フレームワークを使用しています。リムーバブルデバイスのマウント、アンマウント、CD/DVD のイジェクトをマウスクリックで行えます。詳しくは README ファイルを見てください。
- udevil — Includes devmon, が含まれており、udisksとudisks2に互換性があります。
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"
デスクトップ上に sda1
と sda
を除くすべてのパーティションを表示します。
ブロックデバイスの名前は再起動のたびに変わる可能性があるため、パーティションやデバイス全体を非表示にする際に 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
が追加され、nul
や screenshot 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"
のように、チェックするデバイスのパーティションに対応します。