build_embed_linux_system

快速搭建Linux运行平台

最近因为一些突发事情,硬盘损坏连带着系统盘一起BOM,只能重装系统,之前辛苦构建的平台也都付之一炬。重做系统后,又要重新构建一次完整的项目平台;对于我来说轻车熟路,不过考虑到其中涉及挺多步骤,虽然在整个第一章节各部分都有说明,不过内容分散,这里记录下安装的流程。

wsl_support

之前的从业经验来说,大部分情况都是使用VMvare虚拟机、vscode本地/远程修改的方式进行嵌入式Linux的开发。不过随着WSL2的完善,直接通过Hyper-V虚拟机实现Linux运行,在Windows下直接开发更加方便,存储也是根据使用大小自行扩展,不需要像虚拟机那样担心存储不够。虚拟机也能够扩容,不过是以新的盘的形式挂载,比在一个盘里使用麻烦了不少。所以现在,除了使用tftp/nfs的场景(WSL2桥接目前有些坑),很多SDK都使用WSL2进行编译,所以这里涉及WSL的安装。

注意: WSL2运行在Hyper-V虚拟机上,这个会和VMvare有兼容性问题;需要windows版本更新支持,且VMware安装也需要增加”WPH”驱动支持。有WSL2应用需求,先开启Hyper-V,升级安装WSL2,在进行VMware的安装,否则可能需要VMware进行修复安装或者卸载后重新安装。

更新windows系统,windows11是直接支持,不过对于windows10来说,需要使用19041.264或者以上版本。如果版本较低,可以使用微软的Windows Update软件,网址参考: https://www.microsoft.com/zh-cn/software-download/windows10;注意需要较新的CPU版本。

后续部分就是WSL2如何在Windows上的安装,流程可参考:WSL2安装步骤

ubuntu_install

对于ubuntu安装,

VMware虚拟机选择15.5.5以后版本进行安装,早期版本和Windows的Hyper-V虚拟机进行安装。网上有相应教程,安装后输入购买的密钥即可。

对于Ubuntu系统,其实没有硬性要求,一些芯片官方提供的SDK可能使用早期版本,其实新版本也能用,Ubuntu 22.04、Ubuntu 24.04我也都用过,编译中出现问题我也能自己解决。入门者选择开发板SDK对应的Ubuntu即可,不过我这里根据个人习惯选择Ubuntu 22.04.05 LTS(这个版本会影响后续编译构建嵌入式端Debian/Ubuntu的版本,版本不同可能构建失败)。

关于Ubuntu 22.04 LTS的下载地址:https://mirrors.tuna.tsinghua.edu.cn/ubuntu-releases/22.04/

VMware选择>新建虚拟机>典型, 选择安装文件*.iso,按照流程下一步安装,直到完成即可。

注意: 除非能够很顺利的访问Ubuntu官方服务器,不要勾选”安装Ubuntu时更新”和”为图形或无线硬件,以及MP3和其它媒体安装第三方软件”。

dns_server

更新DNS解析服务器

sudo vi /etc/resolv.conf

# 添加DNS服务器
nameserver 223.5.5.5
nameserver 8.8.8.8
nameserver 8.8.4.4

apt_source

更新国内源,这里使用清华源

对于源地址,不要使用网络上分享的内容,使用源网站实时分享的内容,不要自己随意添加,可以保证安全性。

国内源地址: https://mirrors.tuna.tsinghua.edu.cn/help/ubuntu/

对于22.04LTS选择如下。

image

# 配置apt源文件,修改内容指定
sudo vi /etc/apt/source.list

# 删除原内容,将上述内容复制到文件中
# https://mirrors.tuna.tsinghua.edu.cn/help/ubuntu/

# 执行源更新和软件更新
sudo apt update
sudo apt upgrade

ubuntu_software_support

这一步主要进行完善ubuntu的程序和环境,方便后续进行软件平台的编译和构建。

software_install

安装必要的软件。

安装系统编译和构建的必要软件,可以解决后续编译时的大部分问题;这里列出我在进行编译时用到的工具和软件。

sudo apt-get install vim lib32z1 cmake 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

remote_service

安装远程服务工具。

对于ubuntu来说,主要的远程服务工具有openssh、tftp、nfs软件,以及支持vscode远程访问,这四款软件可以说大幅度提高生产效率。

其中前三个软件的安装,可参考: Linux平台软件安装使用方法,不过这里还是整理下;这里只给出基础步骤,有问题可以参考相应安装解决。

# 安装软件
sudo apt-get install openssh-server xinetd tftp-hpa tftpd-hpa nfs-kernel-server -y

进行相应配置并重启。

(1).openssh配置

# openssh更新
sudo vim /etc/ssh/sshd_config

# 修改选项
PermitRootLogin yes
PasswordAuthentication yes

# 重启openssh
sudo service ssh restart

如果希望支持root登录,还需要给root用户配置密码,通过”passwd root”命令按照需求进行配置。

(2). tftp配置

