2. 开发环境搭建:安装Linux虚拟机(Ubuntu)、配置网络与SSH、安装必要的开发工具(gcc、make、git、vim)、搭建TFTP/NFS服务器

做嵌入式开发,第一件事不是写代码,而是先把窝搭好。

我见过太多新手,上来就急着编译内核,结果环境缺这缺那,折腾半天连个Hello World都跑不起来。说白了,开发环境就是你的工作台。工具顺手了,后面的事才能快。

这一章,咱们把Ubuntu虚拟机装好,网络配通,SSH连上,再把常用的开发工具和TFTP/NFS服务器都架起来。嗯,一步到位。

2.1 为什么选Ubuntu?

Linux发行版那么多,为什么我推荐Ubuntu?

  • 社区活跃:遇到问题,Google一下基本都有答案。
  • 软件包新:gcc、make、git这些工具,apt install一把梭。
  • 兼容性好:Buildroot官方测试最多的就是Ubuntu LTS版本。

我个人习惯用Ubuntu 22.04 LTS,稳定,支持周期长,用到2027年没问题。

小提示:如果你用Windows,推荐VMware Workstation或VirtualBox。我偏向VMware,性能损耗小,快照功能好用。VirtualBox免费,也够用。

2.2 安装Ubuntu虚拟机

步骤不复杂,我列个清单,你照着做就行。

  1. 下载镜像:去Ubuntu官网下载22.04 LTS的ISO文件。
  2. 新建虚拟机:选择“典型”安装,稍后安装操作系统。
  3. 分配资源:
    • 内存:至少4GB,建议8GB。
    • CPU:2核起步,4核更舒服。
    • 磁盘:40GB,动态分配。
  4. 挂载ISO:启动虚拟机,选择下载好的Ubuntu镜像。
  5. 安装系统:一路默认,设置用户名和密码。我习惯用ubuntu作为用户名。
注意:磁盘空间别给太小。编译Buildroot和Linux内核时,动辄需要10-20GB空间。我曾经给20GB,结果编译到一半磁盘满了,那叫一个尴尬。

2.3 配置网络与SSH

虚拟机装好了,但怎么跟宿主机通信?两个东西必须配:网络模式和SSH服务。

2.3.1 网络模式选择

模式 特点 适用场景
NAT 虚拟机共享宿主机IP上网,外部无法直接访问虚拟机 仅需上网,不需要外部连接
桥接 虚拟机独立IP,与宿主机在同一网段 需要SSH、TFTP、NFS等网络服务
仅主机 只能与宿主机通信,不能上网 调试阶段,隔离环境

我推荐桥接模式。这样虚拟机就像一台独立的机器,开发板也能直接访问它。你想想看,后面搭建TFTP和NFS服务器,如果虚拟机跟开发板不在一个网段,那得多麻烦。

2.3.2 配置静态IP

桥接模式下,我习惯给虚拟机配静态IP,免得每次重启IP都变。

# 编辑网络配置文件
sudo vim /etc/netplan/01-netcfg.yaml

# 内容如下
network:
  version: 2
  ethernets:
    ens33:
      dhcp4: no
      addresses:
        - 192.168.1.100/24
      gateway4: 192.168.1.1
      nameservers:
        addresses:
          - 8.8.8.8
          - 114.114.114.114

# 应用配置
sudo netplan apply

2.3.3 安装并启用SSH

SSH是嵌入式开发的标配。你总不想每次都跑到虚拟机前操作吧?

# 安装SSH服务
sudo apt update
sudo apt install openssh-server -y

# 检查服务状态
sudo systemctl status ssh

# 允许root登录(可选,我一般不开启)
sudo vim /etc/ssh/sshd_config
# 修改 PermitRootLogin yes

# 重启服务
sudo systemctl restart ssh

配好之后,在宿主机上用ssh ubuntu@192.168.1.100就能连上了。嗯,舒服多了。

2.4 安装必要的开发工具

嵌入式开发离不开这几个工具:gcc、make、git、vim。装起来很简单,但版本要注意。

# 一键安装
sudo apt install build-essential git vim -y

