4.2.3 挂载并切换到真正的根目录
将initramfs成功解压后,挂载真正的根文件系统所需的驱动、程序等已经全部俱备,可以挂载真正的根文件系统了。假设真正的根文件系统在第一块硬盘的第一个分区,即/dev/sda1,并假设挂载点为/root,那么挂载完成后,文件系统的目录树如图4-4所示。
图 4-4 挂载根文件系统后虚拟文件系统结构
挂载真正的根文件系统,即/dev/sda1时,内核将为其创建一个mount对象,为了行文方便,这里用mount2指代。为了方便查找,mount2会被内核加入到一个Hash表中。mount2中的mnt_parent指向了代表rootfs的mount1。mount2中的mnt_mountpoint指向该文件系统的挂载点,显然,这里是rootfs中的/root目录。mount2中的mnt_root指向代表根文件系统的根节点的dentry。
此时,进程0的任务结构体中的fs的root和pwd均指向rootfs的根节点,当然,这个根节点是由mount和rootfs的根目录的dentry的共同标识的。也就是说,此时进程的文件系统的namespace是以rootfs的根目录作为根的目录树。
挂载真正的根文件系统后,rootfs中的内容已经没有保留的意义,但是并不能将rootfs卸载,因为rootfs是整个虚拟文件系统的根。因此,为了不占用内存空间,将rootfs中的内容(文件)释放掉即可,然后将真正的根文件系统移动到虚拟文件系统的根(即rootfs的根)下,最后再将进程的文件系统的namespace切换到真正的根文件系统。切换后,虚拟文件系统中的相关数据结构间的关系如图4-5所示。
图 4-5 切换根目录后虚拟文件系统结构