1. 程式人生 > >btrfs

btrfs

linux、btrfs

btrfs

Technical Preview, 技術預覽版

BtrFS(B-tree文件系統,又稱為Butter FS或Better FS),2007由oracle開源後,得到了IBM、intel等廠商的大力支持,其目標計劃是替代linux目前的ext3/4,成為下一代linux標準的文件系統。

運行在linux上,並遵循GPL協議的強大文件系統。在2014年8月發布了穩定版。


btrfs的特性:

1.可擴展性:

1) ext系列文件系統使用塊位圖來保存每個塊空閑與否的信息(每個塊用一個位來表示是否空閑),當容量擴展時,塊位圖所占的空間會線性的增加,試想一下如果快位圖變得很大時,那麽查找空閑塊就需要大量的時間;BtrFS管理磁盤空間的最小單位是extent,一個extent由一組連續的block組成,extent由extent樹進行管理,因此相比ext系列10個塊需要10個bit來表示,btrfs只需要一個extent就可以,因此減少了元數據的量。對於大文件,extent表現出更加優異的管理性能。


2) ext系統inode是預分配的且大小固定,比如,100G的分區中,inode table只能存放131072個inode,意味著不可能創建131072個文件;同時, inode分配過小,容易導致磁盤空間無法充分利用,過大,容易造成磁盤空間浪費;btrfs為了解決這個問題,使用了動態分配inode,如下圖,每個inode只是FS tree中的一個節點,用戶可以無限制地任意插入新的inode,其物理存儲位置是動態分配的,所以沒有對文件個數的限制。


2.多物理卷支持:

btrfs可以跨越多個物理磁盤設備,動態的增加/減少設備來達到擴容/縮容的目的,技術上還支持(raid0、raid1、raid5、raid10等特性),以及聯機“添加”、“移除”以及“修改”

3.寫時復制更新機制(CoW):

復制、更新及替換指針,而非“就地”更新;btrfs的數據一致性是通過COW(Copy On Write)事務來保證的,所謂COW,即每次寫磁盤數據時,先當前塊數據復制到一個新塊,然後在新塊上進行更新寫入,當新塊寫入完成時,只需將原來指向舊塊的指針指向新塊。


4.數據及元數據校驗碼:checksum

btrfs的另一特點是使用checksum來保證數據的可靠性,假設從磁盤讀取一個塊數據,可以通過比較其checksum來判斷數據是否完整,其他文件系統在文件系統級別上是無法得知數據是否損壞的;同時由於checksum數據存儲在checksum樹的節點上,與塊數據是分開管理的,這樣的好處是能避免checksum和數據保存在同一個塊的時候,文件系統上層獲取了一個錯誤位置的塊時無從得知(因為checksum只計算塊數據是否完整而不是數據應該存在哪個塊,只要塊內數據並無損壞,checksum永遠都是正確的)


5.子卷:sub_volume

在一個文件系統(或邏輯卷)上創建子卷,並沒有層級限制,並且所有卷的空間大小都是可以動態調整的。其應用場景是可以為每個用戶分配一個單獨隔離的卷空間,來達到權限控制和配額管理的目的。


6.快照:支持快照的快照


7.透明壓縮,隱形壓縮:


mkfs.btrfs

選項:

-L|--label <name>:為即將創建的btrfs文件系統指定卷標

-d|--data <type>:為數據存儲指定類型;可以選擇的類型有:raid0, raid1, raid5, raid6, raid10 or single

-m|--metadata <profile>:指定元數據的存儲方式;可以選擇的類型有:raid0, raid1, raid5, raid6, raid10, single or dup

-O|--features <feature1>[,<feature2>...]:指定btrfs文件系統的特性,如果想要查看哪些特性,可以使用命令:mkfs.btrfs -O list-all


可以用支持btrfs文件系統的mount命令中使用下列方式開啟透明壓縮功能:

mount -o compress={lzo|zlib} DEVICE MOUNT_POINT


btrfs

btrfs - control a btrfs filesystem

btrfs <command> [<args>]


btrfs filesystem show

查看btrfs文件系統的詳細屬性;


btrfs filesystem df MOUNT_POINT

查看文件系統的掛載和使用情況

例:btrfs filesystem df /mnt/btrfs/


在線修改文件系統大小:

btrfs filesystem resize {+|-}SIZE[KkMmGgTtPpEe] MOUNT_POINT


例:btrfs filesystem resize -15G /mnt/btrfs/

btrfs filesystem resize +5G /mnt/btrfs/

btrfs filesystem resize max /mnt/btrfs/


向btrfs文件系統中添加或刪除設備

btrfs device

btrfs device add [options] <device> [<device>...] <path>

向文件系統中添加一個新設備

btrfs device delete <device> [<device>...] <path>

從文件系統中刪除一個設備



平衡數據:

btrfs balance start [options] <path>

開啟跨設備的chunk的數據平衡

-mconvert={radi0|raid1|raid5|radi10|raid6|single|dup}

改變元數據的數據平衡布局方式

