news 2026/9/8 11:37:22

Ubuntu 22.04下Vagrant实战:从环境配置到踩坑排查

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Ubuntu 22.04下Vagrant实战:从环境配置到踩坑排查

1. 环境准备与项目背景

1.1 为什么在 Ubuntu 22.04 上使用 Vagrant

先说说标题里这三个关键词:ubuntu 22.04vagrant up。这个组合我反复折腾了小半年,踩了十几个坑,今天把整个过程完整复盘一遍。

vagrant up是 HashiCorp 出品的 Vagrant 工具的核心命令,本质是把"创建虚拟机、加载镜像、网络配置、端口映射、磁盘扩容"这一整套操作从手工流程变成一条命令。配合 Ubuntu 22.04 LTS(Jammy Jellyfish)这台宿主系统,可以快速拉起干净的开发环境,尤其适合在多机协作时统一团队成员的开发环境。

我先说一个最容易被忽视的事实:Ubuntu 22.04 对 Vagrant 的支持不是"开箱即用"的。在 22.04 上直接用apt install vagrant安装的版本往往是 2.2.19 或者更老的打包版本,而这个版本和 VirtualBox 6.1/7.0 的兼容性有坑,后面我会专门展开讲。

这篇内容适合三类人:

  • 想把本地开发环境从"手动装软件"升级为"代码化定义"的后端/前端工程师
  • 需要在 Ubuntu 22.04 上快速搭建可复现测试环境的运维/QA 同学
  • 以及像我一样,明明照着官方文档做,却总是被各种报错卡住的自学党

1.2 核心需求拆解:vagrant up 到底帮你做了什么

一条vagrant up命令,背后其实是一个完整的执行链:

  1. 读取 Vagrantfile:解析你定义的虚拟机配置,包括镜像名、内存、CPU、网络模式、启动后要执行的 shell 脚本
  2. 检查 box 是否存在virtualbox.box如果本地没有对应镜像,自动从远程仓库下载
  3. 创建虚拟机:调用 VirtualBox 的 VBoxManage 命令创建 VM
  4. 导入并启动:把 box 镜像导入 VirtualBox,启动虚拟机
  5. 网络配置:根据 Vagrantfile 里定义的私有网络或端口转发规则配置网络
  6. 同步目录:把宿主机的项目目录挂载到虚拟机里
  7. 执行 provision:如果 Vagrantfile 里写了 shell、Ansible、Puppet 等 provisioner,执行初始化脚本

这七个步骤是顺序执行的,任何一步出问题,vagrant up就会中断,并且大概率会报出"看起来像乱码但实际有迹可循"的错误。

在我自己的实测中,最耗时的一步是 box 下载(取决于网络情况,可能要 5-15 分钟),最容易出错的一步是 virtualbox provider 的适配。所以下文我会把环境准备、box 选型、Vagrantfile 配置这三个环节单独拆开分析。

2. 关键决策:虚拟化栈的选型与坑位

2.1 VirtualBox 还是 Hyper-V,这是个问题

很多人第一次在 Ubuntu 22.04 上跑vagrant up时会遇到一个尴尬:Vagrant 默认的 provider 是 VirtualBox,但如果你用的是 Windows 宿主机(WSL 里面的 Ubuntu 22.04),系统自带的 Hyper-V 会占用 VT-x 虚拟化指令,导致 VirtualBox 无法正常启动虚拟机。

我一开始就是用 Windows + WSL2 跑 Ubuntu 22.04,再在 WSL 里装 Vagrant 去调 VirtualBox。结果vagrant up直接就提示:

VT-x is not available (VERR_VMX_NO_VMX)

这个问题的根因是 Hyper-V 和 VirtualBox 争抢硬件虚拟化资源,两者不能同时使用。

实战中的三个方案:

方案优点缺点适用场景
关掉 Hyper-V,用 VirtualBox兼容性好,Vagrant 支持最全需要重启系统,Docker Desktop 会受牵连只用 VirtualBox 跑虚拟机
保留 Hyper-V,Vagrant 指定 hyperv provider不用关 Hyper-V,Docker 不冲突HyperV provider 的 box 支持少,且需要管理员权限Windows 宿主机上的开发调试
不用本地虚拟机,改用云上的 Ubuntu 22.04环境干净,不受本地虚拟化限制成本高,网络延迟大团队协作环境

