精通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
|
阅读(3148) | 评论(0) | 转发(1) |