本节目录如下所示。
嵌入式Linux的学习需要软硬件结合学习,本系列将以NXP i.MX6ULL和瑞芯微RK3568作为基础平台去验证。选择这两个平台的主要原因是一方面我有这两块开发板,而且这两块板子分别为32位和64位ARM芯片,分别对应低端的工业平台和中高端的视频,AI算法平台,算目前比较常规的应用。
上述两个平台可以说是典型的支持嵌入式Linux的芯片,基本可以满足大部分的嵌入式应用功能需求。考虑两款产品的构建环境,本系列将以Ubuntu 22.04 LTS作为开发环境,其它系统版本理论也可以,不过每个版本遇到的问题可能不一致,就需要遇到时自己去分析解决(这个也是嵌入式学习的难点,每个人遇到的问题都不一样,需要积累经验去总结解决)。
在嵌入式系统学习的过程中,开发环境构建是有门槛的,不建议入门过程中在开发环境构建花费大量时间,以我的经历来说,能够熟练构建一套快速开发环境(编译工具的移植,库的交叉编译,脚本构建),在整个嵌入式Linux系统学习中是比较困难的部分;很多方案商和各类开发板厂商,其最核心业务就是在芯片厂商的方案基础上,基于自己设计的硬件平台实现一套开发环境和启动方案,提供技术资料和技术支持服务;这里面很多技术都需要前置知识点,不建议在入门时就扎入这个深坑。
开发环境的构建,以我的经历来说是感受不到趣味性的;我是参考网上分享的教程和官方的SDK结构摸索着进行学习的,最初只知道跟着敲命令,如果和教程表现一致还好,可当你使用相同版本的系统,却因为缺少某个库文件或权限问题而执行失败后,在不理解背后原理的情况下,只能在网络上搜索相似的问题,看有没有解决办法(现在则求助AI),往往发生构建错误浪费1-2个小时仍然没有解决。特别是交叉编译时,按照教程却卡在某一步,经常枯坐一晚上不停重试,挫败感明显。从我的学习经历看了,这似乎是必须经历的过程,不过我还是希望这份经验总结下来,既是对自己过去的总结,也是希望对后来者有所帮助。这里说明下构建Linux平台时主要遇到的问题。
上面说明嵌入式Linux开发环境构建的背景和软件安装的方法,这当然需要一定的基础,包含不限于如下所示。
对于构建Linux系统平台,没有一定的基础去修改是比较困难,如果错误的使用root权限去修改系统配置,是有几率导致系统功能失效,严重的会崩溃无法启动,最终不得不重装系统。这部分技术十分杂乱,没有任何教程能覆盖到所有的内容。不提Linux本身的命令,对于用户添加的应用如net-tools,ssh,opencv,python,node,sqlite,tftp,每个软件都有一套命令机制和配置管理方法,只是单纯去学习意义不大。而且如果更换了系统版本,对于同一个软件也可能遇到不同的问题。这部分不适合专门去学习,而应该使用中遇到问题,刨根问底去分析解决,从而积累处理经验。
对于初步接触嵌入式Linux平台开发的使用者,建议还是使用开发板或者芯片厂商提供的SDK环境包。如果进一步深入,希望了解这个环境是如何构建的,这系列文章会从安装Ubuntu开始,讲解如何构建编译系统,编译嵌入式执行平台,交叉编译支持程序和库,以及安装软件包的全过程,当然也包含这中间遇到的问题和解决办法。不过每个系统版本遇到的问题都可能不一样,如果遇到问题解决不了的,可以去浏览器搜索查找有没有人遇到类似问题。实在解决不了使用已经构建好的平台也没什么问题,不要过于纠结。兴趣才是第一老师,而通过成功才能加强兴趣,一定要避免过多的挫败感打击学习的积极性。
注意: 类似chatgpt,deepseek,doubao等语言类AI工具的发展,十分方便检索问题和解决办法,在学习中一定要善于使用,事倍功半。我个人使用的是vscode中基于doubao-1.5-pro模型的”MARSCODE AI”插件,体验很不错,在学习和理解本系列文章时可以配合使用。
安装环境可以选择虚拟机模式和直接系统安装,不过因为我习惯windows下开发,且芯片厂商的一些下载调试工具只支持windows下使用,最终选择window和虚拟机操作Linux的方式进行管理,直接系统安装可用UltraISO制作系统盘安装。这里平台选择如下.
Ubuntu 24.04 LTS可以通过VMvare中的Share目录方法,实现本地文件和数据与windows的共享;当然使用vsftp、ssh、samba等工具也可以实现文件和数据交互,后续软件使用方法中有相应说明;当然也可以安装open-vm-tools,实现windows和Linux的文件和数据交互;具体命令如下。
# 安装open-vm-tools
sudo apt-get install open-vm-tools open-vm-tools-desktop nfs-common -y
安装方法: 选择>新建虚拟机>典型, 选择安装文件*.iso,按照流程下一步安装即可;注意其中要输入账号和密码,这个在后期登录和切换用户十分重要。如果虚拟机系统内资料并不是太需要保护,那么为了后期命令的方便,可以使用短密码(确保PC不会被他人随意访问,且内部没有重要信息),否则还是建议使用长密码。另外如果硬盘空间足够,建议虚拟机的空间分配至少50G以上,并且越大越好;虽然后续通过VMware的扩展功能可以增加硬盘空间,不过没有原始的全范围空间使用方便。
如果安装完成的ubuntu无法访问网络环境,通过修改支持国内的dns服务器.
sudo vi /etc/resolv.conf
# 添加DNS服务器
nameserver 223.5.5.5
nameserver 8.8.8.8
nameserver 8.8.4.4
Ubuntu默认使用的镜像源在国外,直接下载访问比较慢,大部分都会直接失败,所以我一般会更新使用国内源,我目前使用的是国内清华镜像源。
对于arm/arm64平台,使用镜像地址为:
另外,对于https://cdn.kernel.org/也支持国内源。
按照网页说明选择对应版本,替换/etc/apt/sources.list下文件,然后执行如下命令即可.
# 更新软件包列表
sudo apt-get update
# 更新软件包
sudo apt-get upgrade
如果出现Ign0:xxxxxxx的访问错误,这是表示访问失败,可以选择http版本。
构建完成后,需要安装编译支持的脚本或者库。下面提供了一些在编译驱动,内核还有一些第三方库或软件时需要增加和更新的库和程序。这些库和程序是在各类编译中整理的,可以直接执行指令进行安装,能够解决大部分编译或者交叉编译时遇到的问题。
sudo apt-get install vim lib32z1 cmake pip3 ninja-build librust-glib-sys-dev -y
sudo apt-get install lz4 bc lzop libffi-dev libssl-dev git libdbus-1-dev -y
sudo apt-get install libncurses5-dev u-boot-tools openssh-server device-tree-compiler -y
sudo apt-get install dos2unix gzip libtool flex libpulse-dev libnl-3-dev -y
sudo apt-get install build-essential manpages-dev make bison util-linux-extra -y
sudo apt-get install software-properties-common binutils gcc-multilib -y
sudo apt-get install libc6-dev-i386 net-tools libsdl2-dev qemu-user-static -y
sudo apt-get install lsb-core lib32stdc++6 libncursesw5-dev lib32ncurses-dev -y
sudo apt-get install open-vm-tools open-vm-tools-desktop nfs-common -y
sudo apt-get install libgl1-mesa-dev texinfo lmbench libgdk-pixbuf2.0-dev -y
sudo apt-get install subversion zlib1g-dev gawk gettext libelf-dev ecj fastjar -y
sudo apt-get install expect expect-dev bzip2 libgmp-dev libmpc-dev texinfo-y
如此,基本完成了linux平台基础环境的构建.
对于Linux平台环境的构建,包含熟悉Linux平台命令和文件知识,安装方便使用和开发的工具,能够自己编译或交叉编译些库和程序,这部分工作并不困难,却十分复杂,不同系统(centos,ubuntu),相同系统的不同版本(16.04,22.04),甚至相同版本系统下不同的库支持情况,都会面临不同的问题。这部分不建议机械的学习,而是有概念后,在使用Linux的过程中,积累深入总结,当你能够整理出自己的笔记或者能实现自己的一键构建工具后,也就自然学会掌握了。
对于嵌入式linux,第一步就是下载交叉编译工具,例如我使用的i.MX6Ull芯片,可以访问如下网站获取编译工具。
下载最新的编译工具,如我使用的是gcc-linaro-7.5.0-2019.12-i686_arm-linux-gnueabihf.tar.xz.
不过这个版本最高支持到7.5.0版本,后面就没有更新,如果使用更高版本的编译工具,需要去arm官网下载,不过速度比较慢,这里推荐去清华源镜像去下载。
这里也说下arm编译工具命名的规则,便于选择用于编译的工具, 这里列出几个不同类型的arm编译工具。
'gcc-linaro-7.5.0-2019.12-i686_arm-linux-gnueabihf.tar.xz'
'gcc-arm-11.2-2022.02-x86_64-aarch64-none-linux-gnu.tar.xz'
'gcc-arm-11.2-2022.02-x86_64-arm-none-linux-gnueabihf.tar.xz'
'gcc-arm-11.2-2022.02-x86_64-arm-none-eabi.tar.xz'
其格式如下:
这里详细解释每个编译选项:
对于上面列出的平台和对应得编译工具可通过如下命令下载。
# i.MX6Ull Cortex-A7 arm32
wget https://mirrors.tuna.tsinghua.edu.cn/armbian-releases/_toolchain/gcc-arm-11.2-2022.02-x86_64-arm-none-linux-gnueabihf.tar.xz
# h618 cortex-a53 arm64
wget https://mirrors.tuna.tsinghua.edu.cn/armbian-releases/_toolchain/gcc-arm-11.2-2022.02-x86_64-aarch64-none-linux-gnu.tar.xz
# stm32 cortex-m3/m4 arm32
wget https://mirrors.tuna.tsinghua.edu.cn/armbian-releases/_toolchain/gcc-arm-11.2-2022.02-x86_64-arm-none-eabi.tar.xz
对于嵌入式Linux开发,在Windows下有更方便的开发方法,那就是使用WSL2开发。 这里不推荐使用WSL1,WSL1使用在Windows下模拟Linux的API,目前微软基本放弃更新,且有接口和应用的缺失,如系统不支持消息队列,不支持systemd,编译内核时缺少某些头文件和库,特别是交叉编译时会遇到各种莫名其妙的问题,而且很难找到原因。对于WSL2则完全采用Hyper-V虚拟机方式,目前除网络和USB支持有问题外,和VMVare使用基本一致,另外WSL2和老版本的VMVare对于虚拟网络有兼容性问题,会导致VMVare无法启动系统,需要将VMVare升级到15.5.7版本或者更高版本。
具体流程参考这篇文章:https://www.bilibili.com/read/cv16178040/
WSL2的开启和使用可参考地址:https://learn.microsoft.com/zh-cn/windows/wsl/install。
#查看Linux内核命令
uanme -a
#目前wsl2的内核为5.xx.xxx, wsl1的内核为4.xx.xxx, 且wsl1内核后续应该不会升级,通过这个方式可以简单判断使用的版本
Linux DESKTOP-SO7SONV 5.15.133.1-microsoft-standard-WSL2 #1 SMP Thu Oct 5 21:02:42 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux
开启Hyper-v的windows bat脚本。
pushd "%~dp0"
dir /b %SystemRoot%\servicing\Packages\*Hyper-V*.mum >hv.txt
for /f %%i in ('findstr /i . hv.txt 2^>nul') do dism /online /norestart /add-package:"%SystemRoot%\servicing\Packages\%%i"
del hv.txt
Dism /online /enable-feature /featurename:Microsoft-Hyper-V -All /LimitAccess /ALL
Pause
注意:WSL2虽然默认支持通过/mnt/*方式访问windows平台的文件,不过这是通过文件系统转译的方式访问的,效率低,会大幅度增加编译时间。另外windows文件不区分大小写,即使通过Linux系统访问也会有这类不一致问题,导致处理出错,从而有可能误删除文件。在使用WSL2时,还是移动到WSL2的Linux目录下使用(非’/mnt/’访问得目录),尽量避免直接使用windows系统下文件。
迁移wsl到其它目录的方法。
#下载编译脚本
wget https://codeload.github.com/pxlrbt/move-wsl/zip/refs/heads/master
#解压并在powershell环境下运行脚本
./move-wsl.ps1
#修改默认用户
Ubuntu2204 config --default-user freedom
安装wsl支持远程桌面环境。
#安装xfce图形界面
sudo apt-get install xfce4 xfce4-goodies
#安装xrdp远程服务
sudo apt-get install xrdp
#修改xrdp配置
sudo vim /etc/xrdp/xrdp.ini
## /etc/xrdp/xrdp.ini
port=3390
max_bpp=128
xserverbpp=128
## end
#修改sesman配置文件
sudo vim /etc/xrdp/sesman.ini
## /etc/xrdp/sesman.ini
KillDisconnected=true
## end
#告知系统使用xfce4-session
sudo echo xfce4-session > ~/.xsession
#修改startwm.sh
sudo vim /etc/xrdp/startwm.sh
## /etc/xrdp/startwm.sh
#test -x /etc/X11/Xsession && exec /etc/X11/Xsession
#exec /bin/sh /etc/X11/Xsession
startxfce4
## end
#启动xrdp服务
sudo /etc/init.d/xrdp start
远程连接方式
#打开mstc,远程连接
localhost:3390
#登录
选择xorg,填写用户和密码(root登录,需要先设置密码)
wsl支持qt环境。
#安装qtcreator
sudo apt-get install libts-dev qtcreator
#安装qt编译工具
sudo apt-get install qttools5-dev-tools
//导入系统环境变量
export QT_ROOT="/lib/qt-lib"
export QT_QPA_FONTDIR=/usr/share/fontsq
export QT_QPA_PLATFORM_PLUGIN_PATH=$QT_ROOT/plugins
#export QT_QPA_PLATFORM=linuxfb:tty=/dev/fb0
export QT_PLUGIN_PATH=$QT_ROOT/plugins
export LD_LIBRARY_PATH=$QT_ROOT/lib:$QT_ROOT/plugins/platforms
export QML2_IMPORT_PATH=$QT_ROOT/qmlv
export XDG_RUNTIME_DIR="/tmp/runtime-root"
对于wsl2环境构建,包含I.MAX6ULL、RK3568、H618芯片的驱动,内核,支持库编译,wsl2图形环境xfce远程连接,qtcreator和qt compiler环境支持,以及驱动开发,验证下来wsl2可以满足开发的需求。不过wsl2还是有一些限制,不过可以通过其它方法绕开。
这是我使用wsl2遇到的主要问题,其它问题都能够解决。总之,wsl2我认为是比较完善的Linux环境,能够满足基本应用,以及驱动开发的需求,不过使用vscode+ssh远程访问vmvare的虚拟机也十分方便,这个在软件安装方法中有详细方法。
wsl修改默认登录用户:
#powershell环境
ubuntu2204.exe config --default-user root
直接开始下一章节:Linux Shell命令行总结