第一步:Kernel首先要注册一个RAMFS文件系统类型(实际注册的类型名称是”ROOTFS”,后续我们可以看到它实际上就是”RAMFS”); 第二步:然后加载(mount)一个空的rootfs文件系统,类型就是上面提到的RAMFS(ROOTFS); 第三步:寻址initramfs文件“XXX.cpio.gz”并解压到已mount的rootfs文件系统中; 第四步:寻址用户空间的ini...
好了,下面咱们就可以得出生成CPIO-INITRD的完整步骤了: cd ~ gen_initramfs_list.sh rootfs/ > filelist gen_init_cpio filelist > rootfs.cpio gzip rootfs.cpio 最后得到的这个rootfs.cpio.gz,就是咱们要的CPIO-INITRD了. 在BOOTLOADER里修改一下参数: append initrd=rootfs.cpio.gz ramdisk_size=8192 vga=792...
4. 切换到另一个root设备时,initrd执行pivot_root后,卸载ramdisk;initramfs是rootfs,既不能pivot_root,也不能卸载。 initramfs会删掉rootfs的所有内容(find -xdev / -exec rm '{}' ';'),再次安装root到rootfs(cd /newmount; mount --move . /; chroot .),把stdin/sdout/stderr挂在新的/dev/console上,...
cpio-initrd 的处理流程(内核空间->用户空间): 1. boot loader 把内核以及 initrd 文件加载到内存的特定位置。 2. 内核判断 initrd 的文件格式,如果是 cpio 格式。 3. 将 initrd 的内容释放到 rootfs 中。 4. 执行 initrd 中的 /init 文件,执行到这一点,内核的工作全部结束,完全交给 /init 文件处理。 cp...
可见对于cpio-initrd格式的镜像,它执行的是init文件 image-initrd的处理流程 1.uboot把内核以及initrd文件加载到内存的特定位置。 2.内核判断initrd的文件格式,如果不是cpio格式,将其作为image-initrd处理。 3.内核将initrd的内容保存在rootfs下的/initrd.image文件中。
第一步:Kernel首先要注册一个RAMFS文件系统类型(实际注册的类型名称是"ROOTFS",后续我们可以看到它实际上就是"RAMFS"); 第二步:然后加载(mount)一个空的rootfs文件系统,类型就是上面提到的RAMFS(ROOTFS); 第三步:寻址initramfs文件“XXX.cpio.gz”并解压到已mount的rootfs文件系统中; 第四步:寻址用户空间的init,...
在解压缩后,kernel将检查 rootfs中是否包含init文件。如果init文件存在,内核就会执行这个文件,并且赋予PID=1的进程号。这个init程序将整个系统引导起来, 包括定位并且安装真正的root设备。如果在cpio文档解压缩后的rootfs中没有init程序(init文件),内核执行旧的代码,定位并且安装 root分区,执行/sbin/init程序。
(1) Linux内核只认cpio格式的initramfs文件包(因为unpack_to_rootfs只能解析cpio格式文件),非cpio格式的 initramfs文件包将被系统抛弃,而initrd可以是cpio包也可以是传统的镜像(image)文件,实际使用中initrd都是传统镜像文件。 (2) initramfs在编译内核的同时被编译并与内核连接成一个文件,它被链接到地址__initramfs_st...
rootfs是一个特定的ramfs(或tmpfs,如果tmpfs被启用)的实例,它始终存在于linux2.6的系统中。rootfs不能被卸载(与其添加特殊代码用来维护空的链表,不如把rootfs节点始终加入,因此便于kernel维护。rootfs是ramfs的一个空实例,占用空间极小)。大部分其他的文件系统安装于rootfs之上,然后忽略它。它是内核启动初始化根文件系统...
一、目的 上文详细介绍了CPIO格式的initrd文件,本文从源代码角度分析加载并解析initrd文件的过程。 initrd文件和linux内核一般存储在磁盘空间中,在系统启动阶段由bootload负责把磁盘上的内核和initrd加载到指定的内存空间中;然后,再由内核读取和解析initrd文件,在VFS(目前只有rootfs的根目录)中新建目... ...