一、开发环境选型:虚拟机还是双系统?

做Linux内核开发,第一个要面对的问题就是:环境怎么搭?

我个人习惯用虚拟机。为什么?因为方便。你想想看,写内核代码免不了要频繁编译、重启、甚至把系统搞崩。虚拟机里搞坏了,拍个快照就恢复,省心。双系统虽然性能更好,但切换起来太麻烦,而且一旦引导出问题,修复起来够你喝一壶的。

当然,如果你要做性能敏感的实验,比如测量内核调度延迟、跑实时性测试,那还是双系统靠谱。虚拟机毕竟有虚拟化层,时间精度会受影响。

嗯,这里我直接给结论:

  • 日常开发、调试、学习 → 虚拟机(VMware 或 VirtualBox)
  • 性能测试、硬件相关实验 → 双系统

下面我分别讲两种方案怎么搭。

二、虚拟机方案:VMware 与 VirtualBox

2.1 选哪个?

这两个我都用过。VMware Workstation 功能更全,3D加速、快照管理、网络配置都更顺手。VirtualBox 免费开源,够用,但偶尔会有小毛病。

我个人建议:

  • 如果你在公司用,有预算 → VMware
  • 如果自己学习,不想花钱 → VirtualBox

两者安装过程大同小异,我以 VirtualBox 为例讲一下关键步骤。

2.2 安装 VirtualBox

去官网下载对应系统的安装包,一路下一步就行。这里有个坑:

注意: Windows 下安装时,如果提示需要启用 Hyper-V 或关闭内核隔离,建议按提示操作。否则虚拟机启动会报错。我曾经在这上面浪费过半小时。

安装完后,记得去「设置 → 网络」里添加一个「仅主机(Host-Only)网络」。这个后面共享文件和 SSH 连接会用到。

2.3 创建虚拟机

点击「新建」,按以下配置:

配置项推荐值说明
内存4GB 以上编译内核很吃内存,2GB 会卡死
CPU2 核以上多核编译能快不少
磁盘40GB 以上内核源码 + 编译产物,20GB 不够用
网络桥接 + 仅主机一个上网,一个本地通信

磁盘类型选 VDI,动态分配。别选固定大小,不然一开始就占满硬盘。

三、安装 Ubuntu Server

做内核开发,我推荐用 Ubuntu Server LTS 版本,比如 22.04 或 24.04。桌面版没必要,浪费资源。而且服务器版默认不装图形界面,更干净。

3.1 下载镜像

ubuntu.com/download/server 下载 ISO 文件。注意选 LTS 版本,别追新。LTS 稳定,社区支持好,遇到问题容易搜到答案。

3.2 安装过程

挂载 ISO,启动虚拟机。安装步骤很简单,我挑几个关键点说:

  • 磁盘分区:选「Use Entire Disk」就行,不用手动分区。除非你要搞 LVM 或加密。
  • 软件包选择:只勾选「OpenSSH server」和「Standard system utilities」。其他都不要,后面需要什么再装。
  • 用户名:建议用简单名字,比如 dev。后面 SSH 和 SCP 方便。
小技巧: 安装时设置好静态 IP,或者安装后改。我习惯用 192.168.56.101 这种 Host-Only 网段的地址,这样宿主机和虚拟机通信不走外网,安全又稳定。

3.3 安装后配置

装完重启,先做几件事:

# 更新系统
sudo apt update && sudo apt upgrade -y

# 安装编译工具链
sudo apt install build-essential flex bison libncurses-dev libssl-dev libelf-dev

# 安装 Git
sudo apt install git

# 安装网络工具
sudo apt install net-tools

这些是编译内核的必备工具。缺了任何一个,编译都会报错。我刚开始学的时候,就因为少装了 libssl-dev,卡了半天。

四、双系统引导配置

如果你决定用双系统,那引导配置是关键。搞不好 Windows 就进不去了。

4.1 分区准备

在 Windows 里用磁盘管理,压缩出一个空闲分区。建议 60GB 以上。不要格式化,留给 Ubuntu 安装程序用。

