尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

ESP-IDF国内镜像快速安装:Ubuntu换源与工具链加速全攻略

ESP-IDF国内镜像快速安装:Ubuntu换源与工具链加速全攻略 1. 先搞清楚ESP-IDF到底在装什么以及为什么卡我最早接触ESP-IDF是在一个物联网项目上需要同时适配ESP32-S3和ESP32-C3两块板子。第一次在Ubuntu上按官方文档安装直接卡到怀疑人生git clone --recursive跑了快一个小时进度条纹丝不动接着下载工具链又提示超时折腾到凌晨才把环境跑通。后来摸清了ESP-IDF的安装机制才发现它不是简单的“下载一个压缩包解压”就完事而是分三步走拉取框架源码和子模块。ESP-IDF的主仓库在GitHub上主仓库里还引用了几十个第三方子模块比如工具链的下载脚本、各类组件库。这里的网络开销最大也是最容易卡住的地方。下载对应芯片的预编译工具链。不同目标芯片对应不同的工具链比如xtensa-esp-elf、riscv32-esp-elf这些几百兆的玩意儿托管在GitHub Releases上网络一波动就断。创建Python虚拟环境并安装pip包。IDF会在~/.espressif下建一个Python虚拟环境然后通过pip安装idf-component-manager、esptool等一系列包。看到这里你就明白了所谓“国内源快速安装”本质上是把这三步里的网络请求全部替换成国内可达的镜像地址。我建议的加速策略是“三段式替换”apt源管系统依赖、pip源管Python包、GitHub镜像管源码和工具链。三者各管一段互相不替代。提示网上很多教程只说“换个pip源就好了”那只能解决第三步的加速。真正的瓶颈往往在第一步和第二步也就是GitHub仓库和工具链的下载这也是本文要重点展开的部分。2. 动手前先把系统源和Python源切换好2.1 确认Ubuntu版本和系统架构安装前先执行两条命令确认环境避免后续装出来的工具链不匹配cat /etc/os-release uname -muname -m输出的是x86_64还是aarch64直接决定了ESP-IDF下载的预编译工具链版本。我见过有人在一台ARM架构的云服务器上硬套x86的安装教程最后工具链跑不起来排查半天才发现是架构搞错了。目前主要的分水岭是Ubuntu 22.04和24.04。22.04及更早的版本的软件源配置文件是/etc/apt/sources.list而24.04换成了新的deb822格式配置文件在/etc/apt/sources.list.d/ubuntu.sources。两者改法略有不同别搞混。2.2 更换apt源22.04和24.04的两种改法先备份再修改这是最基本的操作习惯。一个坑是网上很多教程直接把整个sources.list内容替换成清华源或者阿里云源这在旧版本上没问题但如果你的系统是24.04直接改sources.list是无效的得改ubuntu.sources文件。22.04及之前版本用清华源替换sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak sudo sed -i s//.*archive.ubuntu.com//mirrors.tuna.tsinghua.edu.cng; s//security.ubuntu.com//mirrors.tuna.tsinghua.edu.cng /etc/apt/sources.list sudo apt update24.04版本用同样的思路改deb822格式的文件sudo cp /etc/apt/sources.list.d/ubuntu.sources /etc/apt/sources.list.d/ubuntu.sources.bak sudo sed -i s//archive.ubuntu.com//mirrors.tuna.tsinghua.edu.cng; s//security.ubuntu.com//mirrors.tuna.tsinghua.edu.cng /etc/apt/sources.list.d/ubuntu.sources sudo apt update这里解释一下为什么用s///*archive.ubuntu.com这种通配写法而不是直接替换整行。Ubuntu官方的软件源域名在不同区域有差异有的机器解析出来是archive.ubuntu.com有的是cn.archive.ubuntu.com通配写法可以一次性覆盖这些变体。换成清华源之后apt install下载系统包的速度会有质的提升尤其是装那些编译依赖的时候体感非常明显。2.3 安装编译ESP-IDF所需的系统依赖ESP-IDF的编译链依赖不少系统库和工具官方文档给的安装命令比较分散我这里整理成一条命令直接在终端执行sudo apt install -y git wget flex bison gperf python3 python3-pip python3-venv cmake ninja-build ccache libffi-dev libssl-dev libusb-1.0-0逐个说下哪些是必须的git和wget拉取源码和下载工具链用缺一不可。flex、bison、gperf编译IDF内部组件时要用到的语法分析器和代码生成器少一个都会在编译阶段报错而且报错信息比较隐晦容易让人误判为代码问题。python3、python3-pip、python3-venvIDF的工具链和构建脚本基于Python运行虚拟环境隔离依赖装完系统Python包互相污染的事我遇到过太多次。cmake和ninja-buildIDF从v4.0开始全面转向CMake构建系统ninja是实际的构建执行器比make快不少。ccache编译缓存工具第二次编译同一份代码能快一半以上强烈建议装上。libusb-1.0-0USB串口烧录依赖这个库不装的话esptool可能识别不到板子。如果你是想在Ubuntu 24.04上装这个清单覆盖得已经比较全了。装完之后顺手执行一下cmake --version确认版本号不低于3.16。太老的系统比如Ubuntu 20.04自带的CMake可能不满足要求后面我会在问题排查里专门讲。2.4 配置pip国内源一劳永逸ESP-IDF在安装和运行过程中会通过pip下载大量Python包比如construct、pyserial、ecdsa、pyelftools等。这些包虽然体积不大但在网络不稳的情况下频繁超时重试非常影响心情。pip的国内源配置是用户级的执行一次后对当前用户所有pip操作都生效不需要反复指定pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple如果提示pip命令不存在先执行python3 -m pip install --upgrade pip装好pip。清华源的同步频率在几个主流镜像站里属于比较快的我用了几年没遇到过包版本滞后的情况。阿里云源和腾讯源也可以用选一个你网络延迟低的就行。到这里系统级的“三级加速”已经铺垫完毕接下来正式进入ESP-IDF的安装环节。3. 用国内镜像快速安装ESP-IDF的两种靠谱做法3.1 方法一用esp-gitee-tools一键式安装最省心乐鑫官方在国内维护了一套Gitee镜像工具叫esp-gitee-tools专门用来解决国内开发者拉取源码和子模块慢的问题。我从v4.4时代就用它到现在换了几台机器依然觉得这是最省心的路线。执行步骤如下建议先把工作目录统一规划好我习惯放在~/esp下mkdir -p ~/esp cd ~/esp git clone https://gitee.com/EspressifSystems/esp-gitee-tools.git git clone https://gitee.com/EspressifSystems/esp-idf.git -b v5.3注意第二句clone时-b v5.3指定了分支。我建议不要clone默认的master分支原因有两点一是master分支处于持续开发状态工具链和组件版本可能随时变动今天能编译的工程下周可能就编译不过了二是官方对LTS版本比如v5.1和v5.3有长期的维护承诺遇到问题更容易在社区搜到解决方案。接着设置IDF_PATH环境变量让工具知道去哪里找框架源码export IDF_PATH$HOME/esp/esp-idf然后调用esp-gitee-tools里的安装脚本。这个脚本和IDF自带的install.sh功能一致但内部通过镜像下载工具链和Python依赖速度完全不在一个量级cd ~/esp/esp-gitee-tools ./install.sh esp32这里的esp32是目标芯片参数。我这台机器同时调试ESP32-S3和ESP32-C3的话可以直接传esp32,esp32s3,esp32c3用逗号分隔一次性把多套工具链都装上./install.sh esp32,esp32s3,esp32c3官方支持的芯片参数包括esp32、esp32s2、esp32s3、esp32c3、esp32c6、esp32h2等。不确定的话执行./install.sh --help查看帮助。安装脚本跑完之后在终端激活环境变量source $IDF_PATH/export.sh如果你用的是fish或者zshexport.sh也有对应的变体。到这里第一个方案就算完成了整个过程如果网络正常通常在10分钟以内能搞定。3.2 方法二官方install.sh配合CDN加速适合喜欢官方流程的人如果你不想用Gitee镜像仓库还是希望保持官方install.sh的标准流程也有一个折中方案通过IDF_GITHUB_ASSETS环境变量把工具链的下载地址切换到乐鑫在国内的CDN。步骤同样是先clone主仓库不过这里从GitHub直接clone对网络要求更高cd ~/esp git clone --recursive https://github.com/espressif/esp-idf.git -b v5.3--recursive参数一次性拉取所有子模块。如果这一步卡住或者失败说明你的网络环境对GitHub的连接确实不友好直接退回去用方法一的Gitee镜像更靠谱。clone成功之后在安装前设置CDN变量export IDF_GITHUB_ASSETSdl.espressif.cn/github_assets这个变量的作用原理是IDF的安装脚本在下载预编译工具链时会拼接URL默认指向github.com/espressif下的Releases设置成dl.espressif.cn/github_assets后URL会被重定向到乐鑫的国内CDN节点。这一步解决的就是我开头说的“第二步下载工具链”的瓶颈。然后执行标准安装cd ~/esp/esp-idf ./install.sh esp32同样安装完后执行source $IDF_PATH/export.sh这里有个实际体会即使CDN加速了工具链下载git clone --recursive从GitHub拉子模块的过程依然可能会卡。如果反复重试都不行可以在clone后单独用esp-gitee-tools里的submodule-update.sh来修复cd ~/esp/esp-gitee-tools ./submodule-update.sh这个脚本会识别$IDF_PATH指向的仓库然后从Gitee镜像批量更新子模块。两种方法可以混用不冲突。3.3 激活环境并编译一个工程验证装完环境不验证等于白装。我习惯用hello_world这个例程做冒烟测试它能最快暴露环境缺失的问题。先设置环境变量如果新开终端需要重新执行source $IDF_PATH/export.sh然后复制例程到自己的工作目录并编译mkdir -p ~/esp/examples cp -r $IDF_PATH/examples/get-started/hello_world ~/esp/examples/ cd ~/esp/examples/hello_world idf.py set-target esp32 idf.py buildidf.py set-target esp32这一步会生成sdkconfig文件明确当前工程的芯片型号并下载对应的工具链。首次编译会需要几分钟看到Project build complete.就说明环境OK。如果手边有开发板可以顺手验证一下烧录链路。先把板子的USB接到电脑上执行idf.py -p /dev/ttyUSB0 flash monitor-p参数指定串口设备。这个命令会编译、烧录、打开串口监视器一条龙完成。看到开发板输出的Hello world!日志环境就完全跑通了。3.4 把环境变量固化到.bashrc每次开新终端都要手动source $IDF_PATH/export.sh太累人也容易忘。我把这行写进了~/.bashrcecho export IDF_PATH$HOME/esp/esp-idf ~/.bashrc echo source $IDF_PATH/export.sh ~/.bashrc source ~/.bashrc这样每次打开终端IDF的命令就自动可用了。要注意的是export.sh会把Python虚拟环境和工具链的bin目录临时加入当前终端的PATH写进~/.bashrc后任何新建的终端都会带上这些路径idf.py这个命令就可以直接执行。注意如果你平时还有其他嵌入式开发环境比如Zephyr、STM32的CubeMX要注意export.sh会和它们的工具链环境变量产生一定的相互影响。我在同一台机器上同时用过ESP-IDF和Zephyr两者都往PATH里添加各自的工具链路径偶发出现调用到错误工具链的情况。解决办法是不要把所有环境变量都写进~/.bashrc而是用alias或者独立的脚本按项目来激活。4. 高频问题排查实录4.1 安装进度一直卡在0%这是被问得最多的问题没有之一。install.sh跑到一半进度条卡在0%停住多半是下载工具链时连接不上GitHub Releases。这种情况别反复重试改走两条路如果你用的是esp-gitee-tools方法检查是否已经正确设置IDF_PATH。没有IDF_PATH时脚本不知道该去哪个目录更新会一直等待。如果你用的是官方install.sh确认IDF_GITHUB_ASSETS变量是否已经生效执行echo $IDF_GITHUB_ASSETS输出应该包含dl.espressif.cn。如果变量是空的说明你新开的终端把export语句丢掉了重新设置再跑一次。另外卡在0%还有一种情况是下载过程没有输出日志看起来像假死但其实还在跑。可以用-v参数查看详细输出./install.sh -v esp324.2 pip下载慢或者依赖装不上这个问题通常表现为安装脚本尾部反复出现ReadTimeoutError或者ConnectionResetError。这个最好解决先确认系统pip源是否已配置pip config list看到global.index-url一栏指向pypi.tuna.tsinghua.edu.cn就说明配置生效了。IDF的install.sh会优先读取系统pip的配置所以只要在用户级配好脚本内部的pip操作也会自动走国内源。有些场景下我在内网或者Docker容器里安装不想改全局pip配置就在执行install.sh前临时指定源export PIP_INDEX_URLhttps://mirrors.aliyun.com/pypi/simple/ ./install.sh esp32这个变量只对当前终端生效装完不影响系统其他pip使用。4.3 CLion的Marketplace里找不到ESP-IDF插件CLion用户经常遇到这个问题。JetBrains的插件市场在国内的访问时好时坏搜索不到插件不一定是没有也可能是插件列表拉取超时。我推荐两个办法。第一个是到JetBrains插件商店网页搜索“ESP-IDF”手动下载对应CLion版本的zip包然后打开CLion进入Settings - Plugins - 齿轮图标 - Install Plugin from Disk选择下载的zip离线安装。第二个办法是检查CLion版本和插件的兼容性——乐鑫官方插件要求CLion 2023.1以上太老的版本列表里不会显示。还有个坑离线安装插件后第一次新建项目会弹窗要求下载工具链这里进度条同样可能卡住。建议直接用插件设置里的Use existing ESP-IDF installation把IDF_PATH指向我们已经装好环境的目录让CLion复用现有的工具链不要再让它重复下载。4.4 VSCode终端编译提示找不到idf.pyVSCode的终端和系统终端是独立的不会自动继承~/.bashrc里的环境变量能配对的扩展甚至会自动source环境但大多数情况下还是需要手动来一下。如果你习惯在VSCode集成终端里编译先执行source $IDF_PATH/export.sh确保idf.py命令可用后再执行idf.py build。如果用官方扩展“Espressif IDF”在扩展设置里指定IDF_PATH路径并选择“Use existing setup”这样扩展会直接复用我们已经安装好的环境不要在扩展里再触发一次工具链下载那是另一个容易卡住的地方。4.5 CMake版本过低引发编译报错如果你是在Ubuntu 20.04或者更老的版本上安装系统自带CMake可能只有3.16而部分ESP-IDF版本要求3.16以上。编译时会出现类似CMake 3.16 or higher is required. You are running version 3.10.2的报错。解决办法有两种。一是通过apt升级但老版本系统的apt源里CMake版本往往也很旧二是在Python虚拟环境里装一个较新的CMake用pip install cmake --upgrade装完通过which cmake确认是否优先指向pip安装的版本。我实测下来pip版CMake在Ubuntu上运行稳定可以用。4.6 串口设备识别不到或烧录没权限开发板插上后执行ls /dev/ttyUSB*或者ls /dev/ttyACM*找不到设备大概率是权限问题。Ubuntu下串口设备默认属于dialout组需要把当前用户加入这个组sudo usermod -aG dialout $USER执行完要注销重新登录或者重启系统才能生效。之后执行idf.py -p /dev/ttyUSB0 flash就能正常烧录了。还有个小事有些板子是CH340芯片Ubuntu 22.04之后内核自带驱动不需要额外装但如果是CP210x系列同样也是免驱的。如果插上后设备名都没出现用dmesg | tail -20查看内核日志确认是不是USB线的问题——我踩过这个坑最后发现是线只能充电不能传数据。4.7 Ubuntu 24.04换源后apt update报错24.04的deb822格式文件里有Suites: noble noble-updates noble-backports noble-security这样的配置直接全局替换域名是没问题的。但如果你用的是清华源还要注意源配置文件里如果是从旧版升级过来的可能出现Release文件过期的报错。这种情况把/etc/apt/sources.list.d/ubuntu.sources里的URIs:整行改成http://mirrors.tuna.tsinghua.edu.cn/ubuntu/然后sudo apt update一般就能解决。5. 装完之后进一步提升开发效率的几个配置5.1 开启ccache让重复编译变快如果你和我一样经常在同一个工程上反复改代码然后编译ccache能实实在在帮你省时间。ESP-IDF对ccache的支持是内置的只要系统装了ccache并且环境变量里有它IDF构建时就会自动启用。执行以下命令确认ccache已安装which ccache然后建议把它写进~/.bashrc确保终端里始终能识别export PATH/usr/lib/ccache:$PATH实际体感不清理构建缓存的情况下改一行代码后的增量编译能从每次一分钟缩短到十几秒非常爽。5.2 记住这几个最常用的idf.py命令日常开发用到的命令无非就那几个我总结成一张速查表放在手边命令作用idf.py set-target esp32s3设置目标芯片idf.py menuconfig打开图形化配置界面idf.py build编译工程idf.py -p /dev/ttyUSB0 flash烧录固件idf.py -p /dev/ttyUSB0 monitor打开串口监视器idf.py fullclean清除编译产物idf.py size查看固件各部分大小一个实用技巧执行idf.py flash monitor会先烧录再打开监视器退出监视器的快捷键是Ctrl]。刚接触的人经常用CtrlC退出但这样做会把监视器杀掉下次烧录还要重新连接别问我怎么知道的。5.3 多版本ESP-IDF共存管理不同项目锁定的ESP-IDF版本可能不一样。比如老项目用v4.4.x新项目用v5.3。我见过有人直接在同一个目录下切换分支结果子模块全部乱七八糟。我的做法是把不同版本放在独立的目录下~/esp/esp-idf-v4.4 ~/esp/esp-idf-v5.3需要哪个版本就在~/.bashrc里修改IDF_PATH指向对应目录或者写一个切换脚本在项目根目录执行source激活特定版本。这样最干净避免了版本之间的工具链和Python依赖互相干扰。据说还有个idf-env工具能统一管理多个环境但我没用过如果你装了多个版本手动管理目录已经足够可靠了。最后再分享一个我在实际安装中悟出来的体会安装ESP-IDF这种依赖链很长的环境千万不要闷头一路回车。每执行一个步骤都花十秒钟确认一下输出日志里有没有报错尤其注意git clone和install.sh末尾有没有“successful”字样。网络问题导致的半成品环境排查起来比全新安装还麻烦。我第一次装的时候就是因为中间断网工具链文件不完整编译时报出一些莫名其妙的链接错误当时完全摸不着头脑。现在我的流程固定成一条龙先换系统源再装依赖然后配pip源最后用esp-gitee-tools装IDF总共不到二十分钟。这套流程我换了好几次电脑重装过很多遍亲测下来稳定可复现照着做基本不会再卡在安装这一步。
返回列表