例:btrfs balance start -mconvert=raid5 /mnt/btrfs/


-dconvert={radi0|raid1|raid5|radi10|raid6|single}

改變數據的數據平衡布局方式

例:btrfs balance start -dconvert=raid6 /mnt/btrfs/


btrfs balance pause <path>

暫停數據平衡

btrfs balance cancel <path>

取消正在進行的或已經暫停的數據平衡

btrfs balance resume <path>

恢復被打斷的數據平衡

btrfs balance status [-v] <path>

顯示正在進行的或已經暫停的數據平衡的狀態信息


子卷管理:

btrfs subvolume create [-i <qgroupid>] [<dest>/]<name>

創建子卷

例:btrfs subvolume create /mnt/btrfs/mysub1/


btrfs subvolume delete [options] <subvolume> [<subvolume>...]

刪除子卷

例:btrfs subvolume delete /mnt/btrfs/mysub1/


btrfs subvolume show <subvol-path>

顯示子卷的信息

例:btrfs subvolume show /mnt/btrfs/mysub1/



子卷類似於ext文件系統中的將其他分區掛載到根目錄下的某個空閑子目錄的操作;


快照:

btrfs subvolume snapshot [-r] [-i <qgroupid>] <source> <dest>|[<dest>/]<name>

創建指定子卷的快照卷


例:btrfs subvolume snapshot /mnt/btrfs/mysub1/ /mnt/btrfs/snap_mysub1


將btrfs和ext系列進行轉換:

btrfs-convert

btrfs-convert - convert from ext2/3/4 filesystem to btrfs or rollback

btrfs-convert [options] <device>


將文件系統從ext轉換為btrfs:

~]# btrfs-convert /dev/sdb1


註意:/dev/sdb1分區,應該事先格式化為ext系列文件系統;


將文件系統從btrfs回滾到ext

~]# btrfs-convert -r /dev/sdb1

!!有一些磁盤:

[[email protected] ~]# fdisk -l


磁盤 /dev/sdc:21.5 GB, 21474836480 字節,41943040 個扇區

Units = 扇區 of 1 * 512 = 512 bytes

扇區大小(邏輯/物理):512 字節 / 512 字節

I/O 大小(最小/最佳):512 字節 / 512 字節



磁盤 /dev/sde:21.5 GB, 21474836480 字節,41943040 個扇區

Units = 扇區 of 1 * 512 = 512 bytes

扇區大小(邏輯/物理):512 字節 / 512 字節

I/O 大小(最小/最佳):512 字節 / 512 字節



磁盤 /dev/sdb:21.5 GB, 21474836480 字節,41943040 個扇區

Units = 扇區 of 1 * 512 = 512 bytes

扇區大小(邏輯/物理):512 字節 / 512 字節

I/O 大小(最小/最佳):512 字節 / 512 字節



磁盤 /dev/sdd:21.5 GB, 21474836480 字節,41943040 個扇區

Units = 扇區 of 1 * 512 = 512 bytes

扇區大小(邏輯/物理):512 字節 / 512 字節

I/O 大小(最小/最佳):512 字節 / 512 字節


!!將/dev/sdb、/dev/sdc創建成一個btrfs文件系統,並指定卷標mybtrfs:

[[email protected] ~]# mkfs.btrfs -L mybtrfs /dev/sdb /dev/sdc

btrfs-progs v4.4.1

See http://btrfs.wiki.kernel.org for more information.


Label: mybtrfs

UUID: 42318b53-99e1-4b42-8efd-e66ef655a51f

Node size: 16384

Sector size: 4096

Filesystem size: 40.00GiB

Block group profiles:

Data: RAID0 2.01GiB

Metadata: RAID1 1.01GiB

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


!!查看已經創建的文件系統:

[[email protected] ~]# btrfs filesystem show

Label: ‘mybtrfs‘ uuid: 42318b53-99e1-4b42-8efd-e66ef655a51f

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


!!創建掛載點:

[[email protected] ~]# mkdir /mybtrfs


!!查看其UUID是否相同,相同就可以使用其中一個進行掛載,開啟透明壓縮:

[[email protected] ~]# blkid /dev/sdb

/dev/sdb: LABEL="mybtrfs" UUID="42318b53-99e1-4b42-8efd-e66ef655a51f" UUID_SUB="85df99ac-f8d9-4b2e-aefc-3d174f613e7a" TYPE="btrfs"

[[email protected] ~]# blkid /dev/sdc

/dev/sdc: LABEL="mybtrfs" UUID="42318b53-99e1-4b42-8efd-e66ef655a51f" UUID_SUB="b3de9270-5062-4ff9-a8e1-0293f6128b5b" TYPE="btrfs"

[[email protected] ~]# mount -t btrfs -o compress=lzo /dev/sdb /mybtrfs


!!查看文件系統的掛載和使用情況:

[[email protected] ~]# btrfs filesystem df /mybtrfs

Data, RAID0: total=2.00GiB, used=768.00KiB

System, RAID1: total=8.00MiB, used=16.00KiB

