stm32mp1 linux最小根文件系统制作教程(stm32mp157开发板实操)

Easter79
• 阅读 623

作者:华清远见研发中心,志浩老师。

有用户反馈,关于stm32mp1,ST官方提供的系统太庞大,开机速度慢,占用空间大。基于这个问题,我们整理了Linux5.4.31最小根文件系统的镜像及对应教程,希望对stm32mp157开发板使用的用户有所帮助。

1. 根文件系统开发实验

1.1 实验目的

熟悉Linux 文件系统目录结构,创建自己的文件系统,通过NFS 方式测试。

1.2 实验平台

华清远见开发环境,FS-MP1A平台;

1.3 实验步骤

1 . 根文件系统制作

可以从http://busybox.net/downloads/网站下载busybox-1.29.3源码用于制作Linux文件系统,为了方便,已将源码放进了光盘。

安装交叉编译工具链。

linux@ubuntu:$ sudo apt-get install gcc-arm-linux-gnueabihf
linux@ubuntu:$ sudo apt-get install g++-arm-linux-gnueabihf

验证开发工具是否安装正确,显示版本信息如下图所示。

linux@ubuntu:$ arm-linux-gnueabihf-gcc -v

stm32mp1 linux最小根文件系统制作教程(stm32mp157开发板实操)

建立源码目录

linux@ubuntu:$ cd ~
linux@ubuntu:$ mkdir -p fs-mp1a

将【华清远见-FS-MP1A开发资料\02-程序源码\04-Linux系统移植\01-官方源码】下的busybox-1.29.3.tar.bz2拷贝至该目录。

linux@ubuntu:$ tar xvf busybox-1.29.3.tar.bz2             //解压源码
linux@ubuntu:$ cd busybox-1.29.3

配置busybox 源码:

将顶层目录下的Makefile文件中的CROSS_COMPILE字段修改为“arm-linux-gnueabihf-”

stm32mp1 linux最小根文件系统制作教程(stm32mp157开发板实操)

可以使用如下命令配置源码

linux@ubuntu:$ make menuconfig

stm32mp1 linux最小根文件系统制作教程(stm32mp157开发板实操)

编译源码:

linux@ubuntu:$ make

安装:

busybox 默认安装路径为源码目录下的_install

linux@ubuntu:$ make install

进入安装目录:

linux@ubuntu:$ cd  _install
linux@ubuntu:$ ls
bin  linuxrc  sbin   usr

创建其他需要的目录:

linux@ubuntu:$ mkdir   dev   etc  mnt   proc   var  tmp   sys   root

添加库:

将工具链中的库拷贝到_install 目录下:

linux@ubuntu:$ cp /usr/arm-linux-gnueabihf/lib/ . -a

删除静态库:

