btrfs
Technical Preview, 技术预览版
BtrFS(B-tree文件系统,又称为Butter FS或Better FS),2007由oracle开源后,得到了IBM、intel等厂商的大力支持,其目标计划是替代linux目前的ext3/4,成为下一代linux标准的文件系统。
运行在linux上,并遵循GPL协议的强大文件系统。在2014年8月发布了稳定版。
btrfs的特性:
1.可扩展性:
1) ext系列文件系统使用块位图来保存每个块空闲与否的信息(每个块用一个位来表示是否空闲),当容量扩展时,块位图所占的空间会线性的增加,试想一下如果快位图变得很大时,那么查找空闲块就需要大量的时间;BtrFS管理磁盘空间的最小单位是extent,一个extent由一组连续的block组成,extent由extent树进行管理,因此相比ext系列10个块需要10个bit来表示,btrfs只需要一个extent就可以,因此减少了元数据的量。对于大文件,extent表现出更加优异的管理性能。
2) ext系统inode是预分配的且大小固定,比如,100G的分区中,inode table只能存放131072个inode,意味着不可能创建131072个文件;同时, inode分配过小,容易导致磁盘空间无法充分利用,过大,容易造成磁盘空间浪费;btrfs为了解决这个问题,使用了动态分配inode,如下图,每个inode只是FS tree中的一个节点,用户可以无限制地任意插入新的inode,其物理存储位置是动态分配的,所以没有对文件个数的限制。
2.多物理卷支持:
btrfs可以跨越多个物理磁盘设备,动态的增加/减少设备来达到扩容/缩容的目的,技术上还支持(raid0、raid1、raid5、raid10等特性),以及联机“添加”、“移除”以及“修改”
3.写时复制更新机制(CoW):
复制、更新及替换指针,而非“就地”更新;btrfs的数据一致性是通过COW(Copy On Write)事务来保证的,所谓COW,即每次写磁盘数据时,先当前块数据复制到一个新块,然后在新块上进行更新写入,当新块写入完成时,只需将原来指向旧块的指针指向新块。
4.数据及元数据校验码:checksum
btrfs的另一特点是使用checksum来保证数据的可靠性,假设从磁盘读取一个块数据,可以通过比较其checksum来判断数据是否完整,其他文件系统在文件系统级别上是无法得知数据是否损坏的;同时由于checksum数据存储在checksum树的节点上,与块数据是分开管理的,这样的好处是能避免checksum和数据保存在同一个块的时候,文件系统上层获取了一个错误位置的块时无从得知(因为checksum只计算块数据是否完整而不是数据应该存在哪个块,只要块内数据并无损坏,checksum永远都是正确的)
5.子卷:sub_volume
在一个文件系统(或逻辑卷)上创建子卷,并没有层级限制,并且所有卷的空间大小都是可以动态调整的。其应用场景是可以为每个用户分配一个单独隔离的卷空间,来达到权限控制和配额管理的目的。
6.快照:支持快照的快照
7.透明压缩,隐形压缩:
mkfs.btrfs
选项:
-L|--label <name>:为即将创建的btrfs文件系统指定卷标
-d|--data <type>:为数据存储指定类型;可以选择的类型有:raid0, raid1, raid5, raid6, raid10 or single
-m|--metadata <profile>:指定元数据的存储方式;可以选择的类型有:raid0, raid1, raid5, raid6, raid10, single or dup
-O|--features <feature1>[,<feature2>...]:指定btrfs文件系统的特性,如果想要查看哪些特性,可以使用命令:mkfs.btrfs -O list-all
可以用支持btrfs文件系统的mount命令中使用下列方式开启透明压缩功能:
mount -o compress={lzo|zlib} DEVICE MOUNT_POINT
btrfs
btrfs - control a btrfs filesystem
btrfs <command> [<args>]
btrfs filesystem show
查看btrfs文件系统的详细属性;
btrfs filesystem df MOUNT_POINT
查看文件系统的挂载和使用情况
例:btrfs filesystem df /mnt/btrfs/
在线修改文件系统大小:
btrfs filesystem resize {+|-}SIZE[KkMmGgTtPpEe] MOUNT_POINT
例:btrfs filesystem resize -15G /mnt/btrfs/
btrfs filesystem resize +5G /mnt/btrfs/
btrfs filesystem resize max /mnt/btrfs/
向btrfs文件系统中添加或删除设备
btrfs device
btrfs device add [options] <device> [<device>...] <path>
向文件系统中添加一个新设备
btrfs device delete <device> [<device>...] <path>
从文件系统中删除一个设备
平衡数据:
btrfs balance start [options] <path>
开启跨设备的chunk的数据平衡
-mconvert={radi0|raid1|raid5|radi10|raid6|single|dup}
改变元数据的数据平衡布局方式
例:btrfs balance start -mconvert=raid5 /mnt/btrfs/
-dconvert={radi0|raid1|raid5|radi10|raid6|single}
改变数据的数据平衡布局方式
例:btrfs balance start -dconvert=raid6 /mnt/btrfs/
btrfs balance pause <path>
暂停数据平衡
btrfs balance cancel <path>
取消正在进行的或已经暂停的数据平衡
btrfs balance resume <path>
恢复被打断的数据平衡
btrfs balance status [-v] <path>
显示正在进行的或已经暂停的数据平衡的状态信息
子卷管理:
btrfs subvolume create [-i <qgroupid>] [<dest>/]<name>
创建子卷
例:btrfs subvolume create /mnt/btrfs/mysub1/
btrfs subvolume delete [options] <subvolume> [<subvolume>...]
删除子卷
例:btrfs subvolume delete /mnt/btrfs/mysub1/
btrfs subvolume show <subvol-path>
显示子卷的信息
例:btrfs subvolume show /mnt/btrfs/mysub1/
子卷类似于ext文件系统中的将其他分区挂载到根目录下的某个空闲子目录的操作;
快照:
btrfs subvolume snapshot [-r] [-i <qgroupid>] <source> <dest>|[<dest>/]<name>
创建指定子卷的快照卷
例:btrfs subvolume snapshot /mnt/btrfs/mysub1/ /mnt/btrfs/snap_mysub1
将btrfs和ext系列进行转换:
btrfs-convert
btrfs-convert - convert from ext2/3/4 filesystem to btrfs or rollback
btrfs-convert [options] <device>
将文件系统从ext转换为btrfs:
~]# btrfs-convert /dev/sdb1
注意:/dev/sdb1分区,应该事先格式化为ext系列文件系统;
将文件系统从btrfs回滚到ext
~]# btrfs-convert -r /dev/sdb1
!!有一些磁盘:
[root@localhost ~]# fdisk -l
磁盘 /dev/sdc:21.5 GB, 21474836480 字节,41943040 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘 /dev/sde:21.5 GB, 21474836480 字节,41943040 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘 /dev/sdb:21.5 GB, 21474836480 字节,41943040 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘 /dev/sdd:21.5 GB, 21474836480 字节,41943040 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
!!将/dev/sdb、/dev/sdc创建成一个btrfs文件系统,并指定卷标mybtrfs:
[root@localhost ~]# mkfs.btrfs -L mybtrfs /dev/sdb /dev/sdc
btrfs-progs v4.4.1
See http://btrfs.wiki.kernel.org for more information.
Label: mybtrfs
UUID: 42318b53-99e1-4b42-8efd-e66ef655a51f
Node size: 16384
Sector size: 4096
Filesystem size: 40.00GiB
Block group profiles:
Data: RAID0 2.01GiB
Metadata: RAID1 1.01GiB
System: RAID1 12.00MiB
SSD detected: no
Incompat features: extref, skinny-metadata
Number of devices: 2
Devices:
ID SIZE PATH
1 20.00GiB /dev/sdb
2 20.00GiB /dev/sdc
!!查看已经创建的文件系统:
[root@localhost ~]# btrfs filesystem show
Label: 'mybtrfs' uuid: 42318b53-99e1-4b42-8efd-e66ef655a51f
Total devices 2 FS bytes used 112.00KiB
devid 1 size 20.00GiB used 2.01GiB path /dev/sdb
devid 2 size 20.00GiB used 2.01GiB path /dev/sdc
!!创建挂载点:
[root@localhost ~]# mkdir /mybtrfs
!!查看其UUID是否相同,相同就可以使用其中一个进行挂载,开启透明压缩:
[root@localhost ~]# blkid /dev/sdb
/dev/sdb: LABEL="mybtrfs" UUID="42318b53-99e1-4b42-8efd-e66ef655a51f" UUID_SUB="85df99ac-f8d9-4b2e-aefc-3d174f613e7a" TYPE="btrfs"
[root@localhost ~]# blkid /dev/sdc
/dev/sdc: LABEL="mybtrfs" UUID="42318b53-99e1-4b42-8efd-e66ef655a51f" UUID_SUB="b3de9270-5062-4ff9-a8e1-0293f6128b5b" TYPE="btrfs"
[root@localhost ~]# mount -t btrfs -o compress=lzo /dev/sdb /mybtrfs
!!查看文件系统的挂载和使用情况:
[root@localhost ~]# btrfs filesystem df /mybtrfs
Data, RAID0: total=2.00GiB, used=768.00KiB
System, RAID1: total=8.00MiB, used=16.00KiB
Metadata, RAID1: total=1.00GiB, used=112.00KiB
GlobalReserve, single: total=16.00MiB, used=0.00B
[root@localhost ~]# df -h
文件系统 容量 已用 可用 已用% 挂载点
/dev/mapper/cl-root 18G 4.5G 14G 25% /
devtmpfs 473M 0 473M 0% /dev
tmpfs 489M 156K 489M 1% /dev/shm
tmpfs 489M 7.2M 482M 2% /run
tmpfs 489M 0 489M 0% /sys/fs/cgroup
/dev/sda1 197M 151M 47M 77% /boot
tmpfs 98M 12K 98M 1% /run/user/1000
/dev/sr0 4.1G 4.1G 0 100% /run/media/wenyao/CentOS 7 x86_64
tmpfs 98M 0 98M 0% /run/user/0
/dev/sdb 40G 17M 38G 1% /mybtrfs
!!缩减文件系统(缩减必须在挂载的情况下)再扩增:
[root@localhost ~]# btrfs filesystem resize -10G /mybtrfs
Resize '/mybtrfs' of '-10G'
[root@localhost ~]# btrfs filesystem show
Label: 'mybtrfs' uuid: 42318b53-99e1-4b42-8efd-e66ef655a51f
Total devices 2 FS bytes used 896.00KiB
devid 1 size 10.00GiB used 2.01GiB path /dev/sdb
devid 2 size 20.00GiB used 2.01GiB path /dev/sdc
[root@localhost ~]# btrfs filesystem df /mybtrfs
Data, RAID0: total=2.00GiB, used=768.00KiB
System, RAID1: total=8.00MiB, used=16.00KiB
Metadata, RAID1: total=1.00GiB, used=112.00KiB
GlobalReserve, single: total=16.00MiB, used=0.00B
[root@localhost ~]# btrfs filesystem resize +5G /mybtrfs
Resize '/mybtrfs' of '+5G'
[root@localhost ~]# btrfs filesystem show
Label: 'mybtrfs' uuid: 42318b53-99e1-4b42-8efd-e66ef655a51f
Total devices 2 FS bytes used 896.00KiB
devid 1 size 15.00GiB used 2.01GiB path /dev/sdb
devid 2 size 20.00GiB used 2.01GiB path /dev/sdc
!!向文件系统添加一个设备:
[root@localhost ~]# btrfs device add /dev/sdd /mybtrfs
[root@localhost ~]# btrfs filesystem show
Label: 'mybtrfs' uuid: 42318b53-99e1-4b42-8efd-e66ef655a51f
Total devices 3 FS bytes used 896.00KiB
devid 1 size 15.00GiB used 2.01GiB path /dev/sdb
devid 2 size 20.00GiB used 2.01GiB path /dev/sdc
devid 3 size 20.00GiB used 0.00B path /dev/sdd
[root@localhost ~]# df -h
文件系统 容量 已用 可用 已用% 挂载点
/dev/mapper/cl-root 18G 4.5G 14G 25% /
devtmpfs 473M 0 473M 0% /dev
tmpfs 489M 156K 489M 1% /dev/shm
tmpfs 489M 7.1M 482M 2% /run
tmpfs 489M 0 489M 0% /sys/fs/cgroup
/dev/sda1 197M 151M 47M 77% /boot
tmpfs 98M 16K 98M 1% /run/user/1000
/dev/sr0 4.1G 4.1G 0 100% /run/media/wenyao/CentOS 7 x86_64
/dev/sdb 55G 17M 51G 1% /mybtrfs
!!创建一个子卷(要在其挂在目录下创建),查看子卷信息,然后删除:
[root@localhost mysub1]# btrfs subvolume create /mybtrfs/bbbbb
Create subvolume '/mybtrfs/bbbbb'
[root@localhost mysub1]# btrfs subvolume show /mybtrfs/bbbbb
/mybtrfs/bbbbb
Name: bbbbb
UUID: 5fd8ab9a-886e-aa4a-ad07-457eddd1d960
Parent UUID: -
Received UUID: -
Creation time: 2017-06-06 12:50:53 +0800
Subvolume ID: 261
Generation: 41
Gen at creation: 40
Parent ID: 5
Top level ID: 5
Flags: -
Snapshot(s):
[root@localhost mysub1]# btrfs subvolume delete /mybtrfs/bbbbb
Delete subvolume (no-commit): '/mybtrfs/bbbbb'
[root@localhost mysub1]# btrfs subvolume show /mybtrfs/bbbbb
ERROR: cannot find real path for '/mybtrfs/bbbbb': No such file or directory
!!快照卷其实就是特殊的子卷,想对根目录进行备份的话, 就可以执行下面的指令:
[root@localhost mysub1]# btrfs subvolume snapshot /mybtrfs/ /mybtrfs/snap_mybtrfs
Create a snapshot of '/mybtrfs/' in '/mybtrfs/snap_mybtrfs'
!!查看创建的快照卷:
[root@localhost mysub1]# btrfs subvolume list /mybtrfs
ID 262 gen 43 top level 5 path snap_mybtrfs
!!创建了/dev/sde1分区,并将其格式化为ext4文件系统,将其转化为btrfs文件系统,并回滚:
create btrfs filesystem:
blocksize: 4096
nodesize: 16384
features: extref, skinny-metadata (default)
creating btrfs metadata.
copy inodes [o] [ 0/ 11]
creating ext2 p_w_picpath file.
cleaning up system chunk.
conversion complete.
[root@localhost mysub1]# btrfs-convert -r /dev/sde1
rollback complete.