btrfs(B-tree filesystem),由Oracle 2007年后研发,这是一个技术预览版的文件系统,推出用于弥补、替换Linux中的Ext系列文件系统。 重要技术特性: 1)支持写时复制(COW),保证数据的可靠性 2)更好的扩展性支持,利用动态inode创建、Extent、B-tree实现 3)支持非常大的单个文件与总容量 4)支持文件快速检查功能,基于数据及元数据校验码机制,将数据、元数据的某些属性保存下来,下次读取时可根据这些属性快速检测是否受损,如果损坏还能尝试修复,这样极大的提高数据的准确性 5)支持将多个物理卷组成一个Btrfs文件系统,并内置RAID,支持将数据、元数据以RAID、single、dup等方式在多个物理卷中存储。 6)支持创建子卷,可以创建多个子卷,子卷可以单独挂载 7)支持透明压缩功能,自动占用CPU资源对传入/出的文件进行压缩/解压 8)支持快照,支持对子卷、文件进行快照,还能对快照进行快照 Ext系列对比Btrfs系统: 参考: https://www.ibm.com/developerworks/cn/linux/l-cn-btrfs/index.html
**btrfs 文件系统管理命令: ** btrfs subvolume 用于管理子卷 btrfs filesystem 用于管理文件系统 btrfs balance 用于调整数据、元数据存储负载均衡 btrfs device 用于管理设备 btrfs rescue 用于救援 btrfs quota 用于设置磁盘配额 一、将多个设备文件创建为一个Btrfs文件系统
mkfs.btrfs [options] Device ...
-L 指定卷标
-m 指定元数据如何跨设备文件存储,可以为 raid0, raid1, raid5, raid6, raid10, single or dup。
-d 指定数据如何跨设备文件存储,可以为raid0, raid1, raid5, raid6, raid10 or single or dup
-f 强制格式化
[root@localhost ~]# mkfs.btrfs -f -L myBtrfs /dev/sdb /dev/sdc
btrfs-progs v4.4.1
See http://btrfs.wiki.kernel.org for more information.
Label: myBtrfs
UUID: 144d67a0-5235-491b-bc0c-5edeb63e94f4
Node size: 16384
Sector size: 4096
Filesystem size: 40.00GiB
Block group profiles:
Data: RAID0 2.01GiB 发现数据以RAID0存放
Metadata: RAID1 1.01GiB 发现元数据以RAID1存放
System: RAID1 12.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
```
**二、调整Btrfs逻辑边界**
查看Btrfs文件系统由sdb、sdc组成,大小为40G [root@localhost ~]# btrfs filesystem show /data/ Label: 'myBtrfs' uuid: 144d67a0-5235-491b-bc0c-5edeb63e94f4 Total devices 2 FS bytes used 896.00KiB devid 1 size 20.00GiB used 2.01GiB path /dev/sdb devid 2 size 20.00GiB used 2.01GiB path /dev/sdc 将Btrfs文件系统缩减10G的大小 [root@localhost ~]# btrfs filesystem resize -10G /data/ Resize '/data/' of '-10G'
[root@localhost ~]# btrfs filesystem show /data/ Label: 'myBtrfs' uuid: 144d67a0-5235-491b-bc0c-5edeb63e94f4 Total devices 2 FS bytes used 896.00KiB devid 1 size 10.00GiB used 2.01GiB path /dev/sdb devid 2 size 20.00GiB used 2.01GiB path /dev/sdc ``` 三、为原Btrfs文件系统添加、删除物理设备
添加sdd、sde设备
[root@localhost ~]# btrfs device add /dev/sdd /dev/sde /data/
[root@localhost ~]# btrfs filesystem show /data/
Label: 'myBtrfs' uuid: 144d67a0-5235-491b-bc0c-5edeb63e94f4
Total devices 4 FS bytes used 896.00KiB
devid 1 size 10.00GiB used 2.01GiB path /dev/sdb
devid 2 size 20.00GiB used 2.01GiB path /dev/sdc
devid 3 size 20.00GiB used 0.00B path /dev/sde
devid 4 size 20.00GiB used 0.00B path /dev/sdd
删除sde设备
[root@localhost ~]# btrfs device del /dev/sde /data
[root@localhost ~]# btrfs filesystem show /data
Label: 'myBtrfs' uuid: 144d67a0-5235-491b-bc0c-5edeb63e94f4
Total devices 3 FS bytes used 896.00KiB
devid 1 size 10.00GiB used 2.01GiB path /dev/sdb
devid 2 size 20.00GiB used 2.01GiB path /dev/sdc
devid 4 size 20.00GiB used 0.00B path /dev/sdd
相比LVM ,Btrfs不需要人工把数据此该磁盘中移出来,Btrfs自动完成,功能更为强大
四、管理数据、元数据存放磁盘及方式
当新添加一块硬盘进来后,需要将数据均匀存放到各个磁盘上,此时可以这样做:
[root@localhost ~]# btrfs balance start /data/
Done, had to relocate 3 out of 3 chunks
当数据过大时可以使用pause暂停,resume恢复。
修改数据的存放方式为RAID5:
[root@localhost ~]# btrfs balance start -dconvert=raid5 /data/
Done, had to relocate 1 out of 3 chunks
修改元数据的存放方式为RAID1:
[root@localhost ~]# btrfs balance start -mconvert=raid1 /data/
Done, had to relocate 2 out of 4 chunks
五、启用透明压缩机制
压缩算法有lzo与zlib两种,通过mount重新挂载时选择
[root@localhost ~]# mount -o remount,compress=lzo /dev/sdb /data/
[root@localhost ~]# cp /var/log/messages /data/
对比查看还是有点效果的,原来128K现在压缩后127K...
[root@localhost ~]# ll -h /var/log/messages /data/messages
-rw-------. 1 root root 127K Jan 4 06:24 /data/messages
-rw-------. 1 root root 128K Jan 4 06:25 /var/log/messages
六、管理子卷
创建子卷log、Coo:
[root@localhost ~]# btrfs subvolume create /data/log
Create subvolume '/data/log'
[root@localhost ~]# btrfs subvolume create /data/Coo
Create subvolume '/data/Coo'
查看子卷的简要信息:
[root@localhost data]# btrfs subvolume list /data/
ID 264 gen 95 top level 5 path log
ID 265 gen 92 top level 5 path Coo
查看子卷的详细信息:
[root@localhost ~]# btrfs subvolume show /data/log/
/data/log
Name: log #子卷名字
UUID: b22a5c9d-05f7-da41-89c7-d4dcceae9a0e #子卷UUID
Parent UUID: -
Received UUID: -
Creation time: 2018-01-04 06:32:19 -0800
Subvolume ID: 264 #子卷ID
Generation: 91
Gen at creation: 91
Parent ID: 5
Top level ID: 5
Flags: -
Snapshot(s):
[root@localhost ~]# btrfs subvolume show /data/Coo
/data/Coo
Name: Coo
UUID: a5552185-a8b4-2543-b2ac-f0e348668c8e
Parent UUID: -
Received UUID: -
Creation time: 2018-01-04 06:32:46 -0800
Subvolume ID: 265
Generation: 92
Gen at creation: 92
Parent ID: 5
Top level ID: 5
Flags: -
Snapshot(s):
挂载子卷,一般如果挂载父卷则自动挂载所有子卷。
还能单独挂载子卷:
[root@localhost ~]# mount -o subvol=log /dev/sdb /mnt/
[root@localhost ~]# mount | grep mnt
/dev/sdb on /mnt type btrfs (rw,relatime,seclabel,compress=lzo,space_cache,subvolid=264,subvol=/log)
[root@localhost ~]# mount -o subvolid=265 /dev/sdb /media/
[root@localhost ~]# mount | grep media
/dev/sdb on /media type btrfs (rw,relatime,seclabel,compress=lzo,space_cache,subvolid=265,subvol=/Coo)
七、快照卷的管理
创建快照卷:
[root@localhost ~]# btrfs subvolume snapshot /data/log /data/log_snap
Create a snapshot of '/data/log' in '/data/log_snap'
查看子卷的信息:
[root@localhost data]# btrfs subvolume list /data/
ID 264 gen 95 top level 5 path log
ID 265 gen 92 top level 5 path Coo
ID 266 gen 93 top level 5 path log_snap
删除快照卷:
[root@localhost data]# btrfs subvolume delete /data/log_snap/
Delete subvolume (no-commit): '/data/log_snap'
对快照卷做快照:
注:创建快照之前最好将磁盘设为只读挂载
[root@localhost data]# btrfs subvolume snapshot /data/log_snap/ /data/log_snap_snap
Create a snapshot of '/data/log_snap/' in '/data/log_snap_snap'
对文件做快照(只能在Btrfs中实现):
[root@localhost data]# cp --reflink 1.t 1.t_snap
恢复快照卷:
[root@localhost data]# btrfs subvolume delete log
Delete subvolume (no-commit): '/data/log'
[root@localhost data]# mv log_snap log
八、文件系统转换、回退
将EXT4转换为Btrfs:
[root@localhost ~]# fsck -f /dev/sde #检查磁盘是否损坏、剩余空间
fsck from util-linux 2.23.2
e2fsck 1.42.9 (28-Dec-2013)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
/dev/sde: 11/1310720 files (0.0% non-contiguous), 126322/5242880 blocks
[root@localhost ~]# btrfs-convert /dev/sde #开始转换
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.
[root@localhost ~]# btrfs filesystem show
Label: 'myBtrfs' uuid: 144d67a0-5235-491b-bc0c-5edeb63e94f4
Total devices 3 FS bytes used 10.77MiB
devid 1 size 10.00GiB used 3.00GiB path /dev/sdb
devid 2 size 20.00GiB used 2.31GiB path /dev/sdc
devid 4 size 20.00GiB used 2.31GiB path /dev/sdd
Label: none uuid: 3e61c271-cfcb-42c0-b3f5-a62e9dc8b98a
Total devices 1 FS bytes used 494.21MiB
devid 1 size 20.00GiB used 20.00GiB path /dev/sde
回滚:
[root@localhost ~]# btrfs-convert -r /dev/sde
rollback complete.
[root@localhost ~]# blkid /dev/sde
/dev/sde: UUID="39eb4603-ad53-4fb7-8d23-d69732921539" TYPE="ext4"