Btrfs 也有一个重要的缺点,当 BTree 中某个节点出现错误时,文件系统将失去该节点之下的所有的文件信息。而 ext2/3 却避免了这种被称为”错误扩散”的问题。
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