快捷搜索:   服务器  安全  linux 安全  MYSQL  dedecms

精通initramfs构建stepbystep(十)

    二十九、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是功能强大、配置灵活的自动化构建工具,它的详细使用和配置方法超出了本文的范围,后续可能会专文描述,此处就从略了。

顶(0)
踩(0)

您可能还会对下面的文章感兴趣:

最新评论