学习啦>学习电脑>操作系统>Linux教程>

mdev的hotplug模式介绍

时间: 若木635 分享

  mdev的hotplug模式

  上面的试验中,我们在加载完驱动模块后调用了mdev -s 命令来生成硬盘的设备文件。其实,可以使用mdev的hotplug模式在加载内核时自动生成对应的设备文件:

  在执行insmod命令前,用

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

  命令设置系统的hotplug程序为mdev。

  后续使用insmod命令加载模块时,系统自动调用mdev生成相应的设备文件。

  注意:内核必须配置支持hotplug功能。

  udev的coldplug模式

  内核在启动时已经检测到了系统的硬件设备,并把硬件设备信息通过sysfs内核虚拟文件 系统导出。sysfs文件系统由系统初始化脚本挂载到/sys上。udev扫描sysfs文件系统,根据硬件设备信息生成热插拔(hotplug)事 件,udev再读取这些事件,生成对应的硬件设备文件。由于没有实际的硬件插拔动作,所以这一过程被称为coldplug。我们的initramfs就是 利用这一机制,加载硬件设备的驱动程序模块。

  udev完成coldplug操作,需要下面三个程序:

  udevd——作为deamon,记录hotplug事件,然后排队后再发送给udev,避免事件冲突(race conditions)。

  udevtrigger——扫描sysfs文件系统,生成相应的硬件设备hotplug事件。

  udevsettle——查看udev事件队列,等队列内事件全部处理完毕才退出。

  在initramfs的init脚本中可以执行下面的语句实现coldplug功能:

  mkdir -p /dev/.udev/db

  udevd --daemon

  mkdir -p /dev/.udev/queue

  udevtrigger

  udevsettle

  许多文档提到的在udevd --daemon 命令前要执行

  echo > /proc/sys/kernel/hotplug

  命令,经验证,在我们的initramfs环境下的coldplug功能中并不需要。

  用udev自动加载设备驱动模块

  了解了udev的coldplug的机理,我们就试验一下用udev自动加载设备驱动模块,并生成硬件设备文件。

  (1)从 /sbin 目录下拷贝udevd、udevtrigger、udevsettle程序到image目录下的sbin目录下,并用ldd命令找到它们所需要的动态库文件,拷贝到image目录下的lib目录下。

  (2)修改init脚本,增加coldplug功能:

  #!/bin/sh

  mount -t proc proc /proc

  mount -t sysfs sysfs /sys

  mdev -s

  #using udev autoload hard disk driver module

  mkdir -p /dev/.udev/db

  udevd --daemon

  mkdir -p /dev/.udev/queue

  udevtrigger

  udevsettle

  mount /dev/sda8 /mnt

  killall udevd

  exec switch_root /mnt /sbin/init

  注意:在切换到真正根文件系统前,要把udevd进程杀掉,否则会和真正根文件系统中的udev脚本的执行相冲突。这就是上面killall udevd 语句的作用。

  (3)编写udev规则文件

  规 则文件是udev的灵魂,没有规则文件,udev无法自动加载硬件设备的驱动模块。为了简单,我们直接使用CLFS中的40- modprobe.rules,把它拷贝到image目录下的etc/udev/rules.d目录。

  #

  # Description : 40-modprobe.rules

  #

  # Authors : Based on Open Suse Udev Rules

  # [url=mailto:kay.sievers@suse.de]kay.sievers@suse.de

  #

  # Adapted to : Jim Gifford

  # LFS : Alexander E. Patrakov

  #

  # Version : 00.01

  #

  # Notes :

  #

  ########################################################################

  # hotplug

  ENV{MODALIAS}=="?*", RUN+="/sbin/modprobe $env{MODALIAS}"

  # scsi

  SUBSYSTEM=="scsi_device", ACTION=="add", SYSFS{device/type}=="0|7|14", RUN+="/sbin/modprobe sd_mod"

  SUBSYSTEM=="scsi_device", ACTION=="add", SYSFS{device/type}=="1", SYSFS{device/vendor}=="On[sS]tream", RUN+="/sbin/modprobe osst"

  SUBSYSTEM=="scsi_device", ACTION=="add", SYSFS{device/type}=="1", RUN+="/sbin/modprobe st"

  SUBSYSTEM=="scsi_device", ACTION=="add", SYSFS{device/type}=="[45]", RUN+="/sbin/modprobe sr_mod"

  SUBSYSTEM=="scsi_device", ACTION=="add", RUN+="/sbin/modprobe sg"

  # floppy

  KERNEL=="nvram", ACTION=="add", RUN+="load_floppy_module.sh"

  注意:上面的

  ENV{MODALIAS}=="?*", RUN+="/sbin/modprobe $env{MODALIAS}"

  语 句是实现自动加载硬件设备驱动模块功能的关键,它根据sysfs文件系统中记录的模块aliases数据,用modprobe命令加载对应的内核模块。有 关模块aliases的进一步说明,可参考CLFS手册(CLFS-1.0.0-x86)中的11.5.2.4. Module Loading一节的描述。

  (4)拷贝modprobe命令

  前一节提到过,busybox的modprobe 命令不能正常使用,所以我们需要拷贝 /sbin 目录下的modprobe命令到image目录下的sbin目录,供udev加载内核模块使用。

  再用ldd命令检查一下 /sbin/modprobe 命令所需的动态库文件,如果有则拷贝到image/lib目录下。(我的检查结果是,除了libc6外,不需要其他动态库,所以不需要拷贝)

  好了,重新生成initramfs,initramfs能够自动加载硬盘设备的驱动模块,系统顺利地从initramfs切换到了真正的根文件系统。

mdev的hotplug模式介绍

mdev的hotplug模式 上面的试验中,我们在加载完驱动模块后调用了mdev -s 命令来生成硬盘的设备文件。其实,可以使用mdev的hotplug模式在加载内核时自动生成对应的设备文件: 在执行insmod命令前,用 echo /sbin/mdev /proc/sys/kernel/h
推荐度:
点击下载文档文档为doc格式

精选文章

  • 如何编译加载linux驱动和内核模块
    如何编译加载linux驱动和内核模块

    编译加载linux驱动和内核模块 到目前为止,我们在构建initramfs时还没有涉及内核模块的支持,所用到的硬件驱动程序都是直接编译到内核中。现在我们就看

  • 如何制作最简minilinux
    如何制作最简minilinux

    制作最简minilinux 在制作之前要保证几点: init为指向busybox的链接,若为脚本最后一行为exec /sbin/init,并有执行权限。 目录建设好了,如dev,proc,sys,etc等。

  • busybox的inittab文件格式说明
    busybox的inittab文件格式说明

    busybox的inittab文件格式说明 要写自己的inittab,需要理解busybox的inittab文件格式。 busybox的inittab文件与通常的inittab不同,它没有runlevel的概念,语句功能上也

  • busybox的缺省init模式介绍
    busybox的缺省init模式介绍

    busybox的缺省init模式 当系统没有/etc/inittab文件时,它有一套缺省的模式,按下面配置执行: ::sysinit:/etc/init.d/rcS ::askfirst:/bin/sh ::ctrlaltdel:/sbin/reboot ::shutdow

75405