【北京迅为】《STM32MP157开发板使用手册》- 第十五章 制作最小linux系统

news2024/9/26 1:24:17

iTOP-STM32MP157开发板采用ST推出的双核cortex-A7+单核cortex-M4异构处理器,既可用Linux、又可以用于STM32单片机开发。开发板采用核心板+底板结构,主频650M、1G内存、8G存储,核心板采用工业级板对板连接器,高可靠,牢固耐用,可满足高速信号环境下使用。共240PIN,CPU功能全部引出:底板扩展接口丰富底板板载4G接口(选配)、千兆以太网、WIFI蓝牙模块HDMI、CAN、RS485、LVDS接口、温湿度传感器(选配)光环境传感器、六轴传感器、2路USB OTG、3路串口,CAMERA接口、ADC电位器、SPDIF、SDIO接口等


第六部分 构建文件系统

第十制作最小linux系统

15.1 什么是根文件系统

文件系统是操作系统用于明确存储设备(常见的是磁盘,也有基于NAND Flash的固态硬盘)或分区上的文件的方法和数据结构;即在存储设备上组织文件的方法。操作系统中负责管理和存储文件信息的软件机构称为文件管理系统,简称文件系统。文件系统由三部分组成:文件系统的接口,对对象操作和管理的软件集合,对象及属性。从系统角度来看,文件系统是对文件存储设备的空间进行组织和分配,负责文件存储并对存入的文件进行保护和检索的系统。具体地说,它负责为用户建立文件,存入、读出、修改、转储文件,控制文件的存取,当用户不再使用时撤销文件等。

文件系统的重要性,我想大家都很清楚,不用多说了。这里有一句话,我觉得非常精辟而且到位的点出了文件系统在linux中的重要性:

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

然后来解释一下“根文件系统”这个名词的基本概念。同样引自百度百科的解释:

根文件系统首先是内核启动时所mount的第一个文件系统,内核代码映像文件保存在根文件系统中,而系统引导启动程序会在根文件系统挂载之后从中把一些基本的初始化脚本和服务等加载到内存中去运行。

展开来细说就是,根文件系统首先是一种文件系统,该文件系统不仅具有普通文件系统的存储数据文件的功能,但是相对于普通的文件系统,它的特殊之处在于,它是内核启动时所挂载(mount)的第一个文件系统,内核代码的映像文件保存在根文件系统中,系统引导启动程序会在根文件系统挂载之后从中把一些初始化脚本(如rcS,inittab)和服务加载到内存中去运行。我们要明白文件系统和内核是完全独立的两个部分。在嵌入式中移植的内核下载到开发板上,是没有办法真正的启动Linux操作系统的,会出现无法加载文件系统的错误。

下面来讲解一下常用的子目录:

1、/bin目录 

该目录下存放所有用户都可以使用的、基本的命令,这些命令在挂接其它文件系统之前就可以使用,所以/bin目录必须和根文件系统在同一个分区中。 

/bin目录下常用的命令有:cat,chgrp,chmod,cp,ls,sh,kill,mount,umount,mkdir,mknod,test等,我们在利用Busybox制作根文件系统时,在生成的bin目录下,可以看到一些可执行的文件,也就是可用的一些命令。

2、/sbin 目录 

该目录下存放系统命令,即只有管理员能够使用的命令,系统命令还可以存放在/usr/sbin,/usr/local/sbin目录下,/sbin目录中存放的是基本的系统命令,它们用于启动系统,修复系统等,与/bin目录相似,在挂接其他文件系统之前就可以使用/sbin,所以/sbin目录必须和根文件系统在同一个分区中。 

/sbin目录下常用的命令有:shutdown,reboot,fdisk,fsck等,本地用户自己安装的系统命令放在/usr/local/sbin目录下。

3、/dev目录 

该目录下存放的是设备文件,设备文件是Linux中特有的文件类型,在Linux系统下,以文件的方式访问各种设备,即通过读写某个设备文件操作某个具体硬件。比如通过”dev/ttySAC0”文件可以操作串口0,通过”/dev/mtdblock1”可以访问MTD设备的第2个分区。

4、/etc目录 

该目录下存放着各种配置文件,对于PC上的Linux系统,/etc目录下的文件和目录非常多,这些目录文件是可选的,它们依赖于系统中所拥有的应用程序,依赖于这些程序是否需要配置文件。在嵌入式系统中,这些内容可以大为精减。

5、/lib目录 

该目录下存放共享库和可加载(驱动程序),共享库用于启动系统。运行根文件系统中的可执行程序,比如:/bin /sbin 目录下的程序。

6、/home目录 

用户目录,它是可选的,对于每个普通用户,在/home目录下都有一个以用户名命名的子目录,里面存放用户相关的配置文件。

7、/root目录 

根用户的目录,与此对应,普通用户的目录是/home下的某个子目录。

8、/usr目录 

/usr目录的内容可以存在另一个分区中,在系统启动后再挂接到根文件系统中的/usr目录下。里面存放的是共享、只读的程序和数据,这表明/usr目录下的内容可以在多个主机间共享,这些主要也符合FHS标准的。/usr中的文件应该是只读的,其他主机相关的,可变的文件应该保存在其他目录下,比如/var。/usr目录在嵌入式中可以精减。

9、/var目录 

与/usr目录相反,/var目录中存放可变的数据,比如spool目录(mail,news),log文件,临时文件。

10、/proc目录 