我自己后来选择了方案一,因为 VirtualBox 对 Vagrant 的生态支持最完善,出问题也好排查。如果你坚持用 Hyper-V provider,那vagrant up的时候要指定:

vagrant up --provider hyperv

但要注意,hyperv provider 模式下,Vagrantfile 里config.vm.network "private_network"的语法和 VirtualBox 模式不完全兼容,需要额外配置交换机。

2.2 VirtualBox 版本与 Ubuntu 22.04 的兼容性实测

这是我最想强调的一个坑。如果直接用 Ubuntu 22.04 自带的 apt 源安装 VirtualBox:

sudo apt install virtualbox

安装的版本是 6.1.x 或者 7.0.x,但 Vagrant 官方对 VirtualBox 7.0 的支持直到 Vagrant 2.3+ 才完善。

实测下来,Vagrant 2.2.x + VirtualBox 7.0 的组合,vagrant up大概率会在"导入镜像"阶段报错

There was an error while executing `VBoxManage`, a CLI used by Vagrant for controlling VirtualBox. stderr: VBoxManage: error: Code E_FAIL (0x80004005) ...

解决方式有两类:

  1. 降级 VirtualBox 到 6.1.x(用 Oracle 官方 apt 源装指定版本)
  2. 升级 Vagrant 到 2.3.x 以上(直接去 GitHub 下载 .deb 包安装)

我推荐第二种,因为 Vagrant 2.3 之后的版本对 VirtualBox 7.0 和 Ubuntu 22.04 的支持都更好。

安装新版 Vagrant 的命令:

wget https://releases.hashicorp.com/vagrant/2.4.1/vagrant_2.4.1_linux_amd64.zip unzip vagrant_2.4.1_linux_amd64.zip sudo mv vagrant /usr/local/bin/ vagrant --version

这里有个细节:不要用snap install vagrant,snap 版有权限隔离问题,会导致 Vagrant 无法访问 VirtualBox 的驱动接口。

3. box 选型与 Vagrantfile 配置

3.1 怎么选一个高质量的 Ubuntu 22.04 box

box 就是虚拟机的基础镜像。Vagrant 社区最常用的镜像仓库是 Vagrant Cloud(app.vagrantup.com),你可以在上面搜索ubuntu 22.04,会看到一堆结果。

我拿几个典型例子对比一下:

box 名称体积登录用户特点
ubuntu/jammy64约 500MBvagrant/vagrant官方维护,最稳定,纯命令行
generic/ubuntu2204约 700MBvagrant/vagrant第三方维护,带 cloud-init 支持
bento/ubuntu-22.04约 800MBvagrant/vagrantChef 团队维护,包含常用工具
peru/ubuntu-22.04-server-amd64约 600MB自定义精简版,适合特殊场景

新手最稳妥的选择是ubuntu/jammy64,因为它是 Ubuntu 官方发布的 box,更新频率有保障,Vagrant 的默认配置对它支持最好。

添加 box 的命令:

vagrant box add ubuntu/jammy64

也可以指定版本:

vagrant box add ubuntu/jammy64 --box-version 20240821.0.0

3.2 从零手写一个 Vagrantfile

box 准备好之后,初始化一个项目目录:

mkdir ~/vagrant-lab cd ~/vagrant-lab vagrant init ubuntu/jammy64

这时会生成一个默认的 Vagrantfile。我直接分享一个经过我反复测试、可以稳定跑通的配置:

Vagrant.configure("2") do |config| # 基础镜像 config.vm.box = "ubuntu/jammy64" config.vm.box_version = "20240821.0.0" # 主机名 config.vm.hostname = "ubuntu-2204-dev" # 网络配置:私有网络,固定 IP config.vm.network "private_network", ip: "192.168.56.10" # 端口转发:宿主机 8080 -> 虚拟机 80 config.vm.network "forwarded_port", guest: 80, host: 8080 # VirtualBox provider 专有配置 config.vm.provider "virtualbox" do |vb| vb.name = "ubuntu-2204-dev" vb.memory = "2048" vb.cpus = 2 # 解决 Windows 下 vbox 网卡慢的问题 vb.customize ["modifyvm", :id, "--nictype1", "virtio"] end # 同步目录:宿主机 ./data 同步到虚拟机 /home/vagrant/data config.vm.synced_folder "./data", "/home/vagrant/data" # 首次启动时执行的 shell 脚本 config.vm.provision "shell", inline: <<-SHELL sudo apt-get update sudo apt-get install -y curl wget git vim SHELL end

