新建一个 udev 的规则文件便可。html
udev 会监听移动设备的 插拔 等动做并执行规则中的任务。python
便可实现移动设备热插拔时自动挂载和卸载。linux
代码以下:git
KERNEL!="sd[b-z]?", GOTO="automount_exit" ACTION=="add", SUBSYSTEM=="block", RUN+="/bin/mkdir /media/%E{ID_FS_LABEL}-%E{ID_FS_UUID}", RUN+="/bin/mount -o uid=1000,user,codepage=936,utf8 $root/%k /media/%E{ID_FS_LABEL}-%E{ID_FS_UUID}" ACTION=="remove", SUBSYSTEM=="block", RUN+="/bin/umount /media/%E{ID_FS_LABEL}-%E{ID_FS_UUID}", RUN+="/bin/rmdir /media/%E{ID_FS_LABEL}-%E{ID_FS_UUID}" LABEL="automount_exit"
保存在 /etc/udev/rules.d/my_auto_mount.rulessql
第一行用 glob
跳过名称非 sd[b-z]?
字样的。数据库
%E{ID_FS_LABEL}
是卷标,%E{ID_FS_UUID}
是 UUID
,第二行就是检测 add
事件,先根据卷标和 UUID
在/media/
下建立一个目录而后挂载。ubuntu
第三行是相应的卸载命令。windows
## 中文问题缓存
若是u盘的名称是在windows上命名成中文而后插到linux上,就识别不了正确的中文名称。async
这时候能够修改变量 ID_FS_LABEL 为 ID_FS_LABEL_ENC
从新插入u盘后,在 /media/ 下显示的名称就是 gbk 编码的名称,相似:
/media/\xc7װ\xae\xb5\xc4-B4FE-5315
实际上正常的名称是:
/media/亲爱的-B4FE-5315
因此,若是应用中要显示正常的中文的话,只须要编码转换一下便可,如,python能够这样:
disk_name = mountpoint.split('/')[-1] # 获取挂在的目录后截取不正常的一段 # disk_name == '\xc7װ\xae\xb5\xc4-B4FE-5315' print 'disk_name_in_chinese: ', (eval("'"+disk_name+"'")).decode('gbk').encode('utf-8') >>> 亲爱的-B4FE-5315
另:
1) 不知道还有没有其余解决中文问题的方案,像:
1, 修改系统设置
2, udev 相关配置,或经过导入外部程序解决
2) 还有一种实现方式是修改 fstab 文件
可是有几个弊端:
1. 须要知道 设备的信息,且要频繁修改 fstab 文件
2. 这是在已知设备信息的状况下的处理方式,若是不能知道呢,好比机器卖出去给客户使用了。
3. 而且只在系统启动时才挂载 fstab 中配置的设备,
固然也可使用 mount -a (模拟开机自动挂载操做)
3) 另外一种实现开机自动挂载的方法:
修改 /etc/rc.local 文件, 加入:
for dev in $(ls -1 /dev/disk/by-label/* | grep -v EFI) ; do label=$(basename $dev) mkdir -p /media/$label $(mount | grep -q /media/$label) || mount $dev /media/$label done
4) 设备在目录 /dev/disk/ 下按照不一样的属性罗列,能够到这里查看相关信息
bwhite@os:/dev$ ll disk/ total 0 drwxr-xr-x 6 root root 120 12月 24 14:22 ./ drwxr-xr-x 20 root root 4380 12月 24 14:22 ../ drwxr-xr-x 2 root root 240 12月 24 14:22 by-id/ drwxr-xr-x 2 root root 60 12月 24 14:22 by-label/ drwxr-xr-x 2 root root 160 12月 24 14:22 by-path/ drwxr-xr-x 2 root root 100 12月 24 14:22 by-uuid/ bwhite@os:/dev$
udevadm是一个udev的管理工具,能够用来监视和控制udev运行时的行为,请求内核事件,管理事件队列,以及提供简单的调试机制。
udevadm info
这个命令实际上和数据库的sql语句差很少,--query=查询的内容,其余的参数都是查询条件
例1:
udevadm info --query=all --name=sda 查询sda的全部信息
等价于select * from devicedb where name=sda
例2:
udevadm info --query=path --name=sda out>>/devices/pci0000:00/0000:00:1f.2/ata1/host0/target0:0:0/0:0:0:0/block/sda
等价于select path from devicedb where name=sda
udev 下载地址: https://www.kernel.org/pub/linux/utils/kernel/hotplug/
敲入udevinfo大概就是你用来建立规则的最直接的工具了。你须要知道的所有就是设备的sysfs设备路径. 下面是一个精简的例子:
# udevinfo -a -p /sys/block/sda looking at device '/block/sda': KERNEL=="sda" SUBSYSTEM=="block" ATTR{stat}==" 128535 2246 2788977 766188 73998 317300 3132216 5735004 0 516516 6503316" ATTR{size}=="234441648" ATTR{removable}=="0" ATTR{range}=="16" ATTR{dev}=="8:0" looking at parent device '/devices/pci0000:00/0000:00:07.0/host0/target0:0:0/0:0:0:0': KERNELS=="0:0:0:0" SUBSYSTEMS=="scsi" DRIVERS=="sd" ATTRS{ioerr_cnt}=="0×0" ATTRS{iodone_cnt}=="0×31737" ATTRS{iorequest_cnt}=="0×31737" ATTRS{iocounterbits}=="32" ATTRS{timeout}=="30" ATTRS{state}=="running" ATTRS{rev}=="3.42" ATTRS{model}=="ST3120827AS " ATTRS{vendor}=="ATA " ATTRS{scsi_level}=="6" ATTRS{type}=="0" ATTRS{queue_type}=="none" ATTRS{queue_depth}=="1" ATTRS{device_blocked}=="0" looking at parent device '/devices/pci0000:00/0000:00:07.0': KERNELS=="0000:00:07.0" SUBSYSTEMS=="pci" DRIVERS=="sata_nv" ATTRS{vendor}=="0×10de" ATTRS{device}=="0×037f"
参考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,sync" # Filesystem-specific mount options ACTION=="add", ENV{ID_FS_TYPE}=="vfat|ntfs", ENV{mount_options}="$env{mount_options},utf8,uid=1000,gid=1000,umask=002" # 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}" # Exit LABEL="media_by_label_auto_mount_end"
mount基本语法
mount [参数] /dev/sdb1(须要挂载的分区) /sdb1(挂载目录)
参数是可选的,也能够不带参数,参数的使用方法(-o ro,sync,atime)。
参数:
-t:指定文件系统类型
mount -t ext4 /dev/sdb1 /sdb1
-o:指定挂载选项
ro,rw:只读或者读写的方式挂载,默认是rw.
sync:不适用缓存,全部操做直接读写磁盘。
async:适用缓存,默认方式。
noatime:每次访问文件时不更新文件的访问时间。
atime:每次访问文件时更新文件的访问时间,默认方式。
user:任何用户均可以挂载
nouser:只有超级用户才能够挂载
auto:系统开机自动挂载
noauto:系统开机不自动挂载
remount:从新挂载文件系统。
参考连接:
udev使用笔记
http://www.jianshu.com/p/dd6cecd7755a
使用 udev 高效、动态地管理 Linux 设备文件
https://www.ibm.com/developerworks/cn/linux/l-cn-udev/
udev 自动挂载u盘(转载加修改),通过测试
https://my.oschina.net/dengyz/blog/477703
https://maskray.me/blog/2011-08-12-udev-automount-usb
https://bugs.launchpad.net/ubuntu/+source/hal/+bug/347370
https://cgit.freedesktop.org/hal/commit/?id=97b023f94f1d79a19bc0489c0d167bdaebb765fd