# Btrfs (简体中文)

相关文章

- Installing on Btrfs root

翻译状态： 本文是英文页面 Btrfs 的翻译，最后翻译时间：2013-05-02，点击这里可以查看翻译后英文页面的改动。

Btrfs 是一个 Linux 中的新的写时复制(copy-on-write (COW))的文件系统，目的是实现高级功能的同时着重与容错功能，修复功能以及易于管理。目前由Oracle, Red Hat, 富士通, Intel, SUSE以及其他组织共同开发，在 GPL 许可证下发行，同时向任何人公开贡献代码。

## 安装

Btrfs 已经包含在默认的内核中，安装系统时会默认安装btrfs-progs工具。GRUB 2, mkinitcpio 和 Syslinux 已经支持 Btrfs，不需要额外配置。

## 文件系统创建

可以新建或者从已有文件系统转化为 Btrfs.

### 格式化新文件系统

格式化分区：

    # mkfs.btrfs /dev/<partition>

用户可选择多个设备来创建RAID。支持的RAID级别有 RAID 0、RAID 1和RAID 10。默认情况下，元数据使用镜像，而数据被 strip.

从安装 CD 启动，然后转化分区:

    # btrfs-convert /dev/<partition>

挂载转换后的分区并修改`/etc/fstab`文件，指定分区类型(type 为 btrfs，fs_passno [最后一列] 修改为0，Btrfs在启动时并不进行磁盘检查). `chroot` 到系统并重建 GRUB 条目（如果对此过程不熟悉，参考Install from Existing Linux和GRUB）。

在确认一切正常之后，如果你想永久改变, 删除已保存的镜像，删除启用镜像的子卷,再让驱动器回收空间。

    # rm /ext2_saved/*
    # btrfs subvolume delete /ext2_saved

## 局限性

使用前请了解如下局限。

### 加密

Btrfs 目前还没有内建的加密支持，但可以在运行`mkfs.btrfs`前加密分区，参阅Dm-crypt with LUKS.

(如果已经创建了文件系统，可以使用EncFS或TrueCrypt,但是这样会无法使用 btrfs 的一些功能。)

### 交换文件

Btrfs 不支持交换文件，因为 Btrfs 因为潜在的文件系统损坏风险，没有加入交换文件需要的功能，参阅这里. 交换文件可以挂载到 loop 设备中，但是性能比较差。systemd-loop-swapfile提供了需要的服务文件。

### GRUB2 和 core.img

Grub 2可以启动Btrfs分区，但是因为模块比较大， grub-install 安装的 core.img 文件超过了 MBR 与第一个分区见的空间大小。可以通过使用GPT或在第一个分区前空出1-2M的空间避免此问题。

## Btrfs 特性

### 写时复制 （Copy-On-Write (CoW)）

CoW(写时复制)具有许多优点，但是对大文件的随机小写入有一定的负面性能影响。可以使用 recomended 为数据库文件和虚拟磁盘文件禁用CoW。 你可以在挂载时使用”nodatacow“选项来禁用整个块的CoW特性。这将禁用整个文件系统的CoW特性。 为单文件或目录禁用CoW特性，请使用下面的命令：

    # chattr +C [文件/目录的地址(path)]

注意，chattr的man手册写着:在btrfs上，'C' 标志应该被设置在新建的或者是空白的文件/目录，如果被设置在已有数据的文件,当块分配给该文件时，文件将不确定是否完全稳定。如果'C' 标志被设置给一个目录，将不会影响目前的目录，但在该目录创建的新文件将具有No_COW属性。

### 多设备文件系统和RAID特性

#### 多设备文件系统

当创建btrfs文件系统时，你可以将任意个分区或磁盘设备传给mkfs.btrfs。创建的文件系统将跨这些设备。你可以按这种办法"合并"多个分区或设备来得到一个大btrfs文件系。

也可从现存的btrfs文件系统中增加或移除设备（务必小心）。

多设备btrfs文件系统（也称为一个btrfs卷）需要运行

     # btrfs device scan

才能被识别。这就是 btrfs mkinitcpio hook 或 /etc/rc.conf 的 USEBTRFS 变量的用途。

#### RAID特性

创建跨多设备文件系统时，你也可指定加入文件系统的设备使用RAID0、RAID1或RAID10。

### 子卷

子卷是btrfs的特性之一。子卷实质上是一个保存文件和目录的命名的B树。它们的inode保存在树根之树中，可以为非根用户和组所有。子卷可选设定块配额。子卷内的所有块和文件区段都有引用计数以便做快照。和虚拟机存储的动态扩展相似，其只按需使用设备空间，消除了许多半满的分区。用户也可用不同的挂载选项挂载子卷，得到更灵活的安全性。

创建子卷：

    # btrfs subvolume create [<dest>/]

为提高灵活性，把系统安装到专用的子卷，在内核启动参数中使用：

    rootflags=subvol=<whatever you called the subvol>

它使得系统可以回滚。

如果用在根分区，建议在`/etc/mkinitcpio.conf`的modules数组里加上crc32c，在 HOOKS 里加上 `btrfs`。

### 快照

创建快照：

    # btrfs subvolume snapshot <source> [<dest>/]<name>

快照不是递归包含的，这意味着子卷内的子卷在快照里是空目录。

### 碎片整理

Btrfs支持在线碎片整理。要整理根目录的元数据，只需运行：

    # btrfs filesystem defragment /

这不会整理整个文件系统。查看更多信息，参考btrfs wiki上的this page。

### 压缩

Btrfs支持透明压缩，这意味着分区里的每个文件都被自动压缩。这不单减小了文件的大小，还提高了性能，特别是在使用lzo算法时。用`compress=gzip`或`compress=lzo`挂载选项打开压缩功能。只有在加入挂载选项后创建或修改的文件会被压缩，所以要充分利用压缩特性，最好安装时就启用压缩功能。在准备硬盘时，切换到另一个终端(`Ctrl+Alt+数字`)，运行如下命令：

    # mount -o remount,compress=lzo /dev/sdXY /mnt/target

安装完成后，将`compress=lzo`加入到`/etc/fstab`的根文件系统挂载选项中。

## 参阅

- Btrfs Wiki
- BTRFS Problem FAQ - Official FAQ
- Funtoo Btrfs wiki entry - Very well-written article

Category:

- File systems (简体中文)