【北京迅为】《i.MX8MM嵌入式Linux开发指南》-第五篇 文件系统构建篇-第八十章 busybox文件系统构建

i.MX8MM处理器采用了先进的14LPCFinFET工艺,提供更快的速度和更高的电源效率;四核Cortex-A53,单核Cortex-M4,多达五个内核 ,主频高达1.8GHz,2G DDR4内存、8G EMMC存储。千兆工业级以太网、MIPI-DSI、USB HOST、WIFI/BT、4G模块、CAN、RS485等接口一应俱全。H264、VP8视频硬编码,H.264、H.265、VP8、VP9视频硬解码,并提供相关历程,支持8路PDM接口、5路SAI接口、2路Speaker。系统支持Android9.0(支持获取root限)Linux4.14.78+Qt5.10.1、Yocto、Ubuntu20、Debian9系统。适用于智能充电桩,物联网,工业控制,医疗,智能交通等,可用于任何通用工业和物联网应用、

【公众号】迅为电子

【粉丝群】258811263


第八十章 busybox文件系统构建

配套资料在网盘资料“iTOP-i.MX8MM开发板\02-i.MX8MM开发板网盘资料汇总(不含光盘内容)\嵌入式Linux开发指南(iTOP-i.MX8MM)手册配套资料\4.文件系统构建配套资料\1 busyvox文件系统构建配套资料”目录下。

一个完整的Linux系统包含uboot、kernel和根文件系统。前面的章节已经介绍了uboot和内核,本章我们来学习一下根文件系统的组成和如何构建根文件系统。根文件系统构建成功后,我们就拥有了一个可运行的最小文件系统,只不过这个文件系统还不够完善。后面我们会在这个系统上编写测试Linux驱动,移植一些第三方软件,逐渐将这个文件系统打造成一个功能强大的操作系统。

80.1 根文件系统简介

在NXP原厂的BSP包中,提供的文件系统为yocto文件系统,yocto文件系统集成度高,开发很容易,但是集成度高利于开发,不利于我们学习,所以在制作文件系统这里,我们选用busybox,因为busybox文件系统集成度很低,而且非常精简,在后面移植其他东西的时候我们可以学习到很多细节。而且buildroot里面也是集成了busybox的。buildroot文件系统也会在后面给大家进行单独介绍。

内核是Linux的核心,但文件却是用户与操作系统交互所采用的主要工具。这对 Linux 来说尤其如此,这是因为在 UNIX 传统中,它使用文件 I/O 机制管理硬件设备和数据文件。

Linux文件系统中的文件是数据的集合,文件系统不仅包含着文件中的数据而且还有文件系统的结构,所有Linux 用户和程序看到的文件、目录、软连接及文件保护信息等都存储在其中。这种机制有利于用户和操作系统的交互。

根文件系统首先是一种文件系统,该文件系统不仅具有普通文件系统的存储数据文件的功能,而且相对于普通的文件系统,它的特殊之处在于,它是内核启动时所挂载(mount)的第一个文件系统,系统引导启动程序会在根文件系统挂载之后从中把一些初始化脚本(如rcS,inittab)和服务加载到内存中去运行。我们要明白文件系统和内核是完全独立的两个部分。

根文件系统之所以在前面加一个”根“,说明它是加载其它文件系统的”根“,既然是根的话,那么如果没有这个根,其它的文件系统也就没有办法进行加载的。它包含系统引导和使其他文件系统得以挂载(mount)所必要的文件。根文件系统包括Linux启动时所必须的目录和关键性的文件,例如Linux启动时都需要有init目录下的相关文件,在Linux挂载分区时Linux一定会找/etc/fstab这个挂载文件等,根文件系统中还包括了许多的应用程序bin目录等,任何包括这些Linux 系统启动所必须的文件都可以成为根文件系统。Linux启动时,第一个必须挂载的是根文件系统;若系统不能从指定设备上挂载根文件系统,则系统会出错而退出启动。

80.2 根文件系统目录介绍

