Chinaunix首页 | 论坛 | 博客
  • 博客访问: 410979
  • 博文数量: 93
  • 博客积分: 6000
  • 博客等级: 准将
  • 技术积分: 1052
  • 用 户 组: 普通用户
  • 注册时间: 2008-03-19 11:01
文章分类

全部博文(93)

文章存档

2011年(1)

2009年(26)

2008年(66)

我的朋友

分类: LINUX

2009-03-09 17:33:25

精通initramfs构建step by step (十):uclibc

二十九、toolchain
在initramfs中使用uclibc库,关键是构建uclibc的工具链toolchain。构建uclibc 的 toolchain 有两种主要方式:(1)用buildroot工具( )自动构建,这也是uclibc的官方标准做法。(2)用CLFS Embedded手册的方法手工创建。目前CLFS Embedded还在开发中,可在中查阅。

我们简单地说明用buildroot工具构建uclbic的toolchain的步骤:
(1)获取buildroot。
推荐用svn命令从它的版本库中下载:
svn co svn://uclibc.org/trunk/buildroot
要求使用svn命令,需要先安装subversion软件包。下载过程中,可能会出现连接异常中断的情况,这时重新执行上述命令,继续进行下载,有可能要重复多次。
(2)配置buildroot
因为我们只是创建toolchain,所以需要做相应的配置。在buildroot的顶层目录下,执行
make menuconfig
命令,在缺省配置的基础上做如下配置
Target Architecture: i386
Target Architecture Variant: i686
Package Selection for the target: 取消BusyBox的选项(缺省是选中的)
Target filesystem options: 取消 ext2 root filesystem(缺省是选中的)
Toolchain --> Toolchain type: Buildroot toolchain
(3)编译
执行
make
命令,buildroot工具会自动下载所需要的源文件并自动编译,等一两个小时后,toolchain就编译好了。编译好的toolchain位于
buildroot/build_i686/staging_dir/usr/bin/
目录下。工具命令的前缀是 i686-linux- 。

三十、编译Busybox静态连接uclibc库
一般而言,使用uclibc库是为了把它静态连接到busybox中。具体步骤是:
(1)把uclibc toolchain的目录添加到PATH中。
在~/.bash_profile文件中添加:
#set PATH so it includes uclibc toolchain if it exist
if [ -d ~/buildroot/build_i686/staging_dir/usr/bin ] ; then
PATH="${PATH}":~/buildroot/build_i686/staging_dir/usr/bin
fi

(2)配置busybox静态连接库。
在busybox的配置界面中,选择:
Build Options --> Build BusyBox as a static binary (no shared libs)
(3)编译
执行
make CROSS_COMPILE=i686-linux-
命令“交叉编译”busybox。
最后编译生成的是静态连接的可执行文件,不需要在initramfs中拷贝库文件。

三十一、用buildroot自动构建initramfs
buildroot工具实际是一个功能强大的根文件系统构建工具,它以uclibc和busybox作为系统构建的基础,toolchain只是它构建系统的中间产品。initramfs是一种特殊的根文件系统,当然也可以用buildroot工具自动构建,下面是构建方法的简要描述:
(1)配置
在buildroot的配置界面下做如下的配置:
Package Selection for the target: 选择
Busybox
Run Busybox's own full installation

Use minimal target skeleton
Target filesystem options --> cpio the root filesystem --> comprassion method: gzip
(2)编译
执行
make
命令,进行编译。
(3)输出
构建好的cpio文件是
buildroot/binaries/rootfs.i686.cpio.gz
同一目录下还包含一个未压缩的文件:rootfs.i686.cpio
构建目录则是
buildroot/project_build_i686/uclibc/root
可以在这个目录下对原始的initramfs进行修改调整,然后自己用cpio命令打包生成新的initramfs。
(4)调整
直接用buildroot生成的root.i686.cpio.gz作为initramfs,运行时会出现
can't open /dev/tty1: No such file or directory
can't open /dev/tty2: No such file or directory
can't open /dev/tty3: No such file or directory
错误信息的循环输出,系统不能正常运行。
错误的原因是没有在initramfs的/dev目录下生成相应的设备文件。需要做如下的调整:
1)在构建目录(buildroot/project_build_i686/uclibc/root)下的etc/init.d目录中新增一个初始化脚本文件S10mountfs
#!/bin/sh
mount -t proc proc /proc
mount -t sysfs sysfs /sys
mdev -s

2)更改busybox的setuid属性,否则无法执行mount命令。在构建目录(buildroot/project_build_i686/uclibc/root)下执行
chmod -s bin/busybox
命令。
这两项调整工作做完后,在构建目录(buildroot/project_build_i686/uclibc/root)下执行
find . | cpio -o -H newc |gzip > ../initramfs.cpio.gz
命令,重新生成initramfs的cpio打包文件。
(5)运行效果
运行新的initramfs,系统出现登录提示。输入用户名 root,密码为空,即可进入一个mini的linux系统。

buildroot是功能强大、配置灵活的自动化构建工具,它的详细使用和配置方法超出了本文的范围,后续可能会专文描述,此处就从略了。

---下节预告---
截至到目前,我们都是基于busybox来构建initramfs。还有一种广泛使用的initramfs构建方式是使用klibc软件包,包括一个小巧的C库和常用命令和工具。Debian的initramfs构建工具就综合应用了busybox、udev、klibc。有关klibc的使用方法,请看下一个step:
精通initramfs构建step by step (十一):klibc
阅读(3050) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~