Linux學習筆記之 Btrfs文件系統簡介及使用

Btrfs相關介紹:

Btrfs 是一個 Linux 中的新的寫時複製(copy-on-write (COW))的文件系統,目的是實現高級功能的同時着重與容錯功能,修復功能以及易於管理。目前由Oracle, Red Hat, 富士通, Intel, SUSE以及其他組織共同開發,在 GPL 許可證下發行,同時向任何人公開代碼。


Btrfs核心特性:

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


寫時複製更新機制(CoW):複製、更新及替換指針,而非“就地”更新;在文件進行修改的時候,首先將文件複製一份出來,在複製出來的文件上進行修改,修改完成之後,將指向原有文件的指針修改指向到修改完成的文件上,若修改完成的文件出現了錯誤,則我們可以通過原文件進行修復


數據及元數據校驗碼:checksum ,當存儲某個文件時,checksum會將數據的源數據和數據的校驗碼,分別通過文件的屬性擴展進行保存,當我們再次讀取數據時可以方便的檢測數據是否受損,如果文件受損系統可以完成自動修復;


子卷:sub_volume,在一個捲上創建多個子卷,在每一個子捲上創建文件系統,並掛載使用;


快照:支持快照的快照;因此可以實現類似增量快照的機制


透明壓縮 :如果我們在存儲文件時,進行壓縮存儲,那麼在文件發往btrfs時,會自動的佔用時鐘週期,完成數據的壓縮存放,而用戶並不知道,在用戶讀取文件時,會自動的進行文件的解壓縮,可以實現節約磁盤空間。但是壓縮和解壓縮會佔用時鐘週期;


Btrfs文件系統如何創建:



mkfs.btrfs
-L 'LABEL':指定文件系統的卷標;
-d <type>: raid0, raid1, raid5, raid6, raid10, single  指明數據的存放方式,支持RAID機制;
-m <profile>: raid0, raid1, raid5, raid6, raid10, single, dup 指明元數據的存放方式,是否可跨越多個物理卷,支持RAID機制;
-O <feature>:在格式化文件系統的時候,是否直接開啓文件系統的某些特性;
-O list-all: 列出支持的所有特性;
[root@centos7 ~]# fdisk -l  #有三塊硬盤sdb,sdc,sdd 用於創建btrfs 文件系統,大小均爲20G
Disk /dev/sdd: 21.5 GB, 21474836480 bytes, 41943040 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/sdb: 21.5 GB, 21474836480 bytes, 41943040 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: 21.5 GB, 21474836480 bytes, 41943040 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
[root@centos7 ~]# mkfs.btrfs -L mydata  /dev/sdb /dev/sdc #將sdb,sdc創建爲btrfs文件系統
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 mydata on /dev/sdb
nodesize 16384 leafsize 16384 sectorsize 4096 size 40.00GiB
[root@centos7 ~]# btrfs filesystem show   #查看系統上的所有btrfs文件系統
Label: 'mydata'  uuid: 70cf9f41-8977-4265-bf27-ca38b6459940
Total devices 2 FS bytes used 112.00KiB
devid    1 size 20.00GiB used 2.03GiB path /dev/sdb
devid    2 size 20.00GiB used 2.01GiB path /dev/sdc
[root@centos7 ~]# blkid /dev/sdb    #查看設備sdb的屬性
/dev/sdb: LABEL="mydata" UUID="70cf9f41-8977-4265-bf27-ca38b6459940" UUID_SUB="b8c340e2-6165-4b31-90df-278b5ac77a2f" TYPE="btrfs" 
[root@centos7 ~]# blkid /dev/sdc    #查看設備sdc的屬性
/dev/sdc: LABEL="mydata" UUID="70cf9f41-8977-4265-bf27-ca38b6459940" UUID_SUB="a80e87bb-9564-488a-9c8f-a403d0e4090a" TYPE="btrfs"
可見/sdb,/sdc UUID一直,子卷UUID不同
[root@centos7 ~]# mkdir /mydata    #創建掛載點/mydata
[root@centos7 ~]# mount /dev/sdb /mydata   #掛載剛剛創建的文件系統,此時掛載/dev/sdc是一樣的效果
[root@centos7 ~]# mount | grep /mydata    #掛載成功
/dev/sdb on /mydata type btrfs (rw,relatime,seclabel,space_cache)
#man btrfs filesystem 可用來查看命令幫助文檔


調整btrfs文件系統大小(邏輯邊界):



