Linux initramfs说明

1.前言

最近在尝试对手头的开发板进行移植,此处记录initramfs挂载的基本流程,记录一下,以备后查。分析时是基于linux3.4.2

2. rootfs的挂载

start_kernel->

  vfs_caches_init(num_physpages);

    mnt_init(unsigned long mempages)

      init_rootfs

        register_filesystem(&rootfs_fs_type)

      init_mount_tree

        do_kern_mount

          mount_fs

            type->mount

        set_fs_pwd

        set_fs_root

      

1. 在vfs_caches_init中会完成VFS的构建,并将rootfs挂载到VFS上,VFS与rootfs有一种水乳交融的关系,rootfs为VFS提供了根目录,而rootfs又作为第一个文件系统挂载到VFS;

2. do_kern_mount 会分配vfsmnt, vfsmnt是对挂载点的描述,它连接了挂载点和待挂载文件系统;

3. type->mount调用的就是rootfs的mount也就是rootfs_mount,rootfs_mount中会创建superblock, 并通过ramfs_fill_super创建出根inode和根dentry,最后完成rootfs挂载,实际上就是将创建的

vfsmnt的挂载点mnt_mountpoint指向新创建的根dentry,挂载的根目录mnt_root也为根dentry。注意实际的文件系统挂载时两者未必一样。

4.set_fs_pwd设置进程的当前路径,set_fs_root设置进程的根路径为根目录

经过如上几个步骤就完成了VFS根目录的创建,搭建起VFS的雏形

3.释放initramfs到rootfs 

start_kernel->

  vfs_caches_init(num_physpages);

  rest_init->

    kernel_thread(kernel_init, NULL, CLONE_FS | CLONE_SIGHAND)

      kernel_init

        do_basic_setup

          do_initcalls

            populate_rootfs

              unpack_to_rootfs

1.populate_rootfs通过调用unpack_to_rootfs 会将initramfs的cpio镜像释放到上一节创建的rootfs中

2.cpio的格式可以参考inux文件系统初始化过程(3)---加载initrd(上)

3.释放过程是通过在rootfs中创建目录,普通文件,链接文件,挂载sysfs, proc等文件系统,使得VFS变成枝繁叶茂的大树

释放过程可参考linux文件系统初始化过程(4)---加载initrd(中)

 

 参考文档

https://www.ibm.com/developerworks/cn/linux/l-k26initrd/

https://www.ibm.com/developerworks/cn/linux/l-vfs/

https://blog.csdn.net/nancygreen/article/details/5027039

https://blog.csdn.net/ooonebook/article/details/52624481

https://blog.csdn.net/scotthuang1989/article/details/43603233  Linux Filesystem: 关于vfsmount的理解

https://blog.csdn.net/yiyeguzhou100/article/details/78426292 initramfs的加载过程(从uboot到kernel)

https://blog.csdn.net/ooonebook/article/details/52624481 [rootfs] InitRamdisk & InitRamfs 介绍和使用

http://www.cnblogs.com/wuchanming/p/3769736.html linux文件系统初始化过程(3)---加载initrd(上)

posted @ 2018-09-02 16:24  jasonactions  阅读(1024)  评论(0编辑  收藏  举报