btrfs文件系统支持写时复制功能,对备份很有帮助。在单个硬盘时,btrfs是没有意义的。
核心特性:
多物理卷支持:btrfs可由多个底层物理卷组成;支持RAID,以联机“添加”、“移除”,“修改”;
写时复制更新机制(CoW):复制、更新及替换指针,而非“就地”更新;在文件进行修改的时候,首先将文件复制一份出来,在复制出来的文件上进行修改,修改完成之后,将指向原有文件的指针修改指向到修改完成的文件上,若修改完成的文件出现了错误,则我们可以通过原文件进行修复
数据及元数据校验码;checksum ,当存储某个文件时,checksum会将数据的源数据和数据的校验码,分别通过文件的属性扩展进行保存,当我们再次读取数据时可以方便的检测数据是否受损,如果文件受损系统可以完成自动修复;
子卷:sub_volume,在一个卷上创建多个子卷,在每一个子卷上创建文件系统,并挂载使用;
快照,以及支持快照的快照,即增量快照备份,也可对单个文件进行快照,
内置RAID,支持RAID1\0\10\5\6\
透明压缩 :如果我们在存储文件时,进行压缩存储,那么在文件发往btrfs时,会自动的占用时钟周期,完成数据的压缩存放,而用户并不知道,在用户读取文件时,会自动的进行文件的解压缩,可以实现节约磁盘空间。但是压缩和解压缩会占用时钟周期;
mkfs-btrfs常用选项介绍
mkfs.btrfs [options] btrfsfile_name /dev/sd[a-z] -L " LABEL" -d 'raid_type' 指定数据存储时的类型 : raid 0 , raid 1 ,raid 5 ,raid 6, raid 10 ,single,默认是single(单份) -m 'raid_profile': 指定元数据(属性数据)存储时的类型 raid 0 ,raid 1 ,raid 5 ,raid 6 ,raid 10 ,single,dup(冗余) -f 强制在分区上创建btrfs -O <featuer>(以下是子命令,要全敲) -O list-all 查看所支持的所有featuer(特性) -U 指定UUID
btrfs常用子命令介绍
[root@localhost ~]# btrfs --help usage: btrfs [--help] [--version] <group> [<group>...] <command> [<args>] btrfs subvolume create [-i <qgroupid>] [<dest>/]<name> #创建子卷的命令 Create a subvolume btrfs subvolume delete [options] <subvolume> [<subvolume>...] #删除子卷 Delete subvolume(s) btrfs subvolume list [options] [-G [+|-]value] [-C [+|-]value] [--sort=gen,ogen,rootid,path] <path> #查看子卷信息 List subvolumes (and snapshots) btrfs subvolume snapshot [-r] [-i <qgroupid>] <source> <dest>|[<dest>/]<name> #创建子卷快照。子卷的快照必须与子卷同处一个目录下 Create a snapshot of the subvolume btrfs subvolume get-default <path> #获取子卷默认的文件系统 Get the default subvolume of a filesystem btrfs subvolume set-default <subvolid> <path> #设定子卷的默认文件系统 Set the default subvolume of a filesystem btrfs subvolume find-new <path> <lastgen> #查找子卷目录下最近更新文件,结合find命令使用 List the recently modified files in a filesystem btrfs subvolume show <subvol-path>#查看子卷 Show more information of the subvolume btrfs subvolume sync <path> [<subvol-id>...] Wait until given subvolume(s) are completely removed from the filesystem. btrfs filesystem df [options] <path> #查看使用空间 Show space usage information for a mount point btrfs filesystem show [options] [<path>|<uuid>|<device>|label] Show the structure of a filesystem #查看btrfs下硬盘的空间及使用空间、卷的UUID等信息 btrfs filesystem sync <path> Force a sync on a filesystem btrfs filesystem defragment [options] <file>|<dir> [<file>|<dir>...] #碎片整理 Defragment a file or a directory btrfs filesystem resize [devid:][+/-]<newsize>[kKmMgGtTpPeE]|[devid:]max <path> #调整卷的空间 Resize a filesystem btrfs filesystem label [<device>|<mount_point>] [<newlabel>] #查看或设定卷的label Get or change the label of a filesystem btrfs filesystem usage [options] <path> [<path>..] #查看使用情况 Show detailed information about internal filesystem usage . btrfs balance start [options] <path> #设置文件平衡存储到每个分区中 Balance chunks across the devices btrfs balance pause <path> #暂停 Pause running balance btrfs balance cancel <path> Cancel running or paused balance btrfs balance resume <path> #恢复 Resume interrupted balance btrfs balance status [-v] <path> #查看状态 Show status of running or paused balance btrfs device add [options] <device> [<device>...] <path> #添加硬盘 Add a device to a filesystem btrfs device delete <device> [<device>...] <path> #删除硬盘 Remove a device from a filesystem btrfs device scan [(-d|--all-devices)|<device> [<device>...]] #设备扫描 Scan devices for a btrfs filesystem btrfs device ready <device> Check device to see if it has all of its devices in cache for mounting btrfs device stats [-z] <path>|<device> Show current device IO stats. -z to reset stats afterwards. btrfs device usage [options] <path> [<path>..] Show detailed information about internal allocations in devices. btrfs help [--full] Display help information btrfs version Display btrfs-progs version Use --help as an argument for information on a specific group or command. [root@localhost ~]#
练习操作
1、在/dev/sdd /dev/sde 上创建卷标是test_btrfs的btrfs文件系统
[root@localhost ~]# mkfs.btrfs -f -L test_btrfs /dev/sdd /dev/sde
btrfs-progs v3.19.1
See http://btrfs.wiki.kernel.org for more information.
Turning ON incompat feature 'extref': increased hardlink limit per file to 65536
Turning ON incompat feature 'skinny-metadata': reduced-size metadata extent refs
adding device /dev/sde id 2
fs created label test_btrfs on /dev/sdd
nodesize 16384 leafsize 16384 sectorsize 4096 size 7.00GiB
[root@localhost ~]# man mkfs.btrfs
[root@localhost ~]#
[root@localhost ~]# btrfs filesystem show
Label: 'test_btrfs' uuid: 2827ef62-3b45-464b-b6cd-8799f4d143cf
Total devices 2 FS bytes used 112.00KiB
devid 1 size 5.00GiB used 744.75MiB path /dev/sdd
devid 2 size 2.00GiB used 724.75MiB path /dev/sde
2、查看test_btrfs的各种信息
[root@localhost ~]# mkdir /test_btrfs #创建挂载目录
[root@localhost ~]# mount /dev/sde /test_btrfs/ #挂载。挂载可以使用test_btrfs两个分区名称中的一个来代替
[root@localhost ~]# btrfs filesyste df -h /test_btrfs/ #查看使用空间。注意,挂载后,用挂载目录的名称来代替btrfs
Data, RAID0: total=716.75MiB, used=192.00KiB
Data, single: total=8.00MiB, used=0.00B
System, RAID1: total=8.00MiB, used=16.00KiB
System, single: total=4.00MiB, used=0.00B
Metadata, RAID1: total=358.38MiB, used=112.00KiB
Metadata, single: total=8.00MiB, used=0.00B
GlobalReserve, single: total=16.00MiB, used=0.00B
[root@localhost ~]#
[root@localhost ~]# btrfs filesyste label /test_btrfs/ #查看卷标
test_btrfs
[root@localhost ~]# btrfs fi usage /test_btrfs/ #查看空间使用率
Overall:
Device size: 7.00GiB
Device allocated: 1.43GiB
Device unallocated: 5.57GiB
Device missing: 0.00B
Used: 448.00KiB
Free (estimated): 6.27GiB (min: 3.49GiB)
Data ratio: 1.00
Metadata ratio: 1.98
Global reserve: 16.00MiB (used: 0.00B)
Data,RAID0: Size:716.75MiB, Used:192.00KiB
/dev/sdd 358.38MiB
/dev/sde 358.38MiB
Metadata,single: Size:8.00MiB, Used:0.00B
/dev/sdd 8.00MiB
Metadata,RAID1: Size:358.38MiB, Used:112.00KiB
/dev/sdd 358.38MiB
/dev/sde 358.38MiB
System,single: Size:4.00MiB, Used:0.00B
/dev/sdd 4.00MiB
System,RAID1: Size:8.00MiB, Used:16.00KiB
/dev/sdd 8.00MiB
/dev/sde 8.00MiB
Unallocated:
/dev/sdd 4.28GiB
/dev/sde 1.29GiB
3、添加/dev/sdb和/dev/sdc到test_btrfs后,删除/dev/sdd
[root@localhost ~]# btrfs device add -f /dev/sdb /test_btrfs #添加
[root@localhost ~]# btrfs device add -f /dev/sdc /test_btrfs
[root@localhost ~]# btrfs fi show
Label: 'test_btrfs' uuid: 2827ef62-3b45-464b-b6cd-8799f4d143cf
Total devices 4 FS bytes used 320.00KiB
devid 1 size 5.00GiB used 736.75MiB path /dev/sdd
devid 2 size 2.00GiB used 724.75MiB path /dev/sde
devid 3 size 5.00GiB used 0.00B path /dev/sdb
devid 4 size 5.00GiB used 0.00B path /dev/sdc
btrfs-progs v3.19.1
[root@localhost ~]#
[root@localhost ~]# btrfs device de /dev/sdb /test_btrfs #删除
[root@localhost ~]# btrfs fi show
Label: 'test_btrfs' uuid: 2827ef62-3b45-464b-b6cd-8799f4d143cf
Total devices 3 FS bytes used 320.00KiB
devid 1 size 5.00GiB used 736.75MiB path /dev/sdd
devid 2 size 2.00GiB used 724.75MiB path /dev/sde
devid 4 size 5.00GiB used 0.00B path /dev/sdc
btrfs-progs v3.19.1
[root@localhost ~]#
4、先缩小test_btrfs空间1GB,然后再增加1GB
[root@localhost ~]# btrfs fi resize -1g /test_btrfs/ #减小1G
Resize '/test_btrfs/' of '-1g'
[root@localhost ~]# btrfs fi show
Label: 'test_btrfs' uuid: 2827ef62-3b45-464b-b6cd-8799f4d143cf
Total devices 3 FS bytes used 320.00KiB
devid 1 size 4.00GiB used 736.75MiB path /dev/sdd
devid 2 size 2.00GiB used 724.75MiB path /dev/sde
devid 4 size 5.00GiB used 0.00B path /dev/sdc
[root@localhost ~]# btrfs fi resize +1g /test_btrfs/ #再添加1G
Resize '/test_btrfs/' of '+1g'
[root@localhost ~]# btrfs fi show
Label: 'test_btrfs' uuid: 2827ef62-3b45-464b-b6cd-8799f4d143cf
Total devices 3 FS bytes used 320.00KiB
devid 1 size 5.00GiB used 736.75MiB path /dev/sdd
devid 2 size 2.00GiB used 724.75MiB path /dev/sde
devid 4 size 5.00GiB used 0.00B path /dev/sdc
btrfs-progs v3.19.1
[root@localhost ~]# btrfs fi resize max /test_btrfs/ #也可以使用max选项,把/test_btrfs的空间扩展到/dev/sd{d,e,c}三个分区的最大空间
Resize '/test_btrfs/' of 'max'
[root@localhost ~]# btrfs fi show
Label: 'test_btrfs' uuid: 2827ef62-3b45-464b-b6cd-8799f4d143cf
Total devices 3 FS bytes used 320.00KiB
devid 1 size 5.00GiB used 736.75MiB path /dev/sdd
devid 2 size 2.00GiB used 724.75MiB path /dev/sde
devid 4 size 5.00GiB used 0.00B path /dev/sdc
btrfs-progs v3.19.1
[root@localhost ~]#
5、注意到上面btrfs filesystem show其中的used的信息了吗?/dec/sdc的使用空间为零。/dev/sdc要是后来手动加入到test_btrfs,是吧。所以默认情况需要前两个分区的空间用完后,才会使用/dev/sdc的空间。那么现在把/dev/sdc的空间也使用起来吧!
[root@localhost ~]# btrfs balance start /test_btrfs/ #把数据平衡使用到所有分区
Done, had to relocate 5 out of 5 chunks
[root@localhost ~]# btrfs fi show
Label: 'test_btrfs' uuid: 2827ef62-3b45-464b-b6cd-8799f4d143cf
Total devices 3 FS bytes used 448.00KiB
devid 1 size 5.00GiB used 704.00MiB path /dev/sdd
devid 2 size 2.00GiB used 416.00MiB path /dev/sde
devid 4 size 5.00GiB used 704.00MiB path /dev/sdc
btrfs-progs v3.19.1
[root@localhost ~]#
6、创建子卷test_btrfs1和test_btrfs2
[root@localhost ~]# cd /test_btrfs/
[root@localhost test_btrfs]# ls
[root@localhost test_btrfs]# btrfs subvolume create /test_btrfs/test_btrfs1 #创建test_btrfs1
Create subvolume '/test_btrfs/test_btrfs1'
[root@localhost test_btrfs]# btrfs subvolume create /test_btrfs/test_btrfs2 #创建test_btrfs2
Create subvolume '/test_btrfs/test_btrfs2'
[root@localhost test_btrfs]# ls
test_btrfs1 test_btrfs2
[root@localhost test_btrfs]# btrfs subvolume list -a /test_btrfs/ #查看
ID 260 gen 39 top level 5 path test_btrfs1
ID 261 gen 40 top level 5 path test_btrfs2
7、创建test_btrfs1的快照分区test_btrfs_sanpshot,并验证文件testsnapshot.txt的单个文件快照功能
[root@localhost test_btrfs]# cat test_btrfs1/test.txt
test
123456
[root@localhost test_btrfs1]# btrfs sub snapshot /test_btrfs/test_btrfs1/ /test_btrfs/test_btrfs_snapshot #分区快照 ,快照分区必须与源分区同属一个父目录
Create a snapshot of '/test_btrfs/test_btrfs1/' in '/test_btrfs/test_btrfs_snapshot'
[root@localhost test_btrfs1]# btrfs sub show /test_btrfs/test_btrfs1 | grep "shot"
Snapshot(s):
test_btrfs_snapshot
[root@localhost test_btrfs]# cat test_btrfs_snapshot/test.txt
test
123456
[root@localhost test_btrfs1]# cp --reflink test.txt testsnapshot.txt #建立文件的快照,cp --relink是建立是福本的意思
[root@localhost test_btrfs1]# ls
testsnapshot.txt test.txt
[root@localhost test_btrfs1]# cat testsnapshot.txt
test
123456
[root@localhost test_btrfs1]# cat test.txt
test
123456
123aabcd
[root@localhost test_btrfs1]# cat testsnapshot.txt
test
123456
[root@localhost test_btrfs1]#
8、手动挂载子卷,然后父卷直接路径访问
[root@localhost /]# ls /test_btrfs/test_btrfs1
testsnapshot.txt test.txt
[root@localhost /]# mount -o subvol=test_btrfs1 /dev/sdd /mnt #把子卷test_btrfs1挂载到/mnt
[root@localhost /]# btrfs subv show /mnt #通过挂载目录来查看子卷的信息,说明已挂载成功
/mnt
Name: test_btrfs1
uuid: 747a2849-7c62-1647-a05d-e1fb10bf1907
Parent uuid: -
Creation time: 2016-05-24 22:50:58
Object ID: 258
Generation (Gen): 26
Gen at creation: 6
Parent: 5
Top Level: 5
Flags: -
Snapshot(s):
test_btrfs_snapshot
[root@localhost /]# touch /mnt/{1..10} #在/mnt目录下创建1-10的文件
[root@localhost /]# ls /mnt/ #挂载的目录除了创建的1-10文件之外,还会自动同步/test_btrfs/test_btrfs1下的文件
1 10 2 3 4 5 6 7 8 9 testsnapshot.txt test.txt
[root@localhost /]# ls /test_btrfs/test_btrfs1 #在父卷的子卷名称目录下,就会自动同步显示/mnt的文件
1 10 2 3 4 5 6 7 8 9 testsnapshot.txt test.txt
说明:在挂载子卷的目录时,如果父卷是处于挂载的状态,那么就会自动在父卷目录下挂载子卷的挂载目录;如果父卷是处于没有挂载的状态,那么只要父卷一完成再挂载,也会自动挂载子卷挂载的目录
9、把ext系列的分区/dev/sdb转换成btrfs文件系统
使用到btrfs-conver 转换命令,其中-r 选项是从btrfs 回退到ext
[root@localhost /]# mkfs.ext3 /dev/sdb #把/dev/sdb格式为ext3 mke2fs 1.42.9 (28-Dec-2013) /dev/sdb is entire device, not just one partition! Proceed anyway? (y,n) y Filesystem label= OS type: Linux Block size=4096 (log=2) Fragment size=4096 (log=2) Stride=0 blocks, Stripe width=0 blocks 327680 inodes, 1310720 blocks 65536 blocks (5.00%) reserved for the super user First data block=0 Maximum filesystem blocks=1342177280 40 block groups 32768 blocks per group, 32768 fragments per group 8192 inodes per group Superblock backups stored on blocks: 32768, 98304, 163840, 229376, 294912, 819200, 884736 Allocating group tables: done Writing inode tables: done Creating journal (32768 blocks): done Writing superblocks and filesystem accounting information: done [root@localhost /]# mount /dev/sdb /root/test #挂载 [root@localhost /]# ls /root/test lost+found [root@localhost /]# touch /root/test/{1..10} #创建1-10文件 [root@localhost /]# ls /root/test 1 10 2 3 4 5 6 7 8 9 lost+found [root@localhost /]# umount /root/test #卸载 [root@localhost /]# fsck -f /dev/sdb #强制检查/dev/sdb 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/sdb: 21/327680 files (0.0% non-contiguous), 55935/1310720 blocks [root@localhost /]# btrfs-convert /dev/sdb #转换成btrfs creating btrfs metadata. copy inodes [o] [ 0/ 21] creating ext2fs image file. cleaning up system chunk. conversion complete. [root@localhost /]# mount /dev/sdb /root/test/ [root@localhost /]# ls root/test #再挂载后,文件依然存在 1 10 2 3 4 5 6 7 8 9 ext2_saved lost+found [root@localhost /]# blkid | grep "sdb" /dev/sdb: UUID="06ab4751-a5ca-467e-92f5-c7b6ed2efd1c" UUID_SUB="1fba9c79-dd9a-425e-9d29-e72149661bee" TYPE="btrfs" #已经是btrfs [root@localhost /]# umount /root/test [root@localhost /]# btrfs fi show Label: 'test_btrfs' uuid: 8b7db284-7c8b-496c-8cca-1a1278d13ffc Total devices 3 FS bytes used 816.00KiB devid 1 size 5.00GiB used 1.51GiB path /dev/sdd devid 2 size 5.00GiB used 520.00MiB path /dev/sdc devid 3 size 5.00GiB used 1.51GiB path /dev/sde Label: none uuid: 06ab4751-a5ca-467e-92f5-c7b6ed2efd1c Total devices 1 FS bytes used 219.39MiB devid 1 size 5.00GiB used 5.00GiB path /dev/sdb btrfs-progs v3.19.1 [root@localhost /]# btrfs-convert -r /dev/sdb #回退到ext3 rollback complete. [root@localhost /]# mount /dev/sdb /root/test [root@localhost /]# blkid | grep "sdb" /dev/sdb: UUID="f83914d8-aade-4adb-b8d2-a2e47b665bfc" TYPE="ext3" #已回退成功 [root@localhost /]# ls /root/test/ #回退后文件依然在 1 10 2 3 4 5 6 7 8 9 lost+found [root@localhost /]#
10、把test_btrfs的元数据、数据存储方式从默认转换到raid5
[root@localhost /]# btrfs fi df -h /test_btrfs/ Data, RAID0: total=1.50GiB, used=640.00KiB #数据默认的是raid0 System, RAID1: total=8.00MiB, used=16.00KiB System, single: total=4.00MiB, used=0.00B Metadata, RAID1: total=1.00GiB, used=160.00KiB #元数据默认的是raid1 Metadata, single: total=8.00MiB, used=0.00B GlobalReserve, single: total=16.00MiB, used=0.00B [root@localhost /]# btrfs balance start -mconvert=raid5 /test_btrfs/ #把元数据存储转换成raid5 Done, had to relocate 4 out of 5 chunks [root@localhost /]# btrfs fi df -h /test_btrfs/ Data, RAID0: total=1.50GiB, used=448.00KiB System, RAID5: total=64.00MiB, used=16.00KiB #已转换成功 Metadata, RAID5: total=256.00MiB, used=160.00KiB GlobalReserve, single: total=16.00MiB, used=0.00B [root@localhost /]# btrfs balance start -dconvert=raid5 /test_btrfs/ #把数据存储转换成raid5 Done, had to relocate 1 out of 3 chunks [root@localhost /]# btrfs fi df -h /test_btrfs/ Data, RAID5: total=1.50GiB, used=832.00KiB #已转换成功 System, RAID5: total=64.00MiB, used=16.00KiB Metadata, RAID5: total=256.00MiB, used=160.00KiB GlobalReserve, single: total=16.00MiB, used=0.00B
原创文章,作者:Net20-deamon,如若转载,请注明出处:http://www.178linux.com/17150
评论列表(1条)
已置顶,非常不错。欢迎加入免检家族