在构建根文件系统之前,我们先来看一下根文件系统里面大概都有些什么内容,以 Ubuntu虚拟机为例,根文件系统的目录名字为‘/如果不理解这个/,大家可以回看一下我们在相对路径和绝对路径的知识点,命令如下:

cd  /		//进入到根目录下
ls			//打印当前目录下的文件

进入根目录后,ls查看的内容如下图所示:

上图我们可以看到根目录下有很多的目录和文件,这些都是Ubuntu系统所需要的,有一些目录和文件在嵌入式Linux根文件系统中是不存在的。在这里讲解一下常用的目录文件(可参考第14章节Linux目录结构讲解)。

  1. /bin目录

系统存放可执行文件的目录,在/bin目录下的指令可以被root和一般用户所使用。主要有:cat,chmod,ls,cp等常用的指令。

  1. /dev目录

在Linux系统下,任何外设与接口设备都是以文件的形式存在于这个目录当中,对这个目录下文件的操作就相当于操作外部设备。

  1. /etc目录

系统主要的配置文件几乎都放置在这个目录下,例如人员的账号密码文件、各种服务的启始档等等。一般来说,这个目录下的文件属性是可以让一般使用者查阅的,但是只有root有权利修改。

  1. /lib目录

此目录下存放着 Linux 所必须的库文件。这些库文件是共享库,命令和用户编写的应用程序要使用这些库文件。

  1. /mnt目录

临时挂载目录,一般为空目录,临时挂载某些额外的装置,例如U盘、sd卡等。

  1. /opt目录

这个是给第三方软件放置的目录。一般来说,第三方软件都安装到这个目录下。

  1. /proc目录

当Linux系统启动后,会将此目录作为proc文件系统的挂载点。proc是一个虚拟文件系统,存放的数据都在内存当中,例如系统核心、外设的状态和网络状态等内容。因为这个目录下的数据都是在内存中当中,不占用任何硬盘空间。比较重要的文件例如:/proc/cpuinfo,

/proc/interrupts等。

  1. /usr目录

usr 不是 user 的缩写,而是 Unix Software Resource 的缩写,也就是 Unix 操作系统软件资源目录,而不是用户的数据。所有系统默认的软件都会放置到/usr下。

  1. /sbin目录

Linux有非常多的指令是用来设定系统环境的,这些指令只有root才能使用,其他用户只能用来查询。放在/sbin底下的为开机过程中所需要的,里面包括了开机、修复、还原系统所需要的指令。

  1. /var目录

此目录存放一些可以改变的数据。

  1. /sys目录

此目录和/proc目录非常类似,也是一个虚拟的文件系统。主要记录核心与系统硬件相关的信息。包括目前已加载的核心模块与核心检测到的硬件设备信息等等。

80.3 BusyBox构建根文件系统

制作根文件系统有专门的工具可以使用,叫做BusyBox,BusyBox是标准Linux工具的一个单个可执行实现。BusyBox包含了一些简单的工具,例如cat和echo,还包含了一些更大、更复杂的工具,例如grep、find、mount以及telnet。有些人将BusyBox称为Linux工具里的瑞士军刀.简单的说BusyBox就好像是个大工具箱,它集成压缩了Linux的许多工具和命令。在本节我们使用BusyBox来制作一个根文件系统。

80.3.1 获取BusyBox源码

BusyBox可以从官网下载,官网地址为:https://busybox.net/,如下图所示:

在官网左侧的“Get BusyBox”栏有一行“Download Source”,点击“Download Source”即可打开BusyBox的下载页,如下图所示: 

从上图可以看出,目前最新的BusyBox 版本是 1.33.1。大家可以选择其中的一个版本下载使用。。BusyBox源码路径:iTOP-i.MX8MM开发板\02-i.MX8MM开发板网盘资料汇总(不含光盘内容)\嵌入式Linux开发指南(iTOP-i.MX8MM)手册配套资料\4.文件系统构建配套资料\1 busyvox文件系统构建配套资料\001-busybox源码。准备好源码之后就可以构建根文件系统了。

80.3.2 编译BusyBox构建根文件系统

将准备好的BusyBox源码上传到Ubuntu虚拟机下并解压。使用下列命令解压:

