作者:不要再想Ta | 来源:互联网 | 2017-10-24 16:23
文章标题:精通initramfs构建stepbystep(十)。Linux是中国IT实验室的一个技术频道。包含桌面应用,Linux系统管理,内核研究,嵌入式系统和开源等一些基本分类
二十九、toolchain
在init ramfs中使用uclibc库,关键是构建uclibc的工具链toolchain。构建uclibc 的 toolchain 有两种主要方式:(1)用buildroot工具( http://buildroot.uclibc.org/)自动构建,这也是uclibc的官方标准做法。(2)用CLFS Embedded手册的方法手工创建。目前CLFS Embedded还在开发中,可在http://cross-lfs.org/view/clfs-embedded/x86/中查阅。
我们简单地说明用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。
最后编译生成的是静态连接的可执行文件,不需要在init ramfs中拷贝库文件。
三十一、用buildroot自动构建init ramfs
buildroot工具实际是一个功能强大的根文件系统构建工具,它以uclibc和busybox作为系统构建的基础,toolchain只是它构建系统的中间产品。init ramfs是一种特殊的根文件系统,当然也可以用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
可以在这个目录下对原始的init ramfs进行修改调整,然后自己用cpio命令打包生成新的init ramfs。
(4)调整
直接用buildroot生成的root.i686.cpio.gz作为init ramfs,运行时会出现
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
错误信息的循环输出,系统不能正常运行。
错误的原因是没有在init ramfs的/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 > ../init ramfs.cpio.gz
命令,重新生成init ramfs的cpio打包文件。
(5)运行效果
运行新的init ramfs,系统出现登录提示。输入用户名 root,密码为空,即可进入一个mini的linux系统。
buildroot是功能强大、配置灵活的自动化构建工具,它的详细使用和配置方法超出了本文的范围,后续可能会专文描述,此处就从略了。