Linux 文件系统之btrfs

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux 文件系统之btrfs相关的知识,希望对你有一定的参考价值。

BTRFS(B-tree,Butter FS,Better FS之称),由Oracle于2007年宣布并进行中的COW(copy-on-write式)文件系统。btrfs 出现的原因是它的开发者起初希望扩展文件系统的功能使得它包括快照、池化pooling、校验以及其它一些功能。虽然和 ext4 无关,它也希望能保留 ext4 中能使消费者和企业受益的功能,并整合额外的能使每个人,尤其是企业受益的功能。对于使用大型软件以及大规模数据库的企业,让多种不同的硬盘看起来一致的文件系统能使他们受益并且使数据整合变得更加简单。删除重复数据能降低数据实际使用的空间,当需要镜像一个单一而巨大的文件系统时使用 btrfs 也能使数据镜像变得简单。
核心特性:
1.多物理卷支持,支持RAID,以联机“添加”、“移除”,“修改”,实在是很方便;raid部分请参考 http://blog.51cto.com/marvin89/2106891
2.关于数据一致性相关的特性,btrfs支持数据及元数据校验码,做checksum,避免了 silent corrupt的出现。而传统文件系统则无法做到这一点。btrfs写时复制更新机制(cow)来保证文件系统的一致性。
3.Btrfs 支持创建极为方便的快照 和克隆 。 btrfs 还能够方便的管理多个物理设备,使得传统的卷管理软件变得多余。
4.透明压缩,目录索引,延迟分配,节约硬盘存储空间,提高搜索效率。


具体实现

1、准备4个分区,最好是4块磁盘,这里实验方便在一块磁盘上实现(raid在不同磁盘上实现才有意义)

/dev/sdc1            2048    20971519    10484736    5  Extended
/dev/sdc5            4096     2101247     1048576   83  Linux
/dev/sdc6         2103296     4200447     1048576   83  Linux
/dev/sdc7         4202496     6299647     1048576   83  Linux

2.1、创建btrfs文件系统

[[email protected] ~]# mkfs.btrfs -L mydata -f /dev/sdb{5,6,7,8}
btrfs-progs v4.9.1
See http://btrfs.wiki.kernel.org for more information.

Label:              mydata
UUID:               54161207-74c5-4851-b945-70c510a914c1
Node size:          16384
Sector size:        4096
Filesystem size:    4.00GiB
Block group profiles:
  Data:             RAID0           409.50MiB
  Metadata:         RAID1           204.75MiB
  System:           RAID1             8.00MiB
SSD detected:       no
Incompat features:  extref, skinny-metadata
Number of devices:  4
Devices:
   ID        SIZE  PATH
    1     1.00GiB  /dev/sdb5
    2     1.00GiB  /dev/sdb6
    3     1.00GiB  /dev/sdb7
    4     1.00GiB  /dev/sdb8

2.2 挂载

[[email protected] ~]# mount -U 54161207-74c5-4851-b945-70c510a914c1 /mnt/t1
[[email protected] ~]# df -h
文件系统        容量  已用  可用 已用% 挂载点
/dev/sdb5       4.0G   17M  3.6G    1% /mnt/t1
#等同于mount /dev/sdb5  /mnt/t1

2.3 指定数据元数据都是用raid1 创建

[[email protected] ~]# umount /mnt/t1
[[email protected] ~]# mkfs.btrfs -L mydata -d raid1 -m raid1 -f /dev/sdb{5,6,7,8}
btrfs-progs v4.9.1
See http://btrfs.wiki.kernel.org for more information.

Label:              mydata
UUID:               6a2fe147-c2e3-4c98-b6cb-be6da13886c2
Node size:          16384
Sector size:        4096
Filesystem size:    4.00GiB
Block group profiles:
  Data:             RAID1           204.75MiB
  Metadata:         RAID1           204.75MiB
  System:           RAID1             8.00MiB
SSD detected:       no
Incompat features:  extref, skinny-metadata
Number of devices:  4
Devices:
   ID        SIZE  PATH
    1     1.00GiB  /dev/sdb5
    2     1.00GiB  /dev/sdb6
    3     1.00GiB  /dev/sdb7
    4     1.00GiB  /dev/sdb8

[[email protected] ~]# mount /dev/sdb5 /mnt/t1    
[[email protected] ~]# df -h
文件系统        容量  已用  可用 已用% 挂载点
/dev/sdb5       2.0G   17M  1.8G    1% /mnt/t1   #由此可见数据有raid0到raid1 一半用来做备份  元数据都是204.75mb  可写部分1.8G

[[email protected] ~]# btrfs filesystem df /mnt/t1
Data, RAID1: total=204.75MiB, used=128.00KiB
System, RAID1: total=8.00MiB, used=16.00KiB
Metadata, RAID1: total=204.75MiB, used=112.00KiB
GlobalReserve, single: total=16.00MiB, used=0.00B

3、在raid1的基础上写入数据

[[email protected] ~]# dd if=/dev/zero of=/mnt/t1/a  bs=1024 count=1048576
[[email protected] ~]# dd if=/dev/zero of=/mnt/t1/b  bs=1024 count=1048576

[[email protected] t1]# ll -h
total 1.8G
-rw-r--r--. 1 root root 1.0G Apr 24 09:04 a
-rw-r--r--. 1 root root 810M Apr 24 09:06 b
[[email protected] ~]# df -h
文件系统        容量  已用  可用 已用% 挂载点
/dev/sdb5       2.0G  1.9G   64K  100% /mnt/t1