几个配置项的解释:

  • config.vm.box_version:固定版本号很重要,避免不同人vagrant up时拉到不同版本的镜像,导致环境不一致
  • private_network:配置一个 host-only 网络,让我可以用192.168.56.10直接访问虚拟机,而不需要每次查 IP
  • config.vm.synced_folder:把宿主机的代码目录同步到虚拟机里,这样就实现了"在宿主机写代码、在虚拟机里跑服务"的开发模式

3.3 网络模式选择的深层逻辑

我在前面的配置里用了private_network,但实际应用里还经常用到另外几种网络模式。这里帮你理清:

  • 端口转发(默认模式):宿主机访问localhost:8080,流量被 VBox 转发到虚拟机的 80 端口。好处是宿主机和虚拟机的网络环境完全隔离,坏处是如果服务监听的是非 localhost 地址或者有二级端口依赖,转发规则会写得很累。
  • 私有网络(host-only):给虚拟机分配一个独立 IP,比如192.168.56.10。这样在宿主机上直接访问这个 IP 就行,多个虚拟机之间也可以互相通信。我在本机跑微服务调试时最喜欢这个模式。
  • 公有网络(bridge):虚拟机直接桥接到宿主机的物理网卡,从路由器获取 IP,相当于局域网内的一台独立主机。这种模式适合需要让其他同事访问你虚拟机里服务的时候用。

一个很容易被忽略的细节:Ubuntu 22.04 的默认镜像里,cloud-init 可能会重置网络配置。如果你改了/etc/netplan/下的配置,重启后却被还原,可以在 Vagrantfile 里加一行禁用 cloud-init 的网络管理:

config.vm.provision "shell", inline: <<-SHELL sudo systemctl disable --now cloud-init SHELL

4. 核心实操:完整的 vagrant up 流程记录

4.1 首次启动前的必备检查清单

在真正执行vagrant up之前,我每次都会做一套快速检查:

# 检查版本 vagrant --version VBoxManage --version # 确认 box 已存在 vagrant box list # 检查 VirtualBox 服务 systemctl status vboxdrv

如果vboxdrv没启动,可能是内核模块没加载。在 Ubuntu 22.04 上需要重新编译内核模块:

sudo apt install --reinstall virtualbox-dkms sudo modprobe vboxdrv

这一步不检查,后面大概率会遇到Kernel driver not installed (rc=-1908)的经典错误。

4.2 实战:vagrant up 从启动到登录

下面是我在一个全新 Ubuntu 22.04 环境中的完整操作记录:

cd ~/vagrant-lab vagrant up

第一次执行时,输出大概是这样的:

Bringing machine 'default' up with 'virtualbox' provider... ... ==> default: Importing base box 'ubuntu/jammy64'... ==> default: Matching MAC address for NAT networking... ==> default: Checking if box 'ubuntu/jammy64' is up to date... ==> default: Setting the name of the VM: ubuntu-2204-dev ==> default: Clearing any previously set network interfaces... ==> default: Preparing network interfaces based on configuration... default: Adapter 1: nat default: Adapter 2: hostonly ==> default: Forwarding ports... default: 22 (guest) => 2222 (host) (adapter 1) default: 80 (guest) => 8080 (host) (adapter 1) ... ==> default: Starting the machine... ==> default: Waiting for machine to boot. This may take a few minutes... default: SSH address: 127.0.0.1:2222 default: SSH username: vagrant default: SSH auth method: private key ==> default: Machine booted and ready! ==> default: Mounting shared folders... default: /home/vagrant/data => ./data ==> default: Running provisioner: shell... ==> default: Running: inline script

看到Machine booted and ready!就说明成功了。然后登录虚拟机:

vagrant ssh

登录之后你会直接进入ubuntu@ubuntu-2204-dev:~$的命令行。到这里,一台干净的 Ubuntu 22.04 虚拟机就已经跑起来了。

4.3 宿主机与虚拟机之间的文件互通

前面 Vagrantfile 里配置了config.vm.synced_folder "./data", "/home/vagrant/data"。你可以在宿主机上先创建目录:

mkdir -p ~/vagrant-lab/data echo "hello from host" > ~/vagrant-lab/data/hello.txt

