btrfs文件系统简单学习

分类: Linux杂项 , 文件系统

1 btrfs文件系统

  btrfs文件系统在生产环境应用还不多,因此,本文仅仅简单学习.

1.1 btrfs文件系统核心特性

  1)多物理卷支持:btrfs可由多个底层物理卷组成(可以是单块物理磁盘,也可以是某一分区等);支持RAID,支持联机在线热“添加”、“移除”,“修改”;
  2)写时复制更新机制(CoW):复制、更新及替换指针,而非“就地”更新;
  3)数据及元数据校验码:checksum ,此机制可以保证数据的可靠性;
  4)支持多子卷:sub_volume;
  5)快照:支持快照的快照(增量快照);
  6)透明压缩:(lzo|zlib压缩算法自动压缩)节约存储空间,但会消耗更多的CPU时钟周期.

  注意:仅仅在单块物理磁盘的不同分区创建btrfs文件系统没有太大意义,多块磁盘组合创建为btrfs文件系统才有意义.

1.2 管理btrfs文件系统需要掌握的命令

  掌握btrfs管理命令就可以熟练操作btrfs文件系统了,其主要命令如下(其命令中还有很多子命令,具体查看man帮助手册):

命令 说明
mkfs.btrfs

含义:mkfs.btrfs - create a btrfs filesystem 创建btrfs文件系统

Usage: mkfs.btrfs [options] dev [ dev ... ]

指定物理磁盘设备或者磁盘分区,并将其创建为btrfs文件系统

btrfs filesystem

含义:btrfs-filesystem - command group of btrfs that usually work on the whole filesystem

  查看btrfs属性信息

usage: btrfs filesystem [<group>] <command> [<args>]

btrfs device

含义:btrfs-device - manage devices of btrfs filesystems ,管理btrfs文件系统设备

usage: btrfs device <command> [<args>]

btrfs balance

含义:btrfs-balance - balance block groups on a btrfs filesystem ,均衡btrfs文件系统数据相关

usage: btrfs balance <command> [options] <path>

btrfs-convert

含义:btrfs-convert - convert from ext2/3/4 filesystem to btrfs in-place 文件系统格式互转

usage: btrfs-convert [options] device

btrfs subvolume

含义:btrfs-subvolume - manage btrfs subvolumes ,管理btrfs文件系统子卷

usage: btrfs subvolume <command> <args>

btrfs check

含义:btrfs-check - check or repair an unmounted btrfs filesystem

  检测一个未被挂载的btrfs文件系统

usage: btrfs check [options] <device>

btrfs rescue

含义:btrfs-rescue - Recover a damaged btrfs filesystem

  恢复救援损坏的btrfs文件系统

usage: btrfs rescue <command> [options] <path>

btrfs inspect-internal

含义:btrfs-inspect-internal - query various internal information

usage: btrfs inspect-internal <command> <args>

btrfs property  
btrfs qgroup  
btrfs quota  
btrfs receive  
btrfs replace  
btrfs restore

含义:Try to restore files from a damaged filesystem (unmounted)

  尝试从一个未被挂载的损坏的btrfs文件系统中恢复数据

usage: btrfs restore [options] <device> <path> | -l <device>

btrfs scrub  
btrfs send  
btrf stune  

1.3 简单实践btrfs文件系统

  实践过程:虚拟机新添加3块20G虚拟磁盘测试并创建btrfs文件系统.

  系统环境:centos7.6 

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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
[root@localhost ~]# fdisk -l|grep "^Disk /dev/sd[abcd]\>"|cut -d":" -f1
Disk /dev/sda   #<==系统盘
Disk /dev/sdb   #<==新添加的20G虚拟磁盘
Disk /dev/sdc   #<==新添加的20G虚拟磁盘
Disk /dev/sdd   #<==新添加的20G虚拟磁盘
[root@localhost ~]# mkfs.btrfs -L mydata /dev/sdb /dev/sdc      #<==直接使用此命令即可创建指定卷标的btrfs文件系统
btrfs-progs v4.9.1
See http://btrfs.wiki.kernel.org for more information.
 
