initramfs文件系统

Linux内核加载根文件系统执行/sbin/init程序前,需要找到根设备位置,如果根设备需要驱动的支持,内核有可能无能为力,通过提供一个过渡的临时根文件系统可以使得内核的设计更灵活简单.通常过渡的临时根文件系统基本上是内存文件系统.

常见的内存文件系统有:

rootfs,ramfs,ramdisk,tmpfs

1. rootfs:内核启动的初始始根文件系统,大部分linux系统正常运行后都会安装另外的文件系统,然后忽略rootfs

2. ramfs:基于内存的文件系统.ramfs文件系统没有容量大小的限制,它可以根据需要动态增加容量.直接利用了内核的磁盘高速缓存

3. ramdisk:基于ram的块设备,占据一块固定的内存,事先要使用特定的工具比如mke2fs格式化,还需要一个文件系统驱动来读写其上的文件空间固定导致容量有限,要想装入更多的文件需要重新格式化.Linux的块设备缓冲特性, ram disk上的数据被拷贝到page cache(对于文件数据)和dentry cache(对于目录项),导致内存浪费,它可能不停的动态增长直到耗尽系统的全部内存,所以只有root或授权用户允许使用ramfs

4. tmpfs:增加了容量大小的限制 + 允许把数据写入交换分区.由于增加了这两个特性,tmpfs允许普通用户使用

过渡根文件系统机制:将加载真正的根文件系统需要的设备驱动、工具以及初始化程序先加载到内存运行.

1. initrd: initial Ramdisk
/linuxrc文件,基于ramdisk技术,文件系统(ext2等)镜像文件 ————> cpio格式镜像文件
在内核启动完成后把它复制到/dev/ram块设备中, 作为内核加载真正根文件系统的过渡根文件系统

2. initramfs: initial RAM file system
init文件,cpio格式镜像文件
在内核启动完成后把它复制到rootfs中,作为内核初始的根文件系统,完成挂载系统真正的根文件系统

initramfs制作与使用:

我们学习都是从输出一个hello world开始的,所以这里就用过渡根文件系统输出hello world来说明.

1.编写程序

#include <stdio.h>

int main(int argc, char *argv[])
{
printf("Hello world Initramfs!\n");
sleep(999999999);
}
交叉编译:arm-linux-gcc -static hello.c -o init

2. 打包initramfs镜像
find .|cpio -o -H newc|gzip > ~/myinitramfs.cpio.gz
在内核中选择使用: 注意选择initramfs的压缩格式

3. 解包initramfs镜像
cpio -i -F myinitramfs.cpio --no-absolute-filenames
zcat myinitramfs.cpio.gz | cpio -i -d -H newc --no-absolute-filenames

4. 内核initramfs的构建
General setup --->
[*] Initial RAM filesystem and RAM disk (initramfs/initrd) support
(/rootfs_dir) Initramfs source file(s)
Built-in initramfs compression mode (None) ---> [] None [] GZIP

然后烧录的时候将文件系统烧录即可

时间: 2024-12-23 11:45:20

initramfs文件系统的相关文章

根文件系统挂载过程

目录 注册挂载rootfs文件系统 解压initramfs到rootfs中 prepare_namespace挂载磁盘上的文件系统 注册挂载rootfs文件系统 首先是rootfs的注册和挂载,rootfs作为一切后续文件操作的基石. start_kernel vfs_caches_init mnt_init init_rootfs注册rootfs文件系统 init_mount_tree 挂载rootfs文件系统 vfs_kern_mount mount_fs type->mount其实是roo

Linux内核驱动学习(二)----根文件系统的构成 (root filesystem)

1.建立根文件系统目录和文件 1.1创建目录 1.2创建设备文件(命令mknod):必须创建设备文件---consle\null 1.3创建配置文件---复制已有的/etc目录下的文件 1.4添加内核模块 进入Linux内核目录下,(注意,应该先编译内核,即命令make uImage ARCH=arm  CROSS_COMPILE=arm-linux-) 1.4.1.编译内核模块---命令 make modules ARCH=arm CROSS_COMPILE=arm-linux- 1.4.2.

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

