busybox制作根文件系统2

上篇内容使用busybox制作好了根文件系统,接下来需要进行一些测试和功能的完善!

根文件系统的测试

测试根文件系统的时候不是直接烧写到EMMC里面,这样测试效率太低了,Ubuntu的rootfs目录已经保存了根文件系统,只需要在开发板上通过nfs挂载Ubuntu下的rootfs目录即可。也就是说,根文件系统一直在Ubuntu下,开发板通过网络在使用这个根文件系统,这样方便开发调试。

采用挂载网络根文件系统,使用NFS。要求:

1、linux内核网络驱动要工作正常。

2、设置uboot的bootargs,也就是linux内核的命令行参数。

从ubuntu的tftp里面加载我们前面移植的uboot、zImage和dtb,设置bootcmd。

前提设置

在开发板上设置网络相关变量确保网络正常使用,下面是我根据Ubuntu上IP和开发板IP的设置参数。

setenv serverip '192.168.3.200'
setenv gatewayip '192.168.3.254'
setenv netmask '255.255.255.0'
setenv ipaddr '192.168.3.167'
setenv ethaddr '32:34:46:78:9A:DC'
saveenv

设置使用tftp服务(tftp服务的搭建看这里)加载镜像zImage和dtb。将所要用到的zImage 和imx6ull-14x14-evk-emmc.dtb文件放到Ubuntu上tftp服务的共享目录中。

setenv bootcmd 'tftp 80800000 zImage;tftp 83000000 imx6ull-14x14-evk-emmc.dtb;bootz 80800000 - 83000000'

保存环境变量

saveenv

image-20231027112217875

设置ubuntu上NFS服务支持低版本运行

在Ubuntu上,输入下面命令打开/etc/default/nfs-kernel-server文件

vim /etc/default/nfs-kernel-server

Ubuntu18的 nfs默认只支持3和4版本的nfs,uboot默认使用的是版本2,所以直接修改Ubuntu上的nfs配置,否则nfs根文件系统无法挂载。然后在最后面添加下面这一行:

RPCNFSDOPTS="--nfs-version 2,3,4 --debug --syslog"

image-20231027104209579

添加完成以后保存退出,输入如下命令重启NFS服务即可:

sudo /etc/init.d/nfs-kernel-server restart

image-20231027104407148

bootargs环境变量设置

接下来要启动开发板,在mobaxterm上操作了。

主要是设置里面的root值,将root的值改为NFS挂载即可。在Linux内核源码里面有相应的文档讲解如何设置,文档为内核目录下Documentation/filesystems/nfs/ nfsroot.txt,格式如下:

root=/dev/nfs nfsroot=[<server-ip>:]<root-dir>[,<nfs-options>] ip=<client-ip>:<server-ip>:<gw-ip>:<netmask>:<hostname>:<device>:<autoconf>:<dns0-ip>:<dns1-ip>

:服务器IP地址,就是Ubuntu的IP地址。

:根文件系统的存放路径,这里我的是/home/workdir/rootfs

:NFS的其他可选选项,一般不设置。

:客户端IP地址,即开发板的IP地址, 此地址一定要和Ubuntu的IP在同一个网段且没有被其他设备使用。

:服务器IP地址,Ubuntu的IP地址。

:网关地址

:子网掩码,教程中就是255.255.255.0。

:客户机的名字,一般不设置,此值可以空着。

:设备名,也就是网卡名,一般是eth0,eth1….,正点原子STM32MP157开发板
只有一个网口,名字为eth0。

:自动配置,一般不使用,所以设置为off。

:DNS0服务器IP地址,不使用。

:DNS1服务器IP地址,不使用。

根据上面的格式,bootargs环境变量的root值如下:

root=/dev/nfs nfsroot=192.168.3.200:/home/workdir/rootfs,proto=tcp rw ip=192.168.3.167:192.168.3.200:192.168.3.1:255.255.255.0::eth0:off

proto=tcp表示使用TCP协议,rw表示nfs挂载的根文件系统为可读可写。

通过上面的了解,我们设置参数使用的命令如下:

启动开发板,进入uboot命令行模式,然后重新设置bootargs环境变量,命令如下:

setenv bootargs 'console=ttymxc0,115200 rw root=/dev/nfs nfsroot=192.168.3.200:/home/workdir/rootfs,proto=tcp ip=192.168.3.167:192.168.3.200:192.168.3.1:255.255.255.0::eth0:off'