Label:              mydata              #<==卷标
UUID:               8c6abba9-73dc-4e60-a87f-e313dca6a007    #<==UUID
Node size:          16384
Sector size:        4096    #<==扇区大小
Filesystem size:    40.00GiB    #<==文件系统大小
Block group profiles:
  Data:             RAID0             2.00GiB
  Metadata:         RAID1             1.00GiB
  System:           RAID1             8.00MiB
SSD detected:       no
Incompat features:  extref, skinny-metadata
Number of devices:  2
Devices:                #<==该文件系统下的物理磁盘
   ID        SIZE  PATH
    1    20.00GiB  /dev/sdb
    2    20.00GiB  /dev/sdc
 
[root@localhost ~]# btrfs filesystem show
Label: 'mydata'  uuid: 8c6abba9-73dc-4e60-a87f-e313dca6a007
    Total devices 2 FS bytes used 112.00KiB
    devid    1 size 20.00GiB used 2.01GiB path /dev/sdb
    devid    2 size 20.00GiB used 2.01GiB path /dev/sdc
[root@localhost ~]# btrfs filesystem show /dev/sdb      #<==同一个btrfs文件系统卷,其UUID是一样的
Label: 'mydata'  uuid: 8c6abba9-73dc-4e60-a87f-e313dca6a007
    Total devices 2 FS bytes used 112.00KiB
    devid    1 size 20.00GiB used 2.01GiB path /dev/sdb
    devid    2 size 20.00GiB used 2.01GiB path /dev/sdc
 
[root@localhost ~]# btrfs filesystem show /dev/sdc
Label: 'mydata'  uuid: 8c6abba9-73dc-4e60-a87f-e313dca6a007
    Total devices 2 FS bytes used 112.00KiB
    devid    1 size 20.00GiB used 2.01GiB path /dev/sdb
    devid    2 size 20.00GiB used 2.01GiB path /dev/sdc
[root@localhost ~]# blkid /dev/sdb      #<==同一个btrfs文件系统卷UUID一样,但子卷的UUID不一样,因此,支持多卷
/dev/sdb: LABEL="mydata" UUID="8c6abba9-73dc-4e60-a87f-e313dca6a007" UUID_SUB="1a163afe-6733-4f11-9961-24c125bf5927" TYPE="btrfs"
[root@localhost ~]# blkid /dev/sdc
/dev/sdc: LABEL="mydata" UUID="8c6abba9-73dc-4e60-a87f-e313dca6a007" UUID_SUB="a3306dfe-2a00-45a5-b25b-f82fafe7649a" TYPE="btrfs"
[root@localhost ~]# btrfs filesystem show --mounted     #<==显示已挂载的btrfs文件系统
[root@localhost ~]# btrfs filesystem show --all-devices     #<==默认不加,就是显示所有
Label: 'mydata'  uuid: 8c6abba9-73dc-4e60-a87f-e313dca6a007
    Total devices 2 FS bytes used 112.00KiB
    devid    1 size 20.00GiB used 2.01GiB path /dev/sdb
    devid    2 size 20.00GiB used 2.01GiB path /dev/sdc
[root@localhost ~]# btrfs filesystem show /dev/sdb      #<==指定某一个磁盘设备,同一个btrfs文件系统卷下的物理磁盘设备会全部显示
Label: 'mydata'  uuid: 8c6abba9-73dc-4e60-a87f-e313dca6a007
    Total devices 2 FS bytes used 112.00KiB
    devid    1 size 20.00GiB used 2.01GiB path /dev/sdb
    devid    2 size 20.00GiB used 2.01GiB path /dev/sdc
