[原创] STM32MP157A-DK1测评 - 5、10分钟简化制作Linux Distro

freebsder   2020-4-7 21:25 楼主

简化不是简单,简化只是简化Linux系统的制作过程,制作的目标系统是产品级系统。

STyocto制作工具发布OpenSTLinux系统,这个系统在ST的wiki上有明确的制作过程

使用yocto做系统是嵌入式应用里面比较流行也比较完备的制作方法,然而它有3个问题。第1个问题是yocto的复杂性。这个东西本身使用python脚本来控制制作过程,定制各种组件的编译条件,解决依赖等等。对于这种自成体系的东西,需要消耗大量精力对它的组成,语法,流程等熟悉之后才能取得比较理想的定制效果。第2个问题是recipes菜单管理的碎片化。它没有一个统一的中心仓库管理recipes,官方提供的仓库远远不能满足定制化需求,因此目前来说芯片厂自己提供很多菜单满足自己的需求。第3个问题最致命,基于众所周知的原因,我们通过网络获取外部资源总是无法访问或奇慢无比,甚至使用技术手段加持后还是无法满足网络资源的获取。

因此本人借评测STM32MP157A-DK1的机会给大家介绍一种简化的制作过程。

为什么要自己做一个。1:部分定制,2:过程简单,做系统10分钟,系统配置10分钟,下面看着图多,其实命令很少,主要是大家喜欢图,3:略过make源代码的制作速度快,主机空间占用小,4:包和源代码下载快,5:标准Debian系统,这点很重要,在开发阶段的排错和产品阶段的补丁都可以使用最新的社区成果。缺点:1:定制深度不及Yocto,2:系统空间占用比Yocto定制的系统大。

 

  • OpenSTLinux

首先要说明的是OpenSTLinux是一个基于Debian的发行版,它包括Debian包管理工具apt-get,apt-cache等。OpenSTLinux的系统管理机制不再是传统的SysV的init的方式,而是使用的功能更强大的systemd管理系统,挂载系统等初始化行为由systemd接管。

也就是说,OpenSTLinux是一个定制化的Debian Embedded Linux System。这就有意思了,可以查看/etc/apt/sources.list.d/packages.openstlinux.st.com.list了解ST的包仓库。通过wiki这部分了解基本操作。忘掉ST提供的那个所谓SDK吧,有BUG不说真没什么用。

OpenSTLinux提供的原始镜像包里面包括:

  1. uboot

u-boot-stm32mp157a-dk1-basic.img,u-boot-spl.stm32-stm32mp157a-dk1-basic

  1. 存放二进制内核与设备树的bootfs:

st-image-bootfs-openstlinux-weston-stm32mp1.ext4

  1. rootfs

st-image-weston-openstlinux-weston-stm32mp1.ext4

  1. user fs

st-image-userfs-openstlinux-weston-stm32mp1.ext4

  1. 一些工具fs

st-image-vendorfs-openstlinux-weston-stm32mp1.ext4

 

除了uboot是可执行的二进制文件之外,其余的都是ext4文件系统。通过主机的挂载工具可以直接查看、添加、删除,最主要是可以拷贝里面的东西出来。

拷贝是比较有用的,毕竟OpenSTLinux是一个深度定制的Linux发行版,有些文件是ST单独提供的,我们既然要简化偷懒,最好的办法莫过于拿来直接用,虽然这些文件大部分都是脚本。

image-20200407210537-1.png

bootfs就是把内核与dtb拷贝进去,我们不用再做一个bootfs,可以在make kernel之后把uImage和*.dtb拷贝过来,比如上一篇中的SPI操作我就是这样更新的镜像。

 

  • Debian – 基本系统
make ee_st_rootfs
make install qemu-user-static debootstrap
debootstrap --arch=armhf  --foreign buster debian_st https://mirrors.tuna.tsinghua.edu.cn/debian/

image-20200407210537-2.png

debootstrap可以指定目标系统的规模:mini,还是base,还是其他。具体可以查看debootstrap手册,我这里省事用的base版。

这个过程大约4分钟,当然,这要依赖网络情况,清华的源还是蛮快的。

cp /usr/bin/qemu-arm-static debian_st/usr/bin/
chroot debian_st /usr/bin/qemu-arm-static /bin/sh -i

