loading linux img2a,嵌入式Linux中initrd的应用--浅析ramdisk、ramfs、initrd和initramfs
看到这样的一句话很让我费解,因为似乎我理解为这样做能够提高一点嵌入式linux启动速度,我对此是非常地感兴趣
自此,就开始了我的解惑之旅
首先需要知道的是ramdisk和ramfs
http://www.linuxfordevices.com/c/a/Linux-For-Devices-Articles/Introducing-initramfs-a-new-model-for-initial-RAM-disks/
或者内核源码/Documentation/filesystems/ramfs-rootfs-initramfs.txt
从上述文章,大致可以了解到
ramdisk是一种基于ram的块设备,ramfs是一种基于ram的文件系统,开发ramfs的目的是因为ramdisk浪费了太多的内存cache页,ramfs是基于tmpfs的一个实例
顺理成章,initrd是init ramdisk的缩写,initramfs是init ramfs的缩写
名称里加了init前缀,代表它们具有了引导内核启动的功能
ramfs比ramdisk更加高效,自然initramfs也更加优秀,是2.6内核新加入的推荐使用的机制,虽然可能pc中grub使用的内核cmd
line参数是
kernel /vmlinuz-2.6.25-14.fc9.i686 ro
root=UUID=11d7ac51-2b45-489e-8a48-8d2a28e2c04e rhgb quiet
initrd /initrd-2.6.25-14.fc9.i686.img
,实际上使用的是initramfs,可以靠文件格式来区分。initrd是gziped的,initramfs是cpio的
剩下的部分就只说initrd了
首先是initrd的作用:内核镜像要尽可能小,所以不应该静态包含进太多驱动模块。但是Linux内核启动最后一步,创建init内核线程,需要执行的init程序或者脚本并不在内核镜像中,而在根文件系统中。根文件系统可能在硬盘、磁盘阵列、nfs、flash上,同时根文件系统的格式也是五花八门。此时,实在不想包含这么多驱动到镜像的话,可以使用initrd作为一个过渡。
initrd本身的内容就是一个精简的根文件系统,包含必备的目录和程序,甚至也有一个init脚本或程序linuxrc
一切的一切,因为linux的高可定制性,一切随你便。在pc上通常是后者
以pc上的为例,首先拷贝一个initrd-2.6.25-14.fc9.i686.img,防止破坏了它开不了机
然后将其备份改名为gz,解压缩
[root@localhost boot]# mkdir /tmp/initrd
[root@localhost boot]# cp initrd-2.6.25-14.fc9.i686.img
/tmp/initrd/
[root@localhost boot]# cd /tmp/initrd/
[root@localhost initrd]# mv initrd-2.6.25-14.fc9.i686.img
initrd-2.6.25-14.fc9.i686.gz
[root@localhost initrd]# gunzip initrd-2.6.25-14.fc9.i686.gz
[root@localhost initrd]# ls
initrd-2.6.25-14.fc9.i686
[root@localhost initrd]# file initrd-2.6.25-14.fc9.i686
initrd-2.6.25-14.fc9.i686: ASCII cpio archive
(SVR4 with no CRC)
继续解压缩,查看其根目录下的init脚本,其重要的地方都用加粗了
#!/bin/nash
mount -t proc /proc /proc
setquiet
echo Mounting proc filesystem
echo Mounting sysfs filesystem
mount -t sysfs /sys /sys
echo Creating /dev
mount -o mode=0755 -t tmpfs /dev /dev
mkdir /dev/pts
mount -t devpts -o gid=5,mode=620 /dev/pts /dev/pts
mkdir /dev/shm
mkdir /dev/mapper
echo Creating initial device nodes
mknod /dev/null c 1 3
mknod /dev/zero c 1 5
mknod /dev/systty c 4 0
mknod /dev/tty c 5 0
mknod /dev/console c 5 1
mknod /dev/ptmx c 5 2
mknod /dev/tty0 c 4 0
mknod /dev/tty1 c 4 1
mknod /dev/tty2 c 4 2
mknod /dev/tty3 c 4 3
mknod /dev/tty4 c 4 4
mknod /dev/tty5 c 4 5
mknod /dev/tty6 c 4 6
mknod /dev/tty7 c 4 7
mknod /dev/tty8 c 4 8
mknod /dev/tty9 c 4 9
mknod /dev/tty10 c 4 10
mknod /dev/tty11 c 4 11
mknod /dev/tty12 c 4 12
mknod /dev/ttyS0 c 4 64
mknod /dev/ttyS1 c 4 65
mknod /dev/ttyS2 c 4 66
mknod /dev/ttyS3 c 4 67
echo Setting up hotplug.
hotplug
echo Creating block device nodes.
mkblkdevs
echo "Loading ehci-hcd module"
modprobe -q ehci-hcd
echo "Loading ohci-hcd module"
modprobe -q ohci-hcd
echo "Loading uhci-hcd module"
modprobe -q uhci-hcd
mount -t usbfs /proc/bus/usb /proc/bus/usb
echo "Loading ext3 module"
modprobe -q ext3
echo "Loading scsi_mod module"
modprobe -q scsi_mod
echo "Loading sd_mod module"
modprobe -q sd_mod
echo "Loading libata module"
modprobe -q libata
echo "Loading ata_generic module"
modprobe -q ata_generic
echo "Loading pata_acpi module"
modprobe -q pata_acpi
echo Waiting for driver initialization.
stabilized --hash --interval 250 /proc/scsi/scsi
echo "Loading ata_piix module"
modprobe -q ata_piix
echo Waiting for driver initialization.
stabilized --hash --interval 250 /proc/scsi/scsi
echo "Loading dm-mod module"
modprobe -q dm-mod
echo "Loading dm-mirror module"
modprobe -q dm-mirror
echo "Loading dm-zero module"
modprobe -q dm-zero
echo "Loading dm-snapshot module"
modprobe -q dm-snapshot
echo Making device-mapper control node
mkdmnod
modprobe scsi_wait_scan
rmmod scsi_wait_scan
mkblkdevs
echo Scanning logical volumes
lvm vgscan --ignorelockingfailure
echo Activating logical volumes
lvm vgchange -ay --ignorelockingfailure VolGroup00
resume /dev/VolGroup00/LogVol01
echo Creating root device.
mkrootdev -t ext3 -o defaults,ro
/dev/VolGroup00/LogVol00
echo Mounting root filesystem.
mount /sysroot
echo Setting up other filesystems.
setuproot
loadpolicy
echo Switching to new root and running init.
switchroot
echo Booting has failed.
sleep -1
首先,这里使用的是nash,不是bash、csh等常见shell。nash是专门为了init设计的,因为体积小。
pc机上的initrd不过只是一个过渡,所以在加载完了硬盘、ext3等驱动后,就迫不及待地要重新设置根文件系统了
首先mkrootdev指定最终的根目录,参数跟grub的内核启动参数一致。接着mount
/sysroot将最终的根目录先挂在到/sysroot
,setuproot开始将initrd中的/proc /dev /sys 中的资料转移到
/sysroot ,
switchroot会开始转换/sysroot
为最终的根文件系统,完成后顺便将initrd之前在ram中的一切清空。
(如果有/initrd 目录的话就会把initrd挂载到该目录下)
好了,扯了半天,终于能解释最开始的疑惑了
initrd,或者initramfs,无论在pc还是嵌入式,都是可以选择的,分3种情况
1 完全不要initrd
2 initrd作为最终的根文件系统
3 initrd作为过渡,由initrd的init来加载最终的根文件系统
(本文作者deep_pro http://hi.baidu.com/deep_pro/ 转载请注明出处)
情况1,比如嵌入式linux静态包含了nand flash驱动和jffs2驱动,指定内核启动参数
root=/dev/mtdblock2 rootfs=jffs2 rw console=ttySAC0,115200
init=/linuxrc
(使用busybox作为根文件系统)
情况2,将根文件系统做成ramdisk镜像,使用ubbot下载到0x30800000,内核启动参数
root=/dev/ram rw init=/linuxrc
initrd=0x30800000,8M console=ttySAC0,115200
注意,一旦使用了ramdisk作为内核命令行参数root的参数,root=/dev/ram那么就直接把
initrd当做最终的根文件系统
情况3,pc常见,嵌入式linux也可见这样的启动参数
console=ttySAC0,115200 root=nfs nfsroot=192.168.1.9:/source/rootfs
initrd=0x10800000,0x14af47
也属于情况3
对于arm平台,如果bootloader不支持装入initrd的话,可以使用bootpImage,这种复合镜像会把内核和initrd直接连接到一起。
现在看来,initrd作为最终的根文件系统,将花费时间将initrd从flash读入ram,同时对文件系统的读写不会写入falsh
完全不要initrd,根文件系统一直存在于flash,如果根文件系统可写,也将写入flash
至于性能上的比较,还是经验不足啊
loading linux img2a,嵌入式Linux中initrd的应用--浅析ramdisk、ramfs、initrd和initramfs相关推荐
- 【嵌入式Linux】嵌入式Linux驱动开发基础知识之按键驱动框架
文章目录 前言 1.APP怎么读取按键值 1.1.查询方式 1.2.休眠-唤醒方式 1.3.poll方式 1.3.异步通知方式 1.5. 驱动程序提供能力,不提供策略 2.按键驱动程序框架--查询方式 ...
- 【嵌入式Linux】嵌入式Linux驱动开发基础知识之设备树模型
文章目录 前言 1.设备树的作用 2.设备树的语法 2.1.设备树的逻辑图和dts文件.dtb文件 2.1.1.1Devicetree格式 1DTS文件的格式 node的格式 properties的格 ...
- 【嵌入式Linux】嵌入式Linux驱动开发基础知识之驱动设计的思想:面向对象/分层/分离
文章目录 前言 1.分离设计 驱动程序分析---程序分层 通用驱动程序---面向对象 个性化驱动程序---分离 APP 程序分析 前言 韦东山嵌入式Linux驱动开发基础知识学习笔记 文章中大多内容来 ...
- 嵌入式系统、linux和嵌入式linux的区别
这几个东西比较容易混淆 嵌入式系统: IEEE(国际电气和电子工程师协会)对嵌入式系统的定义:"用于控制.监视或者辅助操作机器和设备的装置".原文为:Devices Used to ...
- 基于嵌入式linux电子相册设计,用于LINUX或者嵌入式LINUX的电子相册程序,基于QT开发...
用于LINUX或者嵌入式LINUX的电子相册程序,基于QT开发,包含源代码和编译好的可执行程序 linux_project\album\album.pro .............\.....\al ...
- 嵌入式转linux服务器,嵌入式Linux中的Web服务器应用
Boa是一个非常小巧的Web服务器,其可执行代码只有60K左右.它是一个单任务的Web服务器,只能依次完成用户的请求,而不会fork出新的进程处理并发连接请求.但boa支持cgi,能够为cgi程序fo ...
- 【Linux】嵌入式Linux系统的移植(下篇:BootLoader,以U-Boot为例)
BootLoader BootLoader的概念 BootLoader就是在操作系统内核运行之前运行的一段小程序.通过这段小程序,可以初始化硬件设备.建立内存空间的映射图,从而将系统的软硬件环境带到一 ...
- 嵌入式linux编程,嵌入式Linux学习笔记 - 嵌入式Linux基础知识和开发环境的构建_Linux编程_Linux公社-Linux系统门户网站...
注:所有内容基于友善之臂Mini2440开发板 一.嵌入式Linux开发环境的构建 嵌入式开发一般分为三个步骤: 1.编译bootloader,烧到开发板 2.编译嵌入式Linux内核,烧到开发板 3 ...
- 嵌入式linux 升级,嵌入式Linux的OTA更新,基本原理和实现
需要更新 一旦嵌入式Linux产品离开实验室并进入现实世界,如何更新设备的问题就变得至关重要. 更新并非总是必要的,但是很难想到没有某个漏洞的软件.即使您的软件是完美的,但是如果设备通过任何开放源代码 ...
最新文章
- 银河1号是超级计算机吗,强国挑战答题答案:银河1号是我国第一台超级计算机,银河1号于____年研制完成。...
- mysql 5.6.24 win32_mysql-5.6.24-win32解决没有my.ini并且修改编码
- 嵌入式开发中使用DDD进行调试
- 如何通过网络连接进行ADB调试
- webdriver 执行完毕关闭chromedriver进程
- grpc入门到精通_Spring Cloud 从入门到精通(一)Nacos 服务中心初探
- 注意地方hadoop中的pi值计算
- Enterprise Library 1.0
- 从0到1:打造移动端H5性能测试平台
- mkv格式提取文件方法
- 解决 invalid DSN: missing the slash separating the database name
- 华为云空间联系人是不是机主_联系人丢失找回—华为云空间数据安全功能关键时刻出绝招...
- 使用 Win32 API 枚举应用程序
- GD32F130FXP6学习笔记六:cortex-m3系列的ADC初识
- 【读点论文】Masked Autoencoders Are Scalable Vision Learners 完型填空应用到视觉处理上
- bzoj4774 修路
- SLAM 三维传感器 点滴
- 用于视觉问答的基于关系推理和注意力的多峰特征融合模型《Multimodal feature fusion by relational reasoning and attention for VQA》
- 华为网络测试软件计算机命令
- 野火i.MX6ULL Linux开发板资料
热门文章
- 第 1-3 课:深入理解字符串 + 面试题
- servlet 和 struts2 同时使用 以及 使用struts2标签库时报错
- Pytorch torchvision完成Faster-rcnn目标检测demo及源码详解
- fastai学习笔记——安装
- 五邑大学c语言期末考试题,五邑大学 c语言试卷.doc
- js 正则 或者_如何彻底搞懂面向 Web 开发者的正则表达式?
- mysql储存过程把集合并_MySQL 多日志表结果集合拼接存储过程
- python爬取京东评论_Python如何爬取京东的评价信息
- QQ浏览器怎样在首页显示优先推荐的网站
- bigdecimal js 判断等于0_为啥阿里禁用BigDecimal的equals方法做等值比较