Btrfs 文件系统简介

简介

文件系统似乎是内核中比较稳定的部分,多年来,人们一直使用 ext2/3,ext 文件系统以其卓越的稳定性成为了事实上的 Linux 标准文件系统。近年来 ext2/3 暴露出了一些扩展性问题,于是便催生了 ext4 。在 2008 年发布的 Linux2.6.19 内核中集成了 ext4 的 dev 版本。 2.6.28 内核发布时,ext4 结束了开发版,开始接受用户的使用。似乎 ext 就将成为 Linux 文件系统的代名词。然而当您阅读很多有关 ext4 的文章时,会发现都不约而同地提到了 btrfs,并认为 ext4 将是一个过渡的文件系统。 ext4 的作者 Theodore Tso 也盛赞 btrfs 并认为 btrfs 将成为下一代 Linux 标准文件系统。 Oracle,IBM, Intel 等厂商也对 btrfs 表现出了极大的关注,投入了资金和人力。

—— 来自 ibm.com

BtrfsB-tree, Butter FS, Better FS)文件系统现在还处于技术预览版阶段,按官方的话来说就是Maybe已经稳定了。即使如此,它还是受到了莫大的关注。因为它所具备的许多特性,在提高磁盘使用效率的同时,也使得系统运行更加稳定,数据更加可靠。下面就来说说Btrfs所具备的一些核心特性,以及如何实现Btrfs的创建和使用。

核心特性

  • 多物理卷支持

    btrfs可由多个底层物理卷组成;支持RAID,可以在线“添加”、“移除”、“修改”。

  • 写时复制更新机制(CoW

    复制、更新及替换指针,而非直接更新。即在修改某文件时,先复制一份源文件,然后在新文件上修改,修改完成后再将指针指向新文件,便于快速恢复。

  • 数据及元数据校验码

    支持使用checksum进行数据校验(可检查数据是否受损,会尝试修复)。

  • 子卷

    支持创建和挂载子卷,以及子卷的子卷的子卷……

  • 快照

    支持快照功能,并支持创建快照的快照,以及快照的快照的快照……(跟LVM类似,子卷的快照必须和子卷处于同一个父卷。)

  • 透明压缩

    自动通过占用cpu时钟周期的方式对数据自动进行压缩,读取的时候自动解压缩。说白了就是自动压缩,用时间和性能来换取空间。

  • 在线无损转换

    可将ext3/ext4文件系统转换成Btrfs,而无需卸载或重新格式化。(支持回滚。)

示例

由于用得不多,就不作详细说明了,感兴趣的话可man一下以下命令进行研究:

1
2
3
4
[hzz@magedu ~]$ btrfs
btrfs btrfs-convert btrfs-find-root btrfs-map-logical btrfs-show-super btrfs-zero-log
btrfsck btrfs-debug-tree btrfs-image btrfs-select-super btrfstune
[hzz@magedu ~]$

文件系统创建

Btrfs能在整个设备上使用,替代MBRGPT分区表,但是并不要求一定这么做,最简单的方法是在一个已存在的分区上创建btrfs文件系统。(示例中是直接使用整个硬盘,替代MBRGPT分区表使用。)

mkfs.btrfs -L mybtrfs -d raid0 -m raid1 /dev/sdb /dev/sdc

数据和元数据的RAID等级可以用-d-m参数指定。默认情况下元数据使用镜像(RAID1),而数据被stripRAID0)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
[hzz@magedu ~]$ sudo mkfs.btrfs -f -L mybtrfs -d raid0 -m raid1 /dev/sdb /dev/sdc
btrfs-progs v4.4.1
See http://btrfs.wiki.kernel.org for more information.