[root@localhost ~]# mkdir /data
[root@localhost ~]# mount -t btrfs /dev/sdb /data/      #<==挂载使用,指定任意一个物理磁盘设备都代表了所属的同一个btrfs文件系统卷
[root@localhost ~]# mount |tail -1                  #<==同一个btrfs文件系统卷只挂载一个物理磁盘设备即代表挂载了全局的物理磁盘
/dev/sdb on /data type btrfs (rw,relatime,space_cache,subvolid=5,subvol=/)
[root@localhost /]# umount /dev/sdb
###启用透明压缩算法(lzo|zlib,此2种算法可以选择其中一种)
[root@localhost /]# mount -t btrfs -o compress=lzo /dev/sdb /data/  #<==注意,如果被blkid命令识别的文件系统,可以不加-t参数,忽略指定文件系统类型步骤
###调整btrfs文件系统大小,须先挂载使用(使用resize子命令,但调整大小取决于底层物理磁盘设备是否加入了btrfs文件系统卷中)
[root@localhost /]# btrfs filesystem resize -10G /data/     #<==指定挂载点,缩减btrfs文件系统大小
Resize '/data/' of '-10G'
[root@localhost /]# btrfs filesystem df /data/      #<==此命令看不出变化
Data, RAID0: total=2.00GiB, used=768.00KiB          #<==存储数据默认使用raid0,所以2块20G磁盘加起来是40G
System, RAID1: total=8.00MiB, used=16.00KiB         #<==文件系统内部机制使用raid1
Metadata, RAID1: total=1.00GiB, used=112.00KiB      #<==元数据使用raid1存储
GlobalReserve, single: total=16.00MiB, used=0.00B
[root@localhost /]# df -lh
Filesystem               Size  Used Avail Use% Mounted on
/dev/mapper/centos-root   39G  1.8G   37G   5% /
devtmpfs                 898M     0  898M   0% /dev
tmpfs                    910M     0  910M   0% /dev/shm
tmpfs                    910M  9.5M  901M   2% /run
tmpfs                    910M     0  910M   0% /sys/fs/cgroup
/dev/sda1               1014M  133M  882M  14% /boot
tmpfs                    182M     0  182M   0% /run/user/0
/dev/sdb                  30G   17M   18G   1% /data        #<==此命令看到btrfs文件系统已减少10G
[root@localhost /]# btrfs filesystem resize +10G /data/     #<==此步骤调整的是逻辑边界
Resize '/data/' of '+10G'
[root@localhost /]# df -lh
Filesystem               Size  Used Avail Use% Mounted on
/dev/mapper/centos-root   39G  1.8G   37G   5% /
devtmpfs                 898M     0  898M   0% /dev
tmpfs                    910M     0  910M   0% /dev/shm
tmpfs                    910M  9.5M  901M   2% /run
tmpfs                    910M     0  910M   0% /sys/fs/cgroup
/dev/sda1               1014M  133M  882M  14% /boot
tmpfs                    182M     0  182M   0% /run/user/0
/dev/sdb                  40G   17M   38G   1% /data
[root@localhost /]# btrfs filesystem resize max /data/  #<==直接调整至最大,要更大,就要新加底层物理卷进来
Resize '/data/' of 'max'
###添加底层物理磁盘
[root@localhost /]# btrfs device add /dev/sdd /data/    #<==直接使用btrfs device子命令添加
[root@localhost /]# df -lh
Filesystem               Size  Used Avail Use% Mounted on
/dev/mapper/centos-root   39G  1.8G   37G   5% /
devtmpfs                 898M     0  898M   0% /dev
tmpfs                    910M     0  910M   0% /dev/shm
tmpfs                    910M  9.5M  901M   2% /run
tmpfs                    910M     0  910M   0% /sys/fs/cgroup
/dev/sda1               1014M  133M  882M  14% /boot
tmpfs                    182M     0  182M   0% /run/user/0
/dev/sdb                  60G   17M   56G   1% /data        #<==容量已变为60G,因为添加多了一块20G物理磁盘
注意:数据如果需要均衡存储到各个底层物理磁盘,需要使用btrfs balance命令及其子命令
[root@localhost /]# btrfs balance start /data/      #<==生产环境有大量数据均衡存储到各底层物理磁盘(视情况)
[root@localhost /]# btrfs balance status /data/     #<==查看状态
No balance found on '/data/'
###移除底层物理卷(必须剩余的物理卷可以存储现有的数据:btrfs文件系统会自动把数据移走到其他物理磁盘)
[root@localhost /]# btrfs device delete /dev/sdd /data  #<==联机时移除设备
[root@localhost /]# btrfs filesystem show /data/        #<==被移除的设备上的数据会自动被btrfs文件系统移走到其他底层物理卷
Label: 'mydata'  uuid: 8c6abba9-73dc-4e60-a87f-e313dca6a007
    Total devices 2 FS bytes used 1.44MiB
    devid    1 size 20.00GiB used 1.28GiB path /dev/sdb
    devid    2 size 20.00GiB used 1.28GiB path /dev/sdc
