【北京迅为】《STM32MP157开发板嵌入式开发指南》-第七十一章 制作Ubuntu文件系统

news2024/11/8 18:19:13

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接口等


七十一制作Ubuntu文件系统

作为linux开发平台,iTOP-STM32MP157也可以移植ubuntu系统.

Ubuntu Base是用于为特定需求创建自定义映像的最小rootfs。Ubuntu Base致力于为板级支持包(BSP)、受限制或集成环境中的应用创建适当的最小环境,作为应用或Linux容器(如LXC或Docker)演示映像的基础。

Ubuntu移植比较简单,ubuntu官方提供了制作好的根文件系统,我们只需要配置下相关内容即可放到板子上运行。本章我们构建的是ubuntu18.04系统。

下载好的Ubuntu –base源码,放在“iTOP-STM32MP157开发板网盘资料汇总\03_文件系统源码和镜像\05_ubuntu文件系统\01_ubuntu18_base源码”目录中如下图:

我们事先准备好了编译好的ubuntu-base的烧写镜像放在“iTOP-STM32MP157开发板网盘资料汇总\03_文件系统源码和镜像\05_ubuntu文件系统\02_制作好的镜像”目录中如下图: 

需要注意的是ubuntu文件系统在烧写之后并没有默认连接网络,需要自己使用命令“dhclient eth0”。进行连接网络。

使用命令“vim /etc/resolv.conf”,添加以下内容

nameserver 114.114.114.114

nameserver 8.8.8.8

添加完成如下图所示:

 

至此我们的ubuntu文件系统就可以上网了

71.1 Ubuntu-base获取

Ubuntu官方针对不同的CPU架构提供相应的ubuntu base根文件系统,有amd64(64位X86)、armhf、i386(32位X86)、powerpc、ppc64el等系统的。

我们可以先下载到Windows计算机内,网站如下。

Ubuntu Base 18.04.5 LTS (Bionic Beaver)

ubuntu-base-18.04.5-base-armhf.tar.gz,点击下载即可,如下图所示:

 

这个压缩包在我们的资料有提供。放在“iTOP-STM32MP157开发板网盘资料汇总\03_文件系统源码和镜像\05_ubuntu文件系统\01_ubuntu20_base源码”目录下

然后我们使用SSH工具传输到我们在虚拟机ubuntu上所建立的文件夹内,拷贝完成如下图所示:

 

71.2 解压Ubuntu-base

首先我们使用命令“mkdir raw-rootfs”,在当前目录下建立raw-rootfs文件,如下图所示

 

然后我们使用命令“sudo tar -xvpf ubuntu-base-18.04.5-base-armhf.tar.gz -C raw-rootfs/”解压系统文件(建议制作文件的小节都在普通用户下操作),解压完成之后就是根文件系统,使用命令“ls”查看目录,如下图所示: 

71.3 安装Qemu-User-Static工具

QEMU是专门模拟不同机器架构的软件,在ubuntu中对其支持良好,若需要挂载ubuntu armhf版本的文件,必须安装qemu-user-static工具。

首先Ubuntu下使用命令“sudo apt-get install qemu-user-static”安装,安装过程中按y继续。如下图所示:

 

这一步骤是将qemu-user-static安装到了pc的ubuntu上,然后使用命令

sudo cp /usr/bin/qemu-arm-static ./raw-rootfs/usr/bin/

拷贝qemu-arm-static到刚刚解压出来的目录。如下图所示:

 

71.4 设置软件源

Ubuntu安装软件是通过名apt-get从网上下载安装的。我们需要指定软件源。

为了制作成功的根文件系统能够联网,可以直接拷贝本机的dns配置文件到根文件系统的相应位置,使用命令“sudo cp /etc/resolv.conf  raw-rootfs/etc/resolv.conf”,如下图所示:

由于默认的apt源服务器在国外,导致下载速度特别慢,所以我们在这里换成国内的清华源使用命令“sudo vim ./raw-rootfs/etc/apt/sources.list”进入该文件。如下图所示: 