image-20231027112331458

将上述的环境变量设置好后,要注意保存!!

saveenv

查看环境变量

查看设置后的环境变量,是否正确设置。

print

image-20231027112454646

确保上面的没有问题后,接下来输入boot命令开始启动

boot

如下图刚开始启动:

image-20231027113022727

最终画面如下图:

可以看到根文件系统已经挂载成功了。

image-20231027122156053

完善根文件系统

创建/etc/init.d/rcS文件

can't run '/etc/init.d/rcS': No such file or directory 提示很简单,说是无法运行/etc/init.d/rcS这个文件,因为这个文件不存在。如下图所示:

image-20231027140426472

在ubunru下,根文件系统的/etc/init.d/目录下创建rcS文件,然后在rcS中输入如下所示内容:

#!/bin/sh PATH=/sbin:/bin:/usr/sbin:/usr/bin:$PATH 
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/lib:/usr/lib 
export PATH LD_LIBRARY_PATH mount -a 
mkdir /dev/pts 
mount -t devpts devpts /dev/pts echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s

对上述参数的简单理解如下:

PATH环境变量保存着可执行文件可能存在的目录,这样在执行一些命令或者可执行文件的时候就不会提示找不到文件这样的错误。LD_LIBRARY_PATH环境变量保存着库文件所在的目录。使用export来导出上面这些环境变量,相当于声明一些“全局变量”。第7行,使用mount命令来挂载所有的文件系统,这些文件系统由文件/etc/fstab来指定,所以一会还要创建/etc/fstab文件。第8和9行,创建目录/dev/pts,然后将devpts挂载到/dev/pts目录中。第11和12行,使用mdev来管理热插拔设备,通过这两行,Linux内核就可以在/dev目录下自动创建设备节点。关于mdev的详细内容可以参考busybox中的docs/mdev.txt文档。

示例代码的rcS文件内容是最精简的,如果去看Ubuntu或者其他大型Linux操作系统中的rcS文件,就会发现其非常复杂。因为是初次学习,所以不用搞这么复杂的,而且这么复杂的rcS文件也是借助其他工具创建的,比如buildroot等。

创建好文件/etc/init.d/rcS以后一定要给其可执行权限!使用如下命令给予权限:

chmod 777 rcS

image-20231027135615191

设置好以后就重新启动Linux内核,启动以后如下图所示:

image-20231027135903332

从上图可以看到,提示找不到/etc/fstab文件,还有一些其他的错误,先把/etc/fstab这个错误解决了。前面说了mount -a挂载所有根文件系统的时候需要读取/etc/fstab,因为/etc/fstab里面定义了该挂载哪些文件,接下来就是创建/etc/fstab文件。

创建/etc/fstab文件

在rootfs中创建/etc/fstab文件,fstab在Linux开机以后自动配置哪些需要自动挂载的分区,格式如下:


:要挂载的特殊的设备,也可以是块设备,比如/dev/sda等等。

:挂载点。

:文件系统类型,比如ext2、ext3、proc、romfs、tmpfs等等。

:挂载选项,在Ubuntu中输入“man mount”命令可以查看具体的选项。一般使用defaults,也就是默认选项defaults包含了rw、suid、dev、exec、auto、nouser和async。

:为1的话表示允许备份,为0不备份,一般不备份,因此设置为0。

:磁盘检查设置,为0表示不检查。根目录‘/’设置为1,其他的都不能设置为1,其他的分区从2开始。一般不在fstab中挂载根目录,因此这里一般设置为0。

按照上述格式,/etc/fstab文件中输入如下内容:

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

操作如下图

image-20231102111807032

fstab文件创建完成后重新启动Linux,结果如下图所示:

image-20231027141228914

从上图可以看出,在运行/etc/init.d/rcS脚本第11行出现问题,提示不能创建“/proc/sys/kernel/hotplug”,这个是Linux内核配置问题,最后在讲解怎么处理。接下来还需要创建一个文件/etc/inittab。

创建/etc/inittab文件

init程序会读取/etc/inittab这个文件,inittab由若干条指令组成。每条指令的结构都是一样的,以“:”分隔的4个段组成,格式如下:

:::
:每个指令的标识符,不能重复。但是对于busybox的init来说, ,有着特殊意义。对于busybox而言用来指定启动进程的控制tty,一般将串口或LCD屏幕设置为控制tty。