然后进入虚拟机:

vagrant ssh cat /home/vagrant/data/hello.txt # 输出:hello from host

反过来,在虚拟机里写文件,宿主机同样能看到。这就是 Vagrant 最核心的开发体验:文件在宿主机编辑,程序在虚拟机里跑,两边看到的是同一份文件

有一类坑是:VirtualBox 的默认同步方式对大量小文件(比如 node_modules)性能很差。如果遇到同步慢的问题,可以改用 rsync 方式:

config.vm.synced_folder "./data", "/home/vagrant/data", type: "rsync"

但 rsync 是单向的,宿主机文件会覆盖虚拟机里的修改,需要配合vagrant rsync-auto来实现热更新。

4.4 虚拟机生命周期管理

vagrant up只是开始,日常使用中这几个命令几乎是每天必用的:

命令作用使用场景
vagrant ssh登录虚拟机日常操作
vagrant reload重启虚拟机并重新应用配置修改 Vagrantfile 后
vagrant provision只执行 provison 脚本改了初始化脚本后
vagrant suspend挂起虚拟机(保留内存状态)临时离开,快速恢复
vagrant halt关闭虚拟机收工
vagrant destroy删除虚拟机彻底清理环境

这里我要特别提醒一下:vagrant destroy会连带删除虚拟机的磁盘文件,如果虚拟机里有没提交的代码或数据库数据,就找不回来了。我的习惯是 destroy 之前先确认代码已经 push 到远端仓库,数据库至少做一次 dump。

5. 常见故障与排查技巧实录

5.1 故障速查表

我把这几个月遇到的高频问题整理成了一张表,方便你直接对照:

报错信息原因解决方案
VT-x is not availableHyper-V 占用虚拟化资源关闭 Hyper-V;或换 hyperv provider
Kernel driver not installed (rc=-1908)vboxdrv 内核模块未加载重装 virtualbox-dkms 并 modprobe
There was an error while executing VBoxManageVagrant 与 VirtualBox 版本不兼容升级 Vagrant 到 2.3+
Timed out while waiting for the machine to bootSSH 连接超时增大config.vm.boot_timeout,检查镜像网络
Authentication failurebox 的 SSH 密钥对不上重新添加 box,或vagrant ssh-config检查
Mounting shared folders failed虚拟机内 vboxsf 模块缺失升级 VirtualBox,重启虚拟机
The box 'ubuntu/jammy64' could not be foundbox 未添加或网络差了vagrant box add ubuntu/jammy64手动下载

5.2 一个亲历现场:SSH 超时问题排查全流程

有一次我在 Ubuntu 22.04 上执行vagrant up,报错:

Timed out while waiting for the machine to boot. This means that Vagrant was unable to communicate with the guest machine within the configured ("config.vm.boot_timeout" value) time period.

我的排查步骤:

第一步,确认虚拟机是否真的启动了

VBoxManage list runningvms # 如果有输出,说明 VM 起来了,问题出在 SSH 连接上

第二步,确认端口映射是否生效

netstat -an | grep 2222 # 看看 2222 端口有没有监听

第三步,尝试手动 SSH 连接

ssh -p 2222 vagrant@127.0.0.1 -i ~/vagrant-lab/.vagrant/machines/default/virtualbox/private_key

你会发现卡在输密码或者直接 Connection refused。这通常说明虚拟机里的 SSH 服务没起来,或者 box 的 SSH 配置有问题。最终解决方案是进入 VirtualBox 的图形界面,用虚拟机控制台登录,然后重启 sshd:

sudo systemctl restart ssh

这个操作之后,再执行vagrant reload就正常了。

5.3 网络适配器的坑:为什么虚拟机里上不了网

另一个高频问题是:虚拟机起来了,SSH 也能登录,但虚拟机里访问外网超时,apt update直接失败。

这个问题的根源通常出在 VirtualBox 的 NAT 网络适配器上。Ubuntu 22.04 box 默认使用的是 virtio 网卡驱动,但某些 VirtualBox 版本对 virtio 的支持有 bug。

解决方案是强制使用 e1000 网卡类型:

config.vm.provider "virtualbox" do |vb| vb.customize ["modifyvm", :id, "--nictype1", "e1000"] end

改完配置后执行:

vagrant reload

