记录使用ARM-Linux下实现U盘自动挂载实践。
Udev的主要功能是实时地在 /dev目录下创建和删除设备节点,但它也能在创建节点的同时,执行一个额外的程序。
“==”: 匹配 比较键值,若等于,则该条件满足;
“!=”: 匹配 比较键值,若不等于,则该条件满足;
“=”: 赋值 分配一个特定的值给该键,他可以覆盖之前的赋值;
“+=”: 赋值 追加特定的值给已经存在的键。
“:=”: 赋值 分配一个特定的值给该键,后面的规则不可能覆盖它。
ACTION: 事件 (uevent) 的行为,例如:add( 添加设备 )、remove( 删除设备 )。
KERNEL: 内核设备名称,例如:sda, cdrom。
DEVPATH: 设备的 devpath 路径。
SUBSYSTEM: 设备的子系统名称,例如:sda 的子系统为 block。
BUS: 设备在 devpath 里的总线名称,例如:usb。
DRIVER: 设备在 devpath 里的设备驱动名称,例如:ide-cdrom。
ID: 设备在 devpath 里的识别号。
SYSFS{filename}: 设备的 devpath 路径下,设备的属性文件“filename”里的内容。
RUN: 为设备而执行的程序列表
LABEL: 在配置文件里为内部控制而采用的名字标签(下面的GOTO服务)
GOTO: 跳到匹配的规则(通过LABEL来标识),有点类似程序语言中的GOTO
创建文件/etc/udev/rules.d/12-usbsd-mount.rules
使用命令:
vi /etc/udev/rules.d/12-usbsd-mount.rules
PS:如果在 /etc 目录下没有udev 文件夹自行手动创建,并在udev下创建文件夹rules.d
#usb自动挂载
ACTION!="add",GOTO="farsight"
KERNEL=="sd[a-z][0-9]",RUN+="/etc/udev/mount-usb.sh %k"
KERNEL=="sd[a-z]",RUN+="/etc/udev/mount-usb.sh %k"
LABEL="farsight"
#SD卡自动挂载
ACTION!="add",GOTO="farsight", KERNEL=="mmcblk[0-9]p[0-9]", RUN+="/etc/mount-sd.sh %k", LABEL="farsight"
#usb卸载
ACTION !="remove",GOTO="farsight"
SUBSYSTEM!="block",GOTO="farsight"
KERNEL=="sd[a-z][0-9]",RUN+="/etc/udev/umount-usb.sh"
KERNEL=="sd[a-z]",RUN+="/etc/udev/umount-usb.sh"
LABEL="farsight"
#SD卡卸载
ACTION!="remove",GOTO="farsight", SUBSYSTEM!="block",GOTO="farsight", KERNEL=="mmcblk[0-9]p[0-9]",RUN+="/etc/umount-sd.sh", LABEL="farsight"
这个文件中ACTION后是说明是什么事件,KERNEL后是说明是什么设备比如sda1,mmcblk0p1等,RUN这个设备插入后去执行哪个程序,%k是传入这个程序的参数,这里%k=kernel的值也就是sda1等。
比如:ACTION!=“add”,GOTO=“farsight” … LABEL=“farsight”
如果不是add事件,就直接跳过KERNEL==… RUN+= …操作
mkdir /mnt/sd -p
mkdir /mnt/usb -p
mkdir -p 中的-p起什么作用?
1、如果创建一个目录,那就用mkdir就够了
2、如果创建多级目录,就必须加上-p
#!/bin/sh
mount -t vfat /dev/$1 /mnt/usb
sync
添加可执行权限:chmod +x /etc/mount-usb.sh
挂接命令(mount):
mount [-t vfstype] [-o options] device dir
即:mount -t 类型 -o 参数 设备名 挂载点
1、 -t 类型
fat32 -> vfat
fat16 -> fat
2、$1在shell中称为“位置参数”,表示传入的第1个参数(第1个入参)。
mount -t vfat /dev/sda1 /mnt/usb
#!/bin/sh
sync
umount /mnt/usb
添加可执行权限 chmod +x /etc/udev/umount-usb.sh
#!/bin/sh
mount -t vfat /dev/$1 /mnt/sd
sync
添加可执行权限 chmod +x /etc/udev/mount-sd.sh
#!/bin/sh
sync
umount /mnt/sd
添加可执行权限
chmod +x /etc/udev/umount-sd.sh
创建文件/etc/udev/rules.d/13-usb-mount.rules
使用命令:
vi /etc/udev/rules.d/13-usb-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"
# 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", 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"
# Mount the device
ACTION=="add", RUN+="/bin/mkdir -p /mnt/%E{dir_name}", RUN+="/bin/mount -o $env{mount_options} /dev/%k /mnt/%E{dir_name}"
# Clean up after removal
ACTION=="remove", ENV{dir_name}!="", RUN+="/bin/umount -l /mnt/%E{dir_name}", RUN+="/bin/rmdir /mnt/%E{dir_name}"
# Exit
LABEL="media_by_label_auto_mount_end"
测试可用二:
KERNEL!="sd*", GOTO="media_by_label_auto_mount_end"
SUBSYSTEM!="block",GOTO="media_by_label_auto_mount_end"
IMPORT{program}="/sbin/blkid -o udev -p %N"
#ENV{ID_FS_TYPE}=="", GOTO="media_by_label_auto_mount_end"
ENV{ID_FS_LABEL}!="", ENV{dir_name}="%E{ID_FS_LABEL}"
ENV{ID_FS_LABEL}=="", ENV{dir_name}="Untitled-%k"
ACTION=="add", ENV{mount_options}="relatime,sync"
ACTION=="add", ENV{ID_FS_TYPE}=="vfat", ENV{mount_options}="iocharset=utf8,umask=000"
ACTION=="add", ENV{ID_FS_TYPE}=="ntfs", ENV{mount_options}="iocharset=utf8,umask=000"
ACTION=="add", RUN+="/bin/mkdir -p /mnt/%E{dir_name}", RUN+="/bin/mount -o $env{mount_options} /dev/%k /mnt/%E{dir_name}"
ACTION=="remove", ENV{dir_name}!="", RUN+="/bin/umount -l /mnt/%E{dir_name}", RUN+="/bin/rmdir /mnt/%E{dir_name}"
LABEL="media_by_label_auto_mount_end"
这个注意点:
第一行:KERNEL!=“sd*”
弟六行:ENV{ID_FS_LABEL}==“”, ENV{dir_name}=“Untitled-%k”
这两个组合时,会在/mnt 文件夹下生成两个文件夹
Untitled-sda以及Untitled-sda1
如果是KERNEL!="sd[a-z][0-9]"与ENV{dir_name}="Untitled-%k"搭配,只会生成一个文件夹
第四行 :#ENV{ID_FS_TYPE}==“”, GOTO=“media_by_label_auto_mount_end”
我测试是需要注释掉的,也有不用注释就可以使用的,但我手上的板子测试不通过,注释之后就可以通过
测试不通过的现象是:没有挂载上,设定的文件夹没有显示挂载的U盘文件
测试可用三:
建议修改最后创建文件夹和删除文件夹,设置为固定文件目录
KERNEL!="sd*", GOTO="media_by_label_auto_mount_end"
SUBSYSTEM!="block",GOTO="media_by_label_auto_mount_end"
IMPORT{program}="/sbin/blkid -o udev -p %N"
#ENV{ID_FS_TYPE}=="", GOTO="media_by_label_auto_mount_end"
ENV{ID_FS_LABEL}!="", ENV{dir_name}="%E{ID_FS_LABEL}"
ENV{ID_FS_LABEL}=="", ENV{dir_name}="Untitled-%k"
ACTION=="add", ENV{mount_options}="relatime,sync"
ACTION=="add", ENV{ID_FS_TYPE}=="vfat", ENV{mount_options}="iocharset=utf8,umask=000"
ACTION=="add", ENV{ID_FS_TYPE}=="ntfs", ENV{mount_options}="iocharset=utf8,umask=000"
ACTION=="add", RUN+="/bin/mount -o $env{mount_options} /dev/%k /mnt/usb"
ACTION=="remove", ENV{dir_name}!="", RUN+="/bin/umount -l /mnt/usb"
LABEL="media_by_label_auto_mount_end"
添加完规则可以使用以下命令刷新一下
udevadm control --reload-rules
自动挂载U盘在项目中很便捷,不用手动挂载
1、网上例子:
busybox-mdev:https://www.cnblogs.com/lifexy/p/7891883.html
https://blog.csdn.net/taiyang1987912/article/details/46985343
2、CSDN例子:
https://blog.csdn.net/zjy900507/article/details/86666041
https://blog.csdn.net/xiaoweiwei1234/article/details
https://blog.csdn.net/liuqun69/article/details/84680119?