udev mdev热插拔配置说明

udev mdev热插拔配置说明

udev

udev介绍

udev用于linux2.6.13或更高版本的内核上,为用户空间提供使用固定设备名的动态/dev目录的解决方案。它通过在 sysfs 的 /class/ 和/block/ 目录树中查找一个称为 dev 的文件,以确定所创建的设备节点文件的主次设备号。所以要使用udev,驱动必须为设备在sysfs中创建类接口及其dev属性文件,方法和sculld模块中创建dev属性相同。

工作原理

当系统内核发现系统中添加或者删除了某个新的设备时,内核检测到后会产生一个hotplug event并查找/proc/sys/kernel/hotplug去找出管理设备连接的用户空间程序。若udev已经启动,内核会通知udev去检测sysfs中关于这个新设备的信息并创建设备节点。udev就会去执行udevd,以便让udevd可以产生或者删除硬件的设备文件。 接着udevd会通过libsysfs读取sys文件系统,以便取得该硬件设备的信息(如/dev/vcs,在/sys/class/tty/vcs/dev存放的是”7:0”,既/dev/vcs的主次设备号);然后再向namedev查询该外部设备的设备文件信息,例如文件的名称、权限等。最后,udevd就依据上述的结果,在/dev/目录中自动建立该外部设备的设备文件,同时在/etc/udev/rules.d下检查有无针对该设备的使用权限。当设备插入或移除时,hotplug机制会让内核会通过netlink socket通讯(内核调用kobject_uevent函数发送netlink message给用户空间,该功能由内核的统一设备模型里的子系统这一层实现)向用户传递一个事件的发生,Udevd通过标准的socket机制,创建socket连接来获取内核广播的uevent事件 并解析这些uevent事件。

热插拔配置

  1. 必须保证文件系统支持udev

  2. 修改etc/init.d/rcs脚本,在系统启动时,挂载sysfs 和tmpfs 文件系统,然后启动udev

#如果/etc/fstab已经配置了挂载sysfs和tmpfs的挂载则忽略以下两行
/bin/mount -t sysfs sysfs /sys 
/bin/mount -t tmpfs tmpfs /dev

#udevd和udevadm 所在的目录可能不同,根据自己的情况修改路径
/bin/udevd --daemon
/sbin/udevadm trigger
  1. 确保内核配置以下选项
  CONFIG_HOTPLUG=y
  CONFIG_UEVENT_HELPER_PATH=""
  CONFIG_NET=y
  CONFIG_UNIX=y
  CONFIG_SYSFS=y
  CONFIG_SYSFS_DEPRECATED*=n
  CONFIG_PROC_FS=y
  CONFIG_TMPFS=y
  CONFIG_INOTIFY_USER=y
  CONFIG_SIGNALFD=y
  CONFIG_TMPFS_POSIX_ACL=y (user ACLs for device nodes)
  CONFIG_BLK_DEV_BSG=y (SCSI devices)
  1. 在/etc下创建udev目录,在/etc/udev创建目录rules.d和文件udev.conf,在udev.conf中添加如下内容
# see udev.conf(5) for details
#udev_log="info"
  1. 在目录/etc/udev/rules.d/下创建auto-mount.rules规则文件
ACTION=="add",KERNEL=="sd[a-z][0-9]",RUN+="/etc/udev/mount-sd.sh %k"
ACTION=="remove",KERNEL=="sd[a-z][0-9]",RUN+="/etc/udev/umount-sd.sh %k"
ACTION=="add",KERNEL=="mmcblk[0-9]p[0-9]",RUN+="/etc/udev/mount-sd.sh %k"
ACTION=="remove",KERNEL=="mmcblk[0-9]p[0-9]",RUN+="/etc/udev/umount-sd.sh %k"

ACTION:说明是什么事件;

KERNEL:说明是什么设备比如sda1,mmcblk0p1等;