这个坑我在升级 VirtualBox 6.1 到 7.0 之后踩过一次,问题就出在 7.0 的 virtio 驱动兼容性上。

5.4 磁盘扩容和时间同步,两个容易被忽视的细节

这里补充两个很容易被忽略但实际影响很大的细节。

磁盘扩容:默认的ubuntu/jammy64box 的虚拟磁盘只有 10GB,装几个软件包之后就满了。扩容最直接的方案是用 VBoxManage 命令行:

# 先关闭虚拟机 vagrant halt # 把磁盘扩容到 40GB VBoxManage modifymedium disk ~/VirtualBox\ VMs/ubuntu-2204-dev/ubuntu-2204-dev.vdi --resize 40960 # 启动虚拟机,进入系统后用 growpart 扩展分区 vagrant ssh sudo growpart /dev/sda 1 sudo resize2fs /dev/sda1

这个过程我实测过,最后df -h能看到根分区从 10GB 变成了 40GB。关键是modifymedium只能扩容,不能缩容,所以一开始规划磁盘大小的时候宁可大一点。

时间同步:VirtualBox 默认的时钟漂移问题在 Ubuntu 22.04 上依然存在,宿主机睡眠唤醒后,虚拟机的时间会慢几分钟。这会导致cron任务错乱、SSH 证书校验失败等问题。

解决方案是启用 VirtualBox 的 guest property 时间同步:

config.vm.provider "virtualbox" do |vb| vb.customize ["guestproperty", "set", :id, "/VirtualBox/GuestAdd/VBoxService/--timesync-interval", "10000"] end

或者在虚拟机里安装增强功能:

vagrant ssh sudo apt install -y virtualbox-guest-utils sudo systemctl restart vboxservice

6. 进阶玩法与效率提升

6.1 多机环境:一个 Vagrantfile 启动多个虚拟机

假设你要模拟一个"前端 + 后端 + 数据库"的三层架构,不再需要手动开三个 VirtualBox 窗口,在同一个 Vagrantfile 里定义三台机器就行:

Vagrant.configure("2") do |config| config.vm.box = "ubuntu/jammy64" config.vm.define "web" do |web| web.vm.hostname = "web-server" web.vm.network "private_network", ip: "192.168.56.11" web.vm.provider "virtualbox" do |vb| vb.memory = "1024" vb.cpus = 1 end end config.vm.define "db" do |db| db.vm.hostname = "db-server" db.vm.network "private_network", ip: "192.168.56.12" db.vm.provider "virtualbox" do |vb| vb.memory = "2048" vb.cpus = 2 end end end

启动的时候:

vagrant up web vagrant up db

两台机器启动之后,web那台机器可以直接用私有 IP192.168.56.12访问db机器,完全模拟了真实服务器间的网络拓扑。

6.2 用 Ansible 批量配置虚拟机

Vagrant 内置的 shell provisioner 适合做简单配置,但如果你要装配多台机器,我强烈建议搭配 Ansible 用。

先安装 Ansible(在宿主机上装就行):

sudo apt install -y ansible

然后在 Vagrantfile 里指定 Ansible 作为 provisioner:

config.vm.provision "ansible" do |ansible| ansible.playbook = "playbook.yml" ansible.inventory_path = "inventory" ansible.verbose = "v" end

这样每次vagrant up --provision,Vagrant 都会调用 Ansible 按 playbook 配置虚拟机,而不是执行一长串 shell。Ansible 的幂等性保证脚本重复执行也不会出错,这是 shell 脚本做不到的。

6.3 快照功能:赶紧用起来

最后分享一个我自己的习惯:每次大改环境之前,先打个快照

Vagrant 1.8+ 之后就支持快照功能:

# 创建快照 vagrant snapshot save before-nginx # 查看快照列表 vagrant snapshot list # 恢复快照 vagrant snapshot restore before-nginx

我把这个推荐给了好几个同事,他们的反应都是"这么重要的功能怎么现在才知道"。

比如你想在虚拟机里试安装某个软件,结果把系统搞崩了,直接vagrant snapshot restore就回到崩之前的干净状态,不需要重新vagrant up再从零开始配置,能省下大量时间。

7. 写在最后的几条实操心得

我没有在总结里放什么高深的理论,直接分享几个亲手踩出来的经验:

第一,在所有 Vagrant 相关的操作前,先确认 VirtualBox 的 Guest Additions 版本和宿主机的 VirtualBox 版本一致。不一致几乎是各种挂载失败、网络异常的根源。检查方法:

vagrant ssh ls /opt/VBoxGuestAdditions-*/version

第二,box 文件存储路径改到非系统盘。Ubuntu 系统盘空间一般不大,box 下载多了很容易占满,尤其是你经常测试不同的发行版镜像时。可以通过设置环境变量VAGRANT_HOME把 box 存到别的盘:

export VAGRANT_HOME=/data/vagrant-home

第三,善用vagrant package导出自定义镜像。如果你在虚拟机里装好了一套完整的开发环境,执行:

vagrant package --output my-ubuntu-2204.box

打包出来的 box 可以直接分发给同事,他们只需要vagrant box add my-ubuntu-2204.box --name my-ubuntu,然后vagrant init my-ubuntu,就获得了一份和你一模一样的环境。这就是我理解的环境一致性:不是靠文档描述,而是靠一个 box 文件直接复现。

第四,遇到报错先看~/.vagrant.d/logs/vagrant.log。这个日志文件记录了你每次操作的完整输出,很多在终端看不到的细节都在里面。我排查过很多次问题,最后定位到根因靠的都是这个日志,而不是网上搜来的只言片语。

最后想说的是,vagrant up这条命令的底层逻辑其实很简单,难点全在它与具体操作系统、虚拟机软件的兼容性上。Ubuntu 22.04 作为一款长期支持版本,和 Vagrant 的配合已经是相当成熟了,只要注意版本匹配、box 选型和网络配置这几个关键点,它真的能成为你日常开发中最省心的工具之一。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/8 11:35:54

QML输入元素全面解析:从TextInput到与C++数据交互

这次我们接着聊QML输入元素。我翻了翻之前的留言&#xff0c;发现不少朋友卡在文本输入、焦点切换、还有和C交互取数据这几块&#xff0c;正好这次把输入元素系统梳理一遍。在QT的QML模块里&#xff0c;输入元素是构建交互界面的地基。不管是做个简单的登录框&#xff0c;还是复…

作者头像 李华
网站建设 2026/9/8 11:33:29

【原创分享】兔膀胱上皮(BEC)细胞的原代分离、培养Protocol

兔膀胱上皮&#xff08;BEC&#xff09;细胞的原代培养一、简介膀胱为重要的排尿器官&#xff0c;其组织结构与尿道基本相似&#xff0c;分为三层&#xff0c;即黏膜、肌层和外膜。膀胱的黏膜层呈粉红色&#xff0c;由移行上皮细胞组成&#xff0c;布满整个膀胱的最里层&#x…

作者头像 李华
网站建设 2026/9/8 11:33:10

工具变慢别急着换:一套性能退化排查与维护方法

“Q33 再也没了往日的丝滑。”最近一次批量任务跑起来之后&#xff0c;我等了很久都等不到结果。坐在屏幕前&#xff0c;那句标题里的话一直在我脑子里转&#xff1a;哦……好吧&#xff0c;反正也不会有人看标题随便写写吧&#xff0c;我老了&#xff0c;Q33 也没了往日的丝滑…

作者头像 李华
网站建设 2026/9/8 11:31:51

三大ORM框架性能实测:MyBatis-Plus、JPA与Spring Data JDBC对比

1. 为什么还要做一次ORM性能测试&#xff1a;动机与目标 先说结论&#xff1a;我这次跑Benchmark&#xff0c;不是想证明某一个ORM天下第一&#xff0c;也不是想搞一个"碾压全场"的流量标题。原因其实很朴素—— 团队内部对选型有分歧&#xff0c;吵了两个月没结果 …

作者头像 李华
网站建设 2026/9/8 11:30:08

嵌入式Linux屏与安卓屏选型指南:开机速度、稳定性与成本全解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/8 11:29:24

STM32F103 AB双分区OTA升级:基于FreeModbus与标准库的可靠实现

STM32F103做OTA已经不算新鲜事&#xff0c;但要把OTA做成A/B双分区、带完整回滚机制、还能通过Modbus RTU串口稳定传输固件&#xff0c;这组合确实少见。我这次是把FreeModbus v1.6移植到标准库v3.5环境下&#xff0c;配合自定义Bootloader&#xff0c;实现了基于RS232串口的A/…

作者头像 李华