image-20200407210537-3.png

/debootstrap/debootstrap --second-stage

image-20200407210537-4.png

这一步是解包刚才debootstrap下载的安装包,大约6分钟,当然,这和你的机器性能有关。

最后,设置root密码,建立登录用户,设置默认输出控制台,这个基本系统就算是做完了,so easy。

rm -fr boot
passwd root
adduser ee
systemctl enable serial-getty@ttySTM0.service

这个系统简化是简化,然而这些包都是Debian的Production Release的包,用做服务器的Debian系统不要太多。

如果没有其他需求,可以直接往下一节,制作镜像和烧写。

image-20200407210537-5.png

 

image-20200407210537-6.png

进一步的,还可以设置本地化locales,安装一些软件包,例如我打算安装无线网卡,因为我不习惯太多线缆。

编辑/etc/apt/sources.list源,然后更新debian包信息。

image-20200407210537-7.png

 

image-20200407210537-8.png

还可以设置locates:dpkg-reconfigure locales,全部选成en_US.UTF-8即可。

最后看一下这个目标系统的大小,退出chroot环境。

image-20200407210537-9.png

这个根文件系统就不要删了,可以当作GCC编译器的include和lib包。

 

  • 镜像制作和烧写

上面已经exit退出了chroot环境,下面的操作都是在主机上进行。根据上面的目标系统大小,做一个块设备文件,并格式化文件系统。

dd if=/dev/zero of=ee_st_fs.ext4 bs=1M count=600
sudo mkfs.ext4 ee_st_fs.ext4

挂载它,然后把ee_st_rootfs下面做好的目标系统考进去。

