第 2 章:内核配置与工具安装
第 2 章:内核配置与工具安装
工欲善其事,必先利其器
2.1 环境要求
硬件要求
| 组件 | 最低要求 | 推荐配置 |
|---|---|---|
| CPU | x86_64 / ARM64 | 多核(压缩需要 CPU) |
| 内存 | 512 MB | ≥ 2 GB(B-Tree 缓存需要内存) |
| 磁盘 | 任意块设备 | SSD(性能最佳) |
| 架构 | x86_64, ARM64, RISC-V | x86_64(测试最充分) |
软件要求
| 组件 | 最低版本 | 推荐版本 |
|---|---|---|
| Linux 内核 | 6.7 | ≥ 6.12 |
| bcachefs-tools | 1.9.x | ≥ 1.13 |
| 编译器 | GCC 10+ | GCC 13+ |
| 发行版 | 任意现代 Linux | Arch / Fedora / Debian 13 |
2.2 方案一:使用发行版预编译内核(推荐)
大多数现代发行版的内核已经内置 Bcachefs 支持。
Arch Linux
# Arch Linux 自 6.7 内核起默认包含 bcachefs 模块
# 检查当前内核版本
uname -r
# 输出示例: 6.12.1-arch1-1
# 检查 bcachefs 模块是否可用
modinfo bcachefs
# 如果有输出,说明内核支持
# 安装 bcachefs-tools
sudo pacman -S bcachefs-tools
# 验证安装
bcachefs version
Fedora (41+)
# Fedora 41+ 内核内置 bcachefs
sudo dnf install bcachefs-tools
# 验证
bcachefs version
Debian 13 (Trixie) / Ubuntu 24.10+
# Debian 13 内核已包含 bcachefs
sudo apt update
sudo apt install bcachefs-tools
# 对于 Ubuntu,可能需要 PPA
# sudo add-apt-repository ppa:bcachefs/ppa
# sudo apt update
# sudo apt install bcachefs-tools
# 验证
bcachefs version
openSUSE Tumbleweed
# Tumbleweed 使用最新内核
sudo zypper install bcachefs-tools
# 验证
bcachefs version
检查内核是否支持 Bcachefs
# 方法 1: 检查模块
modinfo bcachefs 2>/dev/null && echo "模块可用" || echo "模块不可用"
# 方法 2: 检查内核配置
zcat /proc/config.gz | grep BCACHEFS
# 或
grep BCAHCEFS /boot/config-$(uname -r)
# 期望输出:
# CONFIG_BCACHEFS_FS=m (模块方式)
# CONFIG_BCACHEFS_FS=y (内建方式)
2.3 方案二:编译自定义内核
当发行版内核版本太低,或需要自定义配置时,需要手动编译内核。
2.3.1 获取内核源码
# 创建工作目录
mkdir -p ~/kernel-build && cd ~/kernel-build
# 方法 1: 从 kernel.org 下载
wget https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.12.tar.xz
tar xf linux-6.12.tar.xz
cd linux-6.12
# 方法 2: 从 Git 克隆(推荐,便于后续更新)
git clone --depth=1 https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
cd linux
# 或者获取特定版本
git tag -l 'v6.12*'
git checkout v6.12
2.3.2 安装编译依赖
# Debian/Ubuntu
sudo apt install build-essential bc flex bison libelf-dev \
libssl-dev libncurses-dev dwarves
# Fedora
sudo dnf install gcc make flex bison elfutils-libelf-devel \
openssl-devel ncurses-devel dwarves
# Arch Linux
sudo pacman -S base-devel xmlto kmod inetutils bc libelf \
cpio perl tar xz
2.3.3 配置内核
# 基于当前配置
cp /boot/config-$(uname -r) .config
make olddefconfig
# 或者使用菜单配置
make menuconfig
在菜单中启用 Bcachefs:
File systems --->
<*> bcachefs filesystem support
[*] bcachefs debugging
[*] bcachefs assertions (debug builds)
或者直接通过命令行修改配置:
# 启用 bcachefs 为模块(推荐)
./scripts/config --module BCAHCEFS_FS
# 或启用为内建
./scripts/config --enable BCAHCEFS_FS
# 启用调试选项(开发时推荐)
./scripts/config --enable BCAHCEFS_DEBUG
./scripts/config --enable BCAHCEFS_ASSERT
# 查看当前配置状态
grep BCAHCEFS .config
2.3.4 编译与安装
# 查看 CPU 核心数
nproc
# 假设输出 8
# 编译内核(使用所有核心)
make -j$(nproc)
# 编译模块
make modules
# 安装模块
sudo make modules_install
# 安装内核
sudo make install
# 生成 initramfs
# Debian/Ubuntu
sudo update-initramfs -c -k 6.12.0
# Fedora/RHEL
sudo dracut --force /boot/initramfs-6.12.0.img 6.12.0
# Arch Linux
sudo mkinitcpio -k 6.12.0 -g /boot/initramfs-6.12.0.img
# 更新引导加载器
sudo update-grub # GRUB
# 或
sudo bootctl update # systemd-boot
2.3.5 验证新内核
# 重启
sudo reboot
# 验证内核版本
uname -r
# 输出: 6.12.0
# 验证 bcachefs 模块
modinfo bcachefs
# 检查内核配置
zcat /proc/config.gz | grep BCAHCEFS
# 或
grep BCAHCEFS /boot/config-$(uname -r)
2.4 方案三:使用 Linux-next 或开发分支
如果需要最新特性和修复:
# 获取 linux-next(包含最新开发代码)
git clone https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
cd linux-next
# 或获取 bcachefs 专属分支
git clone https://evilpiepirate.org/git/bcachefs.git
cd bcachefs
# 配置和编译同上
cp /boot/config-$(uname -r) .config
make olddefconfig
# 确保 BCAHCEFS_FS=y 或 =m
make -j$(nproc)
sudo make modules_install
sudo make install
⚠️ 注意: 开发分支可能不稳定,不建议在生产环境使用。
2.5 安装 bcachefs-tools
2.5.1 从包管理器安装(推荐)
# 已在 2.2 节展示各发行版的安装命令
# 验证安装
bcachefs version
bcachefs --help
2.5.2 从源码编译
当包管理器版本太旧时:
# 安装 Rust 工具链(bcachefs-tools 已用 Rust 重写)
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
source $HOME/.cargo/env
# 安装依赖
# Debian/Ubuntu
sudo apt install pkg-config libaio-dev libblkid-dev \
libkeyutils-dev libzstd-dev liblz4-dev zlib1g-dev \
libsodium-dev liburcu-dev uuid-dev libudev-dev
# Fedora
sudo dnf install pkgconfig libaio-devel libblkid-devel \
keyutils-libs-devel libzstd-devel lz4-devel zlib-devel \
libsodium-devel userspace-rcu-devel libuuid-devel systemd-devel
# Arch Linux
sudo pacman -S libaio libsodium userspace-rcu zstd lz4
# 克隆源码
git clone https://github.com/koverstreet/bcachefs-tools.git
cd bcachefs-tools
# 编译
make
# 安装
sudo make install
# 验证
bcachefs version
2.5.3 交叉编译(ARM64/RISC-V)
# 安装交叉编译工具链
sudo apt install gcc-aarch64-linux-gnu
# 编译 ARM64 版本
make CROSS_COMPILE=aarch64-linux-gnu- TARGET=aarch64
2.6 内核配置详解
关键配置选项
# .config 中 Bcachefs 相关选项
# 主要选项
CONFIG_BCACHEFS_FS=m # m=模块, y=内建, 空=不编译
# 依赖选项(通常自动选择)
CONFIG_BLOCK=y # 块设备层
CONFIG_CRC32C=m # CRC32C 校验(推荐)
CONFIG_XXHASH=m # xxHash 哈希(可选)
CONFIG_LZ4_COMPRESS=m # LZ4 压缩
CONFIG_LZ4_DECOMPRESS=m # LZ4 解压
CONFIG_ZSTD_COMPRESS=m # Zstandard 压缩
CONFIG_ZSTD_DECOMPRESS=m # Zstandard 解压
CONFIG_CRYPTO_SHA256=m # SHA-256(加密校验和)
# 调试选项(开发时启用,生产环境建议关闭)
CONFIG_BCACHEFS_DEBUG=y # 调试信息
CONFIG_BCACHEFS_ASSERT=y # 断言检查(影响性能)
内建 vs 模块
| 方式 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
=y(内建) | 启动即可用,无需 initramfs 配置 | 内核镜像变大 | 根文件系统使用 bcachefs |
=m(模块) | 按需加载,内核镜像小 | 需要 initramfs 包含模块 | 数据分区使用 bcachefs |
如果根文件系统使用 Bcachefs,必须选择内建 (=y) 或确保 initramfs 包含模块。
Initramfs 配置
# Debian/Ubuntu: 确保 bcachefs 模块在 initramfs 中
echo "bcachefs" | sudo tee /etc/initramfs-tools/modules
sudo update-initramfs -u
# Arch Linux
# 编辑 /etc/mkinitcpio.conf
# 在 MODULES=() 中添加 bcachefs
sudo sed -i 's/MODULES=()/MODULES=(bcachefs)/' /etc/mkinitcpio.conf
sudo mkinitcpio -P
# Fedora
# 编辑 /etc/dracut.conf.d/bcachefs.conf
echo 'add_drivers+=" bcachefs "' | sudo tee /etc/dracut.conf.d/bcachefs.conf
sudo dracut --force
2.7 发行版特定说明
Ubuntu LTS
# Ubuntu 24.04 LTS 内核可能不包含 bcachefs
# 需要安装 HWE 或 mainline 内核
# 方法 1: 安装 Ubuntu 主线内核
# 访问 https://kernel.ubuntu.com/mainline/
# 下载 amd64/linux-headers-*.deb 和 amd64/linux-image-*.deb
sudo dpkg -i linux-*.deb
# 方法 2: 使用 Mainline 工具
sudo add-apt-repository ppa:cappelikan/ppa
sudo apt update
sudo apt install mainline
# 然后在 GUI 中选择 6.7+ 内核
CentOS / RHEL
# RHEL 10 / CentOS Stream 10 可能支持
# RHEL 9 需要自编译内核
# 对于 RHEL 9,建议使用 ELRepo 内核
# https://elrepo.org/
# 或者考虑 Fedora Server
Debian Stable
# Debian Bookworm (12) 不包含 bcachefs
# 需要升级到 Trixie (13) 或自编译
# 方法 1: 使用 backports 内核
sudo apt -t bookworm-backports install linux-image-amd64
# 方法 2: 切换到 testing
sudo apt update && sudo apt upgrade
sudo apt install linux-image-amd64
2.8 常见安装问题排查
问题 1: modinfo bcachefs 无输出
# 原因: 内核未编译 bcachefs 模块
# 解决: 编译新内核或切换到支持的发行版
# 检查内核配置
grep BCAHCEFS /boot/config-$(uname -r)
# 如果无输出或 =n,需要重新编译内核
问题 2: mount: unknown filesystem type ‘bcachefs’
# 原因: bcachefs 模块未加载
# 解决:
# 手动加载模块
sudo modprobe bcachefs
# 检查是否加载成功
lsmod | grep bcachefs
# 如果 modprobe 失败,检查模块是否存在
find /lib/modules/$(uname -r) -name "bcachefs*"
# 如果模块不存在,需要重新编译内核
问题 3: bcachefs format 命令找不到
# 原因: bcachefs-tools 未安装或版本太旧
# 解决:
# 检查是否安装
which bcachefs
bcachefs version
# 如果未安装,按 2.5 节安装
# 如果版本太旧,从源码编译最新版
问题 4: 权限不足
# bcachefs format 需要 root 权限
sudo bcachefs format /dev/sdX
# 确保 /dev/sdX 可访问
ls -la /dev/sdX
# 确保用户在 disk 组
groups $USER
sudo usermod -aG disk $USER
# 需要重新登录生效
问题 5: 编译内核时找不到 Bcachefs 选项
# 原因: 内核版本太旧
# Bcachefs 需要 Linux 6.7+
# 检查内核版本
uname -r
# 如果 < 6.7,需要下载新内核源码
# 参考 2.3 节
2.9 验证安装清单
完成安装后,执行以下检查:
#!/bin/bash
# bcachefs-install-check.sh
echo "=== Bcachefs 安装验证 ==="
echo ""
# 检查内核版本
echo "1. 内核版本:"
KERNEL_VER=$(uname -r)
echo " $KERNEL_VER"
MAJOR=$(echo $KERNEL_VER | cut -d. -f1)
MINOR=$(echo $KERNEL_VER | cut -d. -f2)
if [ "$MAJOR" -gt 6 ] || ([ "$MAJOR" -eq 6 ] && [ "$MINOR" -ge 7 ]); then
echo " ✅ 内核版本满足要求 (>= 6.7)"
else
echo " ❌ 内核版本太低,需要 >= 6.7"
fi
# 检查模块
echo ""
echo "2. bcachefs 模块:"
if modinfo bcachefs &>/dev/null; then
MOD_VER=$(modinfo bcachefs | grep '^version:' | awk '{print $2}')
echo " ✅ 模块可用 (version: $MOD_VER)"
else
echo " ❌ 模块不可用"
fi
# 检查模块是否加载
echo ""
echo "3. 模块加载状态:"
if lsmod | grep -q bcachefs; then
echo " ✅ 模块已加载"
else
echo " ⚠️ 模块未加载(正常,首次使用时自动加载)"
fi
# 检查 tools
echo ""
echo "4. bcachefs-tools:"
if command -v bcachefs &>/dev/null; then
TOOLS_VER=$(bcachefs version 2>/dev/null || echo "未知")
echo " ✅ bcachefs 已安装 (version: $TOOLS_VER)"
else
echo " ❌ bcachefs 未安装"
fi
# 检查内核配置
echo ""
echo "5. 内核配置:"
CONFIG_FILE="/boot/config-$(uname -r)"
if [ -f "$CONFIG_FILE" ]; then
CONFIG_LINE=$(grep "CONFIG_BCACHEFS_FS" "$CONFIG_FILE" 2>/dev/null)
if [ -n "$CONFIG_LINE" ]; then
echo " $CONFIG_LINE"
if echo "$CONFIG_LINE" | grep -qE "=y|=m"; then
echo " ✅ Bcachefs 已启用"
else
echo " ❌ Bcachefs 未启用"
fi
else
echo " ⚠️ 未找到 Bcachefs 配置(可能是模块方式)"
fi
else
echo " ⚠️ 未找到内核配置文件"
fi
echo ""
echo "=== 验证完成 ==="
保存为脚本并执行:
chmod +x bcachefs-install-check.sh
./bcachefs-install-check.sh
2.10 本章小结
| 安装方案 | 适用场景 | 复杂度 |
|---|---|---|
| 发行版包管理器 | 大多数用户 | ⭐ 最简单 |
| 编译自定义内核 | 需要最新特性/自定义配置 | ⭐⭐⭐ |
| linux-next 分支 | 开发者/测试者 | ⭐⭐⭐⭐ |
关键决策点:
- 你的发行版内核 ≥ 6.7 且内置 bcachefs → 使用包管理器
- 内核版本太低 → 编译新内核
- 根文件系统使用 bcachefs → 确保内建或 initramfs 正确配置
扩展阅读
上一章: ← 第 1 章:Bcachefs 简介 | 下一章: 第 3 章:架构与设计原理 →