Linux内核移植与启动 Target borad:FL2440 Bootloader:U-boot-2010.09 交叉编译器:buildroot-2012.08 1.linux内核基础知识 首先,磨刀不误砍柴工.在动手进行linux内核移植之前,我们有必要对linux内核进行一定的了解. 1.1 Linux内核启动过程概述 一个嵌入式Linux系统从软件角度看可以分为四个部分:  引导加载程序(Bootloader),Linux内核,文件系统,应用程序. 其中Bootloader是系统启动或

NFS文件系统制作

内核:              linux-3.0 u-boot:          2010.08 开发板:         fl2440(s3c2440主芯片) 交叉编译器:   2011.11 我们在上面移植了initramfs文件系统,并且已经成功运行了.下面我们开始移植nfs,之前开启PC上的nfs服务功能 确认并安装NFS服务依赖软件包 一般NFS服务器要提供服务,必须启动inet,nfs, mount,portmap或rpcbind这些守护进程并保持在后台状态运行. 这里需要提示

initramfs机制

1.什么是 Initramfs 在2.6版本的linux内核中,都包含一个压缩过的cpio格式的打包文件.当内核启动时,会从这个打包文件中导出文件到内核的rootfs文件系统,然后内核检查rootfs中是否包含有init文件,如果有则执行它,作为PID为1的第一个进程.这个init进程负责启动系统后续的工作,包括定位.挂载“真正的”根文件系统设备(如果有的话).然后执行 /sbin/init程序完成系统的后续初始化工作.  2.Linux2.6 内核对 Initramfs 的处理流程 (1. b

《linux破解root密码》

以下实验操作基于RHEL7.0下进行 步骤如下: 1. 重启系统 2. 按任意键,以中断启动加载器的倒计时. 3. 把光标移动到需要启动的条目. 4. 按e键,编辑该条目 把光标移动到linux16开头的行. 删除 console=ttys0,115200n8 在该行末尾,输入一个空格,然后添加  rd.break 注:rd.break表示控制权从initramfs转移到实际系统之前,进行中断. 5.  ctrl+x使用该改动并启动 启动好后,实际的根文件系统,以只读方式挂载到 /sysroot

利用qemu模拟嵌入式系统制作全过程

http://www.tinylab.org/using-qemu-simulation-inserts-the-type-system-to-produce-the-whole-process/ 利用qemu模拟嵌入式系统制作全过程 by Pingbo Wen of TinyLab.org 2013/08/31 这篇文章,将介绍如何用qemu来搭建一个基于ARM的嵌入式linux系统.通过该文章,你可以学习到如何配置kernel,如何交叉编译 kernel,如何配置busybox并编译,如何制

DM多路径存储

什么是 multipath?普通的电脑主机都是一个硬盘挂接到一个总线上,这里是一对一的关系.而到了有光纤组成的SAN 环境,由于主机和存储通过了光纤交换机连接,这样的话,就构成了多对多的关系.也就是说,主机到存储可以有多条路径可以选择.主机到存储之间的IO 由多条路径可以选择.既 然,每个主机到所对应的存储可以经过几条不同的路径,如果是同时使用的话,I/O 流量如何分配?其中一条路径坏掉了,如何处理?还有在操作系统的角度来 看,每条路径,操作系统会认为是一个实际存在的物理盘,但实际上只是通向同一

利用 qemu 模拟嵌入式系统制作全过程

利用qemu模拟嵌入式系统制作全过程 by Pingbo Wen of TinyLab.org 2013/08/31 这篇文章将介绍如何用 Qemu 来搭建一个基于 ARM 的嵌入式 Linux 系统.通过该文章可以学习到如何配置和交叉编译 Kernel,如何配置 Busybox 并编译,如何制作 Initramfs,如何制作根文件系统,如何定制自己的 Uboot,如何通过 Uboot 向 Kernel 传递参数等.开始干活! 零.环境搭建 在实现我们的目标之前,我们需要搭建自己的工作环境.在这