删除之前的内容替换为如下内容:

deb http://mirrors.ustc.edu.cn/ubuntu-ports/ bionic-updates main restricted universe multiverse

deb-src http://mirrors.ustc.edu.cn/ubuntu-ports/ bionic-updates main restricted universe multiverse

deb http://mirrors.ustc.edu.cn/ubuntu-ports/ bionic-security main restricted universe multiverse

deb-src http://mirrors.ustc.edu.cn/ubuntu-ports/ bionic-security main restricted universe multiverse

deb http://mirrors.ustc.edu.cn/ubuntu-ports/ bionic-backports main restricted universe multiverse

deb-src http://mirrors.ustc.edu.cn/ubuntu-ports/ bionic-backports main restricted universe multiverse

deb http://mirrors.ustc.edu.cn/ubuntu-ports/ bionic main universe restricted

deb-src http://mirrors.ustc.edu.cn/ubuntu-ports/ bionic main universe restricted

如下图所示:

 

保存并退出。

71.5 挂载根文件系统并Chroot

(1)首先在本机挂载刚刚下载好的文件系统,需要挂载proc, sys, dev, dev/pts等文件系统。使用命令“sudo vi mount.sh”添加挂载脚本。如下图所示:

 

挂载过程的脚本mount.sh内容如下 

#!/bin/bash
mnt() {
	echo "MOUNTING"
	sudo mount -t proc /proc ${2}proc
	sudo mount -t sysfs /sys ${2}sys
	sudo mount -o bind /dev ${2}dev
	sudo mount -o bind /dev/pts ${2}dev/pts
	sudo chroot ${2}
}
umnt() {
	echo "UNMOUNTING"
	sudo umount ${2}proc
	sudo umount ${2}sys
	sudo umount ${2}dev/pts
	sudo umount ${2}dev
}

if [ "$1" == "-m" ] && [ -n "$2" ] ;
then
	mnt $1 $2
elif [ "$1" == "-u" ] && [ -n "$2" ];
then
	umnt $1 $2
else
	echo ""
	echo "Either 1'st, 2'nd or both parameters were missing"
	echo ""
	echo "1'st parameter can be one of these: -m(mount) OR -u(umount)"
	echo "2'nd parameter is the full path of rootfs directory(with trailing '/')"
	echo ""
	echo "For example: ch-mount -m /media/sdcard/"
	echo ""
	echo 1st parameter : ${1}
	echo 2nd parameter : ${2}
fi

添加完成如下图:

保存退出

(2)然后使用命令“sudo chmod 777 mount.sh”修改脚本权限,如下图所示:

 

(3)然后使用命令“sudo ./mount.sh -m raw-rootfs/”运行挂载。如下图所示: 

此时我们可以看到,根目录切换成了当前制作ubuntu的目录。

(4)由于ubuntu base是一个最小根文件系统,很多命令、桌面以及软件都没有,因此我们需要先安装一下常用的命令和软件

首先使用命令“apt update”来进行系统源的更新,如下图所示:

 

然后使用以下命令来安装基本的软件:

apt-get install sudo language-pack-en-base ssh net-tools ethtool ifupdown iputils-ping rsyslog htop vim kmod bluez iw network-manager qt5-default openbox make gcc g++ 

如下图所示:

 

 中间可能会报以下错误,我们需要运行以下命令来解决

cd /var/lib/dpkg
mv info info.bak
mkdir info
apt-get upgrade

运行完成之后,重新执行一下安装命令,则不会进行报错

安装完成之后,如果想要安装对应的桌面可以继续执行以下命令

apt-get install xubuntu-desktop
apt-get install xfce4
apt-get install -y xdm
sudo apt-get install vnc4server
vncserver

具体的安装步骤不再截图,安装完成之后开机启动桌面管理器。需要在 /etc/sudoers 文件中赋予权限

