本节移植根文件系统使用最新版的Busybox1.28.1。
1.建立Linux系统中使用的命令1.1下载最新版的busybox
下载网址为
现今的最新版为1.28.1
使用自己制做的最新交叉编译链arm-S3C2440-linux-gnueabi-gcc8.1.0
!!!非常注意linux 内核映像文件find命令,由于交叉编译链的问题,致使制做的文件系统仍然不能被正确挂载,然后寻问老师后才得悉是交叉编译链的问题,这花费了我好多的时间,非常提醒你们。具体制做方式见
https://www.cnblogs.com/slieart/articles/9215721.html
若果不想做,可以直接下载我做好的。
https://coding.net/u/shuimur/p/arm-linux-gcc/git
要用同样的工具链编译内核和文件系统。
1.2解压并配置Busybox
解压后在该目录文件中执行makemenuconfig命令进行配置
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安装
若果在前面的makemenuconfig早已设置了安装目录red hat linux下载,则直接使用makeinstall进行安装。
假如里面没有设置安装路径,则使用makeinstallCONFIG_PREFIX=***********命令进行安装。
1.5拷贝库文件(假如里面选择静态编译linux 内核映像文件find命令,则不须要)
建议使用静态编译,本人尝试动态编译后拷贝库文件到lib中,最后得到的镜像文件容积骚大,须要找其他工具查找未使用库文件后删掉,比较麻烦。
步入编译链所在的目录百度网盘LINUX,执行以下命令查找库文件所在位置
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
以下是编译busybox1.28.1时出现的一些错误的解决方式。
arm-linux-gcc4.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
LinuxSystemUtilities—>nsenter,除去该选项
Coreutils—>sync选项除去
然后即可顺利编译通过。