btrfs文件系统简单学习
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 |
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
· dotnet 源代码生成器分析器入门
· ThreeJs-16智慧城市项目(重磅以及未来发展ai)
· .NET 原生驾驭 AI 新基建实战系列(一):向量数据库的应用与畅想
· Browser-use 详细介绍&使用文档
· 软件产品开发中常见的10个问题及处理方法
· Vite CVE-2025-30208 安全漏洞