使用“vi /etc/sudoers ”命令进入sudoers文件夹,添加以下内容,赋予topeet用户对应的权限(topeet在下一步骤中会创建

topeet    ALL=(ALL:ALL) ALL

添加完成如下图所示:

  1. 然后使用命令“passwd root”设置root用户密码,在这里我们设置成topeet。如下图所示:

 

然后使用命令“adduser topeet”,添加topeet用户,如下图所示: 

 

我们的密码设置为了“topeet”

  1. 接下来使用命令“ vi /etc/hostname”进入hostname文件夹,将“localhost.localdomain”修改为“iTOP-STM32MP157.localdomain”设置主机名称:

修改完成如下图所示:

 

  1. 设置好以后就可以退出根文件系统了,输入命令“exit”退出。如下图所示:

 

最后我们将退出以后再执行一下“sudo ./mount.sh -u raw-rootfs/”脚本取消挂载。如下图所示: 

由于我们需要自动装载一些ko驱动文件且让这些文件在开机之后自动装载,我们首先拷贝“iTOP-STM32MP157开发板网盘资料汇总\03_文件系统源码和镜像\05_ubuntu文件系统\03_ko”路径下的ko文件夹到文件系统的usr目录下,拷贝完成如下图所示: 

然后将“iTOP-STM32MP157开发板网盘资料汇总\03_文件系统源码和镜像\05_ubuntu文件系统\04_rc.local”路径下的rc.local文件拷贝到文件系统的etc目录下,拷贝完成如下图所示: 

然后使用命令“sudo chmod  777 rc.local”修改文件对应的权限,如下图所示: 

至此,ubuntu base根文件系统就已经制作好了,然后我们进行下一个章节的镜像制作了。

71.6 Ubuntu文件系统测试

71.6.1 制作Ubuntu烧写镜像

如下图所示,是制作好的ubuntu系统文件

使用命令“mkdir rootfs创建一个文件夹rootfs用来挂载之后要制作出来的 rootfs.ext4文件系统镜像如下图所示: 

然后使用命令

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

mkfs.ext4 -L rootfs rootfs.ext4

建立一个大小为2000M的ext4 磁盘(作者在这里制作的大小为2000MB,个人感觉不够用的话,可以根据自身情况来进行增大,但要注意的是制作的镜像越大,对应的烧写时间越长),如下图所示:

 

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

 mount ./rootfs.ext4 rootfs

 

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

cp -a raw-rootfs/* ./rootfs 

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

71.6.2 Ubuntu 镜像的烧写

由于 Ubuntu镜像的烧写和之前的QT系统存在区别,QT系统所使用的内核可以不用区分屏幕,而ubuntu系统不同。所以我们在烧写镜像的时候需要修改对应的内核镜像,我们以烧写ubuntu18无桌面版本的镜像为例,镜像存放路径为“iTOP-STM32MP157开发板网盘资料汇总\03_文件系统源码和镜像\05_ubuntu文件系统\02_制作好的镜像\ubuntu18无桌面镜像”,如下图所示:

 

在这里rootfs.ext4为我们要烧写文件系统的镜像。而rootfs.tar.gz为我们文件系统的源码,之后对文件系统的修改都是通过rootfs.tar.gz源码文件来修改的,最后就是我们的不同屏幕的内核镜像,进入该文件如下图所示: 

这里只有四种屏幕的内核镜像,原因是这四种屏幕所使用的触摸驱动相同,而剩下的4.3寸屏幕和10.1寸屏幕所用到的驱动不同,故以上任何一个内核镜像都可以适配。而我们用到以上四种屏幕之后,需要拷贝对应目录下的bootfs.ext4内核镜像来替换烧写文件image目录下的bootfs.ext4文件。

然后我们可以根据烧写章节进行对应的烧写

71.6.3 Ubuntu 根文件系统测试

将上一小节所制作好的文件系统镜像rootfs.ext4拷贝到image烧写目录下,覆盖掉之前的rootfs.ext4,然后进行烧写,烧写启动之后如下图所示:

登录

用户名 topeet

密码 topeet

我们在使用过程中,可以按照ubuntu正常开发流程来使用。例如运行hello world程序。

首先我们使用命令“apt-get install gcc --fix-missing”安装编译器(我们默认已经安装好了)。安装完成后以后输入“gcc -v”查看 gcc 版本。如下图所示:

 

使用“mkdir test”创建测试文件夹进入,如下图: 

然后我们使用命令“vim helloworld.c”创建c文件。 

输入如下内容: 

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

如下图:

添加完成之后保存并退出。

然后使用命令“gcc -o helloworld helloworld.c -static”编译helloworld程序。如下图所示:

 

最后我们使用命令“./helloworld”即可运行程序,如下图。 

17.6.4 Ubuntu WIFI测试

烧写完成之后启动开发板,进入登录界面,登录

用户名 topeet

密码 topeet

进入文件系统之后如下图所示:

 

然后我们使用命令“su root”,进入root用户,进入成功如下图所示: 

使用关闭以太网命令

ifconfig eth0 down

 

输入以下命令查看网络设备, 如下图所示

nmcli dev

 

由于测试用的开发板之前已经连接过wiifi了,所以可能会和大家显示的不同,输入以下命令开启 wifi

nmcli r wifi on

输入以下命令连接 wifi

nmcli dev wifi connect "wifi 名" password "密码"

作者连接公司的 wifi, 输入以下命令:

nmcli dev wifi connect "2701" password "topeet2015"

 

输入以下命令发现可以 ping 通百度,说明 WiFi 联网成功。

ping www.baidu.com

至此我们的wifi测试就完成了。

71.6.5 4.3寸屏幕校准

使用4.3寸屏幕的客户在烧写有界面的ubuntu系统后,会发现屏幕的触摸不准确,所以我们需要校准屏幕。

开机启动之后,进入登录界面,在终端我们用户名和密码都输入“topeet”即可进入系统,如下图所示:

 

然后我们使用“su root”命令输入密码“topeet”转为root用户,如下图所示: 

然后我们使用以下命令

vim /usr/share/X11/xorg.conf.d/40-libinput.con

进入40-libinput.con文件夹如下图所示:

 

我们找到关于触摸屏幕的设置信息“Identifier "libinput touchscreen catchall"”如下图所示:

在该设置信息下添加以下内容,添加完成如下图所示:

Option "CalibrationMatrix" "-1 0 1 0 -1 1 0 0 1"

 

保存退出,然后重启开发板,再次打开图形化界面会发现,触摸正常了。

71.7 使用制作好的Ubuntu文件系统

在网盘目录“iTOP-STM32MP157开发板网盘资料汇总\03_文件系统源码和镜像\05_ubuntu文件系统\02_制作好的镜像”下有制作好的文件系统镜像rootfs.ext4,和制作好的压缩文件 rootfs.tar.gz。

rootfs.ext4文件可以直接拷贝到image目录下,替换原来的文件系统镜像,然后直接进行烧写即可。

要是我们想对Ubuntu系统进行一定的 修改,则需要将rootfs.tar.gz压缩包拷贝到ubuntu虚拟机下任意目录,执行“tar -vxf rootfs.tar.gz”解压,得到的文件夹raw-rootfs就是开发板的Ubuntu-base文件系统,可以在此基础上修改文件系统,解压完成之后的文件如下图所示。

 

然后根据17.5章节进行挂载进入chroot,就可以对文件系统进行修改,如下图: 

然后根据17.6.1小节“制作Ubuntu烧写镜像”,制作可供我们烧写的镜像,然后再使用烧写工具将Ubuntu文件系统烧写进开发板。

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

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

相关文章

ZABBIX API获取监控服务器OS层信息

Zabbix 是一款强大的开源监控解决方案,能够通过其 API 接口自动化管理和获取监控数据。在这篇文章中,详细讲解如何通过 Zabbix API 批量获取服务器的系统名称、IP 地址及操作系统版本信息,并将数据保存到 CSV 文件中。本文适合对 Python 编程和 Zabbix 监控系统有一定基础的…

【数据集】【YOLO】【VOC】目标检测数据集,查找数据集,yolo目标检测算法详细实战训练步骤!

数据集列表 帮忙采集开源数据集&#xff0c;包括YOLO格式数据集和Pascal VOC格式数据集&#xff0c;含图像原文件和标注文件&#xff0c;几百张到几千张不等&#xff0c;国内外公开数据集均可。 针对目标检测&#xff0c;YOLO系列模型训练&#xff0c;分类训练等。 部分数据…

万字长文详解:SpringBoot-Mybatis源码剖析

目录 背景 传统的Mybaits开发方式&#xff0c;是通过mybatis-config.xml对框架进行全局配置&#xff0c;比如&#xff1a;一级缓存、主键生成器等。 而在SpringBoot发布后&#xff0c;通过引入 mybatis-spring-boot-starter依赖包&#xff0c;可以大大减少工作量&#xff0c;实…

[IAA系列] Image Aesthetic Assessment

Preface 本文旨在记录个人结合AI工具对IAA这个领域的一些了解&#xff0c;主要是通过论文阅读的方式加深对领域的了解。有什么问题&#xff0c;欢迎在评论区提出并讨论。 什么是IAA Image Aesthetic Assessment&#xff08;图像美学评估&#xff09;是一种评估图像在视觉上的…

leetcode 2043.简易银行系统

1.题目要求: 示例: 输入&#xff1a; ["Bank", "withdraw", "transfer", "deposit", "transfer", "withdraw"] [[[10, 100, 20, 50, 30]], [3, 10], [5, 1, 20], [5, 20], [3, 4, 15], [10, 50]] 输出&#xff…

一文了解Android SELinux

在Android系统中&#xff0c;SELinux&#xff08;Security-Enhanced Linux&#xff09;是一个增强的安全机制&#xff0c;用于对系统进行强制访问控制&#xff08;Mandatory Access Control&#xff0c;MAC&#xff09;。它限制了应用程序和进程的访问权限&#xff0c;提供了更…

Java链表及源码解析

文章目录 创建一个ILindkedList接口创建方法(模拟实现链表方法)创建MyLinkedList来实现接口的方法创建链表节点addFirst方法&#xff08;新增头部属性&#xff09;addLast方法&#xff08;新增到末尾一个属性&#xff09;remove方法&#xff08;删除指定属性&#xff09;addInd…

微服务系列四:热更新措施与配置共享

目录 前言 一、基于Nacos的管理中心整体方案 二、配置共享动态维护 2.1 分析哪些配置可拆&#xff0c;需要动态提供哪些参数 2.2 在nacos 分别创建共享配置 创建jdbc相关配置文件 创建日志相关配置文件 创建接口文档配置文件 2.3 拉取本地合并配置文件 2.3.1 拉取出现…

NoETL自动化指标平台为数据分析提质增效,驱动业务决策

直觉判断往往来源于多年的经验和专业知识&#xff0c;能够在复杂和不确定的环境中快速做出决策反应。但这种方式普遍存在主观偏见&#xff0c;缺乏合理的科学依据&#xff0c;无法全面、客观、精准地评估和识别市场趋势与用户需求&#xff0c;从而造成决策失误&#xff0c;给业…

使用亚马逊 S3 连接器为 PyTorch 和 MinIO 创建地图式数据集

在深入研究 Amazon 的 PyTorch S3 连接器之前&#xff0c;有必要介绍一下它要解决的问题。许多 AI 模型需要使用无法放入内存的数据进行训练。此外&#xff0c;许多为计算机视觉和生成式 AI 构建的真正有趣的模型使用的数据甚至无法容纳在单个服务器附带的磁盘驱动器上。解决存…

基于MATLAB的实现垃圾分类Matlab源码

⼀、垃圾分类 如何通过垃圾分类管理&#xff0c;最⼤限度地实现垃圾资源利⽤&#xff0c;减少垃圾处置量&#xff0c;改善⽣存环境质量&#xff0c;是当前世界各国共同关注的迫切问题之⼀。根据国家制定的统⼀标准&#xff0c;现在⽣活垃圾被⼴泛分为四类&#xff0c;分别是可…

硬件基础10 逻辑门电路——CMOS

目录 一、门电路类型 二、CMOS逻辑门 1、CMOS基础 2、MOS管开关电路 &#xff08;1&#xff09;、基础理论分析 &#xff08;2&#xff09;、开关动态特性 3、CMOS反相器 4、与非、或非门 三、逻辑门的不同输出结构与参数 1、CMOS的保护和缓冲 2、漏极开路与三态输出…

新手散户如何避免被割?有量化策略适应暴涨暴跌行情吗?|附代码

这是邢不行第 124 期量化小讲堂的分享 作者 | 邢不行 大A今年上半年的行情较为坎坷&#xff0c;市场持续下跌&#xff0c;导致诸多投资者风格大变&#xff0c;从倾向于高风险的进攻策略转为低风险的防御策略&#xff0c;尤以高股息策略和杠铃策略最为火爆。 本文给大家介绍一…

数据链路层Mac协议与ARP协议

Mac帧 ​ ​ 如何将有效载荷和报头分离&#xff1f; 根据固定大小 ​​ 报头固定大小&#xff0c;按报头大小分离 如何分用&#xff1f; ​​​​ 类型为0800&#xff0c;代表为IP报文&#xff0c;应该交给网络层IP协议 目的地址 原地址为Mac地址 局域网通信 ​ 局…

轮椅车、医用病床等康复类器具检测设备的介绍

康复类器具检测设备是指用于检测、评估和测试康复类器具的设备。康复类器具包括轮椅、助行器、假肢、矫形器等。这些器具在使用前需要经过检测和评估以确保其满足质量、性能、安全和有效性的要求。 康复类器具的测试项目及其设备主要包括以下几种&#xff1a; 1、力学测试设…

WiFi一直获取不到IP地址是怎么回事?

在当今这个信息化时代&#xff0c;WiFi已成为我们日常生活中不可或缺的一部分。无论是家庭、办公室还是公共场所&#xff0c;WiFi都为我们提供了便捷的无线互联网接入。然而&#xff0c;有时我们可能会遇到WiFi连接后无法获取IP地址的问题&#xff0c;这不仅影响了我们的网络使…

基于SSM+VUE儿童接种疫苗预约管理系统JAVA|VUE|Springboot计算机毕业设计源代码+数据库+LW文档+开题报告+答辩稿+部署教+代码讲解

源代码数据库LW文档&#xff08;1万字以上&#xff09;开题报告答辩稿 部署教程代码讲解代码时间修改教程 一、开发工具、运行环境、开发技术 开发工具 1、操作系统&#xff1a;Window操作系统 2、开发工具&#xff1a;IntelliJ IDEA或者Eclipse 3、数据库存储&#xff1a…

城镇住房保障:SpringBoot系统架构解析

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常…

软件测试—功能测试详解

&#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 一、测试项目启动与研读需求文档 &#xff08;一&#xff09; 组建测试团队 1、测试团队中的角色 2、测试团队的基本责任 尽早地发现软件程序、系统或产…

第十五届蓝桥杯C/C++B组题解——数字接龙

题目描述 小蓝最近迷上了一款名为《数字接龙》的迷宫游戏&#xff0c;游戏在一个大小为N N 的格子棋盘上展开&#xff0c;其中每一个格子处都有着一个 0 . . . K − 1 之间的整数。游戏规则如下&#xff1a; 从左上角 (0, 0) 处出发&#xff0c;目标是到达右下角 (N − 1, N …