RUN:这个设备插入后去执行哪个程序%k是传入这个程序的参数,这里%k=kernel的值也就是sda1等.

  1. 在/etc/udev下创建mount-sd.sh挂载脚本和umount-sd.sh卸载脚本,即上面auto-mount.rules文件RUN+指定的执行脚本,当系统监控的热插拔事件发生,则会执行脚本进行挂载或卸载,添加如下内容

mount-sd.sh脚本:

#!/bin/sh
mkdir -p /run/media/$1
mount /dev/$1 /run/media/$1
sync

umount-sd.sh脚本:

#!/bin/sh
umount /run/media/$1
rm /run/media/$1 -rf
sync

修改文件权限,为其添加可执行的权限:chmod +x mount-usb.sh umount-usb.sh

  1. 注意脚本的格式问题,可能会出现如下问题,这个在Windows编辑器编辑导致,把^M去掉
    umount /run/media/$1^M
  2. 注意文件系统系统的shell工具,有些是用/bin/bash,则需要改为#!/bin/bash

mdev

mdev介绍

mdev是busybox提供的一个工具,用在嵌入式系统中,相当于简化版的udev,作用是在系统启动和热插拔或动态加载驱动程序时,自动创建设备节点。文件系统中的/dev目录下的设备节点都是由mdev创建的。在加载驱动过程中,根据驱动程序,在/dev下自动创建设备节点。

工作原理

mdev 是基于uevent_helper 机制的,它在系统启动时修改了内核中的uevnet_helper 变量(通过写/proc/sys/kernel/hotplug),值为“/sbin/mdev”。这样内核产生uevent 时会调用uevent_helper 所指的用户级程序,也就是mdev,来执行相应的热拔插动作。

mdev 使用的uevent_helper 机制实现简单,适合用在嵌入式系统中。另外要说明的一点是,uevent_helper 的初始值在内核编译时是可配置的,默认值为/sbin/hotplug。如果想修改它的值,写/proc/sys/kernel/hotplug 文件就可以了。

热插拔配置

  1. 配置uevent_helper

echo "/sbin/mdev" > /proc/sys/kernel/hotplug

  1. 在/etc/init.d/rsC文件中添加如下内容
mount -t tmpfs mdev /dev
mkdir /dev/pts
mount -t devpts devpts /dev/pts
    
#它是mdev运行的基础条件之一    
mount -t sysfs sysfs /sys        

#设置系统的hotplug程序为mdev,当有热插拔事件产生时,内核就会调用位于 /sbin目录的mdev。这时mdev通过环境变量中的 ACTION 和 DEVPATH,来确定此次热插拔事件的动作以及影响了/sys中的哪个目录。接着会看看这个目录中是否有“dev”属性文件,如果有就利用这些信息为这个设备在/dev 下创建设备节点文件。
echo "/sbin/mdev" > /proc/sys/kernel/hotplug

#调用/sbin/mdev程序(其实是个链接,作用是传递参数给/bin目录下的busybox程序并调用它),检索/sys/class、/sys/block和/proc中所有类设备目录,如果在目录中含有名为“dev”的文件且文件中包含的是设备号,则mdev就利用这些信息为这个设备在/dev 下创建设备节点文件。
mdev –s
  1. 确保编译内核时编译如下选项:
CONFIG_PROC_FS=y
CONFIG_PROC_SYSCTL=y
CONFIG_HOTPLUG=y
CONFIG_NET=y
  1. 在/etc/mdev.conf文件中添加对热插拔事件的响应,实现U盘和SD卡的自动挂载
sd[a-z][0-9]   0:0 666  @/etc/mdev/udisk_insert.sh                
sd[a-z]        0:0 666  $/etc/mdev/udisk_remove.sh

@:表示在插入(创建设备结点)后执行后面的脚本;

$:表示在拔出(删除设备结点)前执行后面的脚本;

*:表示在创建设备结点后,删除节点设备前执行后面的脚本。

/etc/mdev/udisk_insert.sh:

#!/bin/sh
mkdir -p /run/media/$MDEV
mount /dev/$MDEV /run/media/$MDEV 

etc/mdev/udisk_remove.sh

#!/bin/sh
umount -l /run/media/sd*
rm -rf /run/media/sd*
  1. 给以上两个脚本设置可执行权限:
chmod +x  /etc/mdev/udisk_insert.sh
chmod +x  /etc/mdev/udisk_remove.sh

以上为udev和mdev热插拔工具的配置过程。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
将可移动设备连入系统时,系统的后台中会依次发生如下事件: l 内核检测到新硬件插入,然后分别通知hotplug和udev。前者用来装入相应的内核模块(如usb-storage),而后者用来在/dev中创建相应的设备节点(如/dev/sda1)。 l udev创建了相应的设备节点之后,会将这一消息通知hal的守护程序(hald)。当然udev还得保证新创建的设备节点可以被普通用户访问。 l hotplug装入了相应的内核模块之后,会把这一消息通知给hald。 l hald在受到hotplug和udev发出的消息之后,认为新硬件已经正式被系统认可了。此时它会通过一系列精心编写的规则文件(就是传说中的xxx-policy.fdi),把发现新硬件的消息通过dbus发送出去,同时还会调用update-fstab或fstab-sync来更新/etc/fstab,为相应的设备节点创建适合的挂载点。 l 卷管理器会监听dbus中发现新硬件的消息。根据所插入的硬件(区分U盘和数码相机等)不同,卷管理器会先将相应的设备节点挂载到hald创建的挂载点上,然后再打开不同的应用程序。 当然,如果是在CDROM中插入光盘,过程可能比较简单。因为CDROM本身就是一个固定的硬件,无需hotplug和udev的协助: l hald会自己监视CDROM,并且将光盘托架开合的消息通过dbus发出去。 l 卷管理器负责检查CDROM中的盘片内容,进行挂载,并调用合适的应用程序。 要注意,hald的工作是从上游得到硬件就绪的消息,然后将这个消息转发到dbus中。尽管它会调用程序来更新fstab,但实际上它自己并不执行挂载的工作。
可以通过udev配置来实现Linux中的热插拔,具体步骤如下: 1. 确认设备节点 首先需要确认设备节点,可以通过以下命令查看: ``` dmesg | tail ``` 在插入设备后,系统会输出设备信息,其中包括设备节点信息。例如,如果插入的是USB设备,通常会以`/dev/sdx`的形式显示。 2. 创建udev规则 在`/etc/udev/rules.d/`目录下创建一个新的规则文件,例如`10-usb.rules`,并在文件中添加以下内容: ``` ACTION=="add", KERNEL=="sd*", RUN+="/path/to/mount_script" ACTION=="remove", KERNEL=="sd*", RUN+="/path/to/unmount_script" ``` 其中,`/path/to/mount_script`和`/path/to/unmount_script`分别为挂载和卸载脚本的路径,可以根据实际情况进行修改。 3. 编写挂载脚本和卸载脚本 在指定的路径下分别创建挂载脚本和卸载脚本,例如`mount_script`和`unmount_script`,并分别添加以下内容: 挂载脚本: ``` #!/bin/bash DEVICE=$1 MOUNT_POINT="/mnt/usb" mkdir -p "${MOUNT_POINT}" mount "${DEVICE}" "${MOUNT_POINT}" ``` 卸载脚本: ``` #!/bin/bash DEVICE=$1 umount "${DEVICE}" ``` 注意,需要给挂载脚本和卸载脚本添加可执行权限: ``` chmod +x /path/to/mount_script chmod +x /path/to/unmount_script ``` 4. 重载udev规则 完成以上步骤后,需要重载udev规则使其生效: ``` sudo udevadm control --reload-rules ``` 现在,当插入/拔出设备时,系统会自动执行指定的脚本进行挂载/卸载操作。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值