[root@localhost /]# ls /data/       #<==数据还在
a.txt
###修改btrfs的数据组织机制,使用btrfs balance命令及其子命令(注意,如果是raid,低层物理磁盘个数需要满足组raid的要求)
[root@localhost /]# btrfs device add /dev/sdd /data
[root@localhost /]# btrfs filesystem show /data/
Label: 'mydata'  uuid: 8c6abba9-73dc-4e60-a87f-e313dca6a007
    Total devices 3 FS bytes used 704.00KiB
    devid    1 size 20.00GiB used 1.28GiB path /dev/sdb
    devid    2 size 20.00GiB used 1.28GiB path /dev/sdc
    devid    3 size 20.00GiB used 0.00B path /dev/sdd
[root@localhost /]# btrfs balance start -mconvert=raid5 /data/      #<==使用raid5,低层物理磁盘个数必须满足最低3个
Done, had to relocate 2 out of 3 chunks
[root@localhost /]# btrfs filesystem df /data/
Data, RAID0: total=2.00GiB, used=768.00KiB
System, RAID5: total=64.00MiB, used=16.00KiB        #<==文件系统内部机制及元数据已使用raid存储
Metadata, RAID5: total=1.00GiB, used=112.00KiB
GlobalReserve, single: total=16.00MiB, used=0.00B
###创建子卷,使用btrfs subvolmue命令及其子命令
[root@localhost /]# btrfs subvolume list /data/     #<==列出父卷下的所有子卷
[root@localhost /]# btrfs subvolume create /data/logs   #<==在父卷下指定名称创建子卷,这里不是创建目录,而是创建子卷
Create subvolume '/data/logs'
[root@localhost /]# btrfs subvolume list /data/     #<==查看父卷下已有的子卷及其卷ID
ID 263 gen 62 top level 5 path logs
注意:挂载了父卷,所有已创建的子卷会被自动挂载在父卷的基础上
###单独挂载某个子卷,须先卸载父卷,并指明某子卷的名称进行挂载(或指定子卷的ID进行挂载)
[root@localhost /]# umount /data/
[root@localhost /]# mount -o subvol=logs /dev/sdd /mnt
[root@localhost /]# mount -o subvolid=263 /dev/sdd /mnt
mount: /dev/sdd is already mounted or /mnt busy
[root@localhost /]# btrfs subvolume show /mnt/      #<==查看子卷的挂载信息
[root@localhost /]# mount /dev/sdd /data/       #<==挂载父卷才可以删除子卷
[root@localhost /]# btrfs subvolume delete /data/logs
Delete subvolume (no-commit): '/data/logs'
[root@localhost /]# btrfs subvolume list /data/
###将ext系列与btrfs互转
[root@localhost /]# btrfs balance start -mconvert=raid1 /data/
Done, had to relocate 2 out of 3 chunks
[root@localhost /]# btrfs device delete /dev/sdd /data/
#将/dev/sdd1格式化为ext4文件系统
[root@localhost /]# mke2fs -t ext4 /dev/sdd1
[root@localhost /]# partx /dev/sdd
NR START      END  SECTORS SIZE NAME UUID
 1  2048 20973567 20971520  10G     