# 验证版本
gcc --version
make --version
git --version
vim --version
工具 作用 最低版本要求
gcc C语言编译器,编译内核和BusyBox 9.0+
make 构建工具,管理编译过程 4.0+
git 版本控制,拉取源码 2.25+
vim 文本编辑器,改配置全靠它 8.0+
额外推荐:再装个tree和htop,看目录结构和系统资源很方便。
sudo apt install tree htop -y

2.5 搭建TFTP服务器

TFTP(Trivial File Transfer Protocol)是嵌入式开发中用来传输内核镜像和设备树文件的。它简单、轻量,U-Boot直接支持。

2.5.1 安装与配置

# 安装TFTP服务
sudo apt install tftpd-hpa -y

# 创建TFTP根目录
sudo mkdir -p /srv/tftp
sudo chmod 777 /srv/tftp

# 编辑配置文件
sudo vim /etc/default/tftpd-hpa

# 内容如下
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/srv/tftp"
TFTP_ADDRESS="0.0.0.0:69"
TFTP_OPTIONS="--secure --create"

# 重启服务
sudo systemctl restart tftpd-hpa
sudo systemctl enable tftpd-hpa

2.5.2 测试TFTP

# 在TFTP目录放一个测试文件
echo "Hello TFTP" | sudo tee /srv/tftp/test.txt

# 在另一台机器上测试(或本机localhost)
tftp 192.168.1.100
tftp> get test.txt
tftp> quit

# 查看是否下载成功
cat test.txt
避坑指南:防火墙要放行UDP 69端口。我曾经配了半天连不上,最后发现是ufw没关。
sudo ufw disable

2.6 搭建NFS服务器

NFS(Network File System)用来共享根文件系统。开发阶段,把根文件系统放在NFS上,开发板通过网络挂载,省去反复烧写的麻烦。

2.6.1 安装与配置

# 安装NFS服务
sudo apt install nfs-kernel-server -y

# 创建共享目录
sudo mkdir -p /srv/nfs
sudo chmod 777 /srv/nfs

# 编辑导出文件
sudo vim /etc/exports

# 添加以下内容(允许开发板访问)
/srv/nfs 192.168.1.0/24(rw,sync,no_subtree_check,no_root_squash)

# 应用配置
sudo exportfs -a
sudo systemctl restart nfs-kernel-server

2.6.2 测试NFS

# 在共享目录放一个测试文件
echo "Hello NFS" | sudo tee /srv/nfs/test.txt

# 在虚拟机本机挂载测试
sudo mount -t nfs 192.168.1.100:/srv/nfs /mnt
cat /mnt/test.txt
sudo umount /mnt
注意:no_root_squash这个选项很重要。如果不加,开发板上的root用户会被映射成nobody,导致权限问题。我刚开始就踩过这个坑,文件能读不能写,查了半天。

2.7 本章知识结构

下面这张图,把整个开发环境的关系理清楚了。

嵌入式开发环境结构图 宿主机 (Windows/Mac) SSH客户端 / 开发IDE Ubuntu虚拟机 gcc / make / git / vim 目标开发板 U-Boot / Linux内核 网络服务层 SSH (22端口) 远程登录 TFTP (69端口) 传输内核/设备树 NFS (2049端口) 共享根文件系统 HTTP 可选 关键说明 1. 宿主机通过SSH连接Ubuntu虚拟机,进行代码编辑和编译 2. 虚拟机通过TFTP向开发板传输内核镜像(zImage)和设备树(.dtb) 3. 虚拟机通过NFS向开发板共享根文件系统(rootfs),开发板网络挂载启动 4. 所有服务都运行在桥接网络模式下,保证IP互通

2.8 验证环境

所有东西都配好了,最后一步:验证一下环境是否完整。

# 1. 检查工具链
gcc --version
make --version
git --version

# 2. 检查网络
ping -c 3 192.168.1.1
ping -c 3 8.8.8.8

# 3. 检查SSH
ssh ubuntu@192.168.1.100

# 4. 检查TFTP
tftp 192.168.1.100 -c get test.txt

# 5. 检查NFS
showmount -e 192.168.1.100

如果每一步都返回正常,恭喜你,开发环境搭建完毕。后面就可以安心搞编译了。

我的习惯:每次搭建完新环境,我都会写一个env_check.sh脚本,把这些检查命令放进去。下次换机器或者重装系统,跑一遍脚本就完事,省心。