tar -vxf busybox-1.33.1.tar.bz2

解压完成后得到busybox-1.33.1目录,如下图所示: 

下面几个步骤开始配置busybox源码并编译。

80.3.2.1指定平台和交叉编译工具

输入以下命令设置交叉编译器,如下图所示:

export PATH=/opt/fsl-imx-xwayland/4.14-sumo/sysroots/x86_64-pokysdk-linux/usr/bin/aarch64-poky-linux:$PATH

 

打开 busybox 的顶层 Makefile,修改CROSS_COMPILE(第164行)和ARCH(第190行)的值,如下所示。如下图所示:

CROSS_COMPILE ?= aarch64-poky-linux-

ARCH ?= arm64

 

80.3.2.2修改Busybox源码支持中文

直接编译busybox源码,使用串口电脑终端时中文显示不正常。需要修改busybox源码,取消busybox 对中文显示的限制。

修改文件:busybox-1.33.1/libbb/printable_string.c,找到函数 printable_string,修改如下: 

12 const char* FAST_FUNC printable_string2(uni_stat_t *stats, const char *str) 
13 { 
14         char *dst; 
15         const char *s; 
16 
17         s = str; 
18         while (1) { 
...... 
30         if (c < ' ') 
31           break; 
32         /* 注释掉下面这个两行代码 */ 
33         /* if (c >= 0x7f) 
34             break; */ 
35         s++; 
36 } 
37 
38 #if ENABLE_UNICODE_SUPPORT 
39     dst = unicode_conv_to_printable(stats, str); 
40 #else 
41 { 
42         char *d = dst = xstrdup(str); 
43         while (1) { 
44             unsigned char c = *d; 
45             if (c == '\0') 
46                 break; 
47         /* 修改下面代码 */ 
48         /* if (c < ' ' || c >= 0x7f) */ 
49       if( c < ' ') 
50             *d = '?'; 
51         d++; 
52         } 
...... 
59 #endif 
60         return auto_string(dst); 
61 }

33 34 行,当字符大于 0X7F 以后就跳出去了。

48 ,如果支持 UNICODE 码的话,当字符大于 0X7F 直接输出‘?

因此针对这几行进行修改。红色部分的代码就是被修改以后的,主要就是禁止字符大于 0X7F 以后 break 和输出‘?’。

文件 busybox-1.33.1/libbb/unicode.c,修改内容如下所示:

1003 static char* FAST_FUNC unicode_conv_to_printable2(uni_stat_t 
*stats, const char *src, unsigned width, int flags)
1004 { 
1005       char *dst; 
1006       unsigned dst_len; 
1007       unsigned uni_count; 
1008       unsigned uni_width; 
1009 
1010       if (unicode_status != UNICODE_ON) { 
1011           char *d; 
1012           if (flags & UNI_FLAG_PAD) { 
1013               d = dst = xmalloc(width + 1); 
...... 
1022       /* 修改下面一行代码 */ 
1023       /* *d++ = (c >= ' ' && c < 0x7f) ? c : '?'; */ 
1024           *d++ = (c >= ' ') ? c : '?'; 
1025       src++; 
1026       } 
1027       *d = '\0'; 
1028       } else { 
1029           d = dst = xstrndup(src, width); 
1030           while (*d) { 
1031               unsigned char c = *d; 
1032               /* 修改下面一行代码 */ 
1033               /* if (c < ' ' || c >= 0x7f) */ 
1034                 if(c < ' ') 
1035                   *d = '?'; 
1036               d++; 
1037           } 
1038       } 
...... 
1044       return dst; 
1045   } 
...... 
1047 
1048   return dst; 
1049 } 

第1024和1034行代码是被修改以后的,同样主要是禁止字符大于 0X7F 的时候设置为‘?’。busybox 中文字符支持跟代码修改有关的就改好了。

80.3.2.3使用menuconfig进行配置

在进行配置之前先创建rootfs文件夹用于busybox源码编译后安装的目录。可以自己选择适合的目录下进行创建。使用下列命令:

mkdir rootfs

如下图所示:

创建文件夹后,我的绝对路径是:/home/topeet/busybox