命令格式:btrfs filesystem resize  [<devid>:]<size>[gkm]|[<devid>:]max <path>

聯機縮減文件系統大小

[root@centos7 ~]# btrfs filesystem resize -10G /mydata    #將文件系統大小縮減去10G
Resize '/mydata' of '-10G'
[root@centos7 ~]# df -lh /mydata    #此時文件系統大小變爲了30G
Filesystem      Size  Used Avail Use% Mounted on
/dev/sdb         30G  1.0M   18G   1% /mydata

聯機擴張文件系統大小:

[root@centos7 ~]# btrfs filesystem resize +5G /mydata    #將文件系統大小擴展5G
Resize '/mydata' of '+5G'
[root@centos7 ~]# df -lh /mydata    #建系統此時增加到了35G
Filesystem      Size  Used Avail Use% Mounted on
/dev/sdb         35G  1.0M   28G   1% /mydata
[root@centos7 ~]# btrfs filesystem resize max /mydata    #max,將文件系統大小調整至其物理邊界40G
Resize '/mydata' of 'max'
[root@centos7 ~]# df -lh /mydata/
Filesystem      Size  Used Avail Use% Mounted on
/dev/sdb         40G  1.0M   38G   1% /mydata


調整btrfs物理邊界大小:

命令格式:btrfs device add/delete/scan <dev>  MOUNT_POINT
[root@centos7 ~]# btrfs device add /dev/sdd /mydata    #爲btrfs文件系統,增加一塊硬盤sdd
[root@centos7 ~]# df -lh /mydata #完成後,總大小爲60G
Filesystem      Size  Used Avail Use% Mounted on
/dev/sdb         60G  1.0M   56G   1% /myda


透明壓縮:


只需在掛載時候,使用-o 並指定壓縮方式即可,對用戶是透明的,可以選擇lzo或zlib兩種壓縮方式

命令格式:mount -o compress={lzo|zlib} DEVICE MOUNT_POINT


btrfs文件均衡:



命令格式: btrfs balance start [OPTIONS] <FILTERS> MOUNT_POINT

常用選項有:

-d: 指定數據的組織機制

-s:指定元數據的組織機制

-m:指定文件系統的組織機制

[root@centos7 ~]# btrfs device add /dev/sdd /mydata    #添加 sdd設備到btrfs文件系統
[root@centos7 ~]# btrfs filesystem show   #查看btrf文件系統信息
Label: 'mydata'  uuid: 70cf9f41-8977-4265-bf27-ca38b6459940
Total devices 3 FS bytes used 640.00KiB
devid    2 size 20.00GiB used 2.03GiB path /dev/sdc
devid    3 size 20.00GiB used 0.00 path /dev/sdb
 devid    4 size 20.00GiB used 1.03GiB path /dev/sdd
[root@centos7 ~]# btrfs balance start -mconvert=raid5 /mydata  #均衡文件,並使用raid5組織文件系統
Done, had to relocate 2 out of 3 chunk
注:raid5,至少需要3塊磁盤。
刪除btrfs的物理卷:
[root@centos7 ~]# btrfs device delete /dev/sdb /mydata    #將sdb設備移除
[root@centos7 ~]# df -lh /mydata
Filesystem      Size  Used Avail Use% Mounted on
/dev/sdc         40G  1.0M   38G   1% /mydata
[root@centos7 ~]# btrfs filesystem show /mydata    #可見sdb 設備已經移除
Label: 'mydata'  uuid: 70cf9f41-8977-4265-bf27-ca38b6459940
Total devices 2 FS bytes used 640.00KiB
devid    2 size 20.00GiB used 2.03GiB path /dev/sdc
devid    3 size 20.00GiB used 1.03GiB path /dev/sdd
Btrfs v3.16.2


btrfs子卷管理:



創建子卷:

命令格式: btrfs subvolume create  /PATH 此路徑必須是在btrfs文件系統的掛載目錄下
[root@centos7 ~]# btrfs subvolume create /mydata/subvol    #創建子卷,子卷名爲subvol
Create subvolume '/mydata/subvol'
[root@centos7 ~]# btrfs subvolume create /mydata/subvol1    #再創建子卷,子卷名爲subvol1
Create subvolume '/mydata/subvol1'
[root@centos7 ~]# btrfs subvolume list /mydata    #查看btrfs 文件系統下的所有子卷信息
ID 262 gen 73 top level 5 path subvol    #ID 262 是子卷subvol的ID,可以用該ID來掛載該卷
ID 263 gen 74 top level 5 path subvol1