Metadata, RAID1: total=1.00GiB, used=112.00KiB

GlobalReserve, single: total=16.00MiB, used=0.00B

[[email protected] ~]# df -h

文件系統 容量 已用 可用 已用% 掛載點

/dev/mapper/cl-root 18G 4.5G 14G 25% /

devtmpfs 473M 0 473M 0% /dev

tmpfs 489M 156K 489M 1% /dev/shm

tmpfs 489M 7.2M 482M 2% /run

tmpfs 489M 0 489M 0% /sys/fs/cgroup

/dev/sda1 197M 151M 47M 77% /boot

tmpfs 98M 12K 98M 1% /run/user/1000

/dev/sr0 4.1G 4.1G 0 100% /run/media/wenyao/CentOS 7 x86_64

tmpfs 98M 0 98M 0% /run/user/0

/dev/sdb 40G 17M 38G 1% /mybtrfs


!!縮減文件系統(縮減必須在掛載的情況下)再擴增:

[[email protected] ~]# btrfs filesystem resize -10G /mybtrfs

Resize ‘/mybtrfs‘ of ‘-10G‘

[[email protected] ~]# btrfs filesystem show

Label: ‘mybtrfs‘ uuid: 42318b53-99e1-4b42-8efd-e66ef655a51f

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


[[email protected] ~]# btrfs filesystem df /mybtrfs

Data, RAID0: total=2.00GiB, used=768.00KiB

System, RAID1: total=8.00MiB, used=16.00KiB

Metadata, RAID1: total=1.00GiB, used=112.00KiB

GlobalReserve, single: total=16.00MiB, used=0.00B

[[email protected] ~]# btrfs filesystem resize +5G /mybtrfs

Resize ‘/mybtrfs‘ of ‘+5G‘

[[email protected] ~]# btrfs filesystem show

Label: ‘mybtrfs‘ uuid: 42318b53-99e1-4b42-8efd-e66ef655a51f

Total devices 2 FS bytes used 896.00KiB

devid 1 size 15.00GiB used 2.01GiB path /dev/sdb

devid 2 size 20.00GiB used 2.01GiB path /dev/sdc



!!向文件系統添加一個設備:

[[email protected] ~]# btrfs device add /dev/sdd /mybtrfs

[[email protected] ~]# btrfs filesystem show

Label: ‘mybtrfs‘ uuid: 42318b53-99e1-4b42-8efd-e66ef655a51f

Total devices 3 FS bytes used 896.00KiB

devid 1 size 15.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/sdd


[[email protected] ~]# df -h

文件系統 容量 已用 可用 已用% 掛載點

/dev/mapper/cl-root 18G 4.5G 14G 25% /

devtmpfs 473M 0 473M 0% /dev

tmpfs 489M 156K 489M 1% /dev/shm

tmpfs 489M 7.1M 482M 2% /run

tmpfs 489M 0 489M 0% /sys/fs/cgroup

/dev/sda1 197M 151M 47M 77% /boot

tmpfs 98M 16K 98M 1% /run/user/1000

/dev/sr0 4.1G 4.1G 0 100% /run/media/wenyao/CentOS 7 x86_64

/dev/sdb 55G 17M 51G 1% /mybtrfs


!!創建一個子卷(要在其掛在目錄下創建),查看子卷信息,然後刪除:

[[email protected] mysub1]# btrfs subvolume create /mybtrfs/bbbbb

Create subvolume ‘/mybtrfs/bbbbb‘

[[email protected] mysub1]# btrfs subvolume show /mybtrfs/bbbbb

/mybtrfs/bbbbb

Name: bbbbb

UUID: 5fd8ab9a-886e-aa4a-ad07-457eddd1d960

Parent UUID: -

Received UUID: -

Creation time: 2017-06-06 12:50:53 +0800

Subvolume ID: 261

Generation: 41

Gen at creation: 40

Parent ID: 5

Top level ID: 5

Flags: -

Snapshot(s):

[[email protected] mysub1]# btrfs subvolume delete /mybtrfs/bbbbb

Delete subvolume (no-commit): ‘/mybtrfs/bbbbb‘

[[email protected] mysub1]# btrfs subvolume show /mybtrfs/bbbbb

ERROR: cannot find real path for ‘/mybtrfs/bbbbb‘: No such file or directory


!!快照卷其實就是特殊的子卷,想對根目錄進行備份的話, 就可以執行下面的指令:

[[email protected] mysub1]# btrfs subvolume snapshot /mybtrfs/ /mybtrfs/snap_mybtrfs

Create a snapshot of ‘/mybtrfs/‘ in ‘/mybtrfs/snap_mybtrfs‘


!!查看創建的快照卷:

[[email protected] mysub1]# btrfs subvolume list /mybtrfs

ID 262 gen 43 top level 5 path snap_mybtrfs


!!創建了/dev/sde1分區,並將其格式化為ext4文件系統,將其轉化為btrfs文件系統,並回滾:

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.

[[email protected] mysub1]# btrfs-convert -r /dev/sde1

rollback complete.




btrfs