警告: 操作前一定备份重要数据!我见过太多人分区搞崩了系统。尤其是 UEFI + GPT 的机器,操作不当会直接无法启动。

4.2 安装 Ubuntu

用 U 盘启动 Ubuntu 安装盘。安装时选「Install Ubuntu alongside Windows Boot Manager」。安装程序会自动处理引导。

如果安装后只能进 Ubuntu,进不去 Windows,别慌。在终端执行:

sudo update-grub

这个命令会重新扫描硬盘上的操作系统,更新 GRUB 菜单。重启后应该就能看到 Windows 选项了。

4.3 手动修复引导

如果 update-grub 没用,那就手动修:

# 查看分区
sudo fdisk -l

# 挂载 EFI 分区(通常是 /dev/nvme0n1p1 或 /dev/sda1)
sudo mount /dev/nvme0n1p1 /mnt

# 检查是否有 Windows 的 EFI 文件
ls /mnt/EFI/Microsoft

# 如果没有,需要从 Windows 恢复盘修复

嗯,这里不展开讲。双系统引导修复是个大话题,后面有专门章节讲。

五、网络与共享文件夹设置

环境搭好了,怎么把代码传进去?总不能每次都 U 盘拷吧。

5.1 网络配置

虚拟机里,我习惯配两个网卡:

  • 网卡1(NAT):用来上网,下载软件包
  • 网卡2(Host-Only):用来和宿主机通信,SSH、SCP 都走这个

在 VirtualBox 里,给虚拟机添加 Host-Only 网卡后,进系统配置:

# 查看网卡名称
ip link

# 编辑网络配置(Ubuntu 22.04 用 netplan)
sudo vim /etc/netplan/00-installer-config.yaml

配置文件内容:

network:
  version: 2
  ethernets:
    enp0s3:
      dhcp4: true
    enp0s8:
      addresses:
        - 192.168.56.101/24

然后 sudo netplan apply 生效。之后你就可以从宿主机 SSH 过去了:

ssh dev@192.168.56.101

5.2 共享文件夹

VirtualBox 的共享文件夹功能,说白了就是让宿主机和虚拟机共用一个目录。我经常把内核源码放在共享文件夹里,两边都能编辑。

设置步骤:

  1. 虚拟机设置 → 共享文件夹 → 添加一个宿主机目录
  2. 勾选「自动挂载」和「固定分配」
  3. 进虚拟机,挂载共享文件夹:
# 安装增强功能
sudo apt install virtualbox-guest-utils

# 挂载(通常自动挂载到 /media/sf_xxx)
sudo mount -t vboxsf 共享文件夹名 /mnt/shared

# 如果权限不够,把自己加到 vboxsf 组
sudo usermod -aG vboxsf $USER
避坑指南: 我曾经在共享文件夹里直接编译内核,结果编译到一半报错。原因是共享文件系统不支持某些文件属性。后来我改成在虚拟机本地编译,编译完再把产物拷回共享文件夹。这个坑你们别踩。

六、本章知识体系

下面这张图总结了本章的核心内容,帮你理清思路:

Linux内核开发环境搭建 · 知识体系 开发环境选型 虚拟机方案 VMware/VirtualBox Ubuntu Server安装 网络与共享文件夹 双系统方案 分区与安装 GRUB引导配置 引导修复 日常开发用虚拟机 · 性能测试用双系统 必备工具链:build-essential · flex · bison · libncurses-dev · libssl-dev 网络配置:NAT(上网)+ Host-Only(本地通信)

七、写在最后

环境搭建是第一步,也是最重要的一步。我见过太多人卡在环境上,还没开始写代码就放弃了。其实没那么复杂,按上面的步骤走,半小时就能搞定。

记住几个要点:

  • 虚拟机里配双网卡,一个上网一个通信
  • 共享文件夹别直接编译,拷到本地再编
  • 双系统先备份,引导坏了有办法修

好了,环境搭好之后,下一章我们就要开始真正接触内核源码了。到时候我会讲怎么下载、阅读和第一次编译内核。


公众号:蓝海资料掘金营,微信deep3321