没有合适的资源?快使用搜索试试~ 我知道了~
精通init ramfs构建
需积分: 9 15 下载量 87 浏览量
2010-04-15
15:36:03
上传
评论
收藏 84KB DOC 举报
温馨提示
试读
23页
精通init ramfs构建step by step ,关于linux下,init ramfs 的创建
资源推荐
资源详情
资源评论
精通 init ramfs 构建 step by step
一、init ramfs 是什么
在 2.6 版本的 linux 内核中,都包含一个压缩过的 cpio 格式的打包文件。当内核启动时,
会从这个打包文件中导出文件到内核的 rootfs 文件系统,然后内核检查 rootfs 中是否包含有
init 文件,如果有则执行它,作为 PID 为 1 的第一个 进程。这个 init 进程负责启动系统后续
的工作,包括定位、挂载“真正的”根文件系统设备(如果有的话)。如果内核没有在 rootfs 中找
到 init 文 件,则内核会按以前版本的方式定位、挂载根分区,然后执行/sbin/init 程序完成系
统的后续初始化工作。
这个压缩过的 cpio 格 式的打包文件就是 init ramfs。编译 2.6 版本的 linux 内核时,编译
系统总会创建 init ramfs,然后把它与编译好的内核连接在一起。内核源代码树中的 usr 目录
就是专门用于构建内核中的 init ramfs 的,其中的 ini tramfs_data.cpio.gz 文件就是 init ramfs。
缺省情况下,init ramfs 是空的,X86 架构下的文件大小是 134 个字节。
二、构建第一个 init ramfs:hello world
从 C 语言开始,学习计算机编程语言的第一个程序几乎都是 hello world,因此我们也构
建一个最简单的 hello world 式的 init ramfs,以说明 init ramfs 的基本构建方法。
init ramfs 的灵魂是 init 文件(或者叫程序,因为它会被内核第一个执行),我们先写一个
简单的 init 程序,它会在内核的 console 中打印出经典的 hello world 信息。
hello.c:
#include
#include
int main(int argc,char argv[])
{
printf("hello world, from init ramfs.");
sleep(9999999);
return 0;
}
其中的 sleep()函数语句是为了避免执行时内核很快打出 panic 的信息,并非功能上的需
要。
接着把 hello.c 编译成静态连接程序:
gcc -o hello_static -static -s hello.c
命令行中的-s 参数表示编译后的程序不包含调试定位信息,目的是减少编译出来的程序
文件的大小。
再创建一个 init ramfs 的构建源文件目录 image,把 hello_static 程序拷入这个目录,并改
名为 init。
在 image 目录下,创建一个 dev/console 的设备文件,否 init 程序无法在内核 console 中
输出信息:
mknod -m 600 dev/console c 5 1
注意,执行这个命令需要有 root 权限。
好了,现在可以设置内核配置参数,进行 init ramfs 的构建了:
在 general setup 配置目录下的 init ramfs sources 配置项下输入 image 的路径名,比如我
的路径就是/home/wyk/init ramfs-test/image。因为我们的 init 程序是 ELF 格式的,所以内核需
要支持 ELF 的可执行文件,否则启动这个 init 程序会失败。在内 核的 Executable file formats
配置目录下,选择 kernel support for ELF binaries,则可使内核支持 ELF 格式的可执行文件。
其他内核配置参数根据实际需要设置即可,不过,为了减少内核编译时间,可参考这篇文章
http://linuxman.blog.ccidnet.com/blog-htm-do-showone-uid-60710-type- blog-itemid-293122.html
设置一个最简单的内核配置。
内核配置参数设置完成后,按常规的内核编译方法进行编译,init ramfs 就自动连接到编
译好的内核映像文件中了。
三、试验环境搭建
试验 init ramfs 需要经常重启系统,所以使用 CPU 模拟器是不错的选择。我们可以选用
qemu,它支持直接启动 linux 内核,无需在模拟器中安装 OS。从方便 使用的角度考虑,我
们采用 qemu launcher 设置 qemu 的各项参数,它的安装可参
考 http://linuxman.blog.ccidnet.com/blog-htm-do- showone-uid-60710-type-blog-itemid-
612280.html。
在 qemu launcher 的 linux 配置标签中,打勾直接启动 linux,然后在下面的文本框中填上
刚才编译好的内核映像文件的路径名。因为 qemu 的运行还需要设置硬盘映像文件,所以还
需要在左边的配置标签中新建一个硬盘映像文件,但实际上我们并不使用硬盘。
配置好 qemu 的参数后,点击 launcher 按钮,内核就开始在 qemu 中运行了。内核输出一
堆内核运行信息后,最后打出了
hello world, from init ramfs.
哈哈,我们构建的 init ramfs 已经能够正常工作了!
四、什么是 rootfs 和 ramfs
所有的 2.6 版本 linux 内核都有一个特殊的文件系统 rootfs,是内核启动的初始始 根文件
系统,init ramfs 的文件会复制到 rootfs。如果把 init ramfs 比作种子,那么 rootfs 就是它生长
的土壤。大部分 linux 系统正常运行后都会安装另外的文件系统,然后忽略 rootfs。
rootfs 是 ramfs 文件系统的一个特殊实例。ramfs 是一种非常简单的文件系统,是基于内
存的文件系统。ramfs 文件系统没有容量大小的限制,它可以根据需要动态增加容量。
ramfs 直接利用了内核的磁盘高速缓存机制。所有的文件的读写数据都会在内存中做高
速缓存(cache),当系统再次使用文件数据时,可以直接从内存 中读写,以提供系统的 I/O 性
能。高速缓存中的写入数据会在适当的时候回写到对应的文件系统设备(如磁盘等)中,这时
它的状态就标识为 clean,这样系 统在必要时可以释放掉这些内存。ramfs 没有对应文件系统
设备,所以它的数据永远都不会回写回去,也就不会标识为 clean,因此系统也永远不会释
放 ramfs 所占用的内存。
因为 ramfs 直接使用了内核已有的磁盘高速缓存机制,所以它的实现代码非常小。也由
于这个原因,ramfs 特性不能通过内核配置参数删除,它是内核的天然特性。
五、ramfs 不是 ramdisk
ramdisk 是在一块内存区域中创建的块设备,用于存放文件系统。ramdisk 的容量是固定
的,不能象 ramfs 一样动态增长。ramdisk 需要 内核的文件系统驱动程序(如 ext2)来操作其上
的数据,而 ramfs 则是内核的天然特性,无需额外的驱动程序。ramdisk 也象其他文件系统设
备一 样,需要在块设备和内存中的磁盘高速缓存之间复制数据,而这种数据复制实际不必
要的。
六、从 ramfs 派生的文件系统 tmpfs
ramfs 的一个缺点是它可能不停的动态增长直到耗尽系统的全部内存,所以只有 root 或
授权用户允许使用 ramfs。为了解决这个问题,从 ramfs 派生出了 tmpfs 文件系统,增加了容
量大小的限制,而且允许把数据写入交换分区。由于增加了这两个特性,所以 tmpfs 允许普
通用户使用。
关于 tmpfs 文件系统更多的信息,可以看内核源码中的
Documentation/filesystems/tmpfs.txt 文档。
综上所述,init ramfs 是一种 ramfs 文件系统,在内核启动完成后把它复制到 rootfs 中,
作为内核初始的根文件系统,它的任务是挂载系统真正的根文件系统。这就是 init ramfs 的
前世今生。
七、什么是 busybox
busybox 号称是嵌入式 Linux 中的瑞士军刀——小巧、功能齐全。它把许多常用的 Linux
命令都集成到一个单一的可执行程序中,只用这一个可执行程序(即 busybox)加上 Linux 内核
就可以构建一个基本的 Linux 系统。busybox 程序非常小巧,包含全部命令可执行文件大小
也只有 750 多 K。busybox 是完全模块化的,可以很容易地在编译时增加、删除其中包含的
命令。
由于 busybox 的这些特点,它广泛应用于 LiveCD、应急修复盘、安装盘等系统中。我
们也是以它为基础,构建 init ramfs。
八、busybox 的配置、编译和安装
(1)去 http://busybox.net 去下载最新的源码,解压展开。
(2)用
make menuconfig
命令启动配置界面配置,配置 busybox 的特性、选择要包含在 busybox 的命令(busybox
称为 applet);
也可以用
make defconfig
命令做缺省配置,包含全部的 applet。
另外两个配置命令是
make allyesconfig——最大配置
make allnoconfig——最小配置
它们和 make defconfig 命令都可以用来作为自定义配置的初始配置,然后再用 make
menuconfing 命令做定制化配置。
为了简单,我们用 make defconfig 做缺省配置。
(3)用
make
命令编译 busybox 软件。
(4)用
make CONFIG_PREFIX=<安装目录> install
命令安装。如果在命令行中省略 CONFIG_PREFIX 变量的赋值,则会安装缺省值
./_install 目录下。CONFIG_PREFIX 可以在 make menuconfig 的配置界面中修改。
我们用 make CONFIG_PREFIX=~/initramfs-test/image 命令把 busybox 安装到 init ramfs 的
构建目录中。
(5)缺省配置下,busybox 动态链接到 glibc,所以要把它用到的动态库复制到 init ramfs
的构建目录中。用 ldd 命令查看 busybox 用到了哪些动态库文件及相应的文件路径,然后把
它们复制到相应的目录下即可。
我们编译的 busybox 需要向 image/lib 目录下复制
ld-linux.so.2
libc.so.6
libcrypt.so.1
libm.so.6
动态库文件。
九、在 image 下创建必要的目录和设备文件
(1)在 imgae 目录下创建
proc , sys , etc ,mnt
四个目录
(2)hello world 已经创建了 console 设备文件,我们再用
mknod -m 600 dev/null c 1 3
命令创建另一个基本的设备文件。
十、试验一下
busybox 的构建和准备工作做完了,我们试验一下吧:
在 image 目录下以 root 用户权限——
(1)用
mount -vt proc proc =proc
mount -vt sysfs sysfs =sys
命令安装内核虚拟文件系统
(2)用
mount -v -o bind /dev dev
命令绑定/dev 的设备文件到 image/dev
(3)用
chroot . /bin/sh
命令进入 busybox 的环境。出现 shell 的命令提示符,可以试着输入几个命令,看看执行
结果。例如,输入 fdisk -l 命令看看是否能显示硬盘的分区。
十一、自动生成/dev 下的设备文件
上节用 chroot 方法试验 busybox 时,为了简单,是用“绑定”的方式把主机的/dev 中的设
备文件映射到 image 目录下的 dev 目录。在 init ramfs 上,这种方法显然不能使用。
生成系统的设备文件,现在通常都是用 udev 动态生成,而 init ramfs 为了做到通用,动
态生成的要求是必须的。在 busybox 中有一个 mdev 命令,就是用来动态生成设备文件,填
充到/dev 目录的。
在系统启动时,用
mdev -s
命令可以根据内核的 sysfs 文件系统在/dev 目录中自动生成相应的设备文件。命令执行
前,需要先挂载内核的 proc 和 sysfs 虚拟文件系统。
十二、初始身手
解决了自动生成设备文件的问题后,我们可以试着做一个最简单的可运行的 linux 系统
了:
(1)在 image 目录下写一个最简单的 init 脚本。
#!/bin/sh
mount -t proc proc /proc
mount -t sysfs sysfs /sys
mdev -s
/bin/sh
(2)为 init 脚本设置可执行权限,否则内核不会去执行它。
chmod +x init
(3)有些 busybox 配置中,mdev 命令需要读取/etc/mdev.conf 文件,为了避免出错信息,
我们创建一个空文件。mdev.conf 文件是用来控制 mdev 生成的设备文件的读写权限的,在这
里我们不需要对设备文件设置特别的权限,就使用 mdev 缺省的 660 的权限设置。有关 mdev
的 设备文件权限的控制详细信息,可参考 busybox 源码树 docs 目录下的 mdev.txt 文件。
touch etc/mdev.conf
(4)在内核源码目录下,执行
make
命令,重新编译内核,生成新的 init ramfs。
剩余22页未读,继续阅读
资源评论
RYZR
- 粉丝: 29
- 资源: 5
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功