在qemu-system-arm模拟器启动initramfs根文件系统内核

一. Initramfs简述

最初的想法是Linus提出的: 把cache当作文件系统装载。

他在一个叫ramfs的cache实现上加了一层很薄的封装,其他内核开发人员编写了一个改进版tmpfs,这个文件系统上的数据可以写出到交换分区,而且可以设定一个tmpfs装载点的最大尺寸以免耗尽内存。initramfs就是tmpfs的一个应用。

优点:

(1)tmpfs随着其中数据的增减自动增减容量.

(2)在tmpfs和page cache/dentry cache之间没有重复数据.

(3)tmpfs重复利用了Linux caching的代码, 因此几乎没有增加内核尺寸, 而caching的代码已经经过良好测试, 所以tmpfs的代码质量也有保证.

(4)不需要额外的文件系统驱动.

另外, initrd机制被设计为旧的"root="机制的前端,而非其替代物,它假设真正的根设备是一个块设备, 而且也假设了自己不是真正的根设备,这样不便将NFS等作为根文件系统。最后/linuxrc不是以PID=1执行的, 因为1这个进程ID是给/sbin/init保留的。 initrd机制找到真正的根设备后将其设备号写入/proc/sys/kernel/real-root-dev, 然后控制转移到内核由其装载根文件系统并启动/sbin/init。

initramfs则去掉了上述假设, 而且/init以PID=1执行, 由init装载根文件系统并用exec转到真正的/sbin/init, 这样也导致一个更为干净漂亮的设计。

二. 使用busybox制作根文件系统

1. 创建一个文件系统所在的目录

# mkdir initramfs

2. 在文件系统目录下创建根文件系统所需要的目录

# cd initramfs

# mkdir bin dev etc lib proc sbin sys usr mnt tmp var home root

# mkdir lib/modules

3. 创建设置节点

# mknod -m 777 dev/console c 5 1

# mknod -m 777 dev/null c 1 3

4. 编译,安装busybox

详细的过程序可以从网上找到,这里只说一下需要注意的地方

0) 配置busybox (使用默认的配置 defconfig)

1) 使用静态编译busybox

2) 设置安装路径 ([youself_dir]/initramfs)

3) 设置交叉编译器(修改Makefile中的CROSS_PROFILE=arm-none-linux-gnueabi-)

5. 添加init程序

在initramfs目录下添加init文件,并添加下面的内容:

#!bin/sh

mount -t proc proc /proc

mount -t sysfs sysfs /sys

mdev -s

sleep 1

echo "##############################################################"

echo "initramfs start "

echo "##############################################################"

PS1="[InitRamFs@\W]#"

export PS1

/bin/sh

exec switch_root /mnt /sbin/init

//----------------------------------------------我是分隔线-------------------------------------------------------------//

三. 配置并编译内核

1. 下载linux 内核,这里我下载的是linux-2.6.38版本

2. 解压,配置内核

# tar –jxvf linux-2.6.38.tar.bz2

# make versatile_defconfig

3. 去掉boot options原有的命令行参数,设置为空

Boot options --à

() Default kernel command string

4. 编译内核

# make –j4 uImage

5. 将initramfs编译到内核中

配置内核

General setup --->

[*] Initial RAM filesystem and RAM disk (initramfs/initrd) support

(/work/ramfs_test/initramfs) Initramfs source file(s)

/work/ramfs_test/initramfs:就是制作的initramfs根文件系统所在的目录

//----------------------------------------------我是分隔线-------------------------------------------------------------//

四. 安装qemu 模拟器

因为我是使用的ubuntu系统,直接执行下面的命令安装:

#sudo apt-get install qemu-system-*

这样会把qemu反支持的处理器架构都安装到本地,也可以根据自己的需要选择。

//----------------------------------------------我是分隔线-------------------------------------------------------------//

五. 在模拟器中运行内核(假设当前是在linux-2.6.38目录下)

# qemu-system-arm -M versatilepb -kernel arch/arm/boot/uImage /dev/null

运行结果如下图:

clip_image001

参考:

http://blog.chinaunix.net/uid-20564848-id-73934.html

http://blog.sina.com.cn/s/blog_80fd855d0100yt9z.html

http://www.iteedu.com/os/linux/mklinuxdiary/ch3initrd/23.php

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值