3、开发主机准备:Linux主机安装(虚拟机/双系统/WSL)、常用开发工具(vim、git、ssh)安装与配置

嵌入式Linux开发与传统的单片机开发、Windows桌面应用开发有一个本质区别:整个工具链、内核源码、交叉编译环境、文件系统构建工具几乎全部原生运行在Linux环境中。如果开发主机本身不是Linux,那么后续的每一步——从内核配置到根文件系统制作——都会陷入“在Windows上模拟Linux”的泥潭,遇到大量路径分隔符、权限模型、符号链接、大小写敏感等底层差异问题。因此,本章的核心任务是为后续30个章节的实操搭建一个稳定、可复现、贴近真实生产环境的Linux工作台。我们将从三种主流安装方式(虚拟机、双系统、WSL)的选型对比开始,然后完成vim、git、ssh三大基础工具的安装与配置,并给出一个完整的“从零到可编译内核模块”的验证闭环。

开发主机Linux环境选型与工具链关系图 虚拟机 (VMware/VirtualBox) 隔离性高,快照方便 性能损耗约5-15% 双系统 (Dual Boot) 原生性能,完全访问硬件 切换需重启,分区有风险 WSL2 (Windows Subsystem) 轻量启动快,与Windows共存 I/O性能弱,USB/串口需转发 选择原则: USB/串口调试→双系统或虚拟机直通 vim 代码编辑/内核配置 git 版本管理/补丁管理 ssh 远程登录/文件传输 验证闭环:编写hello.c → git提交 → ssh推送到开发板

上图展示了本章的核心逻辑:三种安装方式各有优劣,但最终都要落到vim、git、ssh这三个工具上。无论选择哪条路径,工具链的配置标准是一致的。下面我们逐一展开。

3.1 三种Linux安装方式的核心原理与选型判断

3.1.1 虚拟机:隔离与快照的工程价值

虚拟机(VM)通过Hypervisor层(如VMware Workstation、VirtualBox)在宿主机上模拟出一套完整的硬件环境(CPU、内存、磁盘、网卡等),Linux运行在虚拟硬件之上。它的核心优势在于隔离性和可快照性。对于嵌入式开发,这意味着你可以随时保存一个“内核编译环境已就绪”的快照,当后续实验把系统搞崩溃时,一键恢复到干净状态。此外,虚拟机的网络模式(NAT、桥接、Host-Only)可以灵活模拟开发板与主机的网络拓扑。

判断方法:如果你需要同时使用Windows下的Office、EDA工具、串口调试助手,且开发板通过USB或网络与主机交互,虚拟机是最稳妥的选择。但要注意,虚拟机对USB设备的直通支持(特别是USB转串口芯片如CH340、CP2102)需要安装VMware Tools或VirtualBox Extension Pack,否则可能出现设备识别不稳定。

3.1.2 双系统:性能与硬件访问的极致

双系统在物理硬盘上划分独立分区,分别安装Windows和Linux。引导时通过GRUB选择操作系统。它的优势是原生性能——CPU、内存、磁盘I/O完全无虚拟化损耗,对于编译大型内核(如全志、瑞芯微的BSP)能节省20%-30%的时间。同时,对串口、JTAG调试器、USB设备的访问最直接,不存在虚拟化层的兼容性问题。

判断方法:如果你的开发工作流中80%以上的时间都在Linux下,且电脑配置足够(建议16GB内存以上,512GB SSD剩余空间),双系统是长期最佳选择。但风险在于:分区操作有数据丢失风险,且Windows与Linux之间的文件交换需要额外挂载NTFS分区(可能遇到权限和锁文件问题)。

3.1.3 WSL2:轻量级与Windows生态融合

WSL2(Windows Subsystem for Linux 2)基于轻量级Hyper-V虚拟机,提供了一个完整的Linux内核。它的启动速度极快(秒级),内存动态分配,且可以直接访问Windows文件系统(通过/mnt/c)。对于嵌入式开发,WSL2最大的痛点在于I/O性能——跨文件系统操作(在/mnt/c下编译)速度极慢,且对USB串口、JTAG调试器的支持需要额外的usbipd-win工具转发,配置复杂且不稳定。

判断方法:WSL2适合学习、脚本编写、轻量级编译(如单个驱动模块),但不适合需要频繁操作串口、USB设备或编译大型BSP的场景。如果你只是刚开始接触嵌入式Linux,WSL2可以让你快速上手,但后续深入时建议迁移到虚拟机或双系统。