:对busybox来说此项完全没用,所以空着。

:动作,用于指定可能用到的动作。busybox支持的动作如下图所示:

:具体的动作,比如程序、脚本或命令等。

/etc/inittab内容:

#etc/inittab 
::sysinit:/etc/init.d/rcS 
console::askfirst:-/bin/sh 
::restart:/sbin/init 
::ctrlaltdel:/sbin/reboot 
::shutdown:/bin/umount -a -r
::shutdown:/sbin/swapoff -a
第2行,系统启动以后运行/etc/init.d/rcS这个脚本文件。第3行,将console作为控制台终端,也就是ttySTM0。第4行,重启的话运行/sbin/init。第5行,按下ctrl+alt+del组合键的话就运行/sbin/reboot,看来ctrl+alt+del组合键用于重
启系统。第6行,关机的时候执行/bin/umount,也就是卸载各个文件系统。第7行,关机的时候执行/sbin/swapoff,也就是关闭交换分区。

操作如下图:

image-20231027142851474

/etc/inittab文件创建好重启开发板即可。根文件系统要创建的文件就已经全部完成了!!

重启开发板,如下图:

image-20231027143038956

从上图可以看出,没有任何错误提示,说明根文件系统工作已经正常了。

根文件系统其他功能测试

软件运行测试

使用Linux系统的目的就是运行自己的软件,编译的应用软件一般都使用动态库,使用动态库的话应用软件体积就很小,但是得提供库文件,库文件已经添加到了根文件系统中。可以编写一个小小的测试软件来测试一下库文件是否工作正常,在根文件系统下创建一个名为“drivers”的文件夹,以后学习 Linux驱动的时候就把所有的实验文件放到这个文件夹里面。

在Ubuntu下使用vim编辑器新建一个hello.c文件,输入如下内容:

#include <stdio.h> int main(void) 
{ while(1){ printf("hello world!\r\n"); sleep(2); } return 0; 
}

用交叉编译器去编译,也就是使用arm-linux-gnueabihf-gcc编译,命令如下:

arm-linux-gnueabihf-gcc hello.c -o hello

使用arm-linux-gnueabi-gcc将hello.c编译为hello可执行文件。image-20231027144102402

在开发板上执行 hello

程序成功运行了,结果如下图所示:

image-20231027144251738

可以看出, hello这个软件运行正常,说明根文件系统中的共享库是没问题的,要想终止hello的运行,按下“ctrl+c”组合键即可。

中文字符测试

在ubuntu中向在rootfs目录新建一个名为chinese.txt的文件在里面输入中文,然后在MobaXterm下查看这个文件里的内容。结果如下图所示:

image-20231027144712498

从上图可以看出文件里中文内容显示正确,而且中文路径也完全正常,说明根文件系统已经完美支持中文了!

开机自启动测试

在之前测试hello软件的时候都是等Linux启动进入根文件系统以后手动输入命令“./hello”来完成的。一般做好产品以后都是需要开机自动启动相应的软件,本节就以hello这个软件为例,讲解一下如何实现开机自启动。前面说过,进入根文件系统的时候会执行/etc/init.d/rcS这个shell文件,因此可以在这个脚本里面添加要执行的shell命令。添加完成以后的/etc/init.d/rcS文件内容如下:

image-20231027151747674

重启开发板,结果如下图所示:

image-20231027151859680

从上图可看出,hello开机自动运行,证明开机自启动成功。

外网连接测试

这里说的外网是百度、淘宝等这些网站的测试。也
就是说看看开发板能不能上网,能不能和局域网外的这些网站进行通信。测试方法很简单,就是通过ping命令来ping一下百度的官网:www.baidu.com。输入如下命令:

ping www.baidu.com

结果是失败的,提示“bad address”,如下图:

image-20231027152111572

出现这个错误提示是因为 www.baidu.com的地址解析失败了,并没有解析出其对应的IP地址。需要配置域名解析服务器的IP地址,一般域名解析地址可以设置为所处网络的网关地址,比如192.168.1.1。 也可以设置为114.114.1144.114,这个是运营商的域名解析服务器地址。

如何解决

在rootfs中的/etc目录下创建resolv.conf,然后在里面输入如下内容:

nameserver 114.114.114.114 
nameserver 192.168.3.1

