关于initrd和initramfs【转】
转自:https://abcamus.github.io/2017/01/06/%E5%85%B3%E4%BA%8Einitrd%E5%92%8Cinitramfs/
一、initrd
ram disk中的file system叫做initrd,全名叫做initial ramdisk。
注意: 当下用initrams多
如何创建initial ramisk
host > dd if=/dev/zero of=/dev/ram0 bs=1k count=<count>
host > mke2fs -vm0 /dev/ram0 <count>
host > tune2fs -c 0 /dev/ram0
host > dd if=/dev/ram0 bs=1k count=<count> | gzip -v9 > ramdisk.gz
这段代码就创建了大小为count的ramdisk
创建完之后还要添加哪些东西
还要添加一些必要的文件让他工作,可能是库,应用程序等。例如busybox。
host $ mkdir mnt
host $ gunzip ramdisk.gz
host $ mount -o loop ramdisk mnt/
host $ ... copy stuff you want to have in ramdisk to mnt...
host $ umount mnt
host $ gzip -v9 ramdisk
内核如何支持initial ramdisk
#
# General setup
#
...
CONFIG_BLK_DEV_INITRD=y
CONFIG_INITRAMFS_SOURCE=""
...
#
# UBI - Unsorted block images
#
...
CONFIG_BLK_DEV_RAM=y
CONFIG_BLK_DEV_RAM_COUNT=1
CONFIG_BLK_DEV_RAM_SIZE=8192
CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
...
告诉uboot怎么找到她
UBOOT # tftp 0x87000000 ramdisk.gz
UBOOT # erase 0x2200000 +0x<filesize>
UBOOT # cp.b 0x87000000 0x2200000 0x<filesize>
UBOOT # setenv bootargs ... root=/dev/ram0 rw initrd=0x87000000,8M
UBOOT # setenv bootcmd cp.b 0x2200000 0x87000000 0x<filesize>; bootm
UBOOT # saveenv
注意: ramdisk 中要有ram0节点
brw-rw---- 1 root disk 1, 0 Sep 11 1999 /dev/ram0
最后启动内核
二、initramfs
initramfs相当于把initrd放进了内核,通过cpio(这是一个文件处理工具)实现。
如何创建
比initrd简单多了
host > mkdir target_fs
host > ... copy stuff you want to have in initramfs to target_fs...
注意:
- initramfs中的cpio系统不能处理hard link,用soft link
- 顶层必须有个init程序,这是kernel要用的,可以这么做
/init -> /bin/busybox
接着
host > cd target_fs
host > find . | cpio -H newc -o > ../target_fs.cpio
内核支持
#
# General setup
#
...
CONFIG_BLK_DEV_INITRD=y
CONFIG_INITRAMFS_SOURCE="<path_to>/target_fs>"
...
#
# UBI - Unsorted block images
#
...
CONFIG_BLK_DEV_RAM=y
CONFIG_BLK_DEV_RAM_COUNT=1
CONFIG_BLK_DEV_RAM_SIZE=8192
CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
然后执行make uImage的时候就被包含到kernel中了。
uboot支持
因为已经在kernel中了,不需要像initrd一样通过参数 root=/xxx rw initrd=xxx来告诉uboot了
三、比较
- initrd方式中kernel和initial file system为独立的部分,互不影响,下载的时候镜像也小。
- 创建修改initramfs比initrd容易。
- 在烧写的时候,显然一个镜像更容易管理。
参考文献
【作者】sky
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架