linux启停指定的usb接口设备,Linux 自动挂载 usb 设备

新建一个 udev 的规则文件即可。

udev 会监听移动设备的 插拔 等动作并执行规则中的任务。

即可实现移动设备热插拔时自动挂载和卸载。

代码如下:

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.rules

第一行用 glob 跳过名称非 sd[b-z]? 字样的。

%E{ID_FS_LABEL} 是卷标,%E{ID_FS_UUID} 是 UUID,第二行就是检测 add 事件,先根据卷标和 UUID 在/media/ 下创建一个目录然后挂载。

第三行是相应的卸载命令。

## 中文问题

如果u盘的名称是在windows上命名成中文然后插到linux上,就识别不了正确的中文名称。

这时候可以修改变量 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的使用

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

敲入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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值