Performing full device TRIM (5.00GiB) ...
Performing full device TRIM (5.00GiB) ...
Label: mybtrfs
UUID: 24040293-4e59-40c5-82cd-95e945b43831
Node size: 16384
Sector size: 4096
Filesystem size: 10.00GiB
Block group profiles:
Data: RAID0 1.01GiB
Metadata: RAID1 1.01GiB
System: RAID1 12.00MiB
SSD detected: yes
Incompat features: extref, skinny-metadata
Number of devices: 2
Devices:
ID SIZE PATH
1 5.00GiB /dev/sdb
2 5.00GiB /dev/sdc

[hzz@magedu ~]$

属性查看

btrfs filesystem show [laybel]

1
2
3
4
5
6
7
[hzz@magedu ~]$ sudo btrfs filesystem show mybtrfs
Label: 'mybtrfs' uuid: 24040293-4e59-40c5-82cd-95e945b43831
Total devices 2 FS bytes used 112.00KiB
devid 1 size 5.00GiB used 1.51GiB path /dev/sdb
devid 2 size 5.00GiB used 1.51GiB path /dev/sdc

[hzz@magedu ~]$

挂载文件系统

mount -t btrfs /dev/sdb MOUNT_POINT

1
2
3
4
5
6
7
8
[hzz@magedu ~]$ sudo mkdir /mytest
[hzz@magedu ~]$ sudo mount -t btrfs /dev/sdb /mytest
[hzz@magedu ~]$ sudo btrfs filesystem df -h /mytest
Data, RAID0: total=1.00GiB, used=512.00KiB
System, RAID1: total=8.00MiB, used=16.00KiB
Metadata, RAID1: total=1.00GiB, used=112.00KiB
GlobalReserve, single: total=16.00MiB, used=0.00B
[hzz@magedu ~]$

透明压缩挂载

mount -o compress={lzo|zlib} DEVICE MOUNT_POINT

1
2
3
4
5
6
7
8
# 使用lzo格式效果尤其明显。
[hzz@magedu ~]$ sudo mount -o compress=lzo /dev/sdb /mytest
[hzz@magedu ~]$ sudo btrfs filesystem df -h /mytest
Data, RAID0: total=1.00GiB, used=512.00KiB
System, RAID1: total=8.00MiB, used=16.00KiB
Metadata, RAID1: total=1.00GiB, used=112.00KiB
GlobalReserve, single: total=16.00MiB, used=0.00B
[hzz@magedu ~]$

添加硬盘

btrfs device add /dev/sdd /mytest

1
2
3
4
5
6
7
8
9
10
[hzz@magedu ~]$ sudo btrfs device add /dev/sdd /mytest
Performing full device TRIM (5.00GiB) ...
[hzz@magedu ~]$ sudo btrfs filesystem show
Label: 'mybtrfs' uuid: 24040293-4e59-40c5-82cd-95e945b43831
Total devices 3 FS bytes used 640.00KiB
devid 1 size 5.00GiB used 1.51GiB path /dev/sdb
devid 2 size 5.00GiB used 1.51GiB path /dev/sdc
devid 3 size 5.00GiB used 0.00B path /dev/sdd

[hzz@magedu ~]$

均衡数据

btrfs balance start /mytest

1
2
3
[hzz@magedu ~]$ sudo btrfs balance start /mytest
Done, had to relocate 3 out of 3 chunks
[hzz@magedu ~]$

在线调整大小

btrfs filesystem resize +2G /mytest

1
2
3
4
5
[hzz@magedu ~]$ sudo btrfs filesystem resize -2G /mytest
Resize '/mytest' of '-2G'
[hzz@magedu ~]$ sudo btrfs filesystem resize +2G /mytest
Resize '/mytest' of '+2G'
[hzz@magedu ~]$

移除硬盘

btrfs device delete /dev/sdb /mytest

1
2
3
4
5
6
7
8
[hzz@magedu ~]$ sudo btrfs device delete /dev/sdb /mytest
[hzz@magedu ~]$ sudo btrfs filesystem show
Label: 'mybtrfs' uuid: 24040293-4e59-40c5-82cd-95e945b43831
Total devices 2 FS bytes used 448.00KiB
devid 2 size 5.00GiB used 800.00MiB path /dev/sdc
devid 3 size 5.00GiB used 800.00MiB path /dev/sdd

