制作Linux根文件系统

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

在根文件系统的目录下创建libusr/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选项去掉
之后即可顺利编译通过。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值