# 增加tftp配置
# server_args: 指定tftp服务器读取地址
sudo vim /etc/xinetd.d/tftp

server tftp
{
    socket_type = dgram
    wait = yes
    disable = no
    user = root
    protocol = udp
    server = /usr/sbin/in.tftpd
    server_args = -s /home/freedom/Desktop/user_git/sdk/tftp -c
    per_source = 11
    cps =100 2
    flags =IPv4
}

# 修改tftp目录
sudo vim /etc/default/tftpd-hpa

# /etc/default/tftpd-hpa

TFTP_USERNAME="tftp"
#此处指定tftp的映射目录
TFTP_DIRECTORY="/home/freedom/Desktop/user_git/sdk/tftp"
TFTP_ADDRESS=":69"
TFTP_OPTIONS="--secure"

# 重启tftp服务
sudo service tftpd-hpa restart
sudo service xinetd restart

(3). nfs配置

# 更新nfs配置
# 指定nfs服务器访问目录
sudo vim /etc/exports

# /home/freedom/.../nfs NFS共享目录
# *         表示允许所有网络段访问
# rw        表示访问者具有读写权限
# nohiden   表示共享子目录
# insercure 表示通过1024以上的端口通讯
# sync/async        资料同步/不同步缓存
# no_subtree_check  表示不检查父目录权限
# no_root_squash    表示访问者为root权限
/home/freedom/Desktop/Project/sdk/nfs *(rw,nohide,sync,no_root_squash)

vscode的官方下载地址为:https://code.visualstudio.com/Download,下载windwos版本。

点击左下角,选择connect to HOST,输入ssh登录地址:”@",点击登录即可。

连接成功后,即可在windows中进行Linux服务器访问。

application_install

这一步是在系统上安装之前说的remote_manage的项目,构建SDK,安装工具链。

# 创建目录,用于后续项目管理
# 只所以选择这个目录,是因为后续的处理,脚本都是按照这个设计的,选择其它目录需要自行修改
mkdir /home/freedom/Desktop/user_git
cd /home/freedom/Desktop/user_git

# 从github下载项目
git clone https://github.com/zc110747/remote_manage.git

# 进入目录并执行,这一步会执行脚本,创建SDK目录和安装交叉编译工具
cd remote_manage/
chmod 777 preBuildEnvironment.sh && ./preBuildEnvironment.sh

# 在下载目录放置uboot,kernel安装包
cp uboot-imx-lf_v2022.04.tar.xz /home/freedom/Desktop/user_git/sdk/download
cp linux-imx-lf-6.1.y.zip /home/freedom/Desktop/user_git/sdk/download

# 再次执行安装uboot,kernel
./preBuildEnvironment.sh

# 解压buildroot到/home/freedom/Desktop/user_git/sdk/arm/rootfs/buildroot
# https://buildroot.org/downloads/buildroot-2024.02.1.tar.gz
tar -xvf buildroot-2024.02.1.tar.gz -C /home/freedom/Desktop/user_git/sdk/arm/rootfs/

# 重新打开命令行,此时可以使用
SysBuildUboot   # 编译U-boot
SysBuildKernel  # 编译kernel,拷贝到sdk/tftp中,支持tftp远程挂载
SysBuildRootfs  # 编译buildroot rootfs

summary

至此,一个简单的支持I.MX6ULL平台运行的Linux环境就搭建完成了;可以看到步骤并不困难,不过在真正的实践中,其实花费了挺多时间。在实际过程中,重装windows系统后,执行流程如下。

  1. 先安装了VMware,又基于虚拟机安装了Ubuntu-22.04系统,完成本节说明的全部环境搭建。
  2. 通过控制面板开启Linux子系统,商店安装Ubuntu-22.04;等待完成后,发现默认版本是wsl1,此时进行切换。
  3. 按照教程处理,首先通过控制面板开启Hyper-V,再到官网安装系统支持WSL2的补丁,切换发生失败。分析确定为windows版本过低,于是使用windows installer tools进行系统升级(windows update自带更新一直升级失败)。
  4. 重启多次升级完成,然后通过命令执行WSL2切换,等待一段时间后WSL2切换成功,这部分工作完成
  5. 此时测试发现VMware无法打开虚拟机,显示和系统不兼容(用的15.5.2,发现版本过低无法和Hyper-V兼容)。卸载后安装VMware Pro 16的版本,安装中勾选”WPH”驱动,安装成功后能够打开之前的虚拟机,此时才算圆满完成。

当然这里还有个简单的办法,就是使用VMware是关闭Hyper-V虚拟机,使用WSL2再开启。不过这只适合CPU型号较老,不支持新windows版本的机器,有能力还是共存比较好。可以看到,整个过程还是挺折腾的;之所以还算顺利,也是因为有过多次安装的经验,虽然有些遗忘但还记得大致步骤才没有被卡住;对于Linux环境的构建难度正是在此,实践中遇到问题,一定要知其所以然,并积累总结下来,不然问题会越积越多,花费更多时间。

next_chapter

返回目录

直接开始下一章节:Linux平台问题解决方法