使用 udev 在 yocto linux 嵌入式项目上自动安装 USB
Auto mounting USB on a yocto linux embedded project with udev
我有一个 linux 基于 yocto up 和 运行 的嵌入式系统,需要让它自动挂载 USB 设备。系统使用udev,下面是/etc/udev/rules.d/99-auto-mount.rules.
KERNEL!="sd[a-z][0-9]", GOTO="media_by_label_auto_mount_end"
# Import FS infos
IMPORT{program}="/sbin/blkid -o udev -p %N"
ENV{ID_PATH}!="*-usb-*", GOTO="media_by_label_auto_mount_end"
# Get a label if present, otherwise specify one
ENV{dir_name}="USB%k"
# Global mount options
ACTION=="add", ENV{mount_options}="relatime"
# Filesystem-specific mount options
ACTION=="add", ENV{ID_FS_TYPE}=="vfat|ntfs", ENV{mount_options}="$env{mount_options},utf8,gid=100,umask=002", ENV{DISPLAY}=":0", RUN+="/usr/local/bin/announce /media/%E{dir_name} 1"
# Mount the device
ACTION=="add", RUN+="/bin/mkdir -p /media/%E{dir_name}", RUN+="/bin/mount -o $env{mount_options} /dev/%k /media/%E{dir_name}"
# Clean up after removal
ACTION=="remove", ENV{dir_name}!="", RUN+="/bin/umount -l /media/%E{dir_name}", RUN+="/bin/rmdir /media/%E{dir_name}", ENV{DISPLAY}=":0", RUN+="/usr/local/bin/announce /media/%E{dir_name} 0"
# Exit
LABEL="media_by_label_auto_mount_end"
它工作了一段时间,但无法完成我想要它做的所有事情。当插入 USB 记忆棒时(/dev/sda1 用于分区)它会在 [=] 期间创建文件夹 /media/USBsda1 42=]添加并在删除期间删除文件夹/media/USBsda1当USB记忆棒被拔出时
但是它从来没有挂载过U盘
我将规则文件简化为以下基本文件,只是为了尝试将其装入 USB 记忆棒。
U盘已插入,其分区在系统中位于/dev/sda1
KERNEL!="sd[a-z][0-9]", GOTO="media_by_label_auto_mount_end"
# Mount the device
ACTION=="add", RUN+="/bin/mkdir -p /media/USBsda1", RUN+="/bin/mount /dev/sda1 /media/USBsda1"
# Exit
LABEL="media_by_label_auto_mount_end"
文件夹已创建,但未安装记忆棒。
但是,在插入记忆棒并创建文件夹后,我可以使用规则中的确切命令手动将其安装在控制台中
$> /bin/mount /dev/sda1 /media/USBsda1
它安装得很好吗?
有没有人知道可能是什么问题(或者更可能是遗漏了什么)或任何关于进行调查的建议?
Yocto 版本 = 2.1.3
udevadm 版本 = 229
在网络上进行大量修改和阅读信息后,我找到了一个适用于我的系统的解决方案。
我必须在 udev 规则之后插入一个 systemd 服务,然后从该服务调用一个 bash 脚本来完成繁重的工作。
非常感谢 Mike Blackwell 在 stackexchange 上对类似问题的出色回答。 https://serverfault.com/a/767079
我将他的建议用了几个星期用于我自己的系统,并且效果很好。
我有一个 linux 基于 yocto up 和 运行 的嵌入式系统,需要让它自动挂载 USB 设备。系统使用udev,下面是/etc/udev/rules.d/99-auto-mount.rules.
KERNEL!="sd[a-z][0-9]", GOTO="media_by_label_auto_mount_end"
# Import FS infos
IMPORT{program}="/sbin/blkid -o udev -p %N"
ENV{ID_PATH}!="*-usb-*", GOTO="media_by_label_auto_mount_end"
# Get a label if present, otherwise specify one
ENV{dir_name}="USB%k"
# Global mount options
ACTION=="add", ENV{mount_options}="relatime"
# Filesystem-specific mount options
ACTION=="add", ENV{ID_FS_TYPE}=="vfat|ntfs", ENV{mount_options}="$env{mount_options},utf8,gid=100,umask=002", ENV{DISPLAY}=":0", RUN+="/usr/local/bin/announce /media/%E{dir_name} 1"
# Mount the device
ACTION=="add", RUN+="/bin/mkdir -p /media/%E{dir_name}", RUN+="/bin/mount -o $env{mount_options} /dev/%k /media/%E{dir_name}"
# Clean up after removal
ACTION=="remove", ENV{dir_name}!="", RUN+="/bin/umount -l /media/%E{dir_name}", RUN+="/bin/rmdir /media/%E{dir_name}", ENV{DISPLAY}=":0", RUN+="/usr/local/bin/announce /media/%E{dir_name} 0"
# Exit
LABEL="media_by_label_auto_mount_end"
它工作了一段时间,但无法完成我想要它做的所有事情。当插入 USB 记忆棒时(/dev/sda1 用于分区)它会在 [=] 期间创建文件夹 /media/USBsda1 42=]添加并在删除期间删除文件夹/media/USBsda1当USB记忆棒被拔出时
但是它从来没有挂载过U盘
我将规则文件简化为以下基本文件,只是为了尝试将其装入 USB 记忆棒。
U盘已插入,其分区在系统中位于/dev/sda1
KERNEL!="sd[a-z][0-9]", GOTO="media_by_label_auto_mount_end"
# Mount the device
ACTION=="add", RUN+="/bin/mkdir -p /media/USBsda1", RUN+="/bin/mount /dev/sda1 /media/USBsda1"
# Exit
LABEL="media_by_label_auto_mount_end"
文件夹已创建,但未安装记忆棒。
但是,在插入记忆棒并创建文件夹后,我可以使用规则中的确切命令手动将其安装在控制台中
$> /bin/mount /dev/sda1 /media/USBsda1
它安装得很好吗?
有没有人知道可能是什么问题(或者更可能是遗漏了什么)或任何关于进行调查的建议?
Yocto 版本 = 2.1.3
udevadm 版本 = 229
在网络上进行大量修改和阅读信息后,我找到了一个适用于我的系统的解决方案。
我必须在 udev 规则之后插入一个 systemd 服务,然后从该服务调用一个 bash 脚本来完成繁重的工作。
非常感谢 Mike Blackwell 在 stackexchange 上对类似问题的出色回答。 https://serverfault.com/a/767079
我将他的建议用了几个星期用于我自己的系统,并且效果很好。