Linux系統管理之btrfs管理及應用

1、何爲btrfsnode

        Btrfs(一般念成Butter FS,B-tree,  Better FS),由Oracle於2007年宣佈並進行中的COW(copy-on-write式)文件系統。GPL受權的開源文件系統。目標是取代Linux目前的ext3文件系統,改善ext3的限制,特別是單一文件大小的限制,總文件系統大小限制以及加入文件校驗和特性。加入目前ext3/4未支持的一些功能,例如可寫的磁盤快照(snapshots),以及支持遞歸的快照(snapshots of snapshots),內建磁盤陣列(RAID)支持,支持子卷(Subvolumes)的概念,容許在線調整文件系統大小。linux

        文件系統彷佛是內核中比較穩定的部分,多年來,人們一直使用 ext2/3,ext 文件系統以其卓越的穩定性成爲了事實上的 Linux 標準文件系統。近年來 ext2/3 暴露出了一些擴展性問題,因而便催生了 ext4 。在 2008 年發佈的 Linux2.6.19 內核中集成了 ext4 的 dev 版本。 2.6.28 內核發佈時,ext4 結束了開發版,開始接受用戶的使用。彷佛 ext 就將成爲 Linux 文件系統的代名詞。然而當您閱讀不少有關 ext4 的文章時,會發現都不約而同地提到了 btrfs,並認爲 ext4 將是一個過渡的文件系統。 ext4 的做者 Theodore Tso 也盛讚 btrfs 並認爲 btrfs 將成爲下一代 Linux 標準文件系統。 Oracle,IBM, Intel 等廠商也對 btrfs 表現出了極大的關注,投入了資金和人力。bash


2、btrfs的核心特性ide

    多物理卷支持:btrfs可由多個底層物理卷組成;支持RAID,以聯機「添加」、「移除」,「修改」;工具

    寫時複製更新機制(CoW):複製、更新及替換指針,而非「就地」更新。即當咱們修改某個文件的時候,不會直接修改源文件,而是複製一份而後對複製的文件進行修改,修改完把源文件的指針指向複製的文件。ui

    數據及元數據校驗碼:存儲每個文件的時候,會把數據的校驗碼和元數據的校驗碼經過文件某些擴展保存下來,每一個文件讀取時快速校驗文件是否損壞,若是檢測到損壞還會自動嘗試進行修復。spa

    子卷:sub_volume,每個子卷均可以獨立進行掛載debug

    快照:Btrfs 支持建立快照 (snapshot),和克隆 (clone) ,支持快照的快照;指針

    透明壓縮:任何數據流發往btrfs文件系統的時候,它自動可以經過佔據CPU的時鐘週期完成數據壓縮後存放,當文件須要讀取的時候又自動解壓縮。可以節約空間,可是花費CPU時鐘週期。orm


3、btrfs的管理

        在Centos 7以上的版本中,btrfs默認是已經支持的了,可是在Centos 7如下的版本中,若是想要使用btrfs須要從新編譯和更新內核及其對應的管理工具。

[root@localhost ~]# mkfs
mkfs         mkfs.cramfs  mkfs.ext3    mkfs.minix   
mkfs.btrfs   mkfs.ext2    mkfs.ext4    mkfs.xfs     
#默認安裝的Centos 7已經支持btrfs文件系統


    在實驗中,爲了演示真實生產環境,咱們爲虛擬主機添加了三塊硬盤來作實驗,由於btrfs數據和元數據存放機制是能夠基於陣列的形式的,同個硬盤的同一分區作btrfs除了單純的組合分區大小外並沒有其餘意義。

wKioL1YKTa3RclYfAAMTRRbPBV8486.jpg

[root@localhost ~]# fdisk -l

Disk /dev/sda: 107.4 GB, 107374182400 bytes, 209715200 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x00012971

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048     2099199     1048576   83  Linux
/dev/sda2         2099200    44042239    20971520   83  Linux
/dev/sda3        44042240    48236543     2097152   82  Linux swap / Solaris

