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

Bcachefs 完全指南 / 第 4 章:基础操作

第 4 章:基础操作

千里之行,始于格式化


4.1 创建文件系统

4.1.1 基本创建

# 最简单的创建方式
sudo bcachefs format /dev/sdb

# 指定标签(用于多设备管理)
sudo bcachefs format --label=ssd.0 /dev/sdb

# 创建时显示详细信息
sudo bcachefs format --verbose /dev/sdb

4.1.2 常用创建参数

sudo bcachefs format \
    --block_size=4k \
    --bucket_size=256k \
    --checksum=crc32c \
    --compression=lz4 \
    --label=data.0 /dev/sdb

4.1.3 参数详解

参数默认值说明
--block_size4k文件系统块大小
--bucket_size自动存储桶大小(影响空间效率)
--checksumcrc32c校验和算法:crc32c/crc64/xxhash/sha256
--compressionnone压缩算法:none/lz4/zstd/gzip
--encrypted启用加密
--replicas1数据副本数
--label设备标签

4.1.4 带加密创建

# 创建加密文件系统(交互式输入密码)
sudo bcachefs format --encrypted /dev/sdb

# 使用密钥文件
sudo bcachefs format --encrypted --keyfile=/path/to/keyfile /dev/sdb

# 使用 TPM 密钥
sudo bcachefs format --encrypted --tpm /dev/sdb

4.1.5 多设备创建

# 创建包含两个设备的文件系统
sudo bcachefs format /dev/sdb /dev/sdc

# 指定设备角色
sudo bcachefs format \
    --label=ssd.0 /dev/nvme0n1 \
    --label=hdd.0 /dev/sdb \
    --label=hdd.1 /dev/sdc \
    --foreground_target=ssd \
    --background_target=hdd \
    --promote_target=ssd

4.1.6 验证创建结果

# 查看文件系统信息
sudo bcachefs show-super /dev/sdb

# 输出示例:
# Device: /dev/sdb
# UUID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
# Magic: bcachefs
# Version: 1.12
# Block size: 4096
# Bucket size: 262144
# ...

# 检查文件系统完整性
sudo bcachefs fsck /dev/sdb

4.2 挂载与卸载

4.2.1 基本挂载

# 手动挂载(单设备)
sudo mount -t bcachefs /dev/sdb /mnt/data

# 挂载多设备文件系统
sudo mount -t bcachefs /dev/sdb:/dev/sdc /mnt/data

# 使用 UUID 挂载
sudo mount -t bcachefs UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx /mnt/data

4.2.2 常用挂载选项

# 带选项挂载
sudo mount -t bcachefs -o compress=zstd /dev/sdb /mnt/data

# 多个选项
sudo mount -t bcachefs -o \
    compress=zstd,\
    metadata_replicas=2,\
    replicas=2,\
    discard \
    /dev/sdb /mnt/data

4.2.3 挂载选项表

选项类型默认值说明
compress字符串none压缩算法:lz4/zstd/gzip
compression_level整数算法默认压缩级别
replicas整数1数据副本数
metadata_replicas整数1元数据副本数
discard布尔启用 TRIM(SSD 推荐)
noatime布尔不更新访问时间(性能优化)
nodev布尔不允许设备文件
nosuid布尔不允许 SUID 位
noexec布尔不允许执行文件
verbose布尔显示详细挂载信息
errors字符串ro错误处理:ro/remount-ro/panic
journal_flush_delay毫秒1000日志刷新延迟
gc_reserve_percent百分比8GC 保留空间
metadata_target字符串自动元数据存储目标

4.2.4 /etc/fstab 配置

# 获取文件系统 UUID
sudo bcachefs show-super /dev/sdb | grep UUID
# 或
sudo blkid /dev/sdb

# 编辑 fstab
sudo nano /etc/fstab

fstab 条目示例:

# 单设备
UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx /mnt/data bcachefs defaults,noatime,discard 0 0

# 多设备
UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx /mnt/data bcachefs defaults,device=/dev/sdb:/dev/sdc 0 0

# 带压缩
UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx /mnt/data bcachefs compress=zstd,noatime 0 0

4.2.5 卸载

# 基本卸载
sudo umount /mnt/data

# 强制卸载(有进程占用时)
sudo umount -l /mnt/data

# 检查挂载状态
mount | grep bcachefs
df -hT | grep bcachefs

4.2.6 重新挂载

# 重新挂载(例如修改挂载选项)
sudo mount -o remount,compress=zstd /mnt/data

# 将只读挂载改为读写
sudo mount -o remount,rw /mnt/data

