ramfs和ramdisk文件系统的制作和启动

简介: ramfs和ramdisk文件系统的制作和启动

在移植Linux内核早期时,如果flash等存储设备的驱动还没写好,可以将文件系统放到内存中运行。

此时可以使用ramfsramdisk,即将内存的一部分用作文件系统。

ramfs

ramfs就是将文件系统和内核一起编译,编译出来的镜像就包括内核本身和文件系统

内核打开ramfs

Initramfs source file(s)选项中,填入文件系统的路径即可。

最后,ubootbootargs中需要将init=/sbin/init修改为rdinit=/sbin/init,主要就是initrdinit的区别。

ramdisk

ramdisk也是将内存的一部分用作文件系统,只不过不用像上面一样要重新编译内核。

ramdisk制作

ramdisk制作可以使用genext2fs工具或者mke2fs等工具制作。

方法一:genext2fs

genext2fs安装:

sudo apt-get install genext2fs

ramdisk制作脚本:

genext2fs -b 16384 -d /home/book/rootfs ramdisk.image
gzip –v9 ramdisk.image
mkimage -A arm -O linux -T ramdisk -C gzip -n 'xx ramdisk filesystem' -d ramdisk.image.gz uramdisk.image.gz
  • 先使用genext2fs/home/book/rootfs制作成一个名为ramdisk.imageramdisk
  • 然后使用gizp压缩ramdisk.image,得到ramdisk.image.gz
  • 最后用mkimage工具生成uramdisk.image.gzuboot使用

方法二:mke2fs

ramdisk制作脚本:

dd if=/dev/zero of=ramdisk.image bs=1k count=15360
mke2fs –F –v –m 0 ramdisk.image
mount –o loop ramdisk.image /mnt/loop
cp -a rootfs/* /mnt/loop
umount /mnt/loop
gzip –v9 ramdisk.image
mkimage -A arm -O linux -T ramdisk -C gzip -n 'xx ramdisk filesystem' -d ramdisk.image.gz uramdisk.image.gz

过程类似,只不过是先制作一个空的镜像,然后拷贝文件系统的内容。

配置kernel使用ramdisk文件系统

修改uboot的环境变量:

setenv initrd_high=0xffffffff
setenv bootargs console=ttyS0,115200 root=/dev/ram rw init=/sbin/init; bootm ${loadaddr} ${ramdiskaddr} ${fdtaddr}

initrd_high0xffffffff,表示将initrd加载到最高的可用内存地址上。这样可以确保在启动过程中有足够的内存空间来加载initrd文件。

bootargs中,主要是这句:root=/dev/ram rw init=/sbin/init要对。

bootm启动中,loadaddr是内核的加载地址,ramdiskaddrramdisk的加载地址,fdtaddr是设备树的加载地址

制作好的uramdisk.image.gz文件系统,可以在uboot中,先通过tftp命令将uramdisk.image.gz加载到某段内存,例如tftp 82000000 uramdisk.image.gz。最后通过bootm启动。

kernel配置

打开ramfs支持:

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

打开ext2文件系统支持:

File systems  --->
 <*> Second extended fs support

打开ram block支持,并设置大小:

Device Drivers  --->
 [*] Block devices  --->
  <*>   RAM block device support                                   
       (16)    Default number of RAM disks                          
     (65536) Default RAM disk size (kbytes)

正确配置后,uboot启动时,能够看到类似如下ramdisk加载的过程:

## Loading init Ramdisk from Legacy Image at 42000000 ...
   Image Name:   
   Image Type:   ARM Linux RAMDisk Image (gzip compressed)
   Data Size:    2168875 Bytes = 2.1 MiB
   Load Address: 00000000
   Entry Point:  00000000
   Verifying Checksum ... OK

end

往期推荐

直到我干了底层开发,才知道不写业务代码有多爽

你解决bug的能力,暴露了你的水平

入职Linux驱动工程师后,我才知道的真相......

很底层的性能优化:让CPU更快地执行你的代码

薪资倒挂,大家都沉默了...

机遇:我是如何走向Linux驱动的...

当我用几道题考了一遍做Linux驱动的同事..

相关文章
|
存储 缓存 IDE
深度探索Linux操作系统 —— 构建initramfs
深度探索Linux操作系统 —— 构建initramfs
1494 5
|
Ubuntu Linux Shell
使用ramdisk启动ubuntu文件系统(pivot_root)
使用ramdisk启动ubuntu文件系统(pivot_root)
|
存储 缓存 Linux
Ramfs、rootfs和initramfs【ChatGPT】
Ramfs、rootfs和initramfs【ChatGPT】
|
存储 Linux Windows
制作Linux系统SD启动卡
【9月更文挑战第2天】这段内容介绍了一种制作 Linux 系统 SD 启动卡的方法,包括准备工作、安装写入软件、插入与识别 SD 卡、使用写入软件、写入后检查及设置启动设备等步骤。需选择高质量 SD 卡和可靠来源的镜像文件,避免误操作导致数据丢失。
484 4
|
Android开发
我的Android进阶修炼:安卓启动流程之init(1)
本文深入分析了Android系统中的init进程,包括其源码结构、主要功能以及启动流程的详细注解,旨在帮助读者理解init作为用户空间的1号进程在Android启动过程中的关键作用。
533 1
|
存储 缓存 Linux
linux中的rootfs/initrd/ramfs/initramfs
什么是ramfs?ramfs是空间规模动态变化的RAM文件系统。它非常简单,是用来实现Linux缓存机制(缓存page cache and dentry cache)的文件系统。通常情况下,Linux的所有文件在内存中都有缓存。
5750 0
|
存储 Linux Android开发
Rockchip u-boot阶段命令行和代码方式读取u盘内容并解析
Rockchip u-boot阶段命令行和代码方式读取u盘内容并解析
2548 2
|
存储 Ubuntu 网络协议
从Ubuntu-base构建ubuntu rootfs系统(以x86_64和arm为例)
本文介绍了基于Ubuntu-base构建自定义Linux系统的过程,适合嵌入式设备。Ubuntu-base是最小文件系统,包含软件包管理器,可以从Ubuntu源轻松安装软件。文章详细阐述了构建步骤,包括准备宿主系统(确保使用与目标系统相同架构的Ubuntu系统)、创建和挂载分区、配置Ubuntu源、设置DNS、添加用户配置、进入chroot环境以及安装软件(如内核、X-window系统等)。对于arm架构,还提供了通过qemu在X86_64系统上构建arm rootfs的方法。整个过程强调了定制和灵活性,适合对Linux系统有深入了解的开发者。
4848 0
|
Linux 内存技术 Perl
【ZYNQ】制作从 QSPI Flash 启动 Linux 的启动文件
【ZYNQ】制作从 QSPI Flash 启动 Linux 的启动文件
2353 0