风险提示:无论选择哪种方式,务必在安装前备份重要数据。双系统分区操作建议使用GParted Live CD进行,避免Windows磁盘管理器的兼容性问题。虚拟机磁盘文件(.vmdk/.vdi)建议放在SSD上,并定期清理快照,否则会占用大量磁盘空间。

3.1.4 三种方式对比表

对比维度虚拟机双系统WSL2
性能损耗5%-15%无约5%(但跨文件系统I/O极慢)
USB/串口支持需安装扩展包,稳定原生支持需usbipd-win转发,不稳定
启动速度30秒-1分钟1-2分钟(含GRUB等待)秒级
Windows文件访问通过共享文件夹挂载NTFS分区直接/mnt/c访问
快照/回滚支持,方便不支持不支持(可导出tar)
推荐场景开发板调试、多环境隔离长期主力开发、大型编译学习、脚本、轻量编译

3.2 常用开发工具安装与配置

3.2.1 vim:嵌入式开发的编辑器基石

vim是Linux环境下最核心的文本编辑器,尤其在嵌入式领域,你经常需要SSH到无图形界面的开发板上修改配置文件或源码。vim的学习曲线陡峭,但一旦掌握,编辑效率远超图形化IDE。安装非常简单:

# Debian/Ubuntu系
sudo apt update
sudo apt install -y vim

# 配置vim(~/.vimrc)
echo "set number" >> ~/.vimrc
echo "set tabstop=4" >> ~/.vimrc
echo "set shiftwidth=4" >> ~/.vimrc
echo "set expandtab" >> ~/.vimrc
echo "syntax on" >> ~/.vimrc
echo "set mouse=a" >> ~/.vimrc

核心配置说明:set number显示行号,tabstop=4将Tab键显示为4个空格宽度,expandtab将Tab自动转换为空格(避免Makefile中Tab与空格混用导致错误),syntax on开启语法高亮。对于嵌入式开发,建议额外安装vim-plugin管理器(如Vundle或vim-plug),用于管理代码补全插件(如YouCompleteMe或coc.nvim),但初期不必过度配置,先熟练基本操作。

经验提醒:在嵌入式开发中,经常需要编辑Makefile。Makefile要求命令前必须是Tab键,而不是空格。如果你在vim中设置了expandtab,编辑Makefile时请使用:set noexpandtab临时关闭,或者使用:set list查看隐藏字符,避免“missing separator”错误。

3.2.2 git:版本管理与补丁流转的命脉

git在嵌入式Linux开发中不仅是代码版本管理工具,更是与上游社区(kernel.org、U-Boot、Buildroot)交互的标准方式。你经常需要git clone内核源码、git format-patch生成补丁、git am应用补丁。安装与基础配置:

sudo apt install -y git

# 配置用户信息(必须)
git config --global user.name "Your Name"
git config --global user.email "your.email@example.com"

# 配置别名(提高效率)
git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.st status
git config --global alias.lg "log --oneline --graph --all --decorate"

# 配置默认分支名(新版本git)
git config --global init.defaultBranch main

核心原理:git的三大区域(工作区、暂存区、版本库)和四种对象(blob、tree、commit、tag)构成了完整的版本追踪体系。在嵌入式开发中,你通常不会直接操作底层对象,但必须理解git reset(回退)、git rebase(变基)、git cherry-pick(挑选提交)这三个命令在补丁管理中的关键作用。

3.2.3 ssh:远程登录与文件传输的安全通道

ssh(Secure Shell)是嵌入式开发中连接开发板、远程服务器、代码仓库(GitHub/GitLab)的加密通道。安装与配置:

sudo apt install -y openssh-server openssh-client

# 启动ssh服务(开发主机作为服务器时)
sudo systemctl enable ssh
sudo systemctl start ssh

# 生成密钥对(免密登录)
ssh-keygen -t ed25519 -C "embedded-dev"
# 一路回车即可,默认保存在~/.ssh/id_ed25519

# 将公钥复制到开发板(假设开发板IP为192.168.1.100)
ssh-copy-id root@192.168.1.100

关键配置说明:生成密钥对时,-t ed25519指定使用Ed25519算法(比RSA更安全且更短)。ssh-copy-id会自动将公钥追加到目标主机的~/.ssh/authorized_keys文件中,实现免密登录。对于嵌入式开发板,通常使用root用户登录,且开发板的SSH配置可能较旧,如果遇到no matching key exchange method错误,需要在~/.ssh/config中添加兼容配置:

