在busybox的基础上移植必要的工具

使用busybox生成出来的文件系统以及常用命令都并不是太能满足工作的需求。
1.移植bash
下载好bash-4.2.tar.gz
解压
$CC=arm-linux-gcc ./configure --build=i386-linux --host=arm-linux --enable-readline --prefix=~/workspace/build/bash
$make
execute_cmd.c:2205:23: error: ‘job_control’ undeclared (first use in this function)


这个错误实际上很明显,不过这里需要打补丁(job_control)这个变量被谁给错误的删掉了。可以选择打补丁或者降到4.1版本,我这里选择直接使用4.1版本,
只是个演示说明。
$make install
最后会在目标路径下生成bin与share,待用。主要是bin拷到目标板上就可以用了,注意ldd看看会不会缺少库,如果缺少,手动添加

2.因为缺少sfdisk工具,所以需要移植util-linux。
一样有2种移植方式目标板成型系统上编译,或者交叉编译。
这里演示交叉编译。
首先获得util-linux的源码。有2种方式:
1.网站下载
2.apt-get source util-linux
第二种方式类似与git clone
$sudo CC=arm-linux-gcc ./configure --build=i386-linux --host=arm-linux --target=arm-linux --prefix=~/workspace/build/util-linux
configure: error: C compiler cannot create executables


实际上呢,经常有这样的类似错误。查了下,网上说是因为多次编译工具把环境变量改了 那么我们就去看看什么有问题
vi config.log
./configure: line 3620: arm-linux-gcc: command not found
但是实际上 sudo echo $PATH中又有我们的路径。gg之。
sudo有时候会出现找不到命令,而明明PATH路径下包含该命令,让人疑惑。其实出现这种情况的原因,主要是因为当 sudo以管理权限执行命令的时候,linux将PATH环境变量进行了重置,当然这主要是因为系统安全的考虑,但却使得sudo搜索的路径不是我们想要的PATH变量的路径,当然就找不到我们想要的命令了。两种方法解决该问题:

首先,都要打开sudo的配置文件:sudo visudo

1.可以使用 secure_path 指令修改 sudoers 中默认的 PATH为你想要的路径。这个指令指定当用户执行 sudo 命令时在什么地方寻找二进制代码和命令。这个选项的目的显然是要限制用户运行 sudo 命令的范围,这是一种好做法。

2.将Defaults env_reset改成Defaults !env_reset取消掉对PATH变量的重置,然后在.bashrc中最后添加alias sudo='sudo env PATH=$PATH',这样sudo执行命令时所搜寻的路径就是系统的PATH变量中的路径,如想添加其他变量也是类似。

经过测试建议使用方法1。

3.移植dhcp
如果只是简单的拷贝了busybox的rootfs, 那么你会发现以下3个情况
ping 同一局域网  OK
ping 外网IP(8.8.8.8) false
ping 域名(www.baidu.com) false
第三个情况是由于Busybox编译的DNS需要依赖一些动态库(尽管编译的时候选择了使用静态库)。以下是官方说明
**********************************************************************************************
When used with glibc, the BusyBox 'networking' applets will similarly require that you install at least some of the glibc NSS stuff (in particular, /etc/nsswitch.conf, /lib/libnss_dns*, /lib/libnss_files*, and /lib/libresolv*).
**********************************************************************************************
执行上述的拷贝。第三个问题未完全解决。why?因为第二个还没解决。
把第二个放到最后说,是因为我在实际操作过程中,出现过不稳定的情况。
busybox本身也带有udhcpc这个命令,但是需要将相应的必要配置文件拷贝到相应目录,不详述(google关键字 busybox udhcp 移植)
我在使用udhcp的时候出现过长时间的无法获取IP,不知道是udhcp的原因还是服务的问题。为了以后的稳定性,我使用了dhcp-4.2.4-P2.tar.gz
这个实在chinaunix上下载的,如果本身系统容量小,不予考虑,我这里没有这些限制,所以选用这个。
$ tar zxvf dhcp-4.2.4-P2.tar.gz
$ ./configure --prefix=~/workspace/build/
$ make "CC=arm-linux-gcc -static"


或者vi Makefile 进去修改,效果是一样的(建议使用方法)
$make install
$ ls
bin  etc  include  lib  sbin  share


这些都是生成出来的,直接拷贝到板子的/usr下,
提取脚本与配置文件
还是相同的目录下
$cp etc/* /media/board/sbin


其中/media/board/是我的板子根文件夹挂在点
再将源码目录中的linux拷贝到/sbin/目录下。并改名后一个文件为dhclient-script
$cp ./client/scripts/linux /media/board/sbin/dhclient-script


如果你按照我说的移植了bash,那么多余的就不需要做了,如果没有那么将dhclient-script的/bin/bash改为/bin/sh
运行 dhclient [ethx|wlanx]  就OK了


4.如果你需要mkfs.ext4 .ext3这种工具 那么你就需要移植e2fsprogs-1.42.8.tar.gz
$ CC=arm-linux-gcc ./configure --build=i386-linux --host=arm-linux --target=arm-linux --prefix=~/workspace/build/
$ make
$ make install
$ ls
bin  etc  lib  sbin  share


拷贝至板子的/usr/下

猜你喜欢

转载自blog.csdn.net/eagleqingluo/article/details/11612879