构建linux系统的initramfs / ramdisk

原创 2015年07月09日 20:45:44

概述


最近工作中需要用到initramfs。initramfs是一中ram fs,使用它可以使linux系统分阶段启动。使用initramfs主要有两种方式:一种是将最小文件系统直接编译进内核镜像中;另一种方式是制作ramdisk,然后将ramdisk加载到内存中,并指定给内核。无论是哪种方式,都需要内核中驱动的支持,所以要使用initramfs需要在编译内核时打开对initramfs的支持。

配置菜单如下:
Support Initramfs

initramfs的大小是有限制的,在配置ram block驱动是需要制定所需要的大小,配置如下:
ram size

图中使用的是16MB,可以根据需要配置大小。

一、将文件系统编译进内核中


最简单的方法就是将最小根文件系统编译进内核镜像中。那样只需要在编译之前配置内核时制定最小根文件系统的位置就行了,配置initramfs source file就可以了,配置方法如下:
initramfs source file

可以根据自己的实际情况修改Initramfs source file的路径,只需要选中Initramfs source file(s)项回车,然后输入根文件系统路径就好:

initramfs source file path

配置完成后编译,编译出来内核的image文件会比较大,因为这里面包含了最小文件系统。

启动带有initramfs的内核镜像就和启动普通的内核时一样的,不过文件系统在内存中。

二、使用ramdisk


使用ramdisk作为Initramfs比较灵活一些,不需要每次都去编译内核,使用一些命令就可以制作ramdisk。ramdisk也是需要内核的支持,前面已经说过了。为了减小ramdisk占用的内存空间,有时候需要对ramdisk进行压缩,内核使用压缩的ramdisk时就需要对其进行解压缩,我们可以配置内核,使内核支持一些压缩格式:

compress

图中可以看到,我们配置内核支持的时gzip压缩的ramdisk,除此之外内核还支持bzip2,LZMA,XZ和LZO等压缩格式的ramdisk。

下面介绍制作ramdisk的步骤:

1、创建一个16M的空文件,我们内核配置的ram block设备的大小为16MB:

#dd if=/dev/zero of=ramdisk bs=1M count=16

2、格式化这个文件

#mke2fs -F -m0 ramdisk

3、挂载这个文件(通过loop设备)

#mount -t ext2 -o loop ramdisk /mnt

4、将最小文件系统拷贝至ramdisk中

#cp ~/minirootfs/* /mnt -rf

5、umount这个ramdisk

#umount /mnt

6、压缩ramdisk

#gzip -9 ramdisk

第6步完成后将产生一个ramdisk.gz文件,这个就是制作好的压缩的ramdisk文件。
上面步骤进行到第5步,ramdisk应该已经可以使用了,对其进行压缩就是为了减小其占用的空间。

使用ramdisk作为initramfs,需要对内核的bootargs进行修改,需要添加一些args选项。

  • initrd=[address | path]

    在ARM平台中常用initrd=0xXXXXX的方式,其中initrd参数指定的地址就是ramdisk加载到内存的地址。

  • noinitrd
    该选项让内核不要将initrd转换至ram disk中,系统启动后可以通过/dev/initrd访问initrd中的数据。这种方式initrd中可以是任何数据,并非一定要是一个文件系统镜像。

  • root=/dev/ram0
    initrd被挂载为root。从initrd中启动。

ramdisk制作的详细步骤可以参考内核文档kernel/Documentation/initrd.txt

《Linux启动过程分析》之区别Initramfs与initrd

一、简介 1.initrd   在早期的linux系统中,一般只有硬盘或者软盘被用来作为linux根文件系统的存储设备,因此也就很容易把这些设备的驱动程序集成到内核中。但是现在的嵌入式系统中可能将根文...
  • tankai19880619
  • tankai19880619
  • 2013年11月22日 15:32
  • 14823

Linux启动分析之Initramfs

在前面已经分析了rootfs的挂载,解决了VFS架构下原始挂载点的问题,也提到了Initramfs文件包的填充,这里记下如何实现Initramfs填充 一、Initramfs概述 1.initrd...
  • BOJUE01
  • BOJUE01
  • 2016年12月21日 15:11
  • 2537

全面解析Linux 内核 3.10.x - initramfs 启动流程

From: 全面解析Linux 内核 3.10.x - 本文章完全基于MIPS架构 坚持也许就是胜利 - Keven早在之前,Linus提出要把cache当作文件系统装载。 这里有一份来自init...
  • ongoingcre
  • ongoingcre
  • 2016年01月14日 21:06
  • 1485

嵌入式Linux移植之initramfs

Linux可以将根文件系统编译进内核,称作initramfs。加载内核的时候,真实的内核和根文件系统都加载到内存。这在嵌入式系统中非常普遍,我们通常制作一个最小根文件系统initramfs,并把他编译...
  • huangbin0709
  • huangbin0709
  • 2016年10月01日 22:40
  • 704

使用initramfs启动Linux成功

与从ramdisk根文件系统启动Linux成功对比 开发环境:Fedora 9 交叉编译工具链:arm-linux-gcc 4.3.2 with EABI 嵌入式Linux内核版本:2....
  • zzobin
  • zzobin
  • 2012年07月09日 11:20
  • 5198

解决Linux开机进入Initramfs无法开机

今天一早打开Kali,发现进入了Initramfs,无法正常进入系统,网上查了点资料,说可能是由于没有正常关机导致磁盘文件损坏; 回想一下,还真的没有正常关机(昨晚关机时卡死了,我就直接拔电源了。。...
  • Sufeiboy
  • Sufeiboy
  • 2017年10月02日 15:03
  • 1346

Linux INITRAMFS 与 INITRD

1. INITRAMFS 和INITRD(INITRAMDISK) 是什么?        RAMFS 和 RAMDISK 都是内存文件系统,他们有着小巧快速的特点。INIT前缀表示其包含有...
  • yuesichiu
  • yuesichiu
  • 2013年02月22日 09:49
  • 1675

Linux启动流程 initrd与initramfs的区别

  • 2015年12月16日 11:07
  • 774KB
  • 下载

关于使用Initramfs来挂载根文件系统的一些理解

关于使用Initramfs和ramdisk来挂载根文件系统的一些理解。若用这两种方式挂载根文件系统,编译内核的时候,会将我们制作好的根文件系统整合到内核中,它们形成一个不可分离的整体。这个整体会被下载...
  • Andoubi
  • Andoubi
  • 2016年07月19日 20:31
  • 1172

BusyBox制作Initramfs嵌入式Linux根文件系统

嵌入式Linux系统由linux内核与根文件系统两部分构成,两者缺一不可(无根文件系统的内核无法启动) 使用busybox构建嵌入式根文件系统目录结构,配置内核,并且使用Initramfs制作成根...
  • mcu_tian
  • mcu_tian
  • 2016年06月01日 15:44
  • 3427
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:构建linux系统的initramfs / ramdisk
举报原因:
原因补充:

(最多只允许输入30个字)