本节移植根文件系统使用最新版的Busybox1.28.1。
1. 构建Linux系统中使用的命令
1.1 下载最新版的busybox
下载网址为https://www.busybox.net/
现在的最新版为1.28.1
使用自己制作的最新交叉编译链arm-S3C2440-linux-gnueabi-gcc 8.1.0
!!!特别注意,因为交叉编译链的问题,导致制作的文件系统一直不能被正确挂载,之后询问老师后才得知是交叉编译链的问题,这耗费了我很多的时间,特别提醒大家。具体制作方法见
https://www.cnblogs.com/slieart/articles/9215721.html
如果不想做,可以直接下载我做好的。
https://coding.net/u/shuimur/p/arm-linux-gcc/git
要用同样的工具链编译内核和文件系统。
1.2 解压并配置Busybox
解压后在该目录文件中执行make menuconfig
命令进行配置
Busybox Settings
build options
Cross complier prefix
在该项中填入arm-S3C2440-linux-gnueabi-
,使用arm-S3C2440-linux-gnueabi-gcc
进行编译.
如果需要静态编译,安装完成后不需要拷贝编译链中的库文件,则需要选择
Busybox Settings
build options
Build BusyBox as a static binary (no shared libs)
选择安装目录:
Busybox Settings
Installation Options ("make install" behavior)
BusyBox installation position
在此项中填入安装的绝对路径,即自己制作的根文件系统所在的目录。
之后退出并保存。
1.3 编译
使用make
命令进行编译
1.4 安装
如果在上面的make menuconfig
已经设置了安装目录,则直接使用make install
进行安装。
如果上面没有设置安装路径,则使用make install CONFIG_PREFIX=***********
命令进行安装。
1.5 拷贝库文件(如果上面选择静态编译,则不需要)
建议使用静态编译,本人尝试动态编译后拷贝库文件到lib中,最后得到的镜像文件体积骚大,需要找其他工具查找未使用库文件后删除,比较麻烦。
进入编译链所在的目录,执行以下命令查找库文件所在位置
find -name lib
看到列出的目录如下:
./arm-none-linux-gnueabi/libc/thumb2/usr/lib
./arm-none-linux-gnueabi/libc/thumb2/lib
./arm-none-linux-gnueabi/libc/usr/lib
./arm-none-linux-gnueabi/libc/armv4t/usr/lib
./arm-none-linux-gnueabi/libc/armv4t/lib
./arm-none-linux-gnueabi/libc/lib
./arm-none-linux-gnueabi/lib
./lib
看视频得知,所需的库文件在
./arm-none-linux-gnueabi/libc/armv4t/usr/lib
./arm-none-linux-gnueabi/libc/armv4t/lib
在根文件系统的目录下创建lib
和usr/lib
目录
mkdir lib
cd usr
mkdir lib
复制所需库文件。
cp ./arm-none-linux-gnueabi/libc/armv4t/lib/*so* /home/shuimu/more/FileSystem/rootfs_1_20_dynamic/lib -d
cp ./arm-none-linux-gnueabi/libc/armv4t/usr/lib/*so* /home/shuimu/more/FileSystem/rootfs_1_20_dynamic/usr/lib -d
注意:执行复制命令时后面加上-d
选项,cp命令对该选项的解释如下
same as --no-dereference --preserve=links
1.6 构建etc目录
在根文件系统文件夹下创建etc
目录。
该目录下有两个文件:fstab
,inittab
。还有一个目录init.d
,该目录下有一个文件rcS
这三个文件的具体内容如下:
fstab
# device mount-point type options dump fsck order
proc /proc proc defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
sysfs /sys sysfs defaults 0 0
tmpfs /dev tmpfs defaults 0 0
inittab
# /etc/inittab
::sysinit:/etc/init.d/rcS
console::askfirst:-/bin/sh
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r
rcS
#!/bin/sh
mount -a
mkdir /dev/pts
mount -t devpts devpts /dev/pts
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s
需要开机自动执行某些操作可以在rcS
文件中写入具体的命令。
1.7 构建dev目录
使用以下命令构建该目录:
mkdir dev
sudo mknod console c 5 1
sudo mknod null c 1 3
1.8 构建其他目录
这些目录都为空目录。
mkdir sys root tmp mnt proc
1.9 制作jffs2文件镜像
mkfs.jffs2 -n -s 2048 -e 128KiB -d rootfs_1_28_dynamic -o rootfs_1_28_dynamic.jffs2
1.10 下载根文件系统镜像
nfs 30000000 192.168.0.101:/home/shuimu/more/FileSystem/rootfs_1_28_dynamic.jffs2
nand erase.part rootfs
nand write.jffs2 30000000 rootfs $filesize
使用上述命令中的rootfs
是指在uboot中设置的nand分区名称,可以使用mtdparts
命令查看具体分区。
1.11修改启动参数
指定系统使用的文件系统类型是jffs2
set bootargs console=ttySAC0,115200 root=/dev/mtdblock3 rootfstype=jffs2
save
1.12 启动内核
下载内核到nand分区中或者使用nfs命令直接启动内核。
nfs 30000000 192.168.0.101:/home/shuimu/more/LinuxKernel/arch/arm/boot/uImage
nand erase.part kernel
nand write 30000000 kernel $filesize
nfs 30000000 192.168.0.101:/home/shuimu/more/LinuxKernel/arch/arm/boot/uImage
bootm 30000000
以下是编译busybox 1.28.1时出现的一些错误的解决方法。
arm-linux-gcc 4.5.1
miscutils/nandwrite.c:147:3: error: 'MTD_FILE_MODE_RAW' undeclared (first use in this function)
此时会发现出现上述报错。
经过查找,可以找到在编译链目录中./arm-none-linux-gnueabi/sys-root/usr/include/mtd/mtd-abi.h
有定义
定义为:MTD_MODE_RAW
因此修改miscutils/nandwrite.c
将MTD_FILE_MODE_RAW
改为MTD_MODE_RAW
之后继续编译。
util-linux/lib.a(nsenter.o): In function `nsenter_main':
nsenter.c:(.text.nsenter_main+0x19c): undefined reference to `setns'
coreutils/lib.a(sync.o): In function `sync_main':
sync.c:(.text.sync_main+0x70): undefined reference to `syncfs'
collect2: ld returned 1 exit status
Linux System Utilities—>nsenter,去掉该选项
Coreutils—>sync选项去掉
之后即可顺利编译通过。