设置很简单,nameserver表示这是个域名服务器,设置了两个域名服务器地址:114.114.114.114和192.168.1.1,也可以改为其他的域名服务器试试。

image-20231027153305244

将上述文件,保存后退出。重启开发板!重启以后重新ping一下百度官网,成功ping通。结果如下图所示:

image-20231027152812175

可以看出ping百度官网成功了!域名也成功的解析了,至此!根文件系统就彻底的制作完成。

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

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

相关文章

向量数据库,展望AGI时代

无论是向量数据库&#xff0c;还是大模型&#xff0c;归根结底&#xff0c;大家在追捧它时的心态&#xff0c;焦虑大于需求。 向量数据库的热潮&#xff0c;在一定程度上“外化”了人们的焦虑。 但这并不能否定向量数据库的实际价值&#xff0c;甚至更长远来看&#xff0c;向…

RedisTemplate使用详解

RedisTemplate介绍StringRedisTemplate介绍RedisConnectionFactory介绍RedisConnectionFactory源码解析 RedisOperations介绍RedisOperations源码解析 RedisTemplate使用连接池配置RedisTemplate连接池连接池配置 RedisTemplate应用场景RedisTemplate主要特点RedisTemplate使用…

redis运维(十六) 有序集合

一 有序集合 把握一点&#xff1a; 各种redis 命令都提供各种语言对应的API 接口,后续API是关键 ① 概念 1、sorted set --> 有序集合2、redis有序集合也是集合类型的一部分&#xff0c;所以它保留了集合中元素不能重复的特性3、但是不同的是,有序集合给每个元素多设置…

转型做视频了,博客就是稿子,继续坚持写博客,同时发布视频,能写博客说明思路清晰了,能再讲明白,理解就更透彻了,紧跟上时代发展。

1&#xff0c;今天特别记录下&#xff0c;B站给开通了《合集》功能 最近使用视频制作了几个视频。播放量还不错&#xff0c;最好的已经到了 2.6K了。 然后粉丝也涨到了 200个。 添加链接描述 紧跟时代&#xff1a;从写博客到录视频&#xff0c;粉丝大涨&#xff0c;突破200个&…

接口自动化测试 —— 工具、请求与响应

一、工具&#xff1a; 1.工具介绍 postman &#xff1a;很主流的API测试工具&#xff0c;也是工作里面使用最广泛的研发工具。 JMeter&#xff1a; ApiPost&#xff1a; 2.安装postman&#xff1a; 安装好直接打开&#xff0c;不用注册。 二、通信模式&#xff1a; 1、…

【Java 进阶篇】从Java对象到JSON:Jackson的魔法之旅

在现代的软件开发中&#xff0c;处理数据的能力是至关重要的。而当我们谈及数据格式时&#xff0c;JSON&#xff08;JavaScript Object Notation&#xff09;通常是首选。为了在Java中轻松地将对象转换为JSON&#xff0c;我们需要一种强大而灵活的工具。这时&#xff0c;Jackso…

【Java 进阶篇】Redis:打开缓存之门

介绍 Redis&#xff08;Remote Dictionary Server&#xff09;是一个高性能的键值对存储系统&#xff0c;被广泛用作缓存、消息中间件和数据库。它以其快速的读写能力、支持多种数据结构和丰富的功能而闻名。在这篇博客中&#xff0c;我们将深入了解Redis的概念、安装以及基本…

MQTT协议消息代理服务远程连接

目录 1. Linux 搭建 Mosquitto 2. Linux 安装Cpolar 3. 创建MQTT服务公网连接地址 4. 客户端远程连接MQTT服务 5. 代码调用MQTT服务 6. 固定连接TCP公网地址 7. 固定地址连接测试 Mosquitto是一个开源的消息代理&#xff0c;它实现了MQTT协议版本3.1和3.1.1。它可以在不…

第二十章:多线程

进程 线程的特点 1.进程是资源分配的最小单位&#xff0c;线程是最小的执行单位 2.一个进程可以有多个线程 3.线程共享进程资源 package twentyth; public class ThreadTest extends Thread { public void run() { for (int i 1; i < 10; i) {//继承重…

Unity开发之C#基础-File文件读取