然后开始进行busybox源码配置,在/home/topeet/busybox/busybox-1.33.1目录下执行下列命令:

make menuconfig

命令执行后如下图所示:

 

  1. 指定安装目录

Settings  --->

--- Installation Options ("make install" behavior)

(/home/topeet/busybox/rootfs ) Destination path for 'make install'

填写自己的rootfs文件夹的绝对路径(也就是我们在上一步创建的rootfs的路径)。填写完成后如下图所示:

 

  1. 去掉简要安装

Linux Module Utilities  --->

[ ] Simplified modutils

[*] depmod (26 kb) (NEW)

[*] insmod (22 kb) (NEW)

...

默认会选中Simplified modutils,这里我们要取消勾选。结果如所示:

  1. 选择动态编译busybox

Settings  --->

[] Build static binary (no shared libs)

检查默认是不是没有选中“Build static binary”,如果选择了,则取消选中。如下图所示:

 

  1. 设置命令行风格和网络配置

Settings  --->

[*] Support /etc/networks

[*]   vi-style line editing commands

这两个选项默认没有选中,修改后如下图所示:

  1. mdev配置

Linux System Utilities  --->

[*] mdev (17 kb)

[*] Support /etc/mdev.conf

[*] Support subdirs/symlinks

[*] Support regular expressions substitutions when renaming device

[*] Support command execution at device addition/removal

[*] Support loading of firmware

确保这几个都会选中,默认都是选中的。如下图所示:

  1. busybox支持中文显示

使能busybox unicode 编码

Settings  --->

[*] Support Unicode

[*]   Check $LC_ALL, $LC_CTYPE and $LANG environment variables

修改后如下图所示:

 

  1. 交叉编译器设置,设置为aarch-poky-linux-

Settings

 ->Cross compiler prefix

 

设置sysroot,如下图所示:

Settings

->(/opt/fsl-imx-xwayland/4.14-sumo/sysroots/aarch64-poky-linux) Path to sysroot

 按需求配置好选项后,要保存退出。

因为修改过默认配置会有下列提示,是否保存修改,选择“yes”,保存并退出。

 

busybox 的配置就到此结束了,大家也可以根据自己的实际需求选择配置其他的选项,不过对于初学者笔者不建议再做其他的修改,可能会出现编译出错的情况发生。

80.3.2.4编译busybox

配置好busybox后就可以编译了,前面的menuconfig配置中已经指定了编译结果的存放目录。执行下面的命令进行编译:

make -j4 //源码编译

make install //编译结果存放到指定目录

执行结果如下图所示:

编译完成:

 

安装完成结果: 

编译完成以后会在 busybox 的所有工具和文件就会被安装到 rootfs 目录中,rootfs目录文件内容如下图所示: 

rootfs 目录下有 bin、sbin 和 usr 这三个目录,以及 linuxrc 这个文件。Linux内核init进程最后会查找用户空间的init程序,找到以后就会运行这个用户空间的init程序,从而切换到用户态。如果bootargs设置 init=/linuxrc,那么linuxrc就是可以作为用户空间的init程序,所以用户态空间的init程序是busybox来生成的。

busybox的工作就完成了,但是此时的根文件系统还不能使用,还需要一些其他的文件,我们继续来完善 rootfs

80.3.3 构建整个根文件系统

在上一个小节中,编译完成busybox源码后,生成了几个根文件系统下的文件夹,我们还需要手动创建其他剩余的文件夹。如dev、etc、lib、mnt、proc、root、sys、tmp。创建完成后如下图所示:

 mkdir dev etc lib mnt proc root sys tmp

 

我们需要向lib和usr/lib文件夹下拷贝一些库文件。

  1. 向/lib文件夹下添加库文件

因为我们在编译busybox的时候是动态编译的,所以Linux 的应用程序是需要动态库才可以运行,当然你也可以编译成静态的,但是静态的可执行文件会很大。所以我们需要向根文件系统lib文件夹中添加动态库。如不理解可以回看手册第34章节库的制作与使用