掛載子卷:

命令格式:  mount -o subvol=SUBVOLUME  DEVICE /MOUNT_POIN
[root@centos7 ~]# mount -o subvol=subvol /dev/sdb /mnt    #將子卷單獨掛載到/mnt目錄下
[root@centos7 ~]# ls /mnt    #此時是沒有任何內容的
查看子卷相關信息:
命令格式:btrfs subvolume show MOUNT_POINT
[root@centos7 ~]# btrfs subvolume show /mnt    #查看子卷信息
/mnt
Name: subvol
uuid: f0b08e73-e73e-774c-9f3e-262f52eea64f
Parent uuid: -
Creation time: 2015-09-29 00:23:14
Object ID: 262
Generation (Gen): 76
Gen at creation: 73
Parent: 5
Top Level: 5
Flags: -
Snapshot(s):
[root@centos7 ~]# cp /var/log/messages /mnt    #複製messages文件到子卷subvol
[root@centos7 ~]# ls /mnt
messages
[root@centos7 ~]# umount /mnt    #卸載子卷subvol
[root@centos7 ~]# mount /dev/sdb /mydata    #將這個btrfs文件系統掛載到/mydata目錄
[root@centos7 ~]# ls /mydata
subvol  subvol1
[root@centos7 ~]# ls /mydata/subvol    #可見子卷subvol的內容是可見的,所以說一旦父卷掛載,子卷就被自動掛載了
messages
注:由於是子卷,如果父卷已經掛載,則子卷就自動被掛載了
反之,如果只掛載子卷,父卷內容是不會自動掛載的,其內容,不可見
[root@centos7 ~]# umount /mydata    #卸載父卷,
[root@centos7 ~]# mount -o subvol=subvol /dev/sdb /mydata    #單獨掛載子卷
[root@centos7 ~]# ls /mydata/    #此時/mydata下只有子卷的內容,並不會有父卷的內容:如subvol,subvol1目錄
messages
子卷,父卷也可以分別掛載:(可是沒必要單獨掛載子卷,父卷掛載完成後,子卷也就被自動掛載了)
[root@centos7 ~]# umount /mydata    #卸載子卷
[root@centos7 ~]# mount -o subvol=subvol /dev/sdb /mnt    #掛載子捲到/mnt目錄
[root@centos7 ~]# mount /dev/sdb /mydata           #掛載父捲到/mydata目錄
[root@centos7 ~]# ls /mydata/    #此時父卷掛載成功
f1.txt  subvol  subvol1
[root@centos7 ~]# ls /mnt     #子卷內容也可單獨顯示
messages


刪除子卷:



命令格式:btrfs subvolume delete /MOUNT_POINT
[root@centos7 ~]# btrfs subvolume delete /mydata/subvol    #刪除子卷subvol
Transaction commit: none (default)
Delete subvolume '/mydata/subvol'
[root@centos7 ~]# btrfs subvolume list /mydata    #已經沒有了子卷subvol信息了
ID 263 gen 74 top level 5 path subvol1
[root@centos7 ~]# btrfs subvolume snapshot /mydata/subvol1/ /mydata/subvol1_snapshot
Create a snapshot of '/mydata/subvol1/' in '/mydata/subvol1_snapshot'


子卷快照

命令格式:btrfs subvolume snapshot /PATH/TO/SUBVOLUME /PATH/TO/SNAPSHOT
[root@centos7 ~]# cp /etc/passwd /mydata/subvol1/    #複製passwd文檔到子卷subvol1內
[root@centos7 ~]# btrfs subvolume snapshot /mydata/subvol1/ /mydata/subvol1_snapshot     #創建快照subvol1_snapshot
Create a snapshot of '/mydata/subvol1/' in '/mydata/subvol1_snapshot'
[root@centos7 ~]# btrfs subvolume list /mydata    #快照子卷subvol1_snapshot創建完成
ID 263 gen 84 top level 5 path subvol1
ID 264 gen 84 top level 5 path subvol1_snapshot
[root@centos7 ~]# echo "TEST FOR SNAPSHOT" >> /mydata/subvol1/passwd #在passwd文檔後追加一行 "TEST FOR SNAPSHOT" 
[root@centos7 ~]# tail -1 /mydata/subvol1/passwd     #此時子卷中數據更新了
TEST FOR SNAPSHOT
[root@centos7 ~]# tail -1 /mydata/subvol1_snapshot/passwd  #此時快照中的passwd並沒有更新,末尾沒有"TEST FOR SNAPSHOT" 這行
root1:x:1000:1000:root1:/home/root1:/bin/bash
注:在子卷創建快照後,對原子卷做的修改操作並不會反映到快照中。