前言 今天我们将要讲解到c#中 对于文件的读写是怎样的 那么没接触过特别系统编程小伙伴们应该会有一个疑问 这跟文件有什么关系呢&#xff1f; 我们这样来理解 首先 大家对电脑或多或少都应该有不少的了解吧 那么我们这些软件 都是通过变成一个一个文件保存在电脑中 我们才可以…

Spring Boot创建和使用(重要)

Spring的诞生是为了简化Java程序开发的&#xff01; Spring Boot的诞生是为了简化Spring程序开发的&#xff01; Spring Boot就是Spring框架的脚手架&#xff0c;为了快速开发Spring框架而诞生的&#xff01;&#xff01; Spring Boot的优点&#xff1a; 快速集成框架&#x…

2023年G2电站锅炉司炉证考试题库及G2电站锅炉司炉试题解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2023年G2电站锅炉司炉证考试题库及G2电站锅炉司炉试题解析是安全生产模拟考试一点通结合&#xff08;安监局&#xff09;特种作业人员操作证考试大纲和&#xff08;质检局&#xff09;特种设备作业人员上岗证考试大纲…

MySQL 事务的底层原理和 MVCC(一)

在事务的实现机制上&#xff0c;MySQL 采用的是 WAL&#xff08;Write-ahead logging&#xff0c;预写式日志&#xff09;机制来实现的。 在使用 WAL 的系统中&#xff0c;所有的修改都先被写入到日志中&#xff0c;然后再被应用到系统中。通常包含 redo 和 undo 两部分信息。 …

【Java开发】 Springboot集成Mybatis-Flex

1 Mybatis-Flex 介绍 1.1简介 Mybatis-Flex 是一个优雅的 Mybatis 增强框架&#xff0c;它非常轻量、同时拥有极高的性能与灵活性。我们可以轻松的使用 Mybaits-Flex 链接任何数据库&#xff0c;其内置的 QueryWrapper 亮点帮助我们极大的减少了 SQL 编写的工作的同时&#xff…

cocos2dx ​​Animate3D(二)

Twirl 扭曲旋转特效 // 持续时间(时间过后不会回到原来的样子) // 整个屏幕被分成几行几列 // 扭曲中心位置 // 扭曲的数量 // 振幅 static Twirl* create(float duration, const Size& gridSize, const Vec2& position, unsigned int twirls, float amplitude)…

基于springboot实现摄影跟拍预定管理系统【项目源码+论文说明】计算机毕业设计

基于springboot实现摄影跟拍预定管理系统演示 摘要 首先,论文一开始便是清楚的论述了系统的研究内容。其次,剖析系统需求分析,弄明白“做什么”,分析包括业务分析和业务流程的分析以及用例分析,更进一步明确系统的需求。然后在明白了系统的需求基础上需要进一步地设计系统,主要…

【2018年数据结构真题】

方法一 给定一个含n(n>1)个整数的数组&#xff0c;请设计一个在时间上尽可能高效的算法&#xff0c;找出数组中未出现的最小正整数。例如&#xff0c;数组{-5&#xff0c;3&#xff0c;2&#xff0c;3}中未出现的最小正整数是1&#xff1b;数组{1&#xff0c;2&#xff0c;…

AIGC变革BI行业,永洪发布vividime全球化品牌

大数据产业创新服务媒体 ——聚焦数据 改变商业 国内BI商业智能市场&#xff0c;一直有着“内永洪&#xff0c;外Tableau”的说法。成立于2012年的永洪科技经过十多年的发展&#xff0c;早已崛起为国内大数据行业的一支劲旅。 ChatGPT火爆出圈之后&#xff0c;AIGC快速渗透&am…

【C++】vector的介绍与使用

&#x1f9d1;‍&#x1f393;个人主页&#xff1a;简 料 &#x1f3c6;所属专栏&#xff1a;C &#x1f3c6;个人社区&#xff1a;越努力越幸运社区 &#x1f3c6;简 介&#xff1a;简料简料&#xff0c;简单有料~在校大学生一枚&#xff0c;专注C/C/GO的干货分…

【Java 进阶篇】Redis 数据结构:轻松驾驭多样性

引言 Redis是一款强大的键值对存储系统&#xff0c;其数据结构的多样性是其引以为傲的特点之一。在这篇博客中&#xff0c;我们将深入探讨Redis的主要数据结构&#xff0c;包括字符串、哈希表、列表、集合和有序集合&#xff0c;并通过实例代码演示它们的用法。 1. 字符串&am…