4.7 挂载并切换到根文件系统
截止到目前,系统一直在使用initramfs作为临时的根文件系统,initramfs的主要目的之一就是辅助系统顺利地切换到真正的根文件系统。既然现在已经正确的驱动了硬盘,那么接下来,我们就切换到硬盘上的真正的根文件系统。
4.7.1 挂载根文件系统
首先我们需要确定根文件系统所在的物理介质。以存储器为硬盘为例,需要确定文件系统储存在硬盘的哪个分区。内核在引导时已经将文件系统所在的介质等相关参数从GRUB复制到了内核中,所以我们现在可以通过内核获取这个参数。谈到用户空间与内核的通信,读者一定想到了proc与sysfs文件系统,接下来我们在init程序中通过proc文件系统取得文件系统所在的介质。
在GRUB的cmdline中,我们使用了"root=/dev/sda2"指定文件系统所在的介质,因此我们截取"root="后面的值,将其保存在变量ROOT中,供后面挂载使用。
一般在准备挂载文件系统之前,将使用fsck检查文件系统。如果文件系统中存在错误,则试图修复。这个过程要求文件系统没有被挂载或者只能以只读方式挂载。因此,一般首先以只读方式(ro)挂载根文件系统,然后执行fsck检查修复后,再重新以读写方式(rw)挂载。这也是大家看到的在GRUB的配置文件grub.cfg中,内核的命令行参数要指定ro的原因。但是也不排除某些系统在启动时略过fsck的步骤,直接将文件系统以读写方式挂载。因此,在挂载前,我们首先查看内核命令行的这个参数。如果没有指定,默认我们以只读方式挂载。
对于文件系统的类型,可以通过udev来获取,但是这里我们偷个懒,直接让mount来猜测。在init中增加如下使用黑体标识的脚本将真正的根文件系统挂载到/root目录下,当然,不一定是挂载到/root目录下,也可以使用除了“/”外的任何目录作为挂载点。
使用修改的initramfs重新启动vita系统,查看mount的输出和/root目录下的内容,确定真正的根文件系统是否已经挂载,如图4-28所示。根据mount命令的输出可见,分区"/dev/sda2"确实被挂载到了"/root"目录下,该目录下也不再是个空目录了,是根文件系统的内容。
图 4-28 自动挂载根文件系统成功