sudo mount ee_st_fs.ext4 rfs
sudo cp -ar ee_st_rootfs/* rfs
sudo umount rfs

当然,也可以反过来,先做一个ext4的文件系统,挂载之后再直接在这个挂载的系统里debootstrap做系统。

image-20200407210537-10.png

系统镜像做好了,下面主要是烧写和引导相关的操作。

1、把ee_st_fs.ext4拷贝到stm32mp1-openstlinux-20-02-19\images\stm32mp1下。

2、在stm32mp1-openstlinux-20-02-19\images\stm32mp1\flashlayout_st-image-weston下面用仿照现有的tsv文件编写一个自己的烧写配置:

#Opt	Id	Name	Type	IP	Offset	Binary
-	0x01	fsbl1-boot	Binary	none	0x0	tf-a-stm32mp157a-dk1-trusted.stm32
-	0x03	ssbl-boot	Binary	none	0x0	u-boot-stm32mp157a-dk1-trusted.stm32
P	0x04	fsbl1	Binary	mmc0	0x00004400	u-boot-spl.stm32-stm32mp157a-dk1-basic
P	0x05	fsbl2	Binary	mmc0	0x00044400	u-boot-spl.stm32-stm32mp157a-dk1-basic
P	0x06	ssbl	Binary	mmc0	0x00084400	u-boot-stm32mp157a-dk1-basic.img
P	0x21	bootfs	System	mmc0	0x00284400	st-image-bootfs-openstlinux-weston-stm32mp1.ext4
P	0x23	rootfs	FileSystem	mmc0	0x04284400	ee_st_fs.ext4

3、如果只更改rootfs的话,则可以直接进入第5步烧写。如果像我上面那样只保留了bootfs和rootfs,去掉了vendorfs和userfs的话,还需要进行下面的第4步。

4、仿照上面的形式挂载st-image-bootfs-openstlinux-weston-stm32mp1.ext4,修改mmc0_stm32mp157a-dk1_extlinux/extlinux.conf:

# Generic Distro Configuration file generated by OpenEmbedded
MENU BACKGROUND /splash.bmp
TIMEOUT 20
LABEL stm32mp157a-dk1-sdcard
	KERNEL /uImage
	FDT /stm32mp157a-dk1.dtb
	APPEND root=/dev/mmcblk0p5 rootwait rw console=ttySTM0,115200

主要是root=/dev/mmcblk0p5这里。(tsv文件里面第一列的P代表分区,rootfs放在第几个P,这里就改成几)

5、通过STM32CubeProgrammer工具烧写。参见前篇文章

 

  • Debian – 配置网络和系统

上电,一个完整的基础Debian就起来了。

image-20200407210537-11.png

 

image-20200407210537-12.png

 

image-20200407210538-13.png

 

image-20200407210538-14.png

配置无线网卡。参见Debian官方wiki。这里需要注意的是在制作根文件系统的时候,要apt install wpasupplicant iw 等相关包。参考上面 “Debian – 基本系统”的后半截。

image-20200407210538-15.png

通过df -h / 查看文件系统占用情况。然后:

resize2fs -p /dev/mmcblk0p5

mmcblk0p5是具体情况需要根据自己的实际情况选择。调整根文件系统大小,扩展到整个SD卡。

image-20200407210538-16.png

 

到了这里,一个可无线联网的运行在32G SD卡上Debian系统就做好了。

因为做base 系统的时候已经装了openssh-server,因此可以用ssh工具连接开发板进行管理和文件交换了。

 

  • Debian - weston图形界面

1、首先安装weston和虚拟终端的kbd

apt update
apt install kbd weston

2、在主机上挂载OpenSTLinux的st-image-weston-openstlinux-weston-stm32mp1.ext4,主要在主机上拷贝出来三个文件,这三个文件weston配置文件和systemd服务配置文件,不复杂,但是有现成的自然拿来用。

同样的方法,ST提供的其他几个ext4文件系统里的内容,都可以拷贝出来直接用。

sudo mount st-image-weston-openstlinux-weston-stm32mp1.ext4 rfs
scp rfs/etc/xdg/weston/weston.ini ee@192.168.31.8:/home/ee/
scp rfs/lib/systemd/system/weston.service ee@192.168.31.8:/home/ee/
scp rfs/usr/bin/weston-start ee@192.168.31.8:/home/ee/

192.168.31.8是我的开发板地址。

3、在开发板上,修改weston服务配置文件和weston配置文件:

编辑~/weston.service,注释掉

# After=pulsesaudio.service

因为我没有装音频相关包,所以先注释掉。

编辑~/weston.ini,注释掉

#[launcher]
#icon=/usr/share/weston/icon/ST13345_Products_light_blue_24x24.png
#path=/usr/local/demo/demo_launcher.py

因为我没有挂载ST的工具包

4、在开发板上:

cd ~
sudo mkdir -p /etc/xdg/weston/
sudo cp weston.ini /etc/xdg/weston/
sudo cp weston.service /lib/systemd/system/
chmod +x weston-start
sudo cp weston-start /usr/bin/

5、然后打开weston服务

sudo systemctl enable weston 
sudo systemctl start weston

应该能看到weston图形界面了。

image-20200407210538-17.jpeg

 


此内容由EEWORLD论坛网友freebsder原创,如需转载或用于商业用途需征得作者同意并注明出处
 

本帖最后由 freebsder 于 2020-4-7 23:13 编辑
默认摸鱼,再摸鱼。2022、9、28

回复评论 (10)

牛的

我的小站 我的博客
点赞  2020-4-8 14:26
引用: hotsauce1861 发表于 2020-4-8 14:26
牛的

谢谢捧场
点赞  2020-4-8 21:30

厉害啦

点赞  2020-4-9 11:49

这个挺列害

点赞  2020-4-14 07:50

道长你这写错了一个地方吧,是mkdir rootfs不是make rootfs

点赞  2020-4-14 23:08
引用: donatello1996 发表于 2020-4-14 23:08
道长你这写错了一个地方吧,是mkdir rootfs不是make rootfs

是的,写错了。下面图里是正确的。每次改帖子都要审核,我就不改了。
点赞  2020-4-15 09:26
引用: donatello1996 发表于 2020-4-14 23:08 道长你这写错了一个地方吧,是mkdir rootfs不是make rootfs

好眼力,我都不知道你是在哪里看到的。

虾扯蛋,蛋扯虾,虾扯蛋扯虾
点赞  2020-4-16 15:12
引用: littleshrimp 发表于 2020-4-16 15:12 好眼力,我都不知道你是在哪里看到的。

因为我也要弄这块板子,帖子我是认真看完的,每一行

点赞  2020-4-17 17:47

膜拜,linux是个深奥的东西啊

点赞  2020-4-23 17:29

这个不错,标记一下

zhouyuannian#126.com(#换成@)有问题交流
点赞  2020-5-8 09:36
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复