平台: Ubuntu 14.04 LTS
Linux-3.0
首先配置内核参数:
Make menuconfig
Device Drivers --->
SCSI device support --->
<*> SCSIdevice support
[*] legacy/proc/scsi/ support
<*> SCSI disksupport
[*] USB support --->
<*> Supportfor Host-side USB
[*] USB devicefilesystem (DEPRECATED)
<*> OHCI HCDsupport
<*> USB MassStorage support
File systems --->
DOS/FAT/NT Filesystems --->
<*> MSDOS fs support
-*- Native languagesupport --->
<*> Codepage437 (United States, Canada)
<*>SimplifiedChinese charset (CP936, GB2312)
<*>TraditionalChinese charset (Big5)
<*> NLS ISO8859-1 (Latin 1; Western EuropeanLanguages)
<*>NLSUTF-8
保存退出,make,下载到开发板。
按道理说此时开发板仅仅是可以识别出来U盘,还不能自动挂载的,但是我把U盘插上去后系统直接就帮我挂载好了,我猜测是移植根文件系统时已经做好了自动挂载。我们来看一下是怎么实现的。
Linux刚启动时会干什么呢?网上查到是这样的:
Linux 开机脚本启动顺序:
第一步:启动内核
第二步:执行init (配置文件/etc/inittab)
第三步:启动相应的脚本,执行inittab脚本,并且执行里面的脚本/etc/init.d rc.sysinit rc.d rc.local。。。
第四步:启动login登录界面 login
第五步:在用户登录的时候执行sh脚本的顺序:每次登录的时候都会完全执行的 /etc/profile /etc/bashrc /root/.bashrc/root/.bash_profile
那我们去看一下inittab,里面包含这两句:
#Use mdev as hotplug to auto mount USBstorage or SD card
::sysinit:/bin/echo /sbin/mdev >/proc/sys/kernel/hotplug
::sysinit:/sbin/mdev –s
/etc/inittab文件每一行包括四个字段:label:runlevel:action:process,个字段详细含义在http://blog.csdn.net/bluebubble/article/details/8997267
我们仅分析上面两句,期中sysinit表示:只有在启动或重新启动系统并首先进入单用户模式时,init才执行这些登记项。而process表示:具体应该执行的命令。也就是说用户一登录系统,就执行/bin/echo /sbin/mdev >/proc/sys/kernel/hotplug以及/sbin/mdev –s。
/bin/echo /sbin/mdev >/proc/sys/kernel/hotplug的作用是:
当有热插拔事件产生时,内核就会调用位于 /sbin目录的mdev(mdev是mdev是busybox自带的一个简化版的udev。作用是在系统启动和热插拔或动态加载驱动程序时,自动产生驱动程序所需的节点文件,在文件系统中的/dev目录下的设备节点都是由mdev创建的。mdev扫描/sys/class和/sys/block中所有的类设备目录,如果在目录中含有名为"dev"的文件,且文件中包含的是设备号,则mdev就利用这些信息为这个设备在/dev下创建设备节点)。
mdev –s 就是在系统启动时创建所有的设备节点。
mdev挂载也是有规则的,在/etc/mdev.conf中:
sd[a-h]*[0-9] 0:0 0660 *(/usr/sbin/hotplug /media/usb)
sd[a-h] 0:0 0660 *(/usr/sbin/hotplug /media/usb)
ub[a-h]*[0-9] 0:0 0660 *(/usr/sbin/hotplug /media/usb)
ub[a-h] 0:0 0660 *(/usr/sbin/hotplug /media/usb)
mmcblk[0-9]p[0-9] 0:0 0660 @(/bin/mount /dev/$MDEV /media/mmc)
mmcblk[0-9] 0:0 0660 $(/bin/umount /media/mmc)
sg*[0-9] 0:0 0660 *(/usr/sbin/modem_hotplug >/logs/modem_hotplug_sg.log 2>&1)
ttyUSB[0-9] 0:0 0660 *(/usr/sbin/modem_hotplug >/logs/modem_hotplug_tty.log 2>&1)
(@表示是在插入(创建设备结点)后执行后面的脚本,$表示在拔出(删除设备结点)前执行后面的脚本,*表示在创建设备节点后和删除设备节点前都运行命令)。
而要使用mdev之前又得先挂载/sys,这个挂载是发生在系统启动时,依据的是/stc/fstab:(具体解释http://ckc620.blog.51cto.com/631254/394238)
# /etc/fstab: static file system information.
#
# <file system> <mount pt> <type> <options> <dump> <pass>
/dev/root / ext2 rw,noauto 0 1
proc /proc proc defaults 0 0
usbfs /proc/bus/usb usbfs defaults 0 0
tmpfs /dev tmpfs defaults 0 0
ramfs /tmp ramfs defaults 0 0
sysfs /sys sysfs defaults 0 0
(fstab可以自动挂载各种文件系统格式的硬盘、分区、可移动设备和远程设备等)
那么总的来说是怎么一回事呢?系统启动时根据fstab挂载/sys,如果插上U盘,产生热插拔事件也就是hotplug,hotplug通知mdev,mdev根据mdev.conf把相应的设备挂载到设置好的目录中去。