例子参考博客文章: LINUX下 Udev详解
首先在新建此文件在/etc/udev/rules.d/目录下新建010.udev.rules,填入以下内容:
ACTION=="add", KERNEL=="sd[a-z][0-9]", RUN+="/bin/mkdir -p /mnt/usb%n"
ACTION=="add", KERNEL=="sd[a-z][0-9]", RUN+="/bin/mount -t auto /dev/%k /mnt/usb%n -o rw,noauto,sync,dirsync,noexec,nodev,noatime"
ACTION=="remove", KERNEL=="sd[a-z][0-9]", RUN+="/bin/umount -l /mnt/usb%n"
ACTION=="remove", KERNEL=="sd[a-z][0-9]", RUN+="/bin/rmdir /mnt/usb%n"
%k 代表该设备在内核里的名称,比如:"sda1"
%n 设备的内核号码,例如:sda1 的内核号码是 1
# 编辑好此文件,已完成udev规则填写,可能还不能自动挂载,以下是本人遇到的一些情况。
若自动挂载出问题:
# 可以进行插拔U盘观察/var/log/syslog文件的输出,可以看到udev的输出,来进行原因分析。
1、原因一:禁用系统自动挂载,由于我的是ubuntu 20.04 LTS
解决方法一(参考:禁用 Ubuntu 自动挂载功能)
$ gsettings set org.gnome.desktop.media-handling automount false
解决方法二
参考(未经测试):【工具】ubuntu18.04取消自动挂载
2、原因二:This is a systemd feature. The original udev
command has been replaced by systemd-udevd
解决方法(参考:
Udev rule to mount disk does not work):
# sudo systemctl edit systemd-udevd
[Service] MountFlags=shared
# 如果是 Ubuntu 20.04, 把 MountFlags=shared
改为 PrivateMounts=no
其他:
获取未挂载分区的文件系统类型方法
# /bin/lsblk -f | /bin/grep sdc2 | /usr/bin/cut -d' ' -f 2
把sdc2替换你想查看的分区
LINUX下 Udev详解这篇博客提到用以下方式挂载 vfat格式的文件系统,PROGRAM执行的命令结果会返回到RESULT, RESULT=="vfat" 进行对比,若RESULT等于vfat,则返回true,继续执行RUM后面的命令。
ACTION=="add", KERNEL=="sd[a-z][0-9]", PROGRAM=="/lib/udev/vol_id -t %N", RESULT=="vfat", RUN+="/bin/mount -t vfat -o rw,noauto,sync,dirsync,noexec,nodev,noatime,dmask=000,fmask=111 /dev/%k /media/usbhd-%k", OPTIONS="last_rule"
可是我的ubuntu没有/lib/udev/vol_id命令, 自己尝试把PROGRAM的值改为PROGRAM=“
/bin/lsblk -f | /bin/grep sdc2 | /usr/bin/cut -d' ' -f 2”, 但是还是不起作用,不知道什么原因,若各位大佬知道的话,希望能告诉我