ARM-Linux下实现U盘自动挂载

文章目录

  • 前言
  • 一、使用udev脚本挂载
    • 1.创建规则
      • 1.udev规则操作说明符
      • 2.udev规则匹配值
      • 3.添加规则
    • 2.创建挂载目录
    • 3.新建脚本文件
      • 1.创建脚本/etc/udev/mount-usb.sh
      • 2.创建脚本/etc/udev/umount-usb.sh
      • 3.创建脚本/etc/udev/mount-sd.sh
      • 4.创建脚本/etc/udev/umount-sd.sh
  • 二、使用udev规则文件挂载
    • 1.测试可用一
    • 2.测试可用二
    • 3.测试可用三(推荐)
  • 总结


前言

记录使用ARM-Linux下实现U盘自动挂载实践。


一、使用udev脚本挂载

       Udev的主要功能是实时地在 /dev目录下创建和删除设备节点,但它也能在创建节点的同时,执行一个额外的程序。

1.创建规则

1.udev规则操作说明符

==”:  匹配    比较键值,若等于,则该条件满足; 
“!=”:   匹配    比较键值,若不等于,则该条件满足; 
“=”:   赋值    分配一个特定的值给该键,他可以覆盖之前的赋值; 
“+=”:  赋值    追加特定的值给已经存在的键。 
“:=”:  赋值    分配一个特定的值给该键,后面的规则不可能覆盖它。

2.udev规则匹配值

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

3.添加规则

创建文件/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+= …操作

2.创建挂载目录

mkdir /mnt/sd -p

mkdir /mnt/usb -p

mkdir -p 中的-p起什么作用?
1、如果创建一个目录,那就用mkdir就够了
2、如果创建多级目录,就必须加上-p

3.新建脚本文件

1.创建脚本/etc/udev/mount-usb.sh

#!/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

2.创建脚本/etc/udev/umount-usb.sh

#!/bin/sh
sync
umount /mnt/usb

添加可执行权限 chmod +x /etc/udev/umount-usb.sh

3.创建脚本/etc/udev/mount-sd.sh

#!/bin/sh
mount -t vfat /dev/$1 /mnt/sd
sync

添加可执行权限 chmod +x /etc/udev/mount-sd.sh

4.创建脚本/etc/udev/umount-sd.sh

#!/bin/sh
sync
umount /mnt/sd

添加可执行权限

chmod +x /etc/udev/umount-sd.sh

二、使用udev规则文件挂载

创建文件/etc/udev/rules.d/13-usb-mount.rules
使用命令:

vi  /etc/udev/rules.d/13-usb-mount.rules

1.测试可用一

测试可用一

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"

2.测试可用二

测试可用二

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盘文件

3.测试可用三(推荐)

测试可用三
建议修改最后创建文件夹和删除文件夹,设置为固定文件目录

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?

你可能感兴趣的:(Linux,linux,arm,运维)