2. Linux基础环境准备:Ubuntu虚拟机安装、SSH配置、基础工具链安装
做OTA升级包开发,第一件事就是把Linux环境搭好。我见过不少新手在Windows上硬搞,结果编译脚本跑不通、路径分隔符搞混、权限问题一堆——说白了,Linux才是嵌入式开发的天然土壤。这一章我们就从零开始,把Ubuntu虚拟机装好,配通SSH,再把基础工具链一把梭到位。
本章核心目标:在一台Windows/Mac宿主机上,通过VirtualBox搭建Ubuntu 22.04 LTS虚拟机,配置SSH远程访问,安装编译OTA升级包所需的全部基础工具。
2.1 为什么选Ubuntu 22.04 LTS?
你可能要问:Ubuntu版本那么多,为什么偏选22.04?我个人习惯是:做嵌入式开发,LTS版本永远是首选。22.04的支持周期到2027年,这意味着你的开发环境在几年内不会因为系统EOL而被迫迁移。
| 特性 | Ubuntu 22.04 LTS | 其他版本(如20.04/24.04) |
|---|---|---|
| GCC版本 | 11.2(兼容ARM交叉编译链) | 20.04自带GCC 9,对C++17支持不完整 |
| Python版本 | 3.10(OTA脚本常用) | 20.04是3.8,部分新库已放弃支持 |
| 支持周期 | 2027年4月 | 24.04刚出,生态兼容性待验证 |
| 软件包数量 | 最丰富,apt源稳定 | 20.04部分包已进入oldstable |
我在项目中踩过一个坑:用20.04编译某款ARM交叉工具链,结果GCC 9对C++17的std::filesystem支持有bug,折腾了两天才发现是编译器版本问题。换到22.04后一次通过。所以,别在环境版本上省事。
2.2 安装VirtualBox与创建Ubuntu虚拟机
VirtualBox是Oracle家的免费虚拟化软件,稳定、轻量、跨平台。我们用它来跑Ubuntu。
2.2.1 下载与安装VirtualBox
- 访问 VirtualBox官网,下载对应你宿主机的版本(Windows/macOS/Linux)。
- 安装时一路默认即可。Windows用户注意:安装过程中会提示安装网络驱动,一定要同意,否则后面NAT网络用不了。
- 下载Ubuntu 22.04 LTS桌面版ISO镜像(建议从清华镜像站或中科大镜像站下载,速度快)。
我的习惯:ISO镜像下载后先校验SHA256,别问我为什么——有一次我下载的镜像损坏,装到一半报错,重下才解决。命令:sha256sum ubuntu-22.04.3-desktop-amd64.iso
2.2.2 创建虚拟机
打开VirtualBox,点击「新建」,按以下参数配置:
| 配置项 | 推荐值 | 说明 |
|---|---|---|
| 名称 | OTA-Dev-Env | 见名知意 |
| 类型 | Linux | — |
| 版本 | Ubuntu (64-bit) | 必须选64位 |
| 内存大小 | 4096 MB(至少2048) | OTA编译吃内存,别省 |
| 硬盘 | 40 GB(动态分配) | 实际占用按需增长 |
| CPU核心 | 2核(至少1核) | 编译时多核加速明显 |
创建完成后,在「设置 → 存储」中挂载Ubuntu ISO镜像,然后启动虚拟机,按界面提示安装系统。安装时建议勾选「为图形或无线硬件安装第三方软件」,省得后面装驱动麻烦。
注意:安装过程中创建的用户名和密码请牢记。我建议用户名用全小写英文,不要用中文或特殊字符,否则后面SSH和脚本路径处理容易出幺蛾子。
2.3 配置SSH远程访问
虚拟机装好后,你当然可以直接在VirtualBox的窗口里操作。但说实话,那个体验很差——复制粘贴不方便、窗口缩放卡顿、还不能多终端并行。所以,我强烈建议配通SSH,用你习惯的终端工具(如Windows Terminal、iTerm2)远程连进去操作。
2.3.1 在Ubuntu虚拟机中安装并启动SSH服务
# 更新包索引
sudo apt update
# 安装OpenSSH服务器
sudo apt install -y openssh-server
# 检查SSH服务状态
sudo systemctl status ssh
# 如果没启动,手动启动
sudo systemctl enable ssh
sudo systemctl start ssh
安装完成后,用ip a查看虚拟机的IP地址。如果你用的是NAT网络模式,默认IP通常是10.0.2.15。但注意:这个IP在宿主机上直接访问不了,需要配置端口转发。
2.3.2 配置VirtualBox端口转发
在VirtualBox主界面,选中你的虚拟机 → 「设置 → 网络 → 高级 → 端口转发」。添加一条规则:
| 名称 | 协议 | 主机IP | 主机端口 | 子系统IP | 子系统端口 |
|---|---|---|---|---|---|
| SSH | TCP | 127.0.0.1 | 2222 | 10.0.2.15 | 22 |
这样配置后,你在宿主机上执行ssh -p 2222 用户名@127.0.0.1就能连进虚拟机了。
避坑指南:我曾经把主机端口设成了22,结果和宿主机本地的SSH服务冲突,连了半天连不上。端口转发的主机端口建议用1024以上的高位端口,比如2222、22222都行。
2.3.3 配置SSH免密登录(可选但推荐)
每次输密码挺烦的,尤其是后面要频繁scp传文件。配置免密登录只需三步:
# 在宿主机上生成SSH密钥(如果已有则跳过)
ssh-keygen -t rsa -b 4096
# 将公钥复制到虚拟机
ssh-copy-id -p 2222 用户名@127.0.0.1
# 测试免密登录
ssh -p 2222 用户名@127.0.0.1
第一次连的时候会提示确认主机指纹,输入yes即可。之后就能直接登录,不用再输密码了。
2.4 安装基础工具链
环境搭好了,SSH也通了,接下来就是装工具。这些工具是后面编译OTA升级包的基石,缺一个都可能让脚本跑不起来。
2.4.1 一键安装核心工具包
sudo apt update
sudo apt install -y \
build-essential \
cmake \
git \
curl \
wget \
vim \
tree \
htop \
net-tools \
unzip \
p7zip-full \
python3 \
python3-pip \
python3-venv \
openssl \
libssl-dev \
libcurl4-openssl-dev \
libjson-c-dev \
libyaml-dev
我来解释一下这些工具是干什么的:
| 工具 | 用途 | 为什么需要 |
|---|---|---|
| build-essential | GCC/G++编译器套件 | 编译C/C++代码,OTA包中的签名工具、压缩库都需要 |
| cmake | 跨平台构建系统 | 很多嵌入式项目用CMake管理构建 |
| git | 版本控制 | 管理OTA升级包的源码和脚本 |
| python3-pip | Python包管理器 | 安装OTA脚本依赖的Python库 |
| libssl-dev | OpenSSL开发库 | OTA包签名、加密、校验的核心依赖 |
| libjson-c-dev | JSON解析库 | 解析OTA升级包的元数据描述文件 |
2.4.2 验证安装是否成功
装完后,快速验证一下关键工具是否可用:
gcc --version
cmake --version
git --version
python3 --version
openssl version
如果每个命令都能正常输出版本号,说明环境已经就绪。
注意:如果gcc --version报错,大概率是build-essential没装全。可以单独执行sudo apt install --reinstall build-essential重装一次。我遇到过因为网络波动导致包下载不完整的情况,重装就能解决。
2.5 本章知识体系总览
下面这张SVG图把本章的核心流程串起来了,你可以对照着检查自己有没有遗漏步骤。
2.6 常见问题与排查
环境搭建过程中,你可能会遇到一些问题。我把常见的列出来,省得你到处搜。
| 问题 | 可能原因 | 解决方法 |
|---|---|---|
| SSH连接被拒绝 | SSH服务未启动 / 端口转发未配置 | sudo systemctl status ssh检查服务状态;检查VirtualBox端口转发规则 |
| apt update报错 | 网络问题 / 镜像源不可用 | 更换国内镜像源(清华/阿里/中科大) |
| gcc命令找不到 | build-essential未安装成功 | sudo apt install --reinstall build-essential |
| 虚拟机启动黑屏 | VT-x/AMD-V未开启 | 进入BIOS开启虚拟化技术 |
| scp传输文件慢 | NAT模式带宽限制 | 改用桥接网络模式,或使用rsync替代scp |
我的经验:如果你在公司内网环境下搭建,apt源建议换成内网镜像,速度能快10倍。换源方法:编辑/etc/apt/sources.list,把archive.ubuntu.com替换成你的内网镜像地址。
好了,到这里你的Linux基础环境就全部就绪了。虚拟机跑着、SSH连着、工具链装齐了——接下来就可以正式开始OTA升级包的制作了。记住,环境是地基,地基稳了,后面才不慌。