linux@ubuntu:$ rm lib/*.a    

添加系统启动文件:

在etc下添加文件inittab,文件内容如下:

注意:修改文件均为_install目录下

etc/inittab

#this is run first except when booting in single-user mode.
::sysinit:/etc/init.d/rcS
# /bin/sh invocations on selected ttys
# start an "askfirst" shell on the console (whatever that may be)
::askfirst:-/bin/sh
# stuff to do when restarting the init process
::restart:/sbin/init
# stuff to do before rebooting
::ctrlaltdel:/sbin/reboot

在etc下添加文件fstab,文件内容如下:

/etc/fstab

#device    mount-point    type    options    dump    fsck    order
proc     /proc        proc     defaults    0        0
tmpfs    /tmp        tmpfs    defaults    0        0
sysfs    /sys        sysfs    defaults    0        0
tmpfs    /dev        tmpfs    defaults    0        0

这里我们挂载的文件系统有三个proc、sysfs和tmpfs。

回到创建的文件系统处,在etc下创建init.d目录,并在init.d下创建rcS文件,rcS 文件内容为:

etc/init.d/rcS

#!/bin/sh
# This is the first script called by init process
/bin/mount   -a
/sbin/mdev   -s

为rcS 添加可执行权限:

linux@ubuntu:$ chmod a+x init.d/rcS

在etc 下添加profile 文件,文件内容为:

etc/profile

#!/bin/sh
export HOSTNAME=fsmp1a
export USER=root
export HOME=root
export PS1="[$USER@$HOSTNAME \W]\# "
PATH=/bin:/sbin:/usr/bin:/usr/sbin
LD_LIBRARY_PATH=/lib:/usr/lib:$LD_LIBRARY_PATH
export PATH   LD_LIBRARY_PATH

2 . NFS 测试

删除原先的/source/rootfs:

linux@ubuntu:$ sudo rm -rf /source/rootfs

将我们新建的根文件系统拷贝到/source/rootfs目录下

linux@ubuntu:$ sudo mkdir /source/rootfs
linux@ubuntu:$ sudo cp _install/* /source/rootfs -a

修改ubuntu主机中的/tftpboot/pxelinux.cfg/01-00-80-e1-42-60-17文件添加nfs启动选项

# Generic Distro Configuration file generated by OpenEmbedded
menu title Select the boot mode
MENU BACKGROUND /splash.bmp
TIMEOUT 20
DEFAULT stm32mp157a-fsmp1a-emmc
LABEL stm32mp157a-fsmp1a-emmc
    KERNEL /uImage
    FDT /stm32mp157a-fsmp1a.dtb
    APPEND root=/dev/mmcblk2p4 rootwait rw console=ttySTM0,115200
LABEL stm32mp157a-fsmp1a-nfs
    KERNEL /uImage
    FDT /stm32mp157a-fsmp1a.dtb
    APPEND root=/dev/nfs nfsroot=192.168.11.251:/source/rootfs ip=dhcp rootwait rw earlyprintk console=ttySTM0,115200

上述配置中共有两个启动项分别为stm32mp157a-fsmp1a-emmc、stm32mp157a-fsmp1a-nfs。其中stm32mp157a-fsmp1a-emmc选项为正常启动配置;stm32mp157a-fsmp1a-nfs为nfs挂载方式,这里需要注意的是nfsroot=192.168.11.251部分的ip需要根据ubunut主机的实际ip填写。

重新启动开发板,选择nfs启动选项。

stm32mp1 linux最小根文件系统制作教程(stm32mp157开发板实操)

查看是否能够正常挂载,功能是否正常

stm32mp1 linux最小根文件系统制作教程(stm32mp157开发板实操)

2. 制作根文件系统镜像

上小节已经制作好了根文件系统,并且从NFS已经成功启动。本小节将制作一个根文件系统镜像用于后续的固化和烧录。

2. 制作ext4格式的文件系统

在ubuntu中制作一个EXT4空文件, 此处设则为300M大小,由于安装的软件较多时,文件系统会很大,用户可以根据情况自行更改。

linux@ubuntu:$ dd if=/dev/zero of= fsmp1x_rootfs.ext4 bs=300M count=1
linux@ubuntu:$ sudo mkfs.ext4 fsmp1x_rootf.ext4

2. 复制文件系统

将上小节我们移植完成的跟文件系统中所的文件夹都fuubuntu18_rootfs.ext4文件挂载到临时目录/mnt,并拷贝文件系统。

linux@ubuntu:$ sudo mount -o loop fsmp1x_rootf.ext4 /mnt

如果我们已经制作了前面的文件系统则直接拷贝/source/rootfs/下的文件即可

linux@ubuntu:$ sudo cp /source/rootfs/* /mnt -a

如果我们之前没有编译制作文件系统也可以将【华清远见-FS-MP1A开发资料\02-程序源码\04-Linux系统移植\02-移植好的系统镜像文件】下的rootfs.tar.xz文件导入到虚拟机中,使用我们已经移植好的跟文件系统进行制作。

linux@ubuntu:$ sudo tar -xvf rootfs.tar.xz -C /mnt

3. 卸载挂载的fsmp1x_rootf.ext4文件

linux@ubuntu:$ sudo umount /mnt

此时跟文件系统镜像就制作完成了。可以将这个文件导出到windos下烧录到开发板中运行。

4. 修改烧录文件

如果想要烧录到开发板那么就需要修改,烧写文件。这里以eMMC启动的trusted镜像为例来说明。其它启动的修改方法也类似。

修改flashlayout_fs-mp1a-weston\trusted下的FlashLayout_sdcard_stm32mp157a-fsmp1a-trusted.tsv文件将Id为0x23的rootfs分区镜像名由fs-mp1a-weston-openstlinux-weston-fsmp1a.ext4修改为fsmp1x_rootf.ext4。按照《STM32CubeProgrammer烧写方式》章节进行烧录即可。

stm32mp1 linux最小根文件系统制作教程(stm32mp157开发板实操)

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
11个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这
Easter79
Easter79
Lv1
今生可爱与温柔,每一样都不能少。
文章
2.8k
粉丝
5
获赞
1.2k