这是一个空目录,常作为proc文件系统的挂接点,proc文件系统是个虚拟的文件系统,它没有实际的存储设备,里面的目录,文件都是由内核临时生成的,用来表示系统的运行状态,也可以操作其中的文件控制系统。

11、/mnt目录 

用于临时挂载某个文件系统的挂接点,通常是空目录,也可以在里面创建一引起空的子目录,比如/mnt/cdram /mnt/hda1 。用来临时挂载光盘、硬盘。

12、/tmp目录 

用于存放临时文件,通常是空目录,一些需要生成临时文件的程序用到的/tmp目录下,所以/tmp目录必须存在并可以访问。

15.2 Busybox工具简介

在制作文件系统的时候,我们需要使用“Busybox 工具”,即为网盘中的压缩包“”中的 busybox-1.33.1.tar.bz2。

“BusyBox 工具”是一个集成了一百多个最常用 Linux 命令和工具的软件。BusyBox 包含了一些简单的工具,例如 ls、cat 和 echo 命令等等,还包含了一些更大、更复杂的工具, 例 grep、find、mount 以及 telnet 命令。有些人将 BusyBox 称为 Linux 工具里的瑞士军刀。简单的说 BusyBox 就好像是个大工具箱,它集成压缩了 Linux 的许多工具和命令,也包含了 Android 系统自带的 shell。

“Busybox 工具”的官方网址是“http://www.busybox.net/”,这是一个开源的程序,并且一直在更新中,我们使用的版本是“busybox-1.33.1.tar.bz2”。为了方便起见,我们已经将对应的压缩包下载完成,存放路径为“iTOP-STM32MP157开发板网盘资料汇总\03_文件系统源码和镜像\01_最小linux文件系统\01_Busybox工具”。

下面我们来讲解一下如何使用 BusyBox 制作最小文件系统:

15.3 设置支持中文

首先拷贝“busybox-1.33.1.tar.bz2”到我们的虚拟机 Ubuntu 系统上,然后在Ubuntu 命令行,执行

“ tar -xvf busybox-1.33.1.tar.bz2”解压命令,解压完成后,如下图:

 

如下图,使用“ cd busybox-1.33.1”命令进入到前面解压出来的“busybox- 1.33.1”文件夹中。

 

从busybox1.17.0以上之后,对ls命令不做修改是无法显示中文的。就算是内核设置了支持中文的话,在shell下用ls命令也是无法显示中文的,这是因为busybox1.17.0以后版本对中文的支持进行了限制。要想让busybox1.17.0以上支持中文,需做如下修改。

首先使用命令“vim libbb/printable_string.c”,

 

然后查找函数printable_string,我们可以看到在第31,32行和45行的操作,大于0x7F的字符直接被break掉,或者直接被“?”代替了。所以就算是linux内核设置了支持中文,也是无法显示出来的。所以我们对这三行进行修改,注释掉对大于0x7f字符的相关操作。如图所示: 

 

修改之后保存退出。

然后使用命令“vim libbb/unicode.c

 打开之后查找函数unicode_conv_to_printable2,我们可以看到1022行和1030行也对大于0x7f的字符有对应操作,同样的我们对这两处做修改,如图所示:

 

修改之后保存退出。

经过以上修改之后,源码就可以支持中文字符了,但还需要配置 busybox来使能 unicode码,

输入“make menuconfig”命令,如下图,出现“Busybox”的配置界面。

如上图,选中“Busybox Settings”,然后按“回车”进入到“Busybox Settings”界面,如下图。 

方向键下翻找到“Support Unicod”和“Check $LC_ALL, $LC_CTYPE and $LANG environment variables”,选中这两个选项,即使能 busybox 的 unicode 编码以支持中文,如下图所示 

方向键下翻找到“Support Unicod”和“Check $LC_ALL, $LC_CTYPE and $LANG environment variables”,选中这两个选项,即使能 busybox 的 unicode 编码以支持中文,如下图所示 

 接着使用左右反方向按键,选择“Exit”,回到“Busybox Configuration”界面。如图所示:

然后使用左右反方向按键,选择“Exit”,选择“Yes”保存配置 

经过以上配置最小系统就可以支持中文了。

15.4 编译busybox

然后就轮到Busybox的编译配置了,同样输入“ make menuconfig”命令,如下图,出现“Busybox”的配置界面。

 如上图,选中“Settings”,然后按“回车”进入到“Settings”界面,如下图。

 

如上图,选中“Build Options”配置界面的“Cross Compiler prefix”,然后按“回车”,进入“Cross Compiler prefix”配置界面,如下图。 

 

如下图,输入交叉编译工具“arm-none-linux-gnueabihf-”。

 

按“回车”返回到“Setting”配置界面,这时可以看到刚才我们设置的交叉编译工具,如下图。 

 

选中“Installation Options”配置项,如下图。 

 

按回车。设置安装路径为../system

 

按“回车”,回到“Settings”,如下图。 

 

使用键盘“向右”的方向键移动光标到“Exit”,如下图。 

 

选中“Exit”按“回车”继续退出,直到弹出以下界面:

 

 选择“yes”保存退出,至此我们的busybox就设置好了

15.5 编译busybox

执行“make”进行编译,编译完成,接下来我们需要把编译生成的“二进制文件”安装到刚才我们指定的“../system”目录里面,安装二进制文件到“../system”目录,如下图,输入命令“ make install”。完成后如下图:

现在我们使用“ cd ../system”命令,进入“../system”目录,看看里面安装的文件,如下图。 

 

至此我们由busybox制作的文件系统就制作好了。但是还需要一些步骤来对该文件系统进行完善。

15.6 完善最小根文件系统

15.6.1 创建必要文件夹

文件系统还需要新建“dev,etc,lib,mnt,proc,sys,tmp,var”文件夹,使用命令:

mkdir dev etc lib mnt proc sys tmp var etc/init.d ”,如下图所示:

 

15.6.2 拷贝lib库文件

Busybox 编译生成的二进制文件是以动态链接库的形式运行,所以我们需要拷贝编译器里面的库文件到“lib”目录,使用命令

cp -d /usr/local/arm/gcc-arm-10.3-2021.07-x86_64-arm-none-linux-gnueabihf/arm-none-linux-gnueabihf/libc/lib/* ./

如下图所示:

 

15.6.3 创建rcS文件

然后我们需要创建/etc/init.d/rcS 文件 ,在system目录下使用“vim etc/init.d/rcS”命令建立“rcS”文件,并在“rcS”文件输入下面的内容。 

#! /bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin:$PATH
runlevel=S
prevlevel=N
umask 022
export PATH runlevel prevlevel
/bin/hostname iTOP-STM32MP157
mount -a
mkdir /dev/pts
mount -t devpts devpts /dev/pts
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s
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
/sbin/ifconfig lo 127.0.0.1
/etc/init.d/ifconfig-eth0
sleep 1
echo "*************************************" > /dev/ttySTM0
echo "http://topeetboard.com" > /dev/ttySTM0
echo "*************************************" > /dev/ttySTM0

下面我们来分析每一句命令的作用。

第1行表示该文件为一个shell 脚本。

第2行和后面的第6行指定了PATH环境变量,PATH这个环境变量是linux系统内部定义的一个环境变量,含义是操作系统去执行程序时会默认到PATH指定的各个目录下去寻找。如果找不到就认定这个程序不存在,如果找到了就去执行它。将一个可执行程序的目录导出到PATH,可以让我们不带路径来执行这个程序。

rcS中为什么要先导出PATH?就是因为我们希望一旦进入命令行下时,PATH环境变量中就有默认的/bin /sbin /usr/bin /usr/sbin 这几个常见的可执行程序的路径,这样我们进入命令行后就可以ls、cd等直接使用了。

第3行和第6行指定了runlevel环境变量,runlevel=S表示将系统设置为单用户模式。

第5行指定当前用户在创建文件时的默认权限。

第6行导出环境变量

第7行设置机器名字为iTOP-STM32MP157

第8行mount -a是挂载所有的应该被挂载的文件系统,在busybox中mount -a时busybox会去查找一个文件/etc/fstab文件,这个文件按照一定的格式列出来所有应该被挂载的文件系统(包括了虚拟文件系统),在这里我们还没有创建,下面会进行创建。

第 9 和 10 行,创建目录/dev/pts,然后将 devpts 挂载到/dev/pts 目录中。

第 11 和 12 行,使用 mdev 来管理热插拔设备,Linux 内核就可以在/dev 目录下自动创建设备节点.

第13行到18行,在对应的目录下创建相应的文件。

第19行syslogd记录系统或应用程序产生的各种信息,并把信息写到日志中

第20行启动netd服务,我们在之后会创建这个文件

第21行在mnt下创建disk文件夹,方便外部设备(U盘,TF卡)的挂载。

第22行设置本地回环lo为127.0.0.1。

第23行执行ifconfig-eth0脚本配置网络,在下面的步骤中会创建这个脚本。

修改完成之后,我们需要使用命令“chmod 777 rcS”,来给予文件可执行权限,如下图所示:

 

 

15.6.4 创建fstab 文件

文件fstab包含了你的电脑上的存储设备及其文件系统的信息。它是决定一个硬盘(分区)被怎样使用或者说整合到整个系统中的唯一文件。

这个文件的全路径是/etc/fstab。它只是一个文本文件,你能够用你喜欢的编辑器打开它,但是必须是root用户才能编辑它。同时fsck、mount、umount的等命令都利用该程序。

具体来说: 用fstab可以自动挂载各种文件系统格式的硬盘、分区、可移动设备和远程设备等。 对于Windows与arch双操作系统用户,用fstab挂载FAT格式和NTFS格式的分区,可以在Linux中共享windows系统下的资源。

让我们对fstab的用法进行一个详细的了解。/etc/fstab由下面的 fields 组成 (fields之间以空格或tab分开):

<file system>  <dir>  <type>  <options>  <dump>  <pass>

<file systems> - 存储设备的标识 (i.e. /dev/sda1).

<dir> - 告诉 mount 命令应该将文件设备挂载到哪里。

<type> - 定义了要挂载的设备或是分区的文件系统类型,支持许多种不同的文件系统,如 ext2, ext3, reiserfs, xfs, jfs, smbfs, iso9660, vfat, ntfs, swap 以及 auto。 'auto' 类型使 mount 命令对这文件系统类型进行猜测,这对于如 CDROM 和 DVD 之类的可移动设备是非常有用的。

<options> - 定义了不同文件系统的特殊参数,不同文件系统的参数不尽相同。其中一些比较通用的参数有以下这些:

<dump> dump utility 用来决定何时作备份. 安装之后 ( ArchLinux 默认未安装 ), dump 会检查其内容,并用数字来决定是否对这个文件系统进行备份。 允许的数字是 0 和 1 。0 表示忽略, 1 则进行备份。大部分的用户是没有安装 dump 的 ,对他们而言 <dump> 应设为 0。

<pass> fsck 读取 <pass> 的数值来决定需要检查的文件系统的检查顺序。允许的数字是0, 1, 和2。 根目录应当获得最高的优先权 1, 其它所有需要被检查的设备设置为 2. 0 表示设备不会被 fsck 所检查。

在对 fstab有了一定了解之后,我们使用命令“vim fstab”创建fstab文件,并写入以下内容:

#<file system>   <dir> <type> <options> <dump> <pass>
proc /proc proc   defaults 0 0
tmpfs /tmp tmpfs  defaults 0 0
sysfs /sys sysfs  defaults 0 0

修改完成之后,我们需要使用命令“chmod 777 fstab”,来给予文件可执行权限,如下图所示: 

15.6.5 创建inittab 文件 

init 进程为内核加载文件系统的第一个进程,一般称为 0 号进程,init 进程启动后会自动读取 inittab。

  inittab文件中每一行的格式如下所示:(busybox的根目录下的example文件夹下有详尽的inittab文件范例)     

<id>:<runlevel>:<action>:<process>

尽管此格式与传统的Sytem V init类似,但是,id在BusyBox的init中具有不同的意义。对BusyBox而言,id用来指定启动进程的控制tty。如果所启动的进程并不是可以交互的shell,例如BusyBox的sh(ash),应该会有个控制tty,如果控制tty不存在,Busybox的sh会报错。BusyBox将会完全忽略runlevel字段,所以空着它就行了,你也许会问既然没用保留着它干吗,我想大概是为了和传统的Sytem V init保持一致的格式吧。process字段用来指定所执行程式的路径,包括命令行选项。action字段用来指定下面表中8个可应用到process的动作之一。

 

文件根据此配置文件来执行后续的步骤。我们在/etc目录下使用命令“vim inittab”命令,创建inittab文件,在该文件中我们输入以下内容:

::sysinit:/etc/init.d/rcS

console::askfirst:-/bin/sh

::restart:/sbin/init

::shutdown:/bin/umount -a -r

::shutdown:/sbin/swapoff -a

 

第 1行,系统启动以后运行/etc/init.d/rcS 这个脚本文件。

第 2 行,将 console 作为控制台终端,也就是 ttySTM0。

第 3 行,重启的话运行/sbin/init。  

第 4行,关机的时候执行/bin/umount,也就是卸载各个文件系统。

第 5 行,关机的时候执行/sbin/swapoff,也就是关闭交换分区。   

保存退出之后,使用命令“chmod 777 inittab”,修改该文件的权限,如下图所示:

 

15.6.6创建passwd文件

然后使用“ vim passwd”命令在“etc”目录建立“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文件是用来保存用户的信息的,是一个纯文本文件。格式如下:

<name>:<password><uid>:<gid>:<comment>:<home>:<shell>

name:用户名。

password:密码(已经加密)

uid:UID(用户标识),操作系统自己用的

gid:GID组标识。

comment:用户全名或本地帐号

home:用户的主目录的绝对路径

shell:登录使用的Shell,就是对登录命令进行解析的工具

保存退出之后,使用命令“chmod 777 inittab”,修改该文件的权限,如下图所示:

 

15.6.7创建profile 文件 

然后使用“ vim profile”命令在“etc”目录建立“profile”文件,profile用来设置我们的环境变量,在“profile”文件中输入下面的内容。 

USER="`id -un`"

LOGNAME=$USER

PS1='[$USER@$HOSTNAME]:$PWD# '

PATH=$PATH

HOSTNAME=`/bin/hostname`

export USER LOGNAME PS1 PATH

输入结果如下图。 

 

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

 

15.6.8创建eth0-setting 文件 

在etc目录下,使用命令“vim 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

 IP:开发板启动后默认设置的IP地址,IP地址为192.168.1.230

Mask:开发板启动后默认设置的掩码,掩码为255.255.255.0

Gateway:开发板启动后默认配置的网关,网关为192.168.1.1

DNS:开发板启动后默认设置的DNS,DNS为192.168.1.1

MAC:开发板启动后默认设置的MAC地址,MAC地址为08:90:90:90:90:90

MAC地址和作者保持一致即可,其余网络信息大家依据自己的网络情况设置即可,

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

15.6.9创建ifconfig-eth0 文件 

在/etc目录下使用“cd init.d”命令进入init.d文件夹,如下图所示:

 

然后使用命令“vim ifconfig-eth0”创建ifconfig-eth0文件,并写入以下内容:  

#!/bin/sh

echo -n Try to bring eth0 interface up......>/dev/ttySTM0

if [ -f /etc/eth0-setting ] ; then

source /etc/eth0-setting

if grep -q "^/dev/root / nfs " /etc/mtab ; then

echo -n NFS root ... > /dev/ttySTM0

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/ttySTM0

else

/sbin/ifconfig eth0 192.168.253.12 netmask 255.255.255.0 up

fi

fi

echo Done > /dev/ttySTM0

 

ifconfig-eth0是网络配置文件,工作流程就是读取我们创建的eth0-setting网络信息文件来设置网络,如果eth0-setting配置文件不存在,就使用默认配置。

保存退出之后,使用命令“chmod 777 ifconfig-eth0“,修改文件的权限,如下图所示:

 

15.6.10创建medv.conf 文件 

在etc目录下,使用命令“vim mdev.conf”新建mdev.conf 文件,因为我们在rcS文件里面配置了热拔插功能,但是还需要mdev.conf配合,mdev.conf文件是U盘 sd卡的热拔插文件,我们在mdev.conf 输入以下内容:

sd[a-z][0-9] 0:0 666 @ /etc/hotplug/udisk_inserting

sd[a-z] 0:0 666 $ /etc/hotplug/udisk_removing

 

接着使用命令“mkdir hotplug”在etc目录下创建hotplug 文件夹,如下图所示:

 

然后使用命令“cd hotplug”进入hotplug文件夹,然后在hotplug文件夹下使用命令vim udisk_inserting建立udisk_inserting文件夹并在里面输入以下内容: 

#!/bin/sh  

echo "usbdisk insert!" > /dev/console    

if [ -e "/dev/$MDEV"  ]  ; then       

    mkdir -p /mnt/usbdisk/$MDEV          

    mount /dev/$MDEV /mnt/usbdisk/$MDEV

    echo "/dev/$MDEV mounted in /mnt/usbdisk/$MDEV">/dev/console

fi  

 

保存退出后,在hotplug文件夹下使用命令vim udisk_removing建立udisk_removing文件夹并在里面输入以下内容:

udisk_removing:

#!/bin/sh  

echo "usbdisk remove!" > /dev/console   

umount -l /mnt/usbdisk/sd*  

rm -rf /mnt/usbdisk/sd*

 

保存退出后,在hotplug目录下使用命令“chmod 777 *”修改文件权限。 

 

15.6.11创建mtab文件 

返回etc目录下,我们需要在etc目录下创建mtab文件,/etc/mtab是当前的分区挂载情况,记录的是当前系统已挂载的分区。每次挂载/卸载分区时会更新/etc/mtab文件中的信息。所以在ifconfig-eth0文件里面我们就是通过这个/etc/mtab来判断当前的文件系统是不是nfs网络文件系统。

 mtab文件是个链接文件,我们在etc目录下输入命令“ln -s /proc/mounts mtab”把他链接到/proc/mounts,如下图所示:

15.6.12创建netd文件

netd文件是用用来配合profile文件里面的/etc/rc.d/init.d/netd start的这行代码来启动netd 服务的。这里我们就来一起创建这个文件。

(1)在etc目录使用命令“mkdir rc.d”建立文件夹“rc.d”然后使用“cd rc.d” 命令进入到刚才建立的“rc.d” 文件夹 ,接下来在“rc.d” 目录下使用“mkdir init.d” 命令建立“init.d” 文件夹, 使用“cd init.d” 命令进入到刚才建立的“init.d” 文件夹。如下图所示:

 (2)在“ init.d”目录下, 使用“vi netd” 命令建立“ netd” 文件,使用“chmod 777 netd” 命令修改“ netd” 文件的权限为777,

#!/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

如下图所示: 

至此我们的文件系统就制作完成了。下面将进行我们镜像的制作。

15.7 制作镜像

如下图所示,是配置完 busybox 制作的根文件系统。

 

 返回上一目录,使用命令“mkdir rootfs”,rootfs用来挂载之后制作制作出来的 rootfs.ext4如下图所示:

然后使用命令“du system”命令来查看system文件大小,可以看到该文件系统的大小为18M,如下图: 

所以我们镜像大小在这里设置为30M,使用命令如下

dd if=/dev/zero of=rootfs.ext4 bs=1M count=30 

mkfs.ext4 -L rootfs rootfs.ext4

建立一个大小为30M的ext4 磁盘,如下图所示:

 

接下来使用 mount 命令将 rootfs.ext4 挂载到rootfs 目录下,如下图所示:

 mount ./rootfs.ext4 rootfs

 

然后拷贝我们制作的文件系统到rootfs 目录下,如下图所示:

cp -r ./system/* ./rootfs

 

拷贝完成后,使用命令“umount rootfs”,进行解除挂载,如下图所示: 

 

15.8 busybox根文件系统测试

文件系统虽然我们已经制作好了,但是能不能用呢?这里我们先打一个问号,所以我们要对文件系统的功能进行一个测试,使用busybox制作的根文件系统功能比较简单,所以测试起来也不复杂。

制作好的文件系统镜像存放路径为“iTOP-STM32MP157开发板网盘资料汇总\03_文件系统源码和镜像\01_最小linux文件系统\02_最小linux镜像”。

15.8.1 网络测试

网络测试主要是测试网络能不能使用,测试思路为先使用ifconfig命令查看网卡有没有启动,接着在使用ping命令测试能不能成功ping通网络,文件系统启动成功,输入命令ifconfig,查看网卡状态,如下图所示:

 

 接着输入命令“ping 192.168.1.1 -c 3”,注意192.168.1.1是我网关的IP,大家要依据自己的电脑IP实际情况来ping。并且也要保证电脑主机和开发板是在同一网段下。如下图所示:

 接着我们输入命令“ping www.baidu.com” 来ping百度的网址,看能不能ping通,如下图所示:

从上图可以看到,我们能ping通百度的网址,也就证明我们是可以访问外部网络的。至此我们的网络测试部分成功。如果不能ping通,一般这种错误就是域名解析出错了。知道了问题所在我们要怎么解决呢?

当然是添加域名服务器地址呀。添加域名服务器地址很简单,我们打开文件系统的etc目录下eth0-setting,在制作文件系统的时候我们讲到过,eth0-setting文件为网络配置文件,这个文件里描述了网络相关的信息,比如ip,网关,dns等,所以我们就可以修改这里里面的dns,比如这里设置的域名服务地址为 8.8.8.8或者 8.8.4.4,大家也可以改为他的地址,修改完成后,一般就可以ping通了。

 

15.8.2 中文测试

制作文件系统的时候,我们对中文进行了支持,我们直接在MobaXterm的控制台上输入命令mkdir 测试,检查是否可以创建中文文件夹,如下图所示:

15.8.4 热拔插测试

在只做busybox文件系统的时候,我们加入了热拔插U盘相关的代码。首先我们准备一个格式为FAT32格式的U盘,然后我们直接插到开发板上的USB接口,可以看到如下打印信息。

 

可以看出,U盘已经自动挂载到了/mnt/usbdisk/sda1目录上了,接着我们进到/mnt/usbdisk/sda1目录下,使用ls就可以看到U盘里面的文件了,如下图所示: 

 

最后我们从开发上的USB口拔下U盘,可以看到如下图打印信息: 

 

可以看出,u盘已经卸载了,在/mnt/usbdisk目录下输入ls命令如下图所示: 

 

从上图可以发现,已经没有U盘的信息了。

15.8.5 库文件测试

在制作文件系统的时候,我们使用的是动态库。所以需要把lib库文件拷贝到文件系统里面,也就是前面拷贝lib库这一小节的操作。

为什么编译的时候默认选择的是动态库而不是静态库呢,因为busybox运行需要lib文件,使用静态库的话,在编译的时候是直接将lib编译到busybox里面了,但是自己写的程序也需要lib库文件,我们还是需要将lib库拷贝到文件系统里面,那这样做是不是就相当于拷贝了俩分lib库呢,这样文件系统的体积是不是就大了呢,而且大出来的这部分完全是没有必要的。所以选择是动态库。

库文件我们已经拷贝到了文件系统里面,但是能不能用呢?这就需要我们来测试一下了。我们在Ubuntu虚拟机上写一个helloworld.c程序,代码如下:

#include <stdio.h>
int main(void)
{
                printf("hello linux\n");
                printf("hello linux\n");
                printf("hello linux\n");
    return 0;
}

每隔1s循环打印一次hello linux,因为我们要在开发板上运行,所以我们要使用交叉编译器来编译这个c程序,注意使用的交叉编译器要和编译busybox文件系统的编译器保持一致,我们输入以下命令:

arm-none-linux-gnueabihf-gcc -o helloworld helloworld.c

如下图所示:

将编译好的helloworld可执行程序通过U盘拷贝到开发板上,如下图所示:

接着我们输入命令./helloworld来执行我们写的程序,如下图所示

可以看出,我们的helloworld这个程序是可以正常运行的,说明我们只做的文件系统的lib库拷贝的没有问题。

15.8.6 开机自启动程序测试

我们一般写好了一个app,都要让他开机自动启动,而不是手动的去执行他,那么我们要如何实现开机自启动呢?在制作文件系统的时候,我们编写了一个inittab文件,在这个文件里面有这样的一句console::askfirst:-/bin/sh代码,在我们按下回车以后会启动/bin/sh,然后配置/etc/profile文件的配置。所以我们就可以在/etc/profile文件下来实现app的开机自启动。

以前一小节的helloworld可执行程序为例,我们的helloworld在根目录下,如下图所示:

 

 然后我们打开/etc/profile文件,在文件的最下面添加以下代码,如下图所示:

cd /ctest

./helloworld &

cd /

如下图所示:

其中,cd /的意思是我们要进到根目录下,因为根目录下有我们要开机自启动的app,进到这个文件夹以后,就可以./helloworld &来运行这个可执行程序了,&表示后台运行。我们重新编译文件系统,然后烧写到开发板,如下图所示:

其中,cd /的意思是我们要进到根目录下,因为根目录下有我们要开机自启动的app,进到这个文件夹以后,就可以./helloworld &来运行这个可执行程序了,&表示后台运行。我们重新编译文件系统,然后烧写到开发板,如下图所示: 

可以看出,helloworld已经自动运行了,说明开机自启动成功

15.8.7 固定IP测试

在有的时候,我们需要固定IP,所以在制作文件系统的时候,我们加入了网络相关的配置文件eth0-setting和ifconfig-eth0。其中eth0-setting是我们网络配置信息文件,我们如果想固定IP,直接把eth0-setting这个配置文件里面的IP信息改成我们要固定的IP地址即可,我们打开etc目录下的eth0-setting,把里面的IP地址改成要固定的IP地址,如下图所示:

 

 然后我们重新编译烧写文件夹,文件系统启动成功以后,输入命令ifconfig查看IP地址是否为我们设置的IP地址,如下图所示: 

 

可以看出,系统启动后,IP地址已经固定成了我们设置的192.168.1.15地址,当然MAC地址,网关,DNS大家也可以通过这个文件来设置。

15.9 文件系统分区扩容工具的移植和使用

在我们使用过程中,会发现我们的开发板emmc或者TF卡容量为8G,但是在开发板的终端输入“df -h”命令查看,我们的文件系统可以使用的存储空间仅仅为我们烧写的rootfs.ext4文件的大小,如下图所示:

 

那么我们如何扩展我们的分区大小呢,如果是buildroot系统、Ubuntu系统、Debian系统和Yocto系统的话,系统内部已经有了对应的工具e2size2fs。我们可以跳过移植章节。如果使用我们已经提供好的最小系统和QT系统。我们默认已经移植好了,也不用进行移植,直接到使用章节部分。

15.9.1 e2size2fs工具的移植

我们的移植资料存放目录为“iTOP-STM32MP157开发板\iTOP-STM32MP157开发板网盘资料汇总\05_第三方库移植资料\02_e2size2fs文件系统扩容工具移植”。如下图所示:

 

我们在次以最小系统为例,进行演示,qt系统移植的方法相同。首先将我们在“iTOP-STM32MP157开发板\iTOP-STM32MP157开发板网盘资料汇总\03_文件系统源码和镜像\01_最小linux文件系统\02_最小linux镜像”路径下的rootfs.tar.gz文件,拷贝到ubuntu虚拟机上,并解压,解压完成如下图所示:

然后我们将“iTOP-STM32MP157开发板\iTOP-STM32MP157开发板网盘资料汇总\05_第三方库移植资料\02_e2size2fs文件系统扩容工具移植”目录下的e2size2fs.tar.gz文件拷贝到虚拟机ubuntu上,并解压,解压完成如下图所示: 

随后我们使用命令“cd e2size2fs”进入e2size2fs文件夹之中,可以看到bin文件和lib文件夹,将这两个文件夹中的文件使用命令拷贝到我们刚刚解压出的文件系统对应的bin目录和lib目录下,如下图所示: 

然后根据我们的15.7章节制作镜像,文件系统镜像制作完成之后,将对应的镜像烧写到开发板上,至此我们的e2size2fs工具就移植成功了。

15.9.2 e2size2fs工具使用

文件系统烧写成功之后,将拨码开关设置为对应的启动模式启动完成之后,如下图所示:

 

然后我们使用命令“df -h”来查看分区大小,如下图所示:

 

然后我们使用以下命令进行扩容,如下图所示:

resize2fs /dev/mmcblk1p3

 

 然后我们再使用命令“df -h”来查看分区大小,如下图所示:

 

可以看到我们的文件系统分区已经扩容了。

注意这里的扩容命令不是固定的,每个设备和系统的文件分区挂载不同,命令分类如下:

EMMC 非Yocto系统扩容命令

resize2fs /dev/mmcblk1p3

EMMC Yocto系统扩容命令

resize2fs /dev/mmcblk1p4

TF卡 非Yocto系统扩容命令

resize2fs /dev/mmcblk1p5

TF卡 Yocto系统扩容命令

resize2fs /dev/mmcblk1p6

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2121253.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

TikTok内容电商:短视频与直播带货如何重塑消费者购物决策

数字化时代&#xff0c;内容电商已经成为一种重要的商业模式。而TikTok作为全球领先的短视频平台&#xff0c;其内容电商模式正慢慢改变用户的消费习惯。TikTok Shop作为TikTok平台上的电商板块&#xff0c;也凭借其独特的短视频和直播带货模式&#xff0c;影响着消费者的购物决…

百度MEG数据开发治理平台-TDS

导读 百度MEG的上一代大数据产品存在平台分散、质量不均和易用性差等问题&#xff0c;导致开发效率低下、学习成本高&#xff0c;业务需求响应迟缓。为了解决这些问题&#xff0c;百度MEG内部开发了图灵3.0生态系统。图灵3.0覆盖了数据全生命周期&#xff0c;包括Turing Data …

AI在医学领域:HMARL首个多器官诊断AI框架

多器官疾病因其对多个器官系统的同时影响而带来了显著的挑战&#xff0c;这需要复杂和适应性的治疗策略。尽管在人工智能驱动的医疗决策支持系统方面取得了最新进展&#xff0c;但现有的解决方案通常限于单个器官系统。它们往往忽视了器官系统之间复杂的相互依赖性&#xff0c;…

搜维尔科技:SenseGlove触觉反馈数据手套为人形机器人遥操作提供精确的控制和交互方案

SenseGlove触觉反馈数据手套 使用市场上唯一一款结合力反馈、振动触觉反馈和运动捕捉以及紧凑无线设计的触觉手套来收集数据。 遥操作机器人 远程机器人向人类提供触觉反馈&#xff0c;提供更强的真实感和更高的性能&#xff0c;以及安全性和控制力。远程机器人的 SenseGlov…

适用于BLE室内定位系统的自适应路径损耗模型

自适应路径损耗模型(ADAM):提升BLE室内定位精度的创新方法 室内定位系统(IPS)在物联网、智慧城市等领域中扮演着至关重要的角色。然而,由于室内环境的复杂性(如信号多径效应、障碍物等),传统的定位方法往往面临精度不足的问题。本文介绍了一种新颖的模型——ADAM(Ad…

【毕设项目五】基于SpringBoot+VUE的公共卫生教育与宣传系统

基于SpringBootVUE的公共卫生教育与宣传系统 项目介绍 系统有两种角色&#xff1a;管理员和普通用户。 &#xff08;1&#xff09;健康教育资源 &#xff08;2&#xff09;活动管理 &#xff08;3&#xff09;反馈与建议 &#xff08;4&#xff09;用户管理 管理员实现功…

快速上手指南:在Windows系统中下载Ollama,一键启动大模型体验!

1. 下载ollama 官网下载安装&#xff1a; ollama.com 2. 拉取大模型 llama 3.1 终端中输入 ollama pull llama3.1&#xff0c;等待安装 3. 运行 llama3.1 ollama run llama3.1接下来就可以和模型对话了 退出 /bye运行 /? 查看更多聊天中命令 其他 ollama github&#x…

150Kg载重履带式无人车底盘技术详解

150Kg载重履带式无人车底盘&#xff0c;作为现代智能移动平台的重要组成部分&#xff0c;专为复杂地形作业设计&#xff0c;如野外勘探、灾难救援、农业自动化及军事侦察等领域。该底盘集成了先进的动力技术、稳定的履带行走系统、精准的遥控与控制系统以及模块化的设计理念&am…

[数据集][目标检测]河道垃圾检测数据集VOC+YOLO格式2274张8类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;2274 标注数量(xml文件个数)&#xff1a;2274 标注数量(txt文件个数)&#xff1a;2274 标注…

【安全知识】访问控制模型DAC、MAC、RBAC、ABAC有什么区别?

不同的公司或软件提供商&#xff0c;设计了无数种控制用户访问功能或资源的方法。但无论哪种设计&#xff0c;都可归到四种经典权限模型里——自主访问控制(DAC, Discretionary Access Control)、强制访问控制(MAC, Mandatory Access Control)、基于角色访问控制(RBAC, Role-ba…

SprinBoot+Vue高校就业管理系统设计与实现的设计与实现

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 application.yml3.5 SpringbootApplication3.5 Vue 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍&#xff1a;CSDN认证博客专家&#xff0c;CSDN平台Java领域优质…

C语言代码练习(第十九天)

今日练习&#xff1a; 52、有一个已经排好序的数组&#xff0c;要求输入一个数后&#xff0c;按原来排序的规律将它插入数组中 53、输出"魔方阵"。所谓魔方阵是指它的每一行&#xff0c;每一列和对角线之和均相等。 54、找出一个二维数组中的鞍点&#xff0c;即该位置…

如何判断两个ip地址在同一子网

在电脑网络中&#xff0c;了解如何判断两个IP地址是否位于同一子网是一项基础而重要的技能。这对于网络管理、故障排查以及安全策略的实施都至关重要。下面就一起跟着虎观代理小二了解一下吧。 要判断两个‌IP地址是否在同一子网&#xff0c;可以通过以下步骤进行&#xff1a;‌…

Bootstrap简介

Bootstrap 一.Bootstrap简介 什么是Bootstrap? Bootstrap 是一个用于快速开发 Web 应用程序和网站的前端框架。Bootstrap 是基于 HTML、CSS、JAVASCRIPT 的。 为什么使用Bootstrap? 快速开发&#xff1a;Bootstrap 提供了一套预设的CSS样式和JavaScript组件&#xff0c;如…

SAP B1 营销单据 - 单据字段介绍(上)

背景 营销单据&#xff0c;SAP B1 中一群神秘的单据&#xff0c;在官方说明文档中并未指明【营销单据】范围&#xff0c;却经常使用这一说法。它们结构相似&#xff0c;在 用户定义字段(UDF) 功能里统一受【营销单据】部分增加字段的影响&#xff0c;可以相互复制&#xff08;…

骨传导耳机哪个牌子最好?深度优选五款优质精品机型

身为有着多年工作经验的数码博主&#xff0c;在近期工作中发现&#xff0c;许多人因为选择了不合适的劣质骨传导耳机&#xff0c;非但没有享受到音乐与通话的便捷与舒适&#xff0c;反而出现了听力损伤的情况。在这里跟大家说一下&#xff0c;选择骨传导耳机不要盲目选择&#…

[翻译] Vue 3.5 发布

翻译自 vue 官方博客 地址&#xff1a;https://blog.vuejs.org/posts/vue-3-5 今天&#xff0c;我们很高兴地宣布 Vue 3.5 “Tengen Toppa Gurren Lagann” 发布&#xff01; 此次要版本不包含任何重大更改&#xff0c;并且包括内部改进和有用的新功能。我们将在这篇博文中介绍…

ETL数据集成丨MySQL到MySQL的数据迁移实践

前言 MySQL数据迁移至另一MySQL数据库的过程&#xff0c;不仅是数据复制或移动的操作那么简单&#xff0c;它还涉及到一系列策略性考量和技术优化&#xff0c;旨在实现数据的高效、安全传输&#xff0c;以及确保目标系统的高性能运行。其深远意义在于为企业的数字化转型提供强…

智慧水务建设的基本内容

智慧水务解决方案的主要对象客户是全国各地水务投资集团、水务局、水司、水厂、农水办,也会有少量项目涉及到住建局或城管局。解决方案通常会以具体的某个业务单位的职能工作为切入点,配合物联感知、大数据分析、人工智能等技术手段,为城市供水、乡村供水的水质安全、供水调…

纯CSS实现海浪文字效果

如图所示&#xff0c;这是一个很炫酷的文字波动效果&#xff0c;文字呈现出一个海浪波动的效果&#xff0c;这样的动画效果可以显著加强文案本身的含义。本文将解析如何使用纯CSS实现这个特效&#xff0c;基于这个动图可以分析出实现这个效果的主要功能要点&#xff1a; 整体呈…