ext文件系統和btrfs文件系統互轉:


命令格式:btrfs-convert [-r] Device 
    不使用-r 代表從普通文件系統,轉化成btrfs文件系統
    -r:從btrfs回滾到之前的文件系統
[root@centos7 subvol1]# btrfs balance start  -mconvert=raid1 /mydata   #將之前的RAID5降級到RAID1,接下來纔可以拆去三塊硬盤中的其中一塊
Done, had to relocate 2 out of 3 chunks
[root@centos7 subvol1]# btrfs balance start  -dconvert=raid1 /mydata    
Done, had to relocate 1 out of 3 chunks
[root@centos7 subvol1]# btrfs device  delete /dev/sdd /mydata   #此時移除設備sdd
[root@centos7 ~]# fdisk /dev/sdd       #將sdd重新創建分區sdd1
[root@centos7 ~]# mkfs.ext4 /dev/sdd1    #格式化爲ext4文件系統
[root@centos7 subvol1]# mount /dev/sdd1 /mnt    #掛載sdd1
[root@centos7 subvol1]# ls /mnt 
lost+found
[root@centos7 subvol1]# cp /etc/fstab /mnt    #複製文件fstab到 /mnt
[root@centos7 ~]# ls /mnt
fstab  lost+found
[root@centos7 subvol1]# umount /mnt    #卸載文件系統,不要在線做文件系統轉換
[root@centos7 subvol1]# fsck -f /dev/sdd1    #做強制檢測
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/sdd1: 12/1310720 files (0.0% non-contiguous), 126323/5242624 blocks
[root@centos7 ~]# btrfs-convert /dev/sdd1
creating btrfs metadata.
creating ext2fs image file.
cleaning up system chunk.
conversion complete.
 
[root@centos7 ~]# btrfs filesystem show
Label: 'mydata'  uuid: cce40d16-b7ff-4346-9bbd-a498ad6d7633
Total devices 2 FS bytes used 896.00KiB
devid    1 size 20.00GiB used 2.03GiB path /dev/sdb
devid    2 size 20.00GiB used 2.01GiB path /dev/sdc
Label: none  uuid: 7d62e69a-574b-41f8-ab83-718be0d2f5f4
Total devices 1 FS bytes used 493.50MiB
devid    1 size 20.00GiB used 20.00GiB path /dev/sdd1   #可見sdd1已經轉化成了btrfs文件系統
[root@centos7 ~]# mount /dev/sdd1 /mnt
[root@centos7 ~]# ls /mnt
ext2_saved  fstab  lost+found
[root@centos7 ~]# cat /mnt/fstab    #之前的文件fstab仍舊可以正常訪問
#
# /etc/fstab
# Created by anaconda on Wed Aug 19 11:07:17 2015
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/centos-root /                       xfs     defaults        0 0
UUID=d4443e1c-7ecc-4393-9193-94beffba73e7 /boot                   xfs     defaults        0 0
/dev/mapper/centos-home /home                   xfs     defaults        0 0
/dev/mapper/centos-swap swap                    swap    defaults

將btrfs文件系統回滾到原普通文件系統




[root@centos7 ~]# umount /mnt
[root@centos7 ~]# btrfs-convert -r /dev/sdd1
rollback complete.
[root@centos7 ~]# mount /dev/sdd1 /mnt
[root@centos7 ~]# ls /mnt
fstab  lost+found
[root@centos7 ~]# blkid /dev/sdd1    #參考sdd1信息,可見其爲ext4文件系統
/dev/sdd1: UUID="698281c8-c549-46dc-976f-ba509d531f83" TYPE="ext4" 
[root@centos7 ~]# cat /mnt/fstab #且原文件仍舊可以正常訪問
#
# /etc/fstab
# Created by anaconda on Wed Aug 19 11:07:17 2015
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/centos-root /                       xfs     defaults        0 0
UUID=d4443e1c-7ecc-4393-9193-94beffba73e7 /boot                   xfs     defaults        0 0
/dev/mapper/centos-home /home                   xfs     defaults        0 0
/dev/mapper/centos-swap swap                    swap    defaults        0 0


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章