build_embed_linux_system

嵌入式linux开发环境构建

本节目录如下所示。

嵌入式Linux的学习需要软硬件结合学习,本系列将以NXP i.MX6ULL瑞芯微RK3568作为基础平台去验证。选择这两个平台的主要原因是一方面我有这两块开发板,而且这两块板子分别为32位和64位ARM芯片,分别对应低端的工业平台和中高端的视频,AI算法平台,算目前比较常规的应用。

上述两个平台可以说是典型的支持嵌入式Linux的芯片,基本可以满足大部分的嵌入式应用功能需求。考虑两款产品的构建环境,本系列将以Ubuntu 22.04 LTS作为开发环境,其它系统版本理论也可以,不过每个版本遇到的问题可能不一致,就需要遇到时自己去分析解决(这个也是嵌入式学习的难点,每个人遇到的问题都不一样,需要积累经验去总结解决)。

在嵌入式系统学习的过程中,开发环境构建是有门槛的,不建议入门过程中在开发环境构建花费大量时间,以我的经历来说,能够熟练构建一套快速开发环境(编译工具的移植,库的交叉编译,脚本构建),在整个嵌入式Linux系统学习中是比较困难的部分;很多方案商和各类开发板厂商,其最核心业务就是在芯片厂商的方案基础上,基于自己设计的硬件平台实现一套开发环境和启动方案,提供技术资料和技术支持服务;这里面很多技术都需要前置知识点,不建议在入门时就扎入这个深坑。

开发环境的构建,以我的经历来说是感受不到趣味性的;我是参考网上分享的教程和官方的SDK结构摸索着进行学习的,最初只知道跟着敲命令,如果和教程表现一致还好,可当你使用相同版本的系统,却因为缺少某个库文件或权限问题而执行失败后,在不理解背后原理的情况下,只能在网络上搜索相似的问题,看有没有解决办法(现在则求助AI),往往发生构建错误浪费1-2个小时仍然没有解决。特别是交叉编译时,按照教程却卡在某一步,经常枯坐一晚上不停重试,挫败感明显。从我的学习经历看了,这似乎是必须经历的过程,不过我还是希望这份经验总结下来,既是对自己过去的总结,也是希望对后来者有所帮助。这里说明下构建Linux平台时主要遇到的问题。

  1. 访问权限问题,很多人可能直接使用root权限规避这个问题;不过root权限一些指令容易损坏系统文件,误删除或修改关键文件都会导致系统损坏;另外部分厂商的SDK会对root下运行进行限制,则根本无法使用root进行编译。而使用一般用户,则很容易面临权限不足问题,这基本是很难避免的。如mkdir,vim,touch,install等命令创建的文件或目录时,都默认设置为当前用户管理。而如果是在root权限下创建,普通用户可能就不会有修改权限;另外文件从windows迁移到Linux很可能丢失权限,这个时候就需要善于使用chmod(修改文件的读写权限)、chown(更改文件的所属用户)命令,而不要想着就在root下处理,可能对后续带来很多麻烦。
  2. 缺少某类运行支持库,表现为编译时缺少某个头文件([file].h不存在)或者链接中-l[file], 运行时缺少lib[file].so。这时分两种情况,一种是编译本系统运行的文件或工具(运行在桌面端),这时候通过apt –names-only search [file]从安装源中查找,在通过apt-get install安装接口即可;还有一类是交叉编译时缺少某个类库,这时候就比较麻烦,需要去找到相应的类库源码,编译安装的特定目录,在编译时引入此目录,或者使用debian,ubuntu之类的嵌入式系统,在chroot或者应用环境下使用apt软件安装。
  3. 版本中某类库或者软件版本和应用不匹配,这种问题可以分两类处理。

上面说明嵌入式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”插件,体验很不错,在学习和理解本系列文章时可以配合使用。

linux_system_install

virtual_tool_version

安装环境可以选择虚拟机模式和直接系统安装,不过因为我习惯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的扩展功能可以增加硬盘空间,不过没有原始的全范围空间使用方便。

dns_mirrors

如果安装完成的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版本

support_common_library

构建完成后,需要安装编译支持的脚本或者库。下面提供了一些在编译驱动,内核还有一些第三方库或软件时需要增加和更新的库和程序。这些库和程序是在各类编译中整理的,可以直接执行指令进行安装,能够解决大部分编译或者交叉编译时遇到的问题。

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_env_struct

对于Linux平台环境的构建,包含熟悉Linux平台命令和文件知识,安装方便使用和开发的工具,能够自己编译或交叉编译些库和程序,这部分工作并不困难,却十分复杂,不同系统(centos,ubuntu),相同系统的不同版本(16.04,22.04),甚至相同版本系统下不同的库支持情况,都会面临不同的问题。这部分不建议机械的学习,而是有概念后,在使用Linux的过程中,积累深入总结,当你能够整理出自己的笔记或者能实现自己的一键构建工具后,也就自然学会掌握了。

cross_compiler_tools

对于嵌入式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

use_wsl2_linux

wsl_install

对于嵌入式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

  1. 首先在UEFI(BIOS)中启动虚拟化,这个可能根据所用产品平台有关,可参考地址:https://support.microsoft.com/en-us/windows/enable-virtualization-on-windows-11-pcs-c5578302-6e43-4b4b-a449-8ced115f58e1
  2. 在控制面板>程序>启用或关闭Windows功能>适用于Linux的windows子系统,选中并重启,此时PowerShell中可以使用WSL命令。
  3. 以管理员身份启动PowerShell,执行如下命令wsl –update,等待wsl升级完成。
  4. 安装ubuntu系统,这里可以使用MicroSoft Store中的系统安装,版本为Ubuntu 22.04 LTS,MicroSoft Store>Ubuntu>Ubuntu 22.04.3 LTS,点击下载>完成后,点击安装,等待完成后重启即可。
  5. 在Windows平台即可在命令行使用wsl或者直接左下角搜索Ubuntu打开Linux系统,并可以通过wsl –set-version Ubuntu-22.04 2来设置在wsl2运行系统,之后可以按照正常Ubuntu虚拟机进行环境构建和开发。目前可通过如下命令查看是否安装成功。
#查看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_move

迁移wsl到其它目录的方法。

#下载编译脚本
wget https://codeload.github.com/pxlrbt/move-wsl/zip/refs/heads/master

#解压并在powershell环境下运行脚本
./move-wsl.ps1

#修改默认用户
Ubuntu2204 config --default-user freedom

wsl_gui

安装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

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"

wsl_summarize

对于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

next_chapter

返回目录

直接开始下一章节:Linux Shell命令行总结