lib库文件从交叉编译器中获取,前面搭建交叉编译环境时,交叉编译器的路径就是我们在编译busybox时候的用的bsp源码包里面的交叉编译器的绝对路径。交叉编译器中有很多库文件,制作简单的根文件系统,只需要把这些库文件放到根文件系统中就可以了。

交叉编译库文件路径大家依据自己交叉编译器所在的实际路径为准

/opt/fsl-imx-xwayland/4.14-sumo/sysroots/aarch64-poky-linux/lib

此目录下有许多so和.a文件,这些就是库文件,我们进到交叉编译器所在路径,将此目录下的所有so和.a文件拷贝到rootfs/lib目录中,拷贝命令如下:

cp ./*  /home/topeet/busybox/rootfs/lib/ -d -r

后面的“-d”表示拷贝符号链接。

如下图所示:

拷贝完成后,rootfs/lib目录下文件如下图所示: 

 至此,根文件系统的库文件全部添加完毕。整个根文件系统就已经准备好了。

80.4 完善根文件系统

80.4.1 创建eth0-setting文件

使用“cd etc” 命令进入到刚才创建的“etc” 文件夹,如下图所示:

然后命令建立“eth0-setting” 文件,并在“eth0-setting” 文件里输入下面的内容: 

IP=192.168.1.230

Mask=255.255.255.0

Gateway=192.168.1.1

DNS=192.168.1.1

MAC=08:90:90:90:90:90

如下图所示:

 

保存并退出“ eth0-setting” 文件, 使用“ chmod 755 eth0-setting”命令修改文件的权限,如图所示: 

80.4.2 创建 init.d文件

在 etc 目录下用“ mkdir init.d” 命令建立“ init.d” 文件夹,如下图

 

使用“ cd init.d” 命令进入到“ init.d”文件夹,如下图 

在“ init.d”文件夹下面使用“ vi ifconfig-eth0” 命令建立“ ifconfig-eth0” 文件,如下图 

#!/bin/sh
echo -n Try to bring eth0 interface up......>/dev/ttymxc1
if [ -f /etc/eth0-setting ] ; then
source /etc/eth0-setting
if grep -q "^/dev/root / nfs " /etc/mtab ; then
echo -n NFS root ... > /dev/ttymxc1
else
	ifconfig eth0 down
	ifconfig eth0 hw ether $MAC
	ifconfig eth0 $IP netmask $Mask up
	route add default gw $Gateway
fi 
	echo nameserver $DNS > /etc/resolv.conf
else
	if grep -q "^/dev/root / nfs " /etc/mtab ; then
	echo -n NFS root ... > /dev/ttymxc1
else
	/sbin/ifconfig eth0 192.168.253.12 netmask 255.255.255.0 up
	fi
fi 
	echo Done > /dev/ttymxc1

如下图所示:

保存并退出“ ifconfig-eth0” 文件, 使用“ chmod 755 ifconfig-eth0” 命令修改权限,如下图

在“ init.d” 文件夹下使用“ vi rcS” 命令建立“ rcS” 文件,如下图: 

在“ rcS” 文件输入下面的内容(注意每行前面的行号不要复制) : 

#! /bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin:
runlevel=S
prevlevel=N
umask 022
export PATH runlevel prevlevel
trap ":" INT QUIT TSTP
/bin/hostname RK3399
[ -e /proc/1 ] || /bin/mount -n -t proc none /proc 
[ -e /sys/class ] || /bin/mount -n -t sysfs none /sys
[ -e /dev/tty ] || /bin/mount -t ramfs none /dev
echo /sbin/mdev > /proc/sys/kernel/hotplug
/sbin/mdev -s
mkdir -p /dev/pts
mkdir -p /dev/shm
/bin/mount -n -t devpts none /dev/pts -o mode=0622
/bin/mount -n -t tmpfs tmpfs /dev/shm
mkdir -p /var/empty
mkdir -p /var/log
mkdir -p /var/log/boa
mkdir -p /var/lock
mkdir -p /var/run
mkdir -p /var/tmp
syslogd
/etc/rc.d/init.d/netd start
mkdir /mnt/disk
sleep 1
/sbin/ifconfig lo 127.0.0.1
/etc/init.d/ifconfig-eth0 

如下图所示:

保存并退出“rcS” 文件, 使用“chmod 755 rcS” 命令修改“rcS” 文件的权限, 如下图:  

80.4.3 创建passwd 文件

回到etc目录下,使用“vi passwd” 命令建立文件“passwd” , 如下图 

在新建立的“passwd” 文件中输入下面的内容

root:x:0:0:root:/:/bin/sh

bin:*:1:1:bin:/bin:

daemon:*:2:2:daemon:/sbin:

nobody:*:99:99:Nobody:/:

如下图所示:

保存并退出“passwd” 文件,使用“chmod 755 passwd” 命令修改“passwd” 文件的权限,如下图  

80.4.4 创建profile文件

使用“vi profile” 命令在“etc” 目录建立“profile” 文件,如下图:

 

在“profile” 文件中输入下面的内容  

# Ash profile
# vim: syntax=sh
# No core files by default
ulimit -S -c 0 > /dev/null 2>&1
USER="`id -un`"
LOGNAME=$USER
PS1='[$USER@$HOSTNAME]# '
PATH=$PATH
HOSTNAME=`/bin/hostname`
export USER LOGNAME PS1 PATH

保存并退出“ profile” 文件, 使用“ chmod 755 profile”命令修改“ profile” 文件的权限,如下图 

80.4.5 创建其余文件

使用“ mkdir rc.d” 命令在“ etc” 目录建立文件夹“ rc.d” ,如下图所示:

 

使用“cd rc.d” 命令进入到刚才建立的“ rc.d” 文件夹,如下图: 

在“ rc.d” 目录下使用“ mkdir init.d” 命令建立“ init.d” 文件夹,如下图  

 

使用“ cd init.d” 命令进入到刚才建立的“ init.d” 文件夹,如下图: 

 

在“ init.d” 文件夹, 使用“ vi netd” 命令建立“ netd” 文件,如图 

 

在“ netd文件里面输入下面的内容  

 #!/bin/sh

base=inetd

# See how we were called.

case "$1" in

start)

/usr/sbin/$base

;;

    stop)

pid=`/bin/pidof $base`

if [ -n "$pid" ]; then

kill -9 $pid

fi

;;

esac

exit 0 

如下图所示: 

保存并退出“netd” 文件, 使用“chmod 755 netd” 命令修改“netd” 文件的权限,如下图所示: 

80.4.6 生成文件系统镜像

经过前面的步骤我们已经制作完成了一个最小linux文件系统,我们在文件系统目录下(/home/topeet/busybox/rootfs)下的就是我们自己制作的文件系统,接下来我们需要把它打包成iMX8MM开发板的镜像。

  1. 将rootfs文件夹拷贝到Linux源码里面,这里使用的源码是“iTOP-i.MX8MM开发板\01-i.MX8MM开发板光盘资料\20210830\06-源码_Linux系统”。作者的Linux源码在Ubuntu上的路径是:/home/topeet/linux 一定要根据自己源码的位置修改命令,作者使用以下命令将制作好的文件系统拷贝到源码里面。

cp -rfp rootfs/ /home/topeet/linux/

 

  1. 修改Linux源码的编译脚本build.sh

添加如下代码:

export DESTDIR=$SDK_PATH/rootfs

echo DESTDIR:$DESTDIR

 

#generate rootfs.sdcard
function generate_rootfs()
{
	set -e
	rawsize=8192
	fatsize=65536
	#ext4size=3145728
	#ext4size=1845728
	ext4size=2145728

	totalsize=`expr $rawsize + $fatsize + $ext4size + $rawsize`

	dd if=/dev/zero of=$RESULT_OUT/rootfs.ext4 bs=1K count=0 seek=$ext4size
	echo "totalbytes:$totalsize"
	#chown -h -R 0:0 $DESTDIR
	$SDK_PATH/bin/mkfs.ext4 -F -i 4096 $RESULT_OUT/rootfs.ext4 -d $DESTDIR
	$SDK_PATH/bin/fsck.ext4 -pvfD $RESULT_OUT//rootfs.ext4

	fatstart=$rawsize
	fatend=`expr $rawsize + $fatsize`
	ext4start=$fatend
	ext4end=`expr $fatend + $ext4size`
	echo $ext4end
	dd if=/dev/zero of=$RESULT_OUT/rootfs.sdcard bs=1K count=0 seek=$totalsize

	parted -s $RESULT_OUT/rootfs.sdcard mklabel msdos
	parted -s $RESULT_OUT/rootfs.sdcard unit KiB mkpart primary fat32 $fatstart $fatend
	parted -s $RESULT_OUT/rootfs.sdcard unit KiB mkpart primary $ext4start $ext4end
	parted $RESULT_OUT/rootfs.sdcard print

	dd if=$RESULT_OUT/flash.bin of=$RESULT_OUT/rootfs.sdcard conv=notrunc seek=33 bs=1K
	echo $fatstartbytes
	echo $ext4startbytes
	dd if=$RESULT_OUT/boot.img of=$RESULT_OUT/rootfs.sdcard conv=notrunc,fsync seek=1K bs=$fatstart
	dd if=$RESULT_OUT/rootfs.ext4 of=$RESULT_OUT/rootfs.sdcard conv=notrunc,fsync seek=1K bs=$ext4start
}

 elif [ "$build_type" = "rootfs" ]

        then

make -C $LINUXKERNEL_INSTALL_DIR LDFLAGS="" INSTALL_MOD_PATH=$DESTDIR INSTALL_MOD_STRIP=$INSTALL_MOD_STRIP modules_install

#exit 1

 

     elif [ "$1" = "rootfs" ]
then
        build_atf
	build_uboot
	build_kernel
	generate_rootfs
	#exit 1
       

修改好的build.sh在网盘资料“iTOP-i.MX8MM开发板\02-i.MX8MM开发板网盘资料汇总(不含光盘内容)\嵌入式Linux开发指南(iTOP-i.MX8MM)手册配套资料\4.文件系统构建配套资料\1 busyvox文件系统构建配套资料\002-修改好的build.sh”目录下。

  1. 然后编译文件系统,输入./build.sh rootfs。编译完后会在result文件夹生成镜像。

 

80.4.7 最小系统功能测试

烧写编译好的镜像,系统启动后如下图所示:

 

80.4.7.1 U盘挂载和卸载

我们在平时测试程序或者传输数据时经常会用到 U 盘,开发板其实和电脑相同,U 盘插入电脑后需要挂载 U 盘,在拔掉 U 盘前需要先卸载。 首先启动开发板,我们将 U 盘插入 USB 口,可以看到开发板打印信息提示。如下图:

 然后使用命令“fdisk -l”,我们可以看到,U 盘设备为/dev/sda4,在插入 U 盘是也可以看到这一信息。如下图所示:

接着使用命令“mount /dev/sda4 /mnt/disk/”将 U 盘挂载到“/mnt/disk/”,使用命令“df -Th”命令可以查看挂载的目录,然后使用命令“ls /mnt/disk/” 即可查看 U 盘内容,如下图所示: 

80.4.7.2广域网连接测试

首先将网线插入 etherent口,启动开发板。我们使用“ifconfig”查看当前网络配置,如下图所示:

 

这个 eth0 的配置是之前构建最小文件系统时添加的,配置信息在“/etc/eth0-setting”文件中,我们可

以使用命令“vi /etc/eth0-setting”对其进行修改(根据我们自己局域网的环境,主要修改下 IPGateway

DNS),如下图所示:

 

 

修改之后保存退出,使用命令“/etc/init.d/ifconfig-eth0”即可重启网络。如下图所示: 

 最后我们使用命令“ping qq.com”,ping 一下 QQ 的网站,测试局域网外的连接情况,如下图所示:

80.4.7.3 中文显示测试

这里我们先修改下MobaXterm_Professinal_20.3_Preview4的相关设置,点击状态栏“设置,如下图所示:

 

然后我们将“字符集”修改为“UTF-8”。如下图所示: 

最后启动开发板,我们使用命令“mkdir 北京迅为”创建文件夹,如下图所示: 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值