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_size | 4k | 文件系统块大小 |
--bucket_size | 自动 | 存储桶大小(影响空间效率) |
--checksum | crc32c | 校验和算法:crc32c/crc64/xxhash/sha256 |
--compression | none | 压缩算法:none/lz4/zstd/gzip |
--encrypted | 否 | 启用加密 |
--replicas | 1 | 数据副本数 |
--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 | 百分比 | 8 | GC 保留空间 |
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 章:高级特性 →