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(上)

Linux initramfs说明的更多相关文章

  1. Linux 驱动开发

    linux驱动开发总结(一) 基础性总结 1, linux驱动一般分为3大类: * 字符设备 * 块设备 * 网络设备 2, 开发环境构建: * 交叉工具链构建 * NFS和tftp服务器安装 3, ...

  2. 基于 debootstrap 和 busybox 构建 mini ubuntu

    基于 debootstrap 和 busybox 构建 mini ubuntu 最近的工作涉及到服务器自动安装和网络部署操作系统,然后使用 ansible 和 saltsatck 进行配置并安装 op ...

  3. 搭建基于qemu + eclipse的kernel调试环境(by quqi99)

    作者:张华  发表于:2016-02-06版权声明:能够随意转载.转载时请务必以超链接形式标明文章原始出处和作者信息及本版权声明 ( http://blog.csdn.net/quqi99 ) 使用q ...

  4. 内核移植和文件系统制作(2):linux内核最小系统和initramfs文件系统

    linux内核最小系统,使用内核版本:https://www.kernel.org/pub/linux/kernel/v3.0/linux-3.8.1.tar.bz2 1,FL2440板子的基本硬件: ...

  5. Linux内核3.0移植并基于Initramfs根文件系统启动

    Linux内核移植与启动 Target borad:FL2440 Bootloader:U-boot-2010.09 交叉编译器:buildroot-2012.08 1.linux内核基础知识 首先, ...

  6. 从ramdisk根文件系统启动Linux成功,及使用initramfs启动linux

    下面两篇文章是ARM9论坛上的讲解ramdisk文件系统的很不错的文章 今天做了个试验,让Linux2.6.29.4从ramdisk根文件系统启动成功,总结一下. 其中涉及的内容较多,很多东西不再详述 ...

  7. linux中的rootfs/initrd/ramfs/initramfs

    什么是ramfs?ramfs是空间规模动态变化的RAM文件系统.它非常简单,是用来实现Linux缓存机制(缓存page cache and dentry cache)的文件系统.通常情况下,Linux ...

  8. 基于mini2440嵌入式Linux根文件系统制作(Initramfs和nfs两种跟文件系统)

    嵌入式系统由三部分构成: 1.bootoader---bootparameters---2.kernel 3.Root-filesysytem 一个内核可以挂载多个文件系统,但是有一个根文件系统所以叫 ...

  9. 【嵌入式 Linux文件系统】如何使用Initramfs文件系统

    (1)#cd ../rootfs/ #ln -s ./bin/busybox init 创建软链接 (2)进入Linux内核 #make menuconfig General setup-->I ...

随机推荐

  1. 通过java代码执行Linux命令查询声卡和显卡 型号

    package test; import java.io.BufferedReader; import java.io.InputStreamReader; public class ExcuteLi ...

  2. 文件实时同步(rsync+inotify)

    目标服务器:10.11.6.11 源服务器:10.11.6.12 准备条件: 1.关闭selinux: vi /etc/selinux/config #编辑防火墙配置文件 #SELINUX=enfor ...

  3. mysql提取.sql备份文件中的单个表以及表数据

    背景:随着业务模块的不断在增多,数据库mysql容量也是越来越大,做测试时,整个备份还原比较耗费时间,由于有时候仅仅需要单个表或者少数几个表,要想从整个备份文件中提取指定的表以及数据,需要以下方法. ...

  4. Windows Server 2008 R2提示api-ms-win-crt-runtime-l1-1-0.dll 丢失解决方法

    在一台服务器的全新windows Server 2008 R2 服务器上配置php运行环境, 在启动Apache之后,显示下图错误: 解决方法: 1.安装VC redit.exe程序解决 是VC的一个 ...

  5. VScode插件以及配置

    Auto Rename Tag —— 自动同步修改标签 AutoFileName —— 自动补全路径提示 background —— 一个萌萌的插件,可以自己设置vsc的背景图 Bootstrap 3 ...

  6. js 解决两值交换

    总结七种办法来交换a和b的变量值 交换变量值方案一 最最最简单的办法就是使用一个临时变量了 不过使用临时变量的方法实在是太low了 var t; t = a; a = b; b = t;   首先把a ...

  7. codeforces8A

    Train and Peter CodeForces - 8A Peter likes to travel by train. He likes it so much that on the trai ...

  8. [CQOI2009] 中位数

    不错的思维题 传送门:$>here<$ 题意:给出一个N的排列,求出其中有多少个连续子段的中位数是b 数据范围:$N \leq 100000$ $Solution$ 先考虑中位数的意义:一 ...

  9. python并发编程之IO阻塞基础知识点

    IO模型 解决IO问题的方式方法 问题是:IO操作阻塞程序执行 解决的也仅仅是网络IO操作   一般数据传输经历的两个阶段,如图: IO阻塞模型分类: 阻塞IO 非阻塞IO 多路复用IO 异步IO(爬 ...

  10. Python菜鸟快乐游戏编程_pygame(6)

    Python菜鸟快乐游戏编程_pygame(博主录制,2K分辨率,超高清) https://study.163.com/course/courseMain.htm?courseId=100618802 ...