[[email protected] ~]# btrfs filesystem df /mnt/t1      #btrfs的df用来观察当时  文件系统的存储情况
Data, RAID1: total=1.79GiB, used=1.79GiB             #数据部分
System, RAID1: total=8.00MiB, used=16.00KiB
Metadata, RAID1: total=204.75MiB, used=2.00MiB         #在创建玩文件系统后元数据是固定的
GlobalReserve, single: total=16.00MiB, used=0.00B

4、联机状态下修改raid模式

[[email protected] t1]# rm -f {a,b}

[[email protected] ~]# btrfs balance start -dconvert=raid0 -mconvert=raid1  /mnt/t1
Done, had to relocate 4 out of 4 chunks

5.1、移除设备

[[email protected] ~]# btrfs device delete /dev/sdb8 /mnt/t1    #参考 man btrfs-device remove 是remove的别名   会自动移除数据 The operation can take long as it needs to move all data from the device.
[[email protected] ~]# df -h
文件系统        容量  已用  可用 已用% 挂载点
/dev/sdb5       3.0G  418M  1.8G   19% /mnt/t1

5.2、添加设备

[[email protected] ~]# btrfs device add  /dev/sdb8 /mnt/t1
[[email protected] ~]# df -h
文件系统        容量  已用  可用 已用% 挂载点
/dev/sdb5       4.0G  418M  2.9G   13% /mnt/t1

6.1、缩减

[[email protected] ~]# btrfs filesystem resize -700M  /mnt/t1
Resize ‘/mnt/t1‘ of ‘-700M‘
[[email protected] ~]# df -h
文件系统        容量  已用  可用 已用% 挂载点
/dev/sdb5       3.4G  418M  2.1G   17% /mnt/t1

6.2扩展到最大

[[email protected] ~]# btrfs filesystem resize max  /mnt/t1
Resize ‘/mnt/t1‘ of ‘max‘
[[email protected] ~]# df -h
文件系统        容量  已用  可用 已用% 挂载点
/dev/sdb5       4.0G  418M  3.1G   12% /mnt/t1

7、缩减还是设备移动之后做下数据均匀

[[email protected] ~]# btrfs balance start /mnt/t1

子卷跟快照

1、创建子卷

[[email protected] ~]# btrfs subvolume  create  /mnt/t1/logs
Create subvolume ‘/mnt/t1/logs‘

[[email protected]alhost ~]#  btrfs subvolume  list /mnt/t1
ID 281 gen 196 top level 5 path logs

2、子卷默认是跟着父卷的,也可以单独挂载 | 子卷一般不单独挂载,在父卷下可以使用快照卷

[[email protected] ~]# umount /mnt/t1
[[email protected] ~]# mount -o subvol=logs /dev/sdb5 /mnt/t1   #mount -o subvolid=281 /dev/sdb5 /mnt/t1 
[[email protected] ~]# touch /mnt/t1/a
[[email protected] ~]# btrfs subvolume show /mnt/t1/
/mnt/t1
    Name:           logs
    UUID:           7bb3b73f-931c-5a4b-811d-e0290075c534
    Parent UUID:        -
    Received UUID:      -
    Creation time:      2018-04-24 10:06:45 -0400
    Subvolume ID:       281
    Generation:         196
    Gen at creation:    196
    Parent ID:      5
    Top level ID:       5
    Flags:          -
    Snapshot(s):

[[email protected] ~]# umount /mnt/t1
[[email protected] ~]# mount /dev/sdb5 /mnt/t1
[[email protected] ~]# cat /mnt/t1/logs/abc  #子卷中的文件依然存在

3、 创建快照

#现在logs下面创建一个标记文件
[[email protected] logs]# touch a
[[email protected] logs]# echo aa > a

#快照   还是要注意大小,快照是记录源文件变化量,  源文件跟快照都在同一个文件系统中
[[email protected] logs]# btrfs subvolume snapshot /mnt/t1/logs/   /mnt/t1/logs_snapshot
Create a snapshot of ‘/mnt/t1/logs/‘ in ‘/mnt/t1/logs_snapshot‘

#快照验证

[[email protected] logs]# tail -1 ../logs_snapshot/a
aa
[[email protected] logs]# echo bb >> a
[[email protected] logs]# tail -1 ../logs_snapshot/a
aa

[[email protected] logs]# touch b
[[email protected] logs]# ls ../logs_snapshot/
a

4、删除快照

[[email protected] logs]# btrfs subvolume  delete  /mnt/t1/logs_snapshot/
Delete subvolume (no-commit): ‘/mnt/t1/logs_snapshot‘

5、写实复制功能(单个文件快照)

#https://bugs.centos.org/view.php?id=14228    目前bug
[[email protected] logs]# cp --reflink=auto fstab fstab.bak
[[email protected] logs]# echo 888 >> fstab
[[email protected] logs]# tail -1 fstab.bak
UUID=943c7e04-b733-42fe-a1e2-eabf93693f6b swap                    swap    defaults        0 0

#通过写时复制完成

6、删除子卷

[[email protected] ~]# btrfs subvolume delete /mnt/t1/logs/
Delete subvolume (no-commit): ‘/mnt/t1/logs‘

以上是关于Linux 文件系统之btrfs的主要内容,如果未能解决你的问题,请参考以下文章

Linux初学之btrfs文件系统及磁盘配额

Linux btrfs之文件系统转换

Linux 文件系统之btrfs

Linux btrfs之挂载/卸载

Linux btrfs之调整文件系统大小

Linux btrfs子卷 subvolume之create