rootfs文件系统建立、并且挂载于自己超级块(包括目录项dentry和i节点inod)对应的目录项,设置了系统current根目录和根文件系统、pwd的目录和文件系统。
========================================
释放Initramfs到rootfs;如果Initramfs中有init,这种情况比较特殊、rootfs就是最后系统使用的根文件系统。
而且此时,不需要在单独烧录根文件系统的img;此时,根文件系统就是内核uImage的一部分。当然,缺陷就是该文件系统运行时的介质是ramdisk即内存盘、它不再与磁盘对应;因此,此时修改根目录下的文件将不被得到保存。它的内核配置项为:CONFIG_INITRAMFS_SOURCE。实际项目中会经常碰到。
make menuconfig->General setup->Initial RAM filesystem and RAM disk(initramfs/initrd) support
底下的Initramfs source file(s)填写根文件系统的路径,如:../out/target/product/tclm6/root;不填的话,将导致initrd或磁盘文件系统的挂载(因为下边将会看到,内核将找不到“/init”)。
挂载实际文件系统至rootfs,将系统current的根目录切换为/root、系统current的根文件系统切换为磁盘文件系统或initrd作为根文件系统。
setenv bootargs root=/dev/ram0 initrd=0x2800000,24M rootfstype=ext2 mem=64M console=ttyAMA0
setenv bootargs root=/dev/nfs nfsroot=192.168.1.7:/opt/yz/nfs,rw ip=192.168.1.160 mem=64M console=ttyAMA0
rootfs永远不会被卸载,它只是被隐藏了。在用户空间下,更多地情况是只能见到rootfs这棵大树的一叶,而且还是被安装过文件系统了的。
initrd 的全称是 boot loader initialized RAM disk,实质是属于用户态的文件包,也可以作为一种机制理解,其中包含了真正最终的根文件系统的存储设备的驱动程序。在 linux内核启动前,boot loader 会将外部存储中的 initrd 文件包加载到内存中,内核启动时先自行在内存中建立一个轻量级的文件系统rootfs文件系统,然后将initrd 文件包再复制加载解压到rootfs文件系统中,如果是cpio-initrd类型,则直接执行initrd文件包中的脚本init,init负责加载相关设备介质的驱动程序模块等,最后mount到最终真正的文件系统,然后再执行最终真正的根文件系统中的/sbin/init,再次进行其他初始化;如果是image-initrd类型,则将其内容保存到/initrd.image中,建立设备/dev/ram0(即ramdisk),将/initrd.image释放到/dev/ram0,如果在grub或者lilo里配置了 root=/dev/ram0 ,则实际上真正的根设备就是image-initrd了,不把它作为initrd处理 ,而是作为真正的根文件系统处理(这种情况下在没有真正的根文件系统时使用,很多嵌入式设备采用这种方式),没配置则执行image-initrd中的linuxrc文件,进行相关驱动(主要是真正根文件系统所在设备的驱动)的装载,然后将真正的根文件系统设置为根文件系统,执行/sbin/init。
Linux2.6既支持cpio-initrd,也支持image-initrd,但是相比image-initrd,cpio-initrd有着更大的优势。