4.3 查看文件系统信息

4.3.1 查看超级块

# 显示设备超级块信息
sudo bcachefs show-super /dev/sdb

# 输出包含:
# - 文件系统 UUID
# - 版本信息
# - 设备列表
# - 块大小 / 桶大小
# - 创建时间
# - 功能标志

4.3.2 查看使用情况

# 查看空间使用
sudo bcachefs fs usage /mnt/data

# 输出示例:
# Filesystem: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
# Size:               100.0 GiB
# Used:                45.2 GiB (45.2%)
# Online reserved:      0.0 B
# Data:
#   btree:              1.2 MiB
#   user:              44.1 GiB
#   cached:             0.0 B
# Metadata:
#   btree:              0.9 GiB
#   cached:             0.0 B
# Erasure coded:        0.0 B

4.3.3 通用磁盘工具

# 使用 df 查看挂载的文件系统
df -hT /mnt/data
# 输出:
# Filesystem     Type      Size  Used Avail Use% Mounted on
# /dev/sdb       bcachefs   98G   45G   53G  46% /mnt/data

# 使用 lsblk 查看块设备
lsblk -f /dev/sdb
# 输出:
# NAME   FSTYPE LABEL UUID                                 MOUNTPOINT
# sdb    bcachefs       xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx /mnt/data

# 使用 stat 查看文件系统信息
stat -f /mnt/data

4.4 检查与修复

4.4.1 fsck 基本用法

# 检查文件系统(必须先卸载)
sudo umount /mnt/data
sudo bcachefs fsck /dev/sdb

# 自动修复
sudo bcachefs fsck --fix-errors /dev/sdb

# 详细输出
sudo bcachefs fsck --verbose /dev/sdb

# 只检查不修复(dry-run)
sudo bcachefs fsck --dry-run /dev/sdb

4.4.2 fsck 选项

选项说明
--fix-errors自动修复发现的错误
--dry-run只检查不修改
--verbose显示详细检查过程
--very-verbose显示非常详细的输出
--force强制检查(即使标记为干净)
--reconstruct-alloc重建分配信息
--ratelimit-errors限制错误输出速率

4.4.3 检查特定问题

# 只检查 B-Tree 完整性
sudo bcachefs fsck --check-btree /dev/sdb

# 检查引用计数
sudo bcachefs fsck --check-refs /dev/sdb

# 检查校验和
sudo bcachefs fsck --check-checksums /dev/sdb

4.4.4 内核日志中的错误

# 检查内核日志中的 bcachefs 错误
dmesg | grep bcachefs

# 持续监控
sudo dmesg -w | grep bcachefs

4.5 日常管理操作

4.5.1 添加设备

# 向现有文件系统添加新设备
sudo bcachefs device add /mnt/data /dev/sdc

# 添加并指定标签
sudo bcachefs device add --label=hdd.1 /mnt/data /dev/sdc

# 查看设备列表
sudo bcachefs device list /mnt/data

4.5.2 移除设备

# 先迁移数据
sudo bcachefs data migrate /mnt/data /dev/sdc

# 然后移除设备
sudo bcachefs device remove /mnt/data /dev/sdc

4.5.3 修改文件系统参数

# 在线修改挂载选项
sudo mount -o remount,compress=zstd /mnt/data

# 修改副本数
sudo bcachefs set-replicas /mnt/data 2

4.5.4 文件系统锁定期

# 锁定文件系统(防止自动 GC)
sudo bcachefs fs lock /mnt/data

# 解锁
sudo bcachefs fs unlock /mnt/data

4.6 子卷操作

4.6.1 创建子卷

# 创建子卷
sudo bcachefs subvolume create /mnt/data/projects

# 创建嵌套子卷
sudo bcachefs subvolume create /mnt/data/projects/app1
sudo bcachefs subvolume create /mnt/data/projects/app2

4.6.2 列出子卷

# 列出所有子卷
sudo bcachefs subvolume list /mnt/data

# 输出示例:
# ID 256: /projects
# ID 257: /projects/app1
# ID 258: /projects/app2

4.6.3 删除子卷

# 删除子卷
sudo bcachefs subvolume delete /mnt/data/projects/app2

# 递归删除(包含子子卷)
sudo bcachefs subvolume delete --recursive /mnt/data/projects

4.6.4 子卷属性

# 设置子卷配额
sudo bcachefs subvolume set /mnt/data/projects --size=50G

# 查看子卷信息
sudo bcachefs subvolume show /mnt/data/projects

4.7 配额管理

