没志青年
发布于 2025-06-14 / 32 阅读
0

根文件系统移植

通过 NFS 挂载

通过以太网有线连接,开发板使用虚拟机上的根文件系统。

好处:

  • Linux 内核支持 NFS 服务

  • 进行驱动、应用程序开发时,直接在虚拟机上开发,不用传来传去,开发效率比较高。等功能完全开发好了,再把根文件系统烧录进去。

BusyBox

下载地址:Index of /downloads (busybox.net)

这里用最新版 1.37.0

步骤

(1)修改 Makefile

ARCH ?= arm
CROSS_COMPILE ?= /Dev-Tools/Tool-Chain/IMX6ULL/gcc-linaro-4.9.4/bin/arm-linux-gnueabihf-

(2)

make defconfig

(3)

make menuconfig

1、

选择动态编译,默认就是这个,说是静态编译会导致DNS问题,不确定。

-> Settings

-> Build static binary (no shared libs)

2、mdev

-> Linux System Utilities

-> mdev (16 kb) //确保下面的全部选中,默认都是选中的

3、

开启

vi-style line editing commands

4、开启unicode以支持中文

 -> Settings 
 -> Support Unicode //选中 
 -> Check $LC_ALL, $LC_CTYPE and $LANG environment variables //选中

5、

-> Linux Module Utilities

-> Simplified modutils 不要选择

(4)编译

make

放到NFS中

make install CONFIG_PREFIX=/opt/Linux_Workspace/i.MX6ULL/rootfs_nfs_workspace

完善根文件系统

创建其它文件夹

mkdir -p dev proc mnt sys tmp root etc/init.d

添加 lib 库

mkdir -p /opt/Linux_Workspace/i.MX6ULL/rootfs_nfs_workspace/lib
mkdir -p /opt/Linux_Workspace/i.MX6ULL/rootfs_nfs_workspace/usr/lib
cd /opt/Linux_Workspace/i.MX6ULL/arm_gcc/arm-linux-gnueabihf/libc/lib
cp *so* *.a /opt/Linux_Workspace/i.MX6ULL/rootfs_nfs_workspace/lib/ -d
cd /opt/Linux_Workspace/i.MX6ULL/arm_gcc/arm-linux-gnueabihf/lib
cp *so* *.a /opt/Linux_Workspace/i.MX6ULL/rootfs_nfs_workspace/lib/ -d
cd /opt/Linux_Workspace/i.MX6ULL/arm_gcc/arm-linux-gnueabihf/libc/usr/lib
cp *so* *.a /opt/Linux_Workspace/i.MX6ULL/rootfs_nfs_workspace/usr/lib/ -d

如果出问题,可能拷贝的是软链接,不是真正的文件。

创建初始化文件

  • /etc/init.d/rcS

  • /etc/fstab

  • /etc/inittab

OK了

编译报错解决

libbb/hash_md5_sha.c: In function ‘sha1_end’:
libbb/hash_md5_sha.c:1316:28: error: ‘sha1_process_block64_shaNI’ undeclared (first use in this function)
   || ctx->process_block == sha1_process_block64_shaNI
                            ^
libbb/hash_md5_sha.c:1316:28: note: each undeclared identifier is reported only once for each function it appears in
scripts/Makefile.build:197: recipe for target 'libbb/hash_md5_sha.o' failed
make[1]: *** [libbb/hash_md5_sha.o] Error 1
Makefile:744: recipe for target 'libbb' failed
make: *** [libbb] Error 2

解决:

在Settings中关闭 "SHA1: Use hardware accelerated instructions if possible"

networking/libiproute/iplink.c: In function ‘do_set_can’:
networking/libiproute/iplink.c:454:35: error: ‘IFLA_CAN_TERMINATION’ undeclared (first use in this function)
    addattr_l(&req.n, sizeof(req), IFLA_CAN_TERMINATION, &val, sizeof(val));
                                   ^
networking/libiproute/iplink.c:454:35: note: each undeclared identifier is reported only once for each function it appears in
scripts/Makefile.build:197: recipe for target 'networking/libiproute/iplink.o' failed
make[1]: *** [networking/libiproute/iplink.o] Error 1
Makefile:744: recipe for target 'networking/libiproute' failed
make: *** [networking/libiproute] Error 2

IFLA_CAN_TERMINATION 是 Linux 内核 4.18 才引入的 netlink 属性,用于设置 CAN 总线的终端电阻。 如果你用的 内核比较老(比如 4.14 甚至更早),内核头文件里就没有这个宏。 但你用的 BusyBox 版本比较新,它的 ip 工具实现里调用了这个新宏,于是编译失败。

解决:networking/libiproute/iplink.c

case ARG_termination: {
			// uint16_t val;
			NEXT_ARG();
			// val = get_u16(*argv, keyword);
			#ifdef IFLA_CAN_TERMINATION
            addattr_l(&req.n, sizeof(req), IFLA_CAN_TERMINATION, &val, sizeof(val));
			#endif
			break;
		}

让 busybox 支持中文

从 busybox1.17.0 以上之后,对 ls 命令不做修改是无法显示中文的。

就算是内核设置了支持中文的话, 在 shell 下用 ls 命令也是无法显示中文的,这是因为 busybox1.17.0 以后版本对中文的支持进行了限制。

要想让 busybox1.17.0 以上支持中文,需要修改 libbb/printable_string.c 和 libbb/unicode.c 文件。

Buildroot