嵌入式Linux开发学习rootfs通过ramdisk挂载技巧

Posted 与光同程

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了嵌入式Linux开发学习rootfs通过ramdisk挂载技巧相关的知识,希望对你有一定的参考价值。

概述

在工作中发现在很多产品的研发中总是会采用initramfs文件系统来作为挂载rootfs的方式,所以仔细了解了一下怎么挂载initramfs文件系统。

内核配置

首先必须确保内核是支持ramdisk的需要做一些配置

The [configuration](https://so.csdn.net/so/search?q=configuration&spm=1001.2101.3001.7020) of the kernel is as follow:

1) General setup-->[*] Initial RAM filesystem and RAM disk (initramfs/initrd) support

 [*]   Support initial ramdisks compressed using gzip

 [*]   Support initial ramdisks compressed using bzip2

 2)device driver-->Block devices-->   Loopback device support

    RAM block device support

 (16384) Default RAM disk size (kbytes)

 3)ext2 filesystem support, enalbed by default

uboot 设置启动参数

如果启动流程并不复杂可以直接设置启动命令行,

CONFIG_BOOTCOMMAND

下面是我在qemu vexpress仿真平台上 通过模拟mmc

加载rootfs.cpio.gz 到内存 然后启动的设置

#define CONFIG_BOOTCOMMAND_RAM\\

    "setenv bootargs root=/dev/ram0 rootfstype=ext2 rw "\\

    "console=ttyAMA0 rdinit=/linuxrc initrd=0x61000000,100M ;"\\

    "load mmc 0:2 0x60003000 zImage; "\\

    "load mmc 0:2 0x60500000 vexpress-v2p-ca9.dtb; "\\

    "load mmc 0:4 0x61000000 rootfs.cpio.gz; "\\

    "bootz 0x60003000 - 0x60500000 ; "

当然 这只是一种方法,听说还可以使用mkimage工具

将rootfs.cpio.gz打包一层 然后直接传参数给 bootz

就像这样

bootz 0x60003000 0x61000000 0x60500000

总结

在使用initramfs的过程中我感觉相比于传统的我们直接

挂载块设备/dev/mmcblk0 /mmc/sda1 之类的挂载点来看

这种设置方式有其独特的优势:

  1. 相比于读写块设备 ,读写ram总归是会快很多的,系统性能会有所提高。
  2. 可以避免一些需要频繁擦写数据的情况对于块设备的消耗,可以提升设备寿命,对于不怎么开关机长期保持上电状态的设备比如交换机,网桥之类尤其如此。
  3. 所有数据都是临时的,用户怎么折腾都不会改变固件

当然缺点也是明显的:

ram大小是有限的,ram总归是比flash金贵,文件系统如果太大就不好使了,同时对于用户产生数据的保存直接存到ram的根文件系统是没用的。

当然这个问题也非常好解决,直接将块设备挂载到内存文件系统中的一个挂载点上,然后需要保存的用户数据保存到那个挂载点上的文件夹即可。

以上是关于嵌入式Linux开发学习rootfs通过ramdisk挂载技巧的主要内容,如果未能解决你的问题,请参考以下文章

嵌入式ROOTFS transplantation

3将uboot,kernel,rootfs下载到开发板上

buildroot使用介绍

问答23Linux移植:如何制作rootfs?

linux的进程1:rootfs与linuxrc

buildroot构建项目---buildroot介绍