4.7.1 启用配额

# 配额在文件系统创建时自动启用
# 配额类型:
# - 用户配额 (user)
# - 组配额 (group)
# - 子卷配额 (subvolume)

# 查看当前配额
sudo bcachefs quota show /mnt/data

4.7.2 设置配额

# 设置用户配额
sudo bcachefs quota set /mnt/data --user=1000 --size=10G

# 设置组配额
sudo bcachefs quota set /mnt/data --group=100 --size=50G

# 查看配额使用情况
sudo bcachefs quota usage /mnt/data

4.8 文件操作性能注意事项

4.8.1 大量小文件

# Bcachefs 对小文件有一定优势
# 但仍有 CoW 开销

# 测试: 创建 10000 个小文件
for i in $(seq 1 10000); do
    echo "file $i" > /mnt/data/smallfile_$i.txt
done

# 检查空间使用
df -h /mnt/data

4.8.2 文件追加写入

# 追加写入对 CoW 文件系统不友好
# 因为每次追加都可能触发 CoW

# 不推荐:
echo "line1" >> /mnt/data/file.txt
echo "line2" >> /mnt/data/file.txt

# 推荐: 直接写入完整内容
echo -e "line1\nline2" > /mnt/data/file.txt

4.8.3 大文件顺序写入

# Bcachefs 对顺序写入友好
dd if=/dev/zero of=/mnt/data/largefile bs=1M count=1024 status=progress

# 监控写入性能
iostat -x 1

4.9 故障排除

4.9.1 挂载失败

# 问题: mount: wrong fs type
# 解决: 确认 bcachefs 模块已加载
sudo modprobe bcachefs
lsmod | grep bcachefs

# 问题: mount: special device does not exist
# 解决: 检查设备路径
ls -la /dev/sd*

# 问题: mount: permission denied
# 解决: 使用 sudo
sudo mount -t bcachefs /dev/sdb /mnt/data

4.9.2 文件系统损坏

# 检查内核日志
dmesg | tail -50

# 卸载并检查
sudo umount /mnt/data
sudo bcachefs fsck --fix-errors /dev/sdb

# 如果 fsck 失败,尝试重建分配信息
sudo bcachefs fsck --reconstruct-alloc /dev/sdb

4.9.3 空间不足

# 检查使用情况
sudo bcachefs fs usage /mnt/data

# 检查 GC 状态
sudo bcachefs fs gc /mnt/data

# 清理不必要的文件
find /mnt/data -name "*.tmp" -delete

# 增加设备
sudo bcachefs device add /mnt/data /dev/sdc

4.10 完整操作示例

示例:创建并配置一个开发工作空间

#!/bin/bash
# setup-dev-workspace.sh

set -e

DEVICE="/dev/sdb"
MOUNT_POINT="/mnt/dev-workspace"

echo "=== 创建 Bcachefs 开发工作空间 ==="

# 1. 创建文件系统
echo "创建文件系统..."
sudo bcachefs format \
    --label=data.0 \
    --compression=zstd \
    --checksum=crc32c \
    $DEVICE

# 2. 创建挂载点
sudo mkdir -p $MOUNT_POINT

# 3. 挂载
sudo mount -t bcachefs -o noatime,discard $DEVICE $MOUNT_POINT

# 4. 设置权限
sudo chown $USER:$USER $MOUNT_POINT

# 5. 创建目录结构
mkdir -p $MOUNT_POINT/{projects,documents,backups,scratch}

# 6. 创建 fstab 条目
UUID=$(sudo bcachefs show-super $DEVICE | grep "UUID:" | awk '{print $2}')
echo "UUID=$UUID $MOUNT_POINT bcachefs defaults,noatime,discard 0 0" | sudo tee -a /etc/fstab

# 7. 显示结果
echo ""
echo "=== 设置完成 ==="
echo "挂载点: $MOUNT_POINT"
echo "UUID: $UUID"
df -h $MOUNT_POINT

4.11 本章小结

操作命令注意事项
创建bcachefs format /dev/sdX需要 root,数据会被擦除
挂载mount -t bcachefs /dev/sdX /mnt多设备用 : 分隔
卸载umount /mnt先确保无进程占用
检查bcachefs fsck /dev/sdX必须先卸载
信息bcachefs show-super /dev/sdX查看超级块
使用量bcachefs fs usage /mnt挂载时查看
子卷bcachefs subvolume create /mnt/sub创建独立命名空间

扩展阅读


上一章: ← 第 3 章:架构 | 下一章: 第 5 章:高级特性 →