所谓制作根文件系统,就是创建各种目录,并且在里面创建各种文件。比如在/bin、/sbin目录下存放各种可执行程序,在/etc目录下存放配置文件,在/lib目录下存放库文件。本文档基于BusyBox来介绍如何制作根文件系统。
1. BusyBox下载
BusyBox源码下载地址:https://busybox.net/,可根据需求下载合适的版本,例如BusyBox 1.25.0。
2. 解压BusyBox
2.1.把下载好的busybox-1.25.0.tar.bz2拷贝到共享目录下,再拷贝到linux的一个目录下。
2.2. 使用命令tar -xjvf busybox-1.25.0.tar.bz2 解压
3. 配置BusyBox
BusyBox的配置程序和Linux内核菜单配置方式简直一模一样,十分方便易用。使用make menuconfig命令就可以进行配置。
3.1. 设置交叉编译器
进入busybox-1.25.0目录,修改Makefile如下红色字体
cd busybox-1.25.0/
vim Makefile
ARCH ?= arm
CROSS_COMPILE ?= arm-linux-
3.2.使用菜单配置BusyBox
make menuconfig
3.2.1.选择Busybox Settings--->Build Options--->,选择[*] Build Busybox as a static binary(no shared libs)
这个选项是一定要选择的,这样才能把BusyBox编译成静态链接的可执行文件,运行时才独立于其他函数库,否则必须要其他库文件才能运行。
3.2.2.选择Busybox Settings---> General Configuration --->[*] Don't use /usr
这个选项也是要选上的,否则make install 后BusyBox将安装在原系统的/usr下,这将覆盖系统原有的命令。选择这个选项后,make install后会在BusyBox目录下生成一个叫_install的目录,里面有BusyBox和指向他的链接。
3.2.3.去掉Linux System Utilities—> [ ] nsenter
3.2.4.去掉Coreutils ---> [ ] sync
4. 编译安装
默认情况下,make install完成后会在BusyBox目录下创建一个新的本地子目录 _install,其中包含了基本的 Linux 环境。在这个目录中,会有一个链接到 BusyBox 的 linuxrc 程序。这个 linuxrc 程序在构建安装盘或急救盘(允许提前进行模块化的引导)时非常有用。同样在这个目录中,还有一个包含操作系统二进制文件的 /sbin 子目录。还有一个包含用户二进制文件的 /bin 目录。在构建软盘发行版或嵌入式初始 RAM 磁盘时,可以将这个 _install 目录迁移到目标环境的根目录中。
4.1.编译
make
make过程中出现了错误,错误信息如下图
解决方法:将/usr/include/mtd/mtd-abi.h拷贝到busybox的include文件中,并把头文件添加到miscutils/nandwrite.c文件中,操作如下:
cp /usr/include/mtd/mtd-abi.h ./include/
vim miscutils/nandwrite.c(修改如下图)
保存后,继续make,还是出现错误,错误信息如下。
解决方法:/usr/include/linux/fs.h拷贝到busybox的include文件中,不过这次还要额外修改一下文件中的部分内容,否则会出现编译失败。
cp /usr/include/linux/fs.h ./include/
修改include/fs.h文件,修改如下:
vim include/fs.h
1. 屏蔽4个头文件(如下图)
2. 屏蔽以下结构体(如下图)
3. 修改util-linux/blkdiscard.c(如下图)
保存后,继续make,编译通过。
4.2.安装
make install
安装成功之后,会在当前目录下生成新的目录_install(如下图)
5. 制作完整的根文件系统
BusyBox虽然为我们创建了Linux根系统中最基本的shell和一些常用命令,但是一个根文件系统还不只包含这些,还需要其它的一些内容。
5.1. 在PC上创建一个目标根文件系统的目录,并把BusyBox里的_install目录里所有内容复制到这个目录下
mkdir rootfs
cp -ra busybox/busybox-1.25.0/_install/* rootfs/
cd rootfs/
5.2.在rootfs下创建目录
mkdir dev etc lib usr var proc tmp home root mnt sys
在var目录下创建tmp,modules,run,log目录
cd var
mkdir tmp modules run log
5.3.完善rootfs/etc目录
拷贝busybox/busybox-1.25.0/examples/bootfloppy/etc/*到rootfs/etc目录下
cp -r ../busybox/busybox-1.25.0/examples/bootfloppy/etc/* etc
5.3.1.修改inittab
vim etc/inittab(修改如下)
赋予其可执行属性:chmod a+x ./etc/inittab
5.3.2. etc目录下创建passwd和group文件
5.3.2.1.创建passwd
vim etc/passwd
内容如下:
root::0:0:root:/:/bin/sh
ftp::14:50:FTP User:/var/ftp:
bin:*:1:1:bin:/bin:
5.3.2.2.创建group
vim etc/group
内容如下:
root:*:0:
daemon:*:1:
bin:*:2:
sys:*:3:
adm:*:4:
tty:*:5:
disk:*:6:
lp:*:7:lp
mail:*:8:
news:*:9:
uucp:*:10:
proxy:*:13:
kmem:*:15:
dialout:*:20:
fax:*:21:
voice:*:22:
cdrom:*:24:
floppy:*:25:
tape:*:26:
sudo:*:27:
5.3.3. 修改profile文件
vim etc/profile (添加以下内容)
USER="`id -un`"
LOGNAME=$USER
PS1='[\u@\h \W]\$'
PATH=$PATH
HOSTNAME=`/bin/hostname`
export USER LOGNAME PS1 PATH
5.3.4.修改 etc/init.d/rcS文件
vim etc/init.d/rcS(添加以下内容)
export PATH=/sbin:/bin:/usr/sbin:/usr/bin:$PATH
hostname mini2440
mount -a
mkdir -p /dev/pts
mount -t devpts devpts /dev/pts
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s
######开启telnetd服务#########
telnetd -l /bin/login
#######配置网络###############
ifconfig lo 127.0.0.1 netmask 255.0.0.0
ifconfig eth0 192.168.0.210 netmask 255.255.255.0 up
route add default gw 192.168.0.1 eth0
5.3.5.修改etc/fstab文件
vim etc/fstab(添加以下内容)
#device mount-point type option dump fsck order
proc /proc proc defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
mdev /dev tmpfs defaults 0 0
sysfs /sys sysfs defaults 0 0
5.3.6. 建立etc/mdev.conf (mdev设备配置文件)、 net.conf (网络配置文件件)和mime.types: MIME(Multipurpose Internet Mail Extensions) ,内容均为空
5.4.rootfs/dev目录下创建设备节点
cd dev
sudo mknod console c 5 1
sudo mknod null c 1 3
5.5.完善rootfs/lib目录
对于"lib"目录:这个里面放的都是库文件,直接从交叉编译器的库文件目录中拷贝过来
cp -af ../software/opt/FriendlyARM/toolschain/4.4.3/arm-none-linux-gnueabi/lib/*so* lib/
6. 制作根文件系统镜像
将制作根文件系统通过mkyaffs2image工具制作成yaffs文件系统映像文件,然后烧录到nand flash中。这里按照友善之臂的官方推荐,使用mkyaffs2image工具,首先将光盘里的mkyaffs2image.tgz解压出来。进入到mkyaffs2image.tgz所在的目录,然后使用下面的命令:
tar -vxzf mkyaffs2image.tgz
解压成功会出现mkyaffs2image和mkyaffs2image-128M两个文件,其中第一个mkyaffs2image是制作适用于NANDFLASH为64M版本文件系统映象的工具,mkyaffs2image-128M则是 制作适用于128M/256M/512M/1GB版本文件系统映象的工具。
然后使用mkyaffs2image打包制作好的根文件系统即可:
最后将生成的镜像文件rootfs.img拷贝到Windows共享目录下
7. 下载烧写镜像文件
打开tftpboot工具把rootfs.img下载到板子
tftp 0x32000000 rootfs.img //把rootfs.img文件下载到内存0x32000000地址
擦除rootfs分区
nand erase.part rootfs
烧写rootfs.img文件
nand write.yaffs2 0x32000000 rootfs 0xb83d40 (0x32000000:存放下载文件的内存地址, 0xb83d40:文件大小)
重启开发板,就可以进入到根文件系统(如下图)
完