automount
UbuntuでSDカードを使いたいです。udevadm
(or)を使用して次の規則を試しました/lib/systemd/systemd-udevd
。
KERNEL!="sd[a-z][0-9]", GOTO="media_by_label_auto_mount_end"
# Import FS infos
IMPORT{program}="/sbin/blkid -o udev -p %N"
# Get a label if present, otherwise specify one
ENV{ID_FS_LABEL}!="", ENV{dir_name}="%E{ID_FS_LABEL}"
ENV{ID_FS_LABEL}=="", ENV{dir_name}="usbhd-%k"
# Global mount options
ACTION=="add|change", ENV{mount_options}="relatime"
# Filesystem-specific mount options
ACTION=="add|change", ENV{ID_FS_TYPE}=="vfat|ntfs", ENV{mount_options}="$env{mount_options},utf8,gid=100,umask=002"
# Mount the device
ACTION=="add|change", RUN+="/bin/mkdir -p /media/%E{dir_name}", RUN+="/bin/mount -o $env{mount_options} /dev/%k /media/%E{dir_name}", RUN+=" echo /bin/mount -o $env{mount_options} /dev/%k /media/%E{dir_name\
} > /tmp/debug_out.txt"
#ACTION=="add|change"
# Clean up after removal
ACTION=="remove", ENV{dir_name}!="", RUN+="/bin/umount -l /media/%E{dir_name}", RUN+="/bin/rmdir /media/%E{dir_name}"
# Exit
LABEL="media_by_label_auto_mount_end"
コードはインターネットから出てきます。
`udevadm monitor` indicates that the card is detected
KERNEL[1778159.935932] change /devices/pci0000:00/0000:00:14.0/usb4/4-3/4-3:1.0/host11/target11:0:0/11:0:0:0/block/sdc (block)
KERNEL[1778159.939553] remove /devices/pci0000:00/0000:00:14.0/usb4/4-3/4-3:1.0/host11/target11:0:0/11:0:0:0/block/sdc/sdc1 (block)
KERNEL[1778159.942501] change /devices/pci0000:00/0000:00:14.0/usb4/4-3/4-3:1.0/host11/target11:0:0/11:0:0:0/block/sdc (block)
KERNEL[1778159.942615] add /devices/pci0000:00/0000:00:14.0/usb4/4-3/4-3:1.0/host11/target11:0:0/11:0:0:0/block/sdc/sdc1 (block)
UDEV [1778160.026230] change /devices/pci0000:00/0000:00:14.0/usb4/4-3/4-3:1.0/host11/target11:0:0/11:0:0:0/block/sdc (block)
UDEV [1778160.101285] remove /devices/pci0000:00/0000:00:14.0/usb4/4-3/4-3:1.0/host11/target11:0:0/11:0:0:0/block/sdc/sdc1 (block)
UDEV [1778160.184648] change /devices/pci0000:00/0000:00:14.0/usb4/4-3/4-3:1.0/host11/target11:0:0/11:0:0:0/block/sdc (block)
KERNEL[1778160.320013] add /kernel/slab/ext4_inode_cache/cgroup/ext4_inode_cache(14341:systemd-udevd.service) (cgroup)
UDEV [1778160.322555] add /kernel/slab/ext4_inode_cache/cgroup/ext4_inode_cache(14341:systemd-udevd.service) (cgroup)
KERNEL[1778160.387280] add /kernel/slab/fat_inode_cache/cgroup/fat_inode_cache(14341:systemd-udevd.service) (cgroup)
UDEV [1778160.388849] add /kernel/slab/fat_inode_cache/cgroup/fat_inode_cache(14341:systemd-udevd.service) (cgroup)
UDEV [1778160.418509] add /devices/pci0000:00/0000:00:14.0/usb4/4-3/4-3:1.0/host11/target11:0:0/11:0:0:0/block/sdc/sdc1 (block)
出力udevadm test /devices/pci0000:00/0000:00:14.0/usb4/4-3/4-3:1.0/host11/target11:0:0/11:0:0:0/block/sdc/sdc1
もよさそうです。
[...]
run: '/bin/mkdir -p /media/usbhd-sdc1'
run: '/bin/mount -o relatime /dev/sdc1 /media/usbhd-sdc1'
run: '/usr/bin/unshare -m /usr/bin/snap auto-import --mount=/dev/sdc1'
[...]
ただし、ルールはディレクトリを作成し、カードをマウントするわけではありません。権限を使用して上記のルールを手動で実行すると、期待どおりに機能しsudo
ます(ディレクトリの作成が機能しないためsudo
問題ありません)。
(追加の質問:カードからファイルをコピーしてジョブとunmount
カードをトリガーしたいです。カードでもこれを実行できますかunmount
?それとも別のメカニズムを使用できますか?)
=======================
以下の説明に従ってすべてを変更しました。
Udev/rules.d
KERNEL!="sd[a-z][0-9]", GOTO="media_by_label_auto_mount_end"
ACTION=="add", SUBSYSTEM=="block",TAG+="systemd", ENV{SYSTEMD_WANTS}=sd-automounter@%k.service
ACTION=="change", SUBSYSTEM=="block",TAG+="systemd", RUN+="systemctl start sd-automounter@%k"
# Clean up after removal
ACTION=="remove", ENV{dir_name}!="", RUN+="/bin/umount -l /media/%E{dir_name}", RUN+="/bin/rmdir /media/%E{dir_name}"
# Exit
サービスの説明
# /etc/systemd/system/[email protected]
[Service]
Type=oneshot
ExecStart=/usr/local/libexec/sd-automounter %I(base)
そしてサービス
#!/bin/sh
# /usr/local/libexec/sd-automounter
echo "" > /tmp/debug.out
DEVICE_NAME=/dev/"$1"
echo $DEVICE_NAME >>/tmp/debug.out
udevadm info --query=property --export $DEVICE_NAME >> /tmp/debug.out
echo "" >> /tmp/debug.out
CARD_NAME=$(udevadm info --query=property --export $DEVICE_NAME | grep ID_FS_LABEL= | awk -F\' '{print $2}')
echo $CARD_NAME >> /tmp/debug.out
#CARD_NAME=$(/sbin/blkid | grep "$DEVICE_NAME" | awk -F\" '{print $2}' |sed 's/ /_/g')
udevadm info --query=property --export /dev/sdc1
echo $CARD_NAME
mkdir -p /media/$CARD_NAME
mount -t vfat $DEVICE_NAME /media/$CARD_NAME
thanks for all help in advance
手動で行うとsystemctl start sd-automounter@sdd1
魅力のように動作します。
しかし、udevadm monitor
表示中に削除して挿入すると何も起こりません
monitor will print the received events for:
UDEV - the event which udev sends out after rule processing
KERNEL - the kernel uevent
KERNEL[1977111.519970] change /devices/pci0000:00/0000:00:14.0/usb4/4-3/4-3:1.0/host12/target12:0:0/12:0:0:0/block/sdd (block)
KERNEL[1977111.523252] remove /devices/pci0000:00/0000:00:14.0/usb4/4-3/4-3:1.0/host12/target12:0:0/12:0:0:0/block/sdd/sdd1 (block)
KERNEL[1977111.526457] change /devices/pci0000:00/0000:00:14.0/usb4/4-3/4-3:1.0/host12/target12:0:0/12:0:0:0/block/sdd (block)
KERNEL[1977111.526572] add /devices/pci0000:00/0000:00:14.0/usb4/4-3/4-3:1.0/host12/target12:0:0/12:0:0:0/block/sdd/sdd1 (block)
UDEV [1977111.612257] change /devices/pci0000:00/0000:00:14.0/usb4/4-3/4-3:1.0/host12/target12:0:0/12:0:0:0/block/sdd (block)
UDEV [1977111.614914] remove /devices/pci0000:00/0000:00:14.0/usb4/4-3/4-3:1.0/host12/target12:0:0/12:0:0:0/block/sdd/sdd1 (block)
UDEV [1977111.697870] change /devices/pci0000:00/0000:00:14.0/usb4/4-3/4-3:1.0/host12/target12:0:0/12:0:0:0/block/sdd (block)
UDEV [1977111.791344] add /devices/pci0000:00/0000:00:14.0/usb4/4-3/4-3:1.0/host12/target12:0:0/12:0:0:0/block/sdd/sdd1 (block)
答え1
systemd-udev
本物ルールから直接ファイルシステムをマウントする必要はありません。このサイトでこれに関する多くの質問を見つけることができます:-).
最新バージョンのsystemdでは、udevサービスファイルにSystemCallFilter=@system-service @module @raw-io
。ファイルシステムのマウントに必要なシステムコールは許可されません。
(そして、一度mount
FUSEファイルシステムに対して直接ntfs-3g
FUSEサーバープロセスを開始する場合は、それを専用のシステムデバイス(例:unit)に配置するのが最善です.mount
。現在のデバイス内でFUSEプロセスを維持する場合、FUSEプロセスのライフサイクルは実行中のデバイスのライフサイクルと組み合わせられます。
RUN+=
ルールのコマンドに関連する将来(または現在の)問題を回避するには、代わりに次のようにENV{SYSTEMD_WANTS}=my-automounter@%k.service
使用できます。
# /etc/systemd/system/[email protected]
[Service]
Type=oneshot
ExecStart=/usr/local/libexec/my-automounter %I
#!/bin/sh
# /usr/local/libexec/my-automounter
DEV=/dev/"$1"
# You can make this script as complicated as you want.
# You can read udev properties if you want, using
# eval "$(udevadm info --query=property --export "$DEV")"
...
デバイスコールを手動でテストするには、を使用できますsystemctl start my-automounter@sdc1
。
systemdがスクリプトの実行中にエラーが発生した場合、またはsystemctl status my-automounter@*
を使用してエラーメッセージを表示できますjournalctl -b -u my-automounter@*
。
また、udev
特定のエラーレポートを処理する必要はありません。プログラムが突然停止した場合に備えて、どちらも便利なエラー報告機能がsh
あると思います。たとえば、:-)でブロックされたシステムコールを呼び出そうとしたため、systemd
プログラムがシグナルによって終了したことを報告する必要があります。SIGSYS
SystemCallFilter=
答え2
2番目のオプションの問題は、フルパスを使用する必要があることです。
ACTION=="add", SUBSYSTEM=="block",TAG+="systemd", RUN+="/bin/systemctl start sd-automounter@%k"
ACTION=="change", SUBSYSTEM=="block",TAG+="systemd", RUN+="/bin/systemctl start sd-automounter@%k"
実行オプションを使用して追加します。