强曰为道

与天地相似,故不违。知周乎万物,而道济天下,故不过。旁行而不流,乐天知命,故不忧.
文档目录

第 2 章:内核配置与工具安装

第 2 章:内核配置与工具安装

工欲善其事,必先利其器


2.1 环境要求

硬件要求

组件最低要求推荐配置
CPUx86_64 / ARM64多核(压缩需要 CPU)
内存512 MB≥ 2 GB(B-Tree 缓存需要内存)
磁盘任意块设备SSD(性能最佳)
架构x86_64, ARM64, RISC-Vx86_64(测试最充分)

软件要求

组件最低版本推荐版本
Linux 内核6.7≥ 6.12
bcachefs-tools1.9.x≥ 1.13
编译器GCC 10+GCC 13+
发行版任意现代 LinuxArch / 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 分支开发者/测试者⭐⭐⭐⭐

关键决策点:

  1. 你的发行版内核 ≥ 6.7 且内置 bcachefs → 使用包管理器
  2. 内核版本太低 → 编译新内核
  3. 根文件系统使用 bcachefs → 确保内建或 initramfs 正确配置

扩展阅读


上一章: ← 第 1 章:Bcachefs 简介 | 下一章: 第 3 章:架构与设计原理 →