尝试initramfs+klibc
作者: zjujoe 转载请注明出处
Email:zjujoe@yahoo.com
BLOG:http://blog.csdn.net/zjujoe
前言
用 klibc 来做 initramfs , 和 uclibc + busybox 方案比较一下。
编译
获取 klibc 最新版本klibc-1.5,阅读文档: usr/klibc/README
根目录下建立到内核的 link:
klibc-1.5>ls -l linux
lrwxrwxrwx 1 zjujoe zjujoe 59 2008-11-01 10:17 linux -> /home/zjujoe/svn/mhlv_2.6/working/songlixin/20081007_kernel
设置环境变量
export KLIBCARCH=arm
export CROSS_COMPILE=arm-iwmmxt-linux-gnueabi-
编辑:defconfig:
ONFIG_KLIBC=y
CONFIG_AEABI=y
修改 Kbuild, 不编译 kinit gzip (对我们没用,而且编译kinit时会出错)
执行 make
得到所需的静态、动态链接的程序。
得到的静态链接的程序
下面列出我们需要的可执行程序:
root@zjujoe-vm2:/opt/klibc-1.5/usr/dash# ls -l sh
-rwxr-xr-x 1 root root 82644 2008-11-01 11:29 sh
root@zjujoe-vm2:/opt/klibc-1.5/usr/utils/static# ls -l insmod
-rwxr-xr-x 1 root root 15136 2008-11-01 11:29 insmod
-rwxr-xr-x 1 root root 15888 2008-11-01 11:29 mount
-rwxr-xr-x 1 root root 14740 2008-11-01 11:29 mknod
root@zjujoe-vm2:/opt/klibc-1.5/usr/kinit/run-init/static# ls -l run-init
-rwxr-xr-x 1 root root 16280 2008-11-01 11:03 run-init
做成文件系统:
|-- bin
| |-- mknod
| |-- mount
| `-- sh
|-- dev
| |-- console
| `-- stl4
|-- init
|-- lib
| `-- modules
| `-- 2.6.21
| |-- rfs.ko
| |-- xsr.ko
| `-- xsr_stl.ko
|-- newroot
`-- sbin
|-- insmod
`-- run-init
得到的动态链接的程序:
root@zjujoe-vm2:/opt/klibc-1.5/usr/klibc# ls -l klibc-f*
-rwxr-xr-x 2 root root 29456 2008-11-01 11:03 klibc-fZteMV3jM8T7LslxGFaVO6Efwko.so
root@zjujoe-vm2:/opt/klibc-1.5/usr/kinit/run-init/shared# ls -l run-init
-rwxr-xr-x 1 root root 2144 2008-11-01 11:03 run-init
root@zjujoe-vm2:/opt/klibc-1.5/usr/dash# ls -l sh.shared
-rwxr-xr-x 1 root root 66188 2008-11-01 11:29 sh.shared
root@zjujoe-vm2:/opt/klibc-1.5/usr/utils/shared# ls -l
-rwxr-xr-x 1 root root 1568 2008-11-01 11:29 insmod
-rwxr-xr-x 1 root root 1624 2008-11-01 11:29 mknod
-rwxr-xr-x 1 root root 1872 2008-11-01 11:29 mount
做成文件系统:
|-- bin
| |-- mknod
| |-- mount
| `-- sh
|-- dev
| |-- console
| `-- stl4
|-- init
|-- lib
| |-- klibc-fZteMV3jM8T7LslxGFaVO6Efwko.so
| `-- modules
| `-- 2.6.21
| |-- rfs.ko
| |-- xsr.ko
| `-- xsr_stl.ko
|-- newroot
`-- sbin
|-- insmod
`-- run-init
Init 脚本
按照如下写 /init 脚本(和uclibc 那个稍有改变)
#! /bin/sh
insmod /lib/modules/2.6.21/xsr.ko
insmod /lib/modules/2.6.21/xsr_stl.ko
insmod /lib/modules/2.6.21/rfs.ko
mount -o codepage=cp437 -t rfs /dev/stl4 /newroot
mount -t tmpfs none /newroot/dev
mknod /newroot/dev/console c 5 1
exec run-init /newroot /sbin/init --debug
对比
我们使用同样的 bootloader, 同样的内核,只有 initramfs 内容不一样,统计大小及启动到真正的文件系统的时间。
大小:
-rw-r--r-- 1 zjujoe zjujoe 221231 2008-11-01 14:31 rootfs_initramfs.klibc.shared.tgz
-rw-r--r-- 1 zjujoe zjujoe 232386 2008-11-01 15:39 rootfs_initramfs.klibc.static.tgz
-rw-r--r-- 1 zjujoe zjujoe 231099 2008-11-01 15:40 rootfs_initramfs.uclibc.static.tgz
方案 | 程序(libc/mknod/insmod…)大小总和 | 启动到 rfs init命令行时间 |
uclibc + busybox static | 118196 | 2.05 |
klibc+buildin uitl static | 144688 | 2.24 |
klibc+buildin uitl dynamic | 102852 | 2.24 |
考虑到 uclibc + busybox 的灵活性及程序度, 选择使用 方案1.
参考文档
http://bbs.linuxeden.com/archiver/tid-160356.html