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