[hzz@magedu ~]$

移除硬盘时,自动转移数据。

无损转换

btrfs-convert /dev/sdb

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
# 加 -r 参数可进行回滚。
# 首先,将刚卸下来的 /dev/sdb 格式化为 ext3

[hzz@magedu ~]$ sudo mkfs.ext3 /dev/sdb
mke2fs 1.42.9 (28-Dec-2013)
/dev/sdb is entire device, not just one partition!
无论如何也要继续? (y,n) y
Discarding device blocks: 完成
文件系统标签=
OS type: Linux
块大小=4096 (log=2)
分块大小=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
327680 inodes, 1310720 blocks
65536 blocks (5.00%) reserved for the super user
第一个数据块=0
Maximum filesystem blocks=1342177280
40 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736

Allocating group tables: 完成
正在写入inode表: 完成
Creating journal (32768 blocks): 完成
Writing superblocks and filesystem accounting information: 完成

[hzz@magedu ~]$

# 将 /dev/sdb 转化成 btrfs

[hzz@magedu ~]$ sudo btrfs-convert /dev/sdb
create btrfs filesystem:
blocksize: 4096
nodesize: 16384
features: extref, skinny-metadata (default)
creating btrfs metadata.
copy inodes [o] [ 0/ 11]
creating ext2 image file.
cleaning up system chunk.
conversion complete.
[hzz@magedu ~]$ sudo btrfs filesystem show
Label: 'mybtrfs' uuid: 24040293-4e59-40c5-82cd-95e945b43831
Total devices 2 FS bytes used 448.00KiB
devid 2 size 5.00GiB used 800.00MiB path /dev/sdc
devid 3 size 5.00GiB used 800.00MiB path /dev/sdd

Label: none uuid: 5ee5b10f-6aad-412f-a82f-84028b40b69e
Total devices 1 FS bytes used 218.87MiB
devid 1 size 5.00GiB used 5.00GiB path /dev/sdb

[hzz@magedu ~]$

# 将 /dev/sdb 回滚为 ext3

[hzz@magedu ~]$ sudo btrfs-convert /dev/sdb -r
rollback complete.
[hzz@magedu ~]$ sudo btrfs filesystem show
Label: 'mybtrfs' uuid: 24040293-4e59-40c5-82cd-95e945b43831
Total devices 2 FS bytes used 448.00KiB
devid 2 size 5.00GiB used 800.00MiB path /dev/sdc
devid 3 size 5.00GiB used 800.00MiB path /dev/sdd

[hzz@magedu ~]$

创建和挂载子卷

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 创建

btrfs subvolume create /mytest/tst1

# 挂载

mount -o subvol=tst1 /dev/sdc /mytst1

# 父卷挂载,子卷自动挂载。

```bash
[hzz@magedu ~]$ sudo btrfs subvolume create /mytest/tst1
Create subvolume '/mytest/tst1'
[hzz@magedu ~]$ sudo btrfs subvolume list -p /mytest
ID 261 gen 40 parent 5 top level 5 path tst1
[hzz@magedu ~]$

[hzz@magedu ~]$ sudo mkdir /mytst1
[hzz@magedu ~]$ sudo mount -t btrfs -o subvol=tst1 /dev/sdc /mytst1
[hzz@magedu ~]$ sudo btrfs filesystem df -h /mytst1
Data, RAID0: total=1.00GiB, used=320.00KiB
System, RAID1: total=32.00MiB, used=16.00KiB
Metadata, RAID1: total=256.00MiB, used=128.00KiB
GlobalReserve, single: total=16.00MiB, used=0.00B
[hzz@magedu ~]$

更多参考

《Btrfs (简体中文)》)
《新一代 Linux 文件系统 btrfs 简介》
《wiki-Btrfs》
《如何选择文件系统:EXT4、Btrfs 和 XFS》