本节移植根文件系统使用最新版的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目录

linux 内核映像文件find命令_linux的内核文件在哪里_内核映像文件是

在根文件系统文件夹下创建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

内核映像文件是_linux 内核映像文件find命令_linux的内核文件在哪里

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命令直接启动内核。

内核映像文件是_linux的内核文件在哪里_linux 内核映像文件find命令

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选项除去

然后即可顺利编译通过。

Author

这篇优质的内容由TA贡献而来

刘遄

《Linux就该这么学》书籍作者,RHCA认证架构师,教育学(计算机专业硕士)。

发表回复