Host board
    HostName 192.168.1.100
    User root
    KexAlgorithms +diffie-hellman-group14-sha1
    HostKeyAlgorithms +ssh-rsa
    PubkeyAcceptedAlgorithms +ssh-rsa

3.3 实战案例:从零搭建可编译内核模块的Linux工作台

本案例的目标是在一台Windows 10主机上,通过虚拟机(VMware Workstation 16)安装Ubuntu 22.04 LTS,并完成工具链配置,最终成功编译一个最简单的内核模块(hello.ko)。这个案例覆盖了本章所有知识点,并验证了环境可用性。

背景与约束:主机配置为i7-12700H、32GB内存、1TB SSD。开发板为树莓派4B(ARM64架构),后续需要交叉编译,但本案例仅验证本机编译能力。虚拟机分配8GB内存、4核CPU、100GB磁盘。

操作步骤:

  1. 虚拟机安装:下载Ubuntu 22.04 LTS ISO镜像,VMware选择“典型”安装,自定义硬件中设置内存8GB、处理器4核、磁盘100GB(拆分为多个文件)。网络选择NAT模式(便于后续桥接切换)。
  2. 系统更新与基础工具:进入系统后,执行sudo apt update && sudo apt upgrade -y,然后安装vim、git、ssh、build-essential(包含gcc、make等编译工具):sudo apt install -y vim git openssh-server build-essential。
  3. 配置vim和git:按3.2.1和3.2.2的配置命令执行,并验证vim --version和git --version。
  4. 验证ssh:在Windows主机上打开PowerShell,执行ssh user@虚拟机IP,输入密码登录成功。然后执行ssh-keygen生成密钥,使用ssh-copy-id实现免密登录。
  5. 编写并编译内核模块:创建测试目录mkdir -p ~/dev/hello && cd ~/dev/hello,编写hello.c:
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>

static int __init hello_init(void) {
    printk(KERN_INFO "Hello, Embedded Linux!\n");
    return 0;
}

static void __exit hello_exit(void) {
    printk(KERN_INFO "Goodbye, Embedded Linux!\n");
}

module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("A simple Hello World module");
MODULE_VERSION("0.1");

编写Makefile:

obj-m += hello.o

KERNEL_DIR := /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)

all:
    $(MAKE) -C $(KERNEL_DIR) M=$(PWD) modules

clean:
    $(MAKE) -C $(KERNEL_DIR) M=$(PWD) clean

执行make,如果看到hello.ko生成,说明环境正常。然后sudo insmod hello.ko,dmesg | tail查看内核日志,应看到“Hello, Embedded Linux!”。最后sudo rmmod hello卸载模块。

结果与复盘:整个过程耗时约30分钟(含系统安装)。关键风险点在于:VMware的USB直通未配置,导致后续连接开发板时需要额外设置;内核模块编译需要安装linux-headers-$(uname -r),如果缺失会报错Cannot find kernel headers,需执行sudo apt install linux-headers-$(uname -r)。此外,Makefile中的$(MAKE)必须使用Tab缩进,否则报错missing separator。

案例总结:这个案例验证了虚拟机方案的可行性。对于后续的交叉编译(如ARM64),只需在虚拟机上安装对应的交叉编译工具链(gcc-aarch64-linux-gnu),并修改Makefile中的CROSS_COMPILE变量即可。虚拟机快照功能在此时发挥巨大作用——在安装完所有基础工具后拍摄快照,后续实验失败可随时回滚。

3.4 常见误区与总结复盘

误区一:在Windows上使用Source Insight或VS Code直接编辑Linux源码。这会导致文件权限、换行符(CRLF vs LF)、编码问题。Linux内核源码要求LF换行符,且Makefile对Tab敏感。正确做法是:所有编辑操作在Linux虚拟机内完成,或使用VS Code的Remote-SSH插件连接到Linux主机。

误区二:git配置不完整。很多初学者跳过user.name和user.email配置,导致提交时出现“Please tell me who you are”错误。更严重的是,如果后续需要向社区提交补丁,错误的邮箱会导致无法署名。

误区三:ssh密钥权限设置错误。如果~/.ssh目录或authorized_keys文件权限过于开放(如777),sshd会拒绝使用密钥认证。正确权限为:~/.ssh目录700,authorized_keys文件600。

误区四:忽视虚拟机磁盘扩容。Ubuntu默认使用LVM,但VMware磁盘文件如果创建时设置为“单个文件”,后续扩容需要额外操作。建议创建时选择“拆分为多个文件”,并预留至少20GB的扩展空间。