第5章 文件系统移植(busybox1.28.3)
【注】本文所用的开发吧是IMX283,其他开发板移植也是类似,只是交叉工具链不同。
1.下载busybox
下载地址:http://www.busybox.net/(当前最新的稳定版本busybox-1.28.3)
笔者用的是busybox-1.28.3。下载并解压busybox-1.28.3.tar.bz2:
$tar -xvf busybox-1.28.3.tar.bz2
2.配置编译busybox
1)进入busybox解压后的目录
$ cd ./busybox-1.28.3/
2)修改Makefile
$ vi Makefile
添加如下内容:
ARCH = arm
CROSS_COMPILE= arm-fsl-linux-gnueabi-
【注】根据开发板的型号选择相应开发工具。
3)make menuconfig
$ make menuconfig
Settings —> Support –long-options —> [*] Don’t use /usr
Settings —>Build Options —> [*] Build static binary (no shared libs) //这里编译成静态.
Settings —>Build Options —> () Cross Compiler prefix //这里可以指定编译器arm-fsl-linux-gnueabi-,由于我们在makefile写了,这里就不需要填。
Settings —>Build Options —> InstallationOptions (“make install” behavior) —> (./_install) BusyBoxinstallation prefix //这里填写根文件安装的路径,默认是当前文件夹下的_install
Settings —>Busybox Library Tuning —>[*] Username completion //用户名,环境变量相关
Settings —>Busybox Library Tuning —>[*] Fancy shell prompts
4)make
$make
5)make install //拷贝制作好的根文件到安装目录,可以看到生成3个文件目录。
$ make install
$ls _install
【注】bin 和sbin目录下生成的是常用shell命令和工具等,linuxrc 是启动文件。
3.创建根文件目录
【注】以下步骤要切换到root用户。
$cd root
$mkdir rootfs
$cd rootfs
$mkdir bin dev etc libproc sbin sys usr mnt tmp var root
$mkdir –p usr/bin usr/libusr/sbin lib/modules
4.拷贝busybox编译生成的3个文件目录到rootfs (busybox只生成3个文件目录 bin linuxrc sbin)
$cp _install/* -rf /root/rootfs
5.拷贝c运行库
拷贝我们开发板的交叉编译工具lib目录:
$cd /opt/gcc-4.4.4-glibc-2.11.1-multilib-1.0/arm-fsl-linux-gnueabi/arm-fsl-linux-gnueabi/multi-libs/lib
$cp *so* /root/rootfs/lib -d //-d 表示把链接关系原封不动拷贝
【注】以下两个步骤是选配。
6.剪裁链接库的大小。去除LIB的符号表。
$cd /root/rootfs/lib
$arm-fsl-linux-gnueabi-strip *.so
7.在rootfs/dev/下创建设备节点,这2个设备节点是初始化必须的设备:
$mknod -m 660 null c 1 3
$mknod -m 660 console c 5 1
8. rootfs/etc/的初始化配置脚本修改
1)拷贝busybox-1.28.3/examples/bootfloopy/etc/*到当前目录下
$cp -r busybox-1.28.3/examples/bootfloopy/etc/* /root/rootfs/etc
包括文件:fstab init.d inittab profile
2)修改iniitab文件:
$vi etc/inittab
::sysinit:/etc/init.d/rcS
::respawn:-/bin/sh
::ctrlaltdel:/bin/umount -a -r
3)修改etc/fstab文件
proc /proc proc defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
sysfs /sys sysfs defaults 0 0
tmpfs /dev tmpfs defaults 0 0
4)修改init.d/rcS文件
#! /bin/sh
ifconfig eth0 192.168.2.201
/bin/mount -a
mkdir -p /dev/pts
mount -t devpts devpts /dev/pts
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev –s
5)修改profile文件
这里可以配置用户名等信息,不是必须的,暂时不配。
9.根文件系统基本制作完成。可以通过nfs挂载了验证是否正确。
这里我们通过tftp升级uImage,nfs网络文件系统挂载rootfs.
前提,确保配置好了nfs,和 tftp
MX28 U-Boot > setenv serverip 192.168.2.200
MX28 U-Boot > setenv ipaddr 192.168.2.201
MX28 U-Boot >setenv bootargs root=/dev/nfs nfsroot=192.168.2.200:/root/rootfsip=192.168.2.201 init=/sbin/init console=ttyAM0,115200n8
//MX28 U-Boot > run settftpboot
//MX28 U-Boot > saveenv
MX28 U-Boot > tftp 0x41600000 uImage
MX28 U-Boot > bootm
启动后,即可看到自己的文件系统啦!
【编译出现的问题】
问题1 busybox error: ‘MTD_FILE_MODE_RAW’
编译busybox-1.28.3时出错:
miscutils/nandwrite.c: In function ‘nandwrite_main’:
miscutils/nandwrite.c:151:3: error: ‘MTD_FILE_MODE_RAW’ undeclared (first use in this function)
miscutils/nandwrite.c:151:3: note: each undeclared identifier is reported only once for each function it appears in
解决办法:
【方法一】
mtd/mtd-abi.h里面有定义。于是定位到我的工具链的该文件:
sudo updatedb
sudo locate mtd-abi.h
cat /查找结果的工具链路径/include/mtd/mtd-abi.h
发现有定义
/*
* Read/write file modes for access to MTD
*/
enum mtd_file_modes {
MTD_MODE_NORMAL = MTD_OTP_OFF,
MTD_MODE_OTP_FACTORY = MTD_OTP_FACTORY,
MTD_MODE_OTP_USER = MTD_OTP_USER,
MTD_MODE_RAW,
};
#include < mtd/mtd-abi.h>
修改busybox nandwrite.c:147 ‘MTD_FILE_MODE_RAW’ -> ‘MTD_MODE_RAW’
【方法二】
make menuconfig 去掉 nandwrite模块即可。
问题2 busybox error:undefined reference to `setns’/’syncfs’
$make menuconfig
Linux System Utilities—>nsenter,去掉该选项.
Coreutils—>sync选项去掉.