前言
一種技術要知其然,還要知其所以然。
Btrfs文件系統
Btrfs(B-tree文件系統,通常念成Butter FS,Better FS或B-tree FS),一種支持寫入時復制(COW)的文件系統,運行在Linux操作系統,采用GPL授權。Oracle于2007年對外宣布這項計劃,并發布源代碼,在2014年8月發布穩定版目標是替換Linux目前的ext3文件系統,改善ext3的限制,特別是單個文件的大小,總文件系統大小或文件檢查和加入ext3未支持的功能,像是可寫快照(writable snapshots)、快照的快照(snapshots of snapshots)、內建磁盤陣列(RAID),以及子卷(subvolumes)。Btrfs也宣稱專注在“容錯、修復及易于管理”。
引用于(https://zh.wikipedia.org/wiki/Btrfs)
Btrfs文件系統的核心特性
1.多物理卷支持:btrfs文件系統可由多個底層物理卷組成;支持RAID,以聯機“添加”、“移除”,“修改”;
2.寫時復制更新機制(CoW): 所謂 COW,即每次寫磁盤數據時,先將更新數據寫入一個新的 block,當新數據寫入成功之后,再更新相關的數據結構指向新 block 。復制、更新及替換指針,而非“就地”更新; ”就地“更新是指地址指針指向。
3.數據及元數據校驗碼(checksum):btrfs在讀取數據的同時會讀取其相應的 checksum 。如果最終從磁盤讀取出來的數據和 checksum 不相同,btrfs 會首先嘗試讀取數據的鏡像備份,如果數據沒有鏡像備份,btrfs 將返回錯誤。寫入磁盤數據之前,btrfs 計算數據的 checksum 。然后將 checksum 和數據同時寫入磁盤。
4.子卷:Subvolume 是很優雅的一個概念。即把文件系統的一部分配置為一個完整的子文件系統,稱之為 subvolume 。 采用 subvolume,一個大的文件系統可以被劃分為多個子文件系統,這些子文件系統共享底層的設備空間,在需要磁盤空間時便從底層設備中分配,類似應用程序調用 malloc() 分配內存一樣。可以稱之為存儲池。這種模型有很多優點,比如可以充分利用 disk 的帶寬,可以簡化磁盤空間的管理等
5.快照:支持快照的快照;可以在快照中在做快照
6.透明壓縮:在用戶寫入數據時系統會自動進行壓縮,而用戶調用數據的過程是一個解壓縮的過程,但是這個過程,對用戶來說是透明的,是自動進行的。
7.多設備管理:Btrfs 支持動態添加設備。用戶在系統中增加新的磁盤之后,可以使用 btrfs 的命令將該設備添加到文件系統中。為了靈活利用設備空間,Btrfs 將磁盤空間劃分為多個 chunk 。每個 chunk 可以使用不同的磁盤空間分配策略。比如某些 chunk 只存放 metadata,某些 chunk 只存放數據。一些 chunk 可以配置為 mirror,而另一些 chunk 則可以配置為 stripe 。這為用戶提供了非常靈活的配置可能性。
引用于(http://lirui213.blog.51cto.com/4449582/1689754) 進行了一點修改
Btrfs的應用和管理常用的命令
Btrfs文件系統創建需要用到的命令:
mkfs.btrfs -L 'LABEL':建立卷標。
-d : raid0, raid1, raid5, raid6, raid10, single指明確文件系統的類型
-m : raid0, raid1, raid5, raid6, raid10, single, dup指明類型
-O 指明格式化是,啟動的特性 -O list-all: 列出支持的所有feature;
Btrfs的文件掛載和管理
屬性查看:
btrfs filesystem show
掛載文件系統:
mount -t btrfs /dev/sdb MOUNT_POINT
透明壓縮機制:
mount -o compress={lzo|zlib} DEVICE MOUNT_POINT 常用的子命令 1.subvolume
<–子卷管理命令,可以man btrfs-subvolume查看器詳細信息;
btrfs subvolume create /PATH/subvolumename:創建子卷 此路徑必須在btrfs文件系統的掛載目錄下
btrfs subvolume delete 刪除子卷
btrfs subvolume list:列出所有子卷
btrfs subvolume snapshot
| :創建快照
btrfs subvolume get-default:默認卷
btrfs subvolume set-default:設置默認卷
btrfs subvolume show:用來查看子卷的詳細信息
2.filesystem
<–用來管理btrfs文件系統,可以man btrfs-filesystem查看詳細信息;
btrfs filesystem show:顯示詳細信息
btrfs filesystem show –mounted:顯示已經掛載的文件系統的詳細信息
btrfs filesystem show –all-device:顯示所有文件系統的詳細信息
btrfs filesystem show /PATH: 顯示指定的文件系統的詳細
btrfs filesystem label:顯示文件系統的label
btrfs filesystem resize:縮減或者增大文件系統的容量
btrfs filesystem df:顯示已經掛載的文件系統的信息
btrfs filesystem sync同步操作
3.balance <–用來均衡各物理卷直接的數據量,man btrfs-balance;
btrfs balance start:開始均衡文件系統
btrfs balance start -dconvert:修改數據的組織機制,即raid級別
btrfs balance start -mconvert修改元數據的組織機制,即raid級別
btrfs balance start -sconvert:修改系統的組織機制,即raid級別
btrfs balance pause:停止
btrfs balance cancel取消
btrfs balance resume繼續
btrfs balance status 查看均衡狀態
4.device <–管理物理設備的命令,man btrfs-device;
btrfs device add :添加設備
btrfs device delete :從文件系統中移除或者去除設備
btrfs device ready :
btrfs device stats [-z] |:
實驗
實驗環境:centos 7 實驗材料:3塊10G的硬盤
第一步:先用VMware來創建3個虛擬硬盤,
第二步:mkfs.btrfs -L experiment /dev/sdb /dev/sdc:就是把sdb和sdc兩塊硬盤格式化成以卷標為experiment的文件系統
第三步: mount /dev/sdb 或者/dev/sdc都可以掛載 將兩塊硬盤掛載到/mnt/experiment
第四步: btrfs filesystem df /mnt blkid /dev/sdb blkid /dev/sdc blkid命令 獲取文件系統類型、UUID 發現父UUID都是一樣的,但是子UUID是不一樣的,可以看出它是支持多卷的。
第五步: 對btrfs文件的size縮小和增大
第6步: 對btrfs文件添加硬盤 btrfs device add :添加設備 btrfs device delete :從文件系統中移除或者去除設備
第七步: 剛加進來的硬盤數據時0,想要讓后加進來的硬盤有數據,那就得進行數據均衡,數據均衡就要用到 btrfs balance
第八步: 對btrfs文件系統的硬盤卸載
發現數據會自動移動 還未卸載的硬盤上 數據沒有丟失,
第八步: 對btrfs文件系統進行子卷操作
[root@localhost experiment]# btrfs subvolume create /mnt/experiment/subvolume Create subvolume '/mnt/experiment/subvolume' #創建子卷subvolume [root@localhost experiment]# btrfs subvolume list /mnt/experiment/subvolume/ ID 262 gen 62 top level 5 path subvolume #ID 是這個子卷的ID可以此ID進行掛載 #查看子卷信息 [root@localhost experiment]# btrfs subvolume show /mnt/experiment/subvolume/ /mnt/experiment/subvolume Name: subvolume uuid: 39fc0341-19d0-1a43-9a0b-64ea90b29ab5 Parent uuid: - Creation time: 2016-05-22 21:27:29 Object ID: 262 Generation (Gen): 62 Gen at creation: 62 Parent: 5 Top Level: 5 Flags: - Snapshot(s): [root@localhost tmp]# mount -o subvol=subvolume /dev/sdb /tmp/subvolume #進行掛載
Note: 我忘了mount的這個用法,就重新在看看。
-o options:(掛載文件系統的選項) async:異步模式;一般使用異步模式 sync:同步模式; atime/noatime:包含目錄和文件的訪問時間戳;默認情況下使用 diratime/nodiratime:目錄的訪問時間戳 auto/noauto:是否支持自動掛載 exec/noexec:是否支持將文件系統上應用程序運行為進程 dev/nodev:是否支持在此文件系統上使用設備文件; suid/nosuid:是否支持suid remount:重新掛載 ro:表示只讀 rw: 表示讀寫 user/nouser:是否允許普通用戶掛載此設備 acl:啟用此文件系統上的acl功能 acl訪問控制列表 [root@localhost tmp]# ls /tmp/subvolume/ [root@localhost tmp]# btrfs subvolume show /tmp/subvolume /tmp/subvolume Name: subvolume uuid: 39fc0341-19d0-1a43-9a0b-64ea90b29ab5 Parent uuid: - Creation time: 2016-05-22 21:27:29 Object ID: 262 Generation (Gen): 62 Gen at creation: 62 Parent: 5 Top Level: 5 Flags: - Snapshot(s):
查看子卷
[root@localhost tmp]# cp /var/log/messages /tmp/subvolume/
復制數據到子卷
[root@localhost tmp]# ls /tmp/subvolume/ messages [root@localhost tmp]# ls /mnt/experiment/ grub2.cfg issue subvolume/ [root@localhost tmp]# ls /mnt/experiment/subvolume/ messages [root@localhost tmp]# umount /tmp/subvolume/ [root@localhost tmp]# mkdi mkdict mkdir [root@localhost tmp]# mkdir /tmp/test [root@localhost tmp]# mount /dev/sdb /tmp/test/ [root@localhost tmp]# ls /tmp/test/ grub2.cfg issue subvolume [root@localhost tmp]# ls /tmp/test/subvolume/ messages
Note:子卷中的內容是可見,所以一旦父卷掛載,子卷就被自動被掛載了 如果只有單單掛載了子卷,父卷內容是不會自動掛載的,其內容是不可見的。
第九步:刪除子卷 [root@localhost tmp]# umount /tmp/test/
[root@localhost tmp]# btrfs subvolume delete /mnt/experiment/subvolume/ Delete subvolume (no-commit): '/mnt/experiment/subvolume' #刪除子卷 [root@localhost tmp]# btrfs subvolume list /mnt/experiment/ grub2.cfg issue #子卷信息沒了
總結 還有很多操作還沒做,以后有時間在更新,還有子卷快照,ext文件系統和btrfs文件系統互轉等等
原創文章,作者:N19_king,如若轉載,請注明出處:http://www.www58058.com/16503