1. 程式人生 > >Linux 文件系統之btrfs

Linux 文件系統之btrfs

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文件系統

[root@localhost ~]# 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 掛載

[root@localhost ~]# mount -U 54161207-74c5-4851-b945-70c510a914c1 /mnt/t1
[root@localhost ~]# df -h
文件系統        容量  已用  可用 已用% 掛載點
/dev/sdb5       4.0G   17M  3.6G    1% /mnt/t1
#等同於mount /dev/sdb5  /mnt/t1

2.3 指定數據元數據都是用raid1 創建

[root@localhost ~]# umount /mnt/t1
[root@localhost ~]# 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

[root@localhost ~]# mount /dev/sdb5 /mnt/t1    
[root@localhost ~]# df -h
文件系統        容量  已用  可用 已用% 掛載點
/dev/sdb5       2.0G   17M  1.8G    1% /mnt/t1   #由此可見數據有raid0到raid1 一半用來做備份  元數據都是204.75mb  可寫部分1.8G

[root@localhost ~]# 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的基礎上寫入數據

[root@localhost ~]# dd if=/dev/zero of=/mnt/t1/a  bs=1024 count=1048576
[root@localhost ~]# dd if=/dev/zero of=/mnt/t1/b  bs=1024 count=1048576

[root@localhost 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
[root@localhost ~]# df -h
文件系統        容量  已用  可用 已用% 掛載點
/dev/sdb5       2.0G  1.9G   64K  100% /mnt/t1

[root@localhost ~]# 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模式

[root@localhost t1]# rm -f {a,b}

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

5.1、移除設備

[root@localhost ~]# 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.
[root@localhost ~]# df -h
文件系統        容量  已用  可用 已用% 掛載點
/dev/sdb5       3.0G  418M  1.8G   19% /mnt/t1

5.2、添加設備

[root@localhost ~]# btrfs device add  /dev/sdb8 /mnt/t1
[root@localhost ~]# df -h
文件系統        容量  已用  可用 已用% 掛載點
/dev/sdb5       4.0G  418M  2.9G   13% /mnt/t1

6.1、縮減

[root@localhost ~]# btrfs filesystem resize -700M  /mnt/t1
Resize ‘/mnt/t1‘ of ‘-700M‘
[root@localhost ~]# df -h
文件系統        容量  已用  可用 已用% 掛載點
/dev/sdb5       3.4G  418M  2.1G   17% /mnt/t1

6.2擴展到最大

[root@localhost ~]# btrfs filesystem resize max  /mnt/t1
Resize ‘/mnt/t1‘ of ‘max‘
[root@localhost ~]# df -h
文件系統        容量  已用  可用 已用% 掛載點
/dev/sdb5       4.0G  418M  3.1G   12% /mnt/t1

7、縮減還是設備移動之後做下數據均勻

[root@localhost ~]# btrfs balance start /mnt/t1

子卷跟快照

1、創建子卷

[root@localhost ~]# btrfs subvolume  create  /mnt/t1/logs
Create subvolume ‘/mnt/t1/logs‘

[root@localhost ~]#  btrfs subvolume  list /mnt/t1
ID 281 gen 196 top level 5 path logs

2、子卷默認是跟著父卷的,也可以單獨掛載 | 子卷一般不單獨掛載,在父卷下可以使用快照卷

[root@localhost ~]# umount /mnt/t1
[root@localhost ~]# mount -o subvol=logs /dev/sdb5 /mnt/t1   #mount -o subvolid=281 /dev/sdb5 /mnt/t1 
[root@localhost ~]# touch /mnt/t1/a
[root@localhost ~]# 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):

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

3、 創建快照

#現在logs下面創建一個標記文件
[root@localhost logs]# touch a
[root@localhost logs]# echo aa > a

#快照   還是要註意大小,快照是記錄源文件變化量,  源文件跟快照都在同一個文件系統中
[root@localhost logs]# btrfs subvolume snapshot /mnt/t1/logs/   /mnt/t1/logs_snapshot
Create a snapshot of ‘/mnt/t1/logs/‘ in ‘/mnt/t1/logs_snapshot‘

#快照驗證

[root@localhost logs]# tail -1 ../logs_snapshot/a
aa
[root@localhost logs]# echo bb >> a
[root@localhost logs]# tail -1 ../logs_snapshot/a
aa

[root@localhost logs]# touch b
[root@localhost logs]# ls ../logs_snapshot/
a

4、刪除快照

[root@localhost 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
[root@localhost logs]# cp --reflink=auto fstab fstab.bak
[root@localhost logs]# echo 888 >> fstab
[root@localhost logs]# tail -1 fstab.bak
UUID=943c7e04-b733-42fe-a1e2-eabf93693f6b swap                    swap    defaults        0 0

#通過寫時復制完成

6、刪除子卷

[root@localhost ~]# btrfs subvolume delete /mnt/t1/logs/
Delete subvolume (no-commit): ‘/mnt/t1/logs‘

Linux 文件系統之btrfs