第二章:开发环境准备——Linux主机环境搭建

说实话,很多初学者在Buildroot上栽跟头,不是Buildroot本身有多难,而是开发环境没搭好。我见过太多人花了一周时间折腾环境,最后发现只是少装了一个包。这一章,咱们就把地基打牢。

2.1 选择你的Linux发行版

我个人习惯用Ubuntu 20.04 LTS或22.04 LTS。为什么?因为社区支持最好,遇到问题随便一搜就有答案。Debian也行,但包名有时候会有点小差异。

你可能会问:「我用CentOS行不行?」嗯,理论上可以,但我不建议。Buildroot官方测试最多的就是Ubuntu/Debian,你用其他发行版,可能会遇到一些莫名其妙的依赖问题。我曾经有个学员用Arch Linux,折腾了三天才把环境配好——不是不能做,是没必要给自己加戏。

我的建议:如果你手头没有现成的Linux机器,直接在Windows上装个VMware或VirtualBox,跑一个Ubuntu 22.04。分配4GB内存、40GB硬盘就够了。别用WSL,WSL在某些网络配置上会有坑。

2.2 安装必要依赖包

Buildroot的依赖说多不多,说少不少。少了哪个,编译到一半就报错,那才叫崩溃。我整理了一个清单,你直接复制粘贴就行。

先更新你的包管理器:

sudo apt update
sudo apt upgrade -y

然后安装核心依赖:

sudo apt install -y \
    build-essential \
    git \
    wget \
    cpio \
    unzip \
    file \
    bc \
    rsync \
    libncurses5-dev \
    libssl-dev \
    flex \
    bison \
    python3 \
    python3-pip \
    python3-venv \
    u-boot-tools \
    device-tree-compiler

这里面有几个关键点:

  • build-essential:包含了gcc、g++、make等编译工具链。没有它,你什么都编译不了。
  • libncurses5-dev:这是Buildroot的menuconfig界面依赖。少了它,你配不了内核选项。
  • device-tree-compiler:编译设备树用的。做嵌入式Linux,设备树是绕不开的坎。

避坑指南:我曾经在Ubuntu 18.04上遇到过python版本太老导致Buildroot脚本报错。建议至少用Python 3.8以上。检查方法:python3 --version

2.3 配置Git与Repo

Git是版本控制的基础,Repo是Google为Android开发的多仓库管理工具。虽然Buildroot本身不需要Repo,但如果你要管理多个BSP包,Repo会很有用。

2.3.1 安装并配置Git

sudo apt install -y git
git config --global user.name "你的名字"
git config --global user.email "你的邮箱@example.com"

我个人习惯再加几个配置:

git config --global core.editor "vim"
git config --global color.ui true
git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.st status

这些别名能让你少打几个字。你想想看,每天敲几十次git命令,省下来的时间够喝杯咖啡了。

2.3.2 安装Repo工具

mkdir -p ~/bin
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo

然后把~/bin加到PATH里:

echo 'export PATH=$PATH:~/bin' >> ~/.bashrc
source ~/.bashrc

注意:Repo工具依赖Python 3。如果你系统默认的python指向的是Python 2,记得改一下:sudo ln -sf /usr/bin/python3 /usr/bin/python

2.4 搭建TFTP/NFS服务器

这两个服务是嵌入式开发中的「快递员」和「共享文件夹」。TFTP用来把内核、设备树传到开发板,NFS用来让开发板挂载根文件系统。调试阶段用NFS,能省去反复烧写Flash的时间。

2.4.1 搭建TFTP服务器

安装tftp-hpa:

sudo apt install -y tftpd-hpa

配置文件在/etc/default/tftpd-hpa,我一般改成这样:

TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/srv/tftp"
TFTP_ADDRESS="0.0.0.0:69"
TFTP_OPTIONS="--secure --create"

然后创建目录并设置权限:

sudo mkdir -p /srv/tftp
sudo chmod 777 /srv/tftp
sudo systemctl restart tftpd-hpa
sudo systemctl enable tftpd-hpa

测试一下:

echo "Hello TFTP" | sudo tee /srv/tftp/test.txt
tftp localhost
tftp> get test.txt
tftp> quit
cat test.txt

如果看到「Hello TFTP」,说明TFTP跑起来了。

我的经验:TFTP默认端口是69,很多公司防火墙会拦这个端口。如果你在公司内网开发,记得跟IT申请开放UDP 69端口。我曾经因为这个卡了一整天,最后发现是防火墙在搞鬼。

2.4.2 搭建NFS服务器

安装nfs-kernel-server:

sudo apt install -y nfs-kernel-server

编辑/etc/exports文件,添加共享目录:

/srv/nfs 192.168.1.0/24(rw,sync,no_subtree_check,no_root_squash)

解释一下这几个参数:

  • rw:读写权限。调试阶段必须开。
  • sync:同步写入。数据更安全,但速度稍慢。
  • no_subtree_check:禁用子树检查。提高性能。
  • no_root_squash:允许root用户以root权限访问。这个很重要,因为开发板上很多操作需要root权限。

然后创建目录并启动服务:

sudo mkdir -p /srv/nfs
sudo chmod 777 /srv/nfs
sudo exportfs -a
sudo systemctl restart nfs-kernel-server
sudo systemctl enable nfs-kernel-server

验证NFS是否正常工作:

showmount -e localhost

应该能看到你刚才配置的共享目录。

安全提醒:no_root_squash这个选项在生产环境千万别用。它意味着任何客户端都能以root身份操作你的NFS共享目录。调试阶段图方便可以开,但产品发布前一定要关掉。

2.5 本章知识体系

下面这张图帮你理清开发环境的整体结构:

开发环境知识体系 Linux主机(Ubuntu/Debian) 必要依赖包(build-essential, libncurses5-dev, python3等) 版本控制(Git + Repo) TFTP服务器 + NFS服务器

说白了,整个开发环境就是一层叠一层。底层是操作系统,上面是依赖包,再上面是工具链,最上面是网络服务。哪一层出问题,Buildroot都跑不起来。

2.6 验证环境是否就绪

最后,我习惯跑一个快速检查脚本,确认所有东西都到位了:

#!/bin/bash
echo "=== 检查开发环境 ==="

# 检查Git
git --version &>/dev/null && echo "✓ Git 已安装" || echo "✗ Git 未安装"

# 检查编译工具
gcc --version &>/dev/null && echo "✓ GCC 已安装" || echo "✗ GCC 未安装"
make --version &>/dev/null && echo "✓ Make 已安装" || echo "✗ Make 未安装"

# 检查Python
python3 --version &>/dev/null && echo "✓ Python3 已安装" || echo "✗ Python3 未安装"

# 检查TFTP
systemctl is-active tftpd-hpa &>/dev/null && echo "✓ TFTP 服务运行中" || echo "✗ TFTP 服务未运行"

# 检查NFS
systemctl is-active nfs-kernel-server &>/dev/null && echo "✓ NFS 服务运行中" || echo "✗ NFS 服务未运行"

echo "=== 检查完毕 ==="

把这段脚本保存为check_env.sh,然后chmod +x check_env.sh && ./check_env.sh。如果所有项都打勾,恭喜你,环境准备好了。

最后说一句:开发环境搭建这件事,看起来琐碎,但值得你花时间一次搞定。我见过太多人「先跑起来再说」,结果编译到一半缺这个缺那个,反而更浪费时间。磨刀不误砍柴工,这句话在嵌入式开发里尤其适用。


专注资料整理