Disk /dev/sdb: 8589 MB, 8589934592 bytes, 16777216 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes


Disk /dev/sdc: 8589 MB, 8589934592 bytes, 16777216 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes


Disk /dev/sdd: 8589 MB, 8589934592 bytes, 16777216 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
#能夠看到新添加的三塊硬盤:/dev/sdb,/dev/sdc,/dev/sdd


建立btrfs文件系統:

    mkfs.btrfs

        -L 'LABEL':指定卷標名

        -d <type>: raid0, raid1, raid5, raid6, raid10, single:指定數據的存放機制

        -m <profile>: raid0, raid1, raid5, raid6, raid10, single , dup:指定元數據的存放機制

        -O <feature>:指定格式化時啓動的feature,不是全部內核都支持,須要內核啓動對應的某些功能

        -O list-all: 列出支持的全部feature;

[root@localhost ~]# mkfs.btrfs -L mybtrfs /dev/sdb /dev/sdc 
Btrfs v3.16.2
See http://btrfs.wiki.kernel.org for more information.

Turning ON incompat feature 'extref': increased hardlink limit per file to 65536
adding device /dev/sdc id 2
fs created label mybtrfs on /dev/sdb
	nodesize 16384 leafsize 16384 sectorsize 4096 size 16.00GiB
#把/dev/sdb和/dev/sdc以默認的機制整合爲一個btrfs文件系統,LABEL名存放在/dev/sdb上,總大小爲兩個硬盤大小

[root@localhost ~]# btrfs filesystem show
Label: 'mybtrfs'  uuid: d004175e-6488-4ded-a50b-815d58542171
	Total devices 2 FS bytes used 112.00KiB
	devid    1 size 8.00GiB used 1.83GiB path /dev/sdb
	devid    2 size 8.00GiB used 1.81GiB path /dev/sdc
#顯示btrfs文件系統的信息,這裏能夠看到咱們剛剛建立的卷標名爲:mybtrfs的uuid,和整合的兩個硬盤

[root@localhost ~]# blkid /dev/sdb
/dev/sdb: LABEL="mybtrfs" UUID="d004175e-6488-4ded-a50b-815d58542171" UUID_SUB="814a7aa3-77e7-442b-845d-dfbeaa14e143" TYPE="btrfs" 
[root@localhost ~]# blkid /dev/sdc
/dev/sdc: LABEL="mybtrfs" UUID="d004175e-6488-4ded-a50b-815d58542171" UUID_SUB="0f17445e-24b3-43fa-b8df-ffe49bbb2852" TYPE="btrfs" 
#這裏能夠看到兩個硬盤的UUID是同樣的,說明屬於同一個btrfs文件系統卷,可是子卷UUID_SUB是不同的

[root@localhost ~]# mkdir /mybtrfs
[root@localhost ~]# mount /dev/sdb /mybtrfs/
[root@localhost ~]# mount
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime,seclabel)
devtmpfs on /dev type devtmpfs (rw,nosuid,seclabel,size=499884k,nr_inodes=124971,mode=755)
securityfs on /sys/kernel/security type securityfs (rw,nosuid,nodev,noexec,relatime)
tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev,seclabel)
devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,seclabel,gid=5,mode=620,ptmxmode=000)
configfs on /sys/kernel/config type configfs (rw,relatime)
/dev/sda2 on / type ext4 (rw,relatime,seclabel,data=ordered)
selinuxfs on /sys/fs/selinux type selinuxfs (rw,relatime)
systemd-1 on /proc/sys/fs/binfmt_misc type autofs (rw,relatime,fd=30,pgrp=1,timeout=300,minproto=5,maxproto=5,direct)
mqueue on /dev/mqueue type mqueue (rw,relatime,seclabel)
hugetlbfs on /dev/hugepages type hugetlbfs (rw,relatime,seclabel)
debugfs on /sys/kernel/debug type debugfs (rw,relatime)
/dev/sda1 on /boot type xfs (rw,relatime,seclabel,attr2,inode64,noquota)
/dev/sdb on /mybtrfs type btrfs (rw,relatime,seclabel,space_cache)

