4.6.8 启动udevd和模拟热插拔
现在对于自动加载硬盘控制器驱动来说,是万事俱备,只欠东风了,让我们来扣响扳机。修改init,在其中启动udevd,并使用udevadm对冷插拔设备模拟热插拔。另外,udevd需要保存某些运行时的信息,因此,我们需要建立run目录:
因为这个目录也是保存运行时信息的,关机后不再需要保存,因此我们也使用相对高效的基于内存的文件系统。修改后的init文件如下:
init启动了udev的服务进程udevd,然后使用命令udevadm遍历sysfs中的设备,向这些设备在sysfs文件系统中的文件uevent写入"add"字符串,请求内核重新发送KOBJ_ADD事件,相当于模拟了一次热插拔。
udevd收到硬盘控制器的uevent后,将加载硬盘控制器驱动,并创建设备节点。当然devtmpfs也会创建设备节点,但是udevd与devtmpfs并不矛盾,udevd可以在devtmpfs上进行用户空间的各种修饰。
命令"udevadm settle"的目的是等待udevd处理完内核向用户空间发送的uevent后再继续向下执行。否则,如果这里不进行等待,后续的操作有可能发生错误。举个例子,假如在udevd正在调用modprobe加载硬盘驱动模块时,init后续的脚本可能已经并行地开始挂载根文件系统了,但是此时设备尚未被驱动,更别提设备节点了,所以挂载将会失败。
重新压缩initramfs,更新到vita系统,重启系统。我们来检查一下硬盘控制器是否正确加载,如图4-27所示。通过lsmod和查看设备节点,显然硬盘控制器驱动已经成功自动加载。
图 4-27 查看加载模块以及建立的硬盘设备节点