[root@localhost /]# fsck -f /dev/sdd1
[root@localhost /]# btrfs-convert /dev/sdd1     #<==将ext4转换为btrfs
create btrfs filesystem:
    blocksize: 4096
    nodesize:  16384
    features:  extref, skinny-metadata (default)
creating ext2 image file
creating btrfs metadatacopy inodes [o] [         2/        11]
[root@localhost /]# btrfs filesystem show
Label: 'mydata'  uuid: 8c6abba9-73dc-4e60-a87f-e313dca6a007
    Total devices 2 FS bytes used 704.00KiB
    devid    1 size 20.00GiB used 1.28GiB path /dev/sdb
    devid    2 size 20.00GiB used 1.28GiB path /dev/sdc
 
Label: none  uuid: 4eb42c5e-f260-4e64-ac2d-080f488c747b
    Total devices 1 FS bytes used 325.27MiB
    devid    1 size 10.00GiB used 583.66MiB path /dev/sdd1
#挂载使用
[root@localhost /]# mount /dev/sdd1 /mnt/
#回滚至ext文件系统
[root@localhost /]# umount /mnt/
[root@localhost /]# btrfs-convert -r /dev/sdd1
rollback complete
[root@localhost /]# blkid /dev/sdd1
/dev/sdd1: UUID="a88d5de4-620d-41d3-bd0e-3ff88c787362" TYPE="ext4"
 
###将某磁盘的单个分区添加至现有的btrfs文件系统中
[root@localhost /]# partx /dev/sdd
NR START END SECTORS SIZE NAME UUID
1 2048 20973567 20971520 10G
2 20973568 31459327 10485760 5G
[root@localhost /]# mkfs.btrfs /dev/sdd2
btrfs-progs v4.9.1
See http://btrfs.wiki.kernel.org for more information.
 
Label: (null)
UUID: 3b7731a0-af8a-488c-bf23-23b207bdf6da
Node size: 16384
Sector size: 4096
Filesystem size: 5.00GiB
Block group profiles:
Data: single 8.00MiB
Metadata: DUP 256.00MiB
System: DUP 8.00MiB
SSD detected: no
Incompat features: extref, skinny-metadata
Number of devices: 1
Devices:
ID SIZE PATH
1 5.00GiB /dev/sdd2
 
[root@localhost /]# btrfs device add /dev/sdd2 /data/
/dev/sdd2 appears to contain an existing filesystem (btrfs).
ERROR: use the -f option to force overwrite of /dev/sdd2   #<==强制覆盖数据后添加
[root@localhost /]# btrfs device add -f /dev/sdd2 /data/
[root@localhost /]# btrfs filesystem show
Label: 'mydata' uuid: 8c6abba9-73dc-4e60-a87f-e313dca6a007
Total devices 3 FS bytes used 704.00KiB
devid 1 size 20.00GiB used 1.28GiB path /dev/sdb
devid 2 size 20.00GiB used 1.28GiB path /dev/sdc
devid 3 size 5.00GiB used 0.00B path /dev/sdd2

  

posted @   執著的蝸牛  阅读(1670)  评论(0编辑  收藏  举报
编辑推荐:
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
· dotnet 源代码生成器分析器入门
阅读排行:
· ThreeJs-16智慧城市项目(重磅以及未来发展ai)
· .NET 原生驾驭 AI 新基建实战系列(一):向量数据库的应用与畅想
· Browser-use 详细介绍&使用文档
· 软件产品开发中常见的10个问题及处理方法
· Vite CVE-2025-30208 安全漏洞
# btrfs文件系统简单学习
1 btrfs文件系统1.1 btrfs文件系统核心特性1.2 管理btrfs文件系统需要掌握的命令1.3 简单实践btrfs文件系统
点击右上角即可分享
微信分享提示