[root@localhost ~]# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda2        20G  903M   18G   5% /
devtmpfs        489M     0  489M   0% /dev
tmpfs           497M     0  497M   0% /dev/shm
tmpfs           497M  6.6M  491M   2% /run
tmpfs           497M     0  497M   0% /sys/fs/cgroup
/dev/sda1      1014M  114M  901M  12% /boot
/dev/sdb         16G  896K   14G   1% /mybtrfs
#能夠看到咱們建立掛載的btrfs已經能夠正常使用

    前面咱們說過btrfs是支持透明壓縮機制的,在Centos 7中,mount有個選項是支持透明壓縮機制的,若是須要開啓,掛載的時候可使用下面命令:

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

[root@localhost mybtrfs]# mount -o compress=zlib /dev/sdb /mybtrfs/


4、btrfs的管理

①、查看和設置btrfs文件系統

    btrfs filesystem show

        --mounted:查看已經掛載的btrfs文件系統信息

        --all-devices:查看全部的btrfs文件系統信息,默認值

        <path>|<uuid>|<device>|<label>:指明查看具體掛載路徑,uuid,設備,卷標名的btrfs文件系統信息

[root@localhost mybtrfs]# btrfs filesystem show --mounted
Label: 'mybtrfs'  uuid: d004175e-6488-4ded-a50b-815d58542171
	Total devices 2 FS bytes used 768.00KiB
	devid    1 size 8.00GiB used 1.83GiB path /dev/sdb
	devid    2 size 8.00GiB used 1.81GiB path /dev/sdc

    

    btrfs filesystem sync

        <path>:把掛載使用的btrfs文件系統在內存中的數據同步到硬盤上

    

    btrfs filesystem df

        <path>:查看已掛載的btrfs文件系統的數據和元數據使用率狀況

[root@localhost mybtrfs]# btrfs filesystem df /mybtrfs/
Data, RAID0: total=1.60GiB, used=640.00KiB
Data, single: total=8.00MiB, used=0.00
System, RAID1: total=8.00MiB, used=16.00KiB
System, single: total=4.00MiB, used=0.00
Metadata, RAID1: total=1.00GiB, used=112.00KiB
Metadata, single: total=8.00MiB, used=0.00
GlobalReserve, single: total=16.00MiB, used=0.00

    

    btrfs filesystem label

        <device>|<mount_point>:查看設備和掛載點的LABEL名

        [<device>|<mount_point>] [<newlabel>]:修改設備和掛載點的LABEL名

[root@localhost mybtrfs]# btrfs filesystem label /dev/sdd mybtrfs1
[root@localhost mybtrfs]# btrfs filesystem label /dev/sdd
mybtrfs1

   

    btrfs filesystem resize

        [<devid>:]<size>[gkm]|[<devid>:]max <path>:調整掛載的btrfs文件系統的大小

[root@localhost mybtrfs]# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda2        20G  903M   18G   5% /
devtmpfs        489M     0  489M   0% /dev
tmpfs           497M     0  497M   0% /dev/shm
tmpfs           497M  6.6M  491M   2% /run
tmpfs           497M     0  497M   0% /sys/fs/cgroup
/dev/sda1      1014M  114M  901M  12% /boot
/dev/sdb         16G  896K   14G   1% /mybtrfs
[root@localhost mybtrfs]# btrfs filesystem resize -4G /mybtrfs/
Resize '/mybtrfs/' of '-4G'
[root@localhost mybtrfs]# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda2        20G  903M   18G   5% /
devtmpfs        489M     0  489M   0% /dev
tmpfs           497M     0  497M   0% /dev/shm
tmpfs           497M  6.6M  491M   2% /run
tmpfs           497M     0  497M   0% /sys/fs/cgroup
/dev/sda1      1014M  114M  901M  12% /boot
/dev/sdb         12G  896K  6.0G   1% /mybtrfs
#能夠看到mybtrfs大小由原來的16G變爲12G
[root@localhost mybtrfs]# btrfs filesystem resize max /mybtrfs/
Resize '/mybtrfs/' of 'max'
#直接把邏輯邊界調整爲最大物理邊界值


