4. Linux 发行版选择与安装:Ubuntu LTS 版本选择、分区方案、软件源配置
做嵌入式驱动开发,第一件事就是选对 Linux 发行版。说实话,我见过不少新手在发行版上纠结很久——Ubuntu、Debian、Fedora、Arch 挨个试,最后发现时间全花在折腾系统上了。我的建议很直接:用 Ubuntu LTS,别犹豫。
4.1 为什么是 Ubuntu LTS?
LTS 是 Long Term Support 的缩写,也就是长期支持版。Ubuntu 每两年发布一个 LTS 版本,官方提供 5 年安全更新和维护。这对嵌入式开发来说太重要了——你想想看,一个驱动项目可能持续两三年,如果系统中途停止维护,那工具链、编译器、内核头文件都可能出兼容性问题。
我个人习惯用 Ubuntu 22.04 LTS(Jammy Jellyfish)。为什么是这个版本?
- 内核版本 5.15:对主流 ARM 和 RISC-V 开发板支持已经很成熟
- GCC 11.3:交叉编译工具链兼容性好,不会出现奇怪的链接错误
- 社区资源丰富:遇到问题,Stack Overflow 上基本都有答案
- 长期支持到 2027 年:一个项目周期内不用操心系统升级
4.2 分区方案:给驱动开发留足空间
很多人装 Linux 时直接「使用整个磁盘」一路下一步,结果用着用着就发现 /home 不够用了,或者 /boot 分区太小导致内核更新失败。做驱动开发,分区方案得提前规划好。
我推荐的分区方案是这样的(以 256GB SSD 为例):
| 分区 | 大小 | 文件系统 | 挂载点 | 说明 |
|---|---|---|---|---|
| EFI 系统分区 | 512 MB | FAT32 | /boot/efi | UEFI 启动必需 |
| /boot | 1 GB | ext4 | /boot | 存放内核和 initrd,别太小 |
| 根分区 | 50 GB | ext4 | / | 系统和软件安装 |
| /home | 剩余全部 | ext4 | /home | 代码、工具链、SDK 都放这里 |
| 交换分区 | 8 GB | swap | — | 内存不够时用,建议等于内存大小 |
如果你用的是双系统(Windows + Ubuntu),记得先给 Windows 留足空间,然后在空闲区域创建这些分区。安装时选择「其他选项」,手动指定挂载点。
4.3 软件源配置:别让下载速度拖后腿
系统装好之后,第一件事就是换软件源。Ubuntu 默认的源服务器在国外,下载速度慢得让人抓狂。我记得第一次装 Ubuntu 时,apt update 跑了半小时还没完,后来才发现是源的问题。
换源的方法很简单:
- 备份原文件:
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak - 编辑 sources.list:
sudo vim /etc/apt/sources.list - 把里面的
archive.ubuntu.com替换成国内镜像源地址
常用的国内镜像源有:
| 镜像站 | 地址 | 特点 |
|---|---|---|
| 阿里云 | mirrors.aliyun.com | 速度快,更新及时 |
| 清华大学 | mirrors.tuna.tsinghua.edu.cn | 稳定,教育网友好 |
| 中科大 | mirrors.ustc.edu.cn | 老牌镜像站,可靠性高 |
| 华为云 | mirrors.huaweicloud.com | 企业级稳定性 |
以阿里云为例,22.04 的 sources.list 内容大致如下:
deb http://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ jammy-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ jammy-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ jammy-backports main restricted universe multiverse
换源后别忘了执行:
sudo apt update
sudo apt upgrade -y
这样才能让新源生效,并把系统更新到最新状态。
4.4 安装后的必备软件包
系统就绪后,我会立刻安装一组基础开发工具。这些是驱动开发的「标配」:
sudo apt install -y build-essential git vim curl wget \
net-tools openssh-server tree htop \
gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf \
gcc-aarch64-linux-gnu g++-aarch64-linux-gnu \
libncurses-dev flex bison libssl-dev \
device-tree-compiler u-boot-tools
简单解释一下这些包的作用:
- build-essential:编译必备,包含 GCC、make 等
- git:版本管理,内核源码和驱动代码都靠它
- arm-linux-gnueabihf:32 位 ARM 交叉编译器
- aarch64-linux-gnu:64 位 ARM 交叉编译器
- libncurses-dev:内核配置时
make menuconfig需要 - device-tree-compiler:编译设备树文件(.dts → .dtb)
- u-boot-tools:制作 U-Boot 镜像的工具
4.5 本章知识体系
下面这张图帮你理清本章的核心逻辑:
说白了,这一章就三件事:选对版本、分好区、配好源。这三步做好了,后面搭建交叉编译环境、编译内核、编写驱动模块才能顺风顺水。别小看这些基础工作——我见过太多人因为分区不够或者源太慢,浪费了大把时间在环境问题上。