②、查看和設置btrfs設備

    btrfs device add [-Kf] <dev> [<dev>...] <path>:爲已經建立的btrfs中新添加一個設備,當硬盤已經格式化爲其餘文件系統時候,須要指定-f進行強制執行

[root@localhost mybtrfs]# btrfs device add /dev/sdd /mybtrfs/
[root@localhost mybtrfs]# btrfs filesystem show
Label: 'mybtrfs'  uuid: d004175e-6488-4ded-a50b-815d58542171
	Total devices 3 FS bytes used 768.00KiB
	devid    1 size 8.00GiB used 1.83GiB path /dev/sdb
	devid    2 size 8.00GiB used 1.81GiB path /dev/sdc
	devid    3 size 8.00GiB used 0.00 path /dev/sdd
#這裏咱們能夠看到新添加的磁盤中使用爲0,這是由於新添加的磁盤數據沒有均衡到新磁盤中
[root@localhost mybtrfs]# btrfs balance start /mybtrfs/
Done, had to relocate 6 out of 6 chunks
[root@localhost mybtrfs]# btrfs filesystem show
Label: 'mybtrfs'  uuid: d004175e-6488-4ded-a50b-815d58542171
	Total devices 3 FS bytes used 448.00KiB
	devid    1 size 8.00GiB used 1.03GiB path /dev/sdb
	devid    2 size 8.00GiB used 256.00MiB path /dev/sdc
	devid    3 size 8.00GiB used 288.00MiB path /dev/sdd
#添加完硬盤的時候須要對數據進行均衡操做,讓數據平衡存放到各硬盤中

 

    btrfs device delete [-Kf] <dev> [<dev>...] <path>:在已經建立的btrfs刪除一個設備

[root@localhost mybtrfs]# btrfs device delete /dev/sdb /mybtrfs/
#刪除設備時,btrfs的容量要大於數據容量,刪除設備btrfs會自動把刪除的設備中的數據移動到其餘設備中

    btrfs device scan [(--all-devices|-d)|<device> [<device>...]]:掃描btrfs中的設備

    btrfs device stats [(--all-devices|-d)|<device> [<device>...]]:顯示I/O統計數據


③、均衡全部數據到各btrfs設備,從新修改數據和元數據的組織機制

    btrfs balance start <path>:當咱們聯機添加硬盤時,就須要把以前硬盤中的數據均衡到全部的硬盤中

[root@localhost mybtrfs]# btrfs balance start /mybtrfs/


注意:修改數據存放機制,設備若是不夠的話raid級別是不支持的。入raid5至少須要三塊硬盤

    btrfs balance start -dconvert= raid0,raid1,raid5,raid6,raid10,single <path>:聯機修改數據的存放機制

[root@localhost mybtrfs]# btrfs balance start -dconvert=raid5 /mybtrfs/
Done, had to relocate 1 out of 3 chunks


    btrfs balance start -mconvert= raid0,raid1,raid5,raid6,raid10,single,dup <path>:聯機修改元數據的存放機制

[root@localhost mybtrfs]# btrfs balance start -mconvert=raid5 /mybtrfs/
Done, had to relocate 2 out of 3 chunks

    btrfs balance status <path>:查看當前磁盤均衡信息

    btrfs balance pause <path>:暫停數據均衡,若是數據量太大又遇到業務繁忙時,能夠暫時中止

    btrfs balance resume <path>:從新執行中止的數據均衡

    btrfs balance cancel <path>:清除運行或中止的數據均衡

        

④、管理btrfs設備子卷

    btrfs subvolume create [-i <qgroupid>] <name>:建立子卷

[root@localhost mybtrfs]# btrfs subvolume create /mybtrfs/logs
Create subvolume '/mybtrfs/logs'
[root@localhost mybtrfs]# btrfs subvolume list /mybtrfs/
ID 262 gen 57 top level 5 path logs
#如今能夠查看到logs子卷,ID爲262
root@localhost /]# umount /mybtrfs/
[root@localhost /]# mkdir /logs
[root@localhost /]# mount -o subvol=logs /dev/sdb /logs/
#當掛載父卷的時候,全部的子卷都會默認掛載,使用此命令單獨掛載子卷


    btrfs subvolume delete [options] <subvolume> [<subvolume>...]:刪除子卷  

[root@localhost mybtrfs]# btrfs subvolume delete /mybtrfs/logs/
Transaction commit: none (default)
Delete subvolume '/mybtrfs/logs'


    btrfs subvolume list [options] [-G <value>] [-C <value>] [--sort=rootid,gen,ogen,path] <path>:列出全部或指定的子卷

[root@localhost mybtrfs]# btrfs subvolume list /mybtrfs/
ID 262 gen 57 top level 5 path logs
#如今能夠查看到logs子卷,ID爲262


    btrfs subvolume snapshot [-r] <source> <dest>|<name>:作快照  

[root@localhost mybtrfs]# btrfs subvolume create /mybtrfs/logs
Create subvolume '/mybtrfs/logs'
[root@localhost mybtrfs]# btrfs subvolume snapshot /mybtrfs/logs/ /mybtrfs/logs_snapshot
Create a snapshot of '/mybtrfs/logs/' in '/mybtrfs/logs_snapshot'
[root@localhost mybtrfs]# btrfs subvolume list /mybtrfs/
ID 262 gen 64 top level 5 path logs
ID 263 gen 64 top level 5 path logs_snapshot
#能夠查看此時快照卷做爲父卷的子卷已經生產。

    因爲btrfs寫時複製的機制,這裏還能夠對單個文件進行快照

[root@localhost logs]# cp --reflink passwd passwd.snap


    btrfs subvolume get-default <path>:查看那個子卷爲默認卷

    btrfs subvolume set-default <id> <path>:設置默認子卷

    btrfs subvolume show <path>:查看子卷的詳細信息

[root@localhost /]# btrfs subvolume show /logs/
/logs
	Name: 			logs
	uuid: 			7776e291-e9c4-664d-8eb7-15a42a1bdcb4
	Parent uuid: 		-
	Creation time: 		2015-09-29 07:28:59
	Object ID: 		262
	Generation (Gen): 	58
	Gen at creation: 	57
	Parent: 		5
	Top Level: 		5
	Flags: 			-
	Snapshot(s):


⑤、將其餘文件系統轉換爲btrfs系統

    一、對須要轉換的文件系統進行強制檢查

[root@localhost logs]# fsck -f /dev/sda4
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/sda4: 11/655360 files (0.0% non-contiguous), 83137/2621440 block

    二、使用btrfs-convert命令進行轉換

[root@localhost logs]# btrfs-convert /dev/sda4
creating btrfs metadata.
creating ext2fs p_w_picpath file.
cleaning up system chunk.
conversion complete.

    三、查看是否轉換成功並掛載查看是否正常

[root@localhost logs]# btrfs filesystem show
Label: none  uuid: 5eb3f147-519a-49ea-ad21-d754f966aafa
	Total devices 1 FS bytes used 324.80MiB
	devid    1 size 10.00GiB used 10.00GiB path /dev/sda4

    四、對轉換成功的文件系統降級回原來的文件系統

[root@localhost logs]# btrfs-convert -r /dev/sda4
rollback complete.
[root@localhost logs]# blkid /dev/sda4
/dev/sda4: UUID="b9b43946-e2df-4348-b431-0cb5212b2f0d" TYPE="ext4"
#這裏能夠看到/dev/sda4已經降級會ext4
相關文章
相關標籤/搜索