posts - 68, comments - 19, trackbacks - 0, articles - 1

Btrfs介绍与使用

Posted on 2018-10-10 13:08 viery 阅读(101) 评论(0)  编辑  收藏 所属分类: linux
btrfs(B-tree filesystem),由Oracle 2007年后研发,这是一个技术预览版的文件系统,推出用于弥补、替换Linux中的Ext系列文件系统。
  重要技术特性:
   1)支持写时复制(COW),保证数据的可靠性
   2)更好的扩展性支持,利用动态inode创建、Extent、B-tree实现
   3)支持非常大的单个文件与总容量
   4)支持文件快速检查功能,基于数据及元数据校验码机制,将数据、元数据的某些属性保存下来,下次读取时可根据这些属性快速检测是否受损,如果损坏还能尝试修复,这样极大的提高数据的准确性
   5)支持将多个物理卷组成一个Btrfs文件系统,并内置RAID,支持将数据、元数据以RAID、single、dup等方式在多个物理卷中存储。
   6)支持创建子卷,可以创建多个子卷,子卷可以单独挂载
   7)支持透明压缩功能,自动占用CPU资源对传入/出的文件进行压缩/解压
   8)支持快照,支持对子卷、文件进行快照,还能对快照进行快照
   
  Ext系列对比Btrfs系统:
   参考: https://www.ibm.com/developerworks/cn/linux/l-cn-btrfs/index.html btrfs 文件系统管理命令:
  btrfs subvolume     用于管理子卷
  btrfs filesystem    用于管理文件系统
  btrfs balance    用于调整数据、元数据存储负载均衡
  btrfs device    用于管理设备
  btrfs rescue    用于救援
  btrfs quota     用于设置磁盘配额
一、将多个设备文件创建为一个Btrfs文件系统

mkfs.btrfs [options] Device 
    
-L  指定卷标
    
-m  指定元数据如何跨设备文件存储,可以为 raid0, raid1, raid5, raid6, raid10, single or dup。
    
-d  指定数据如何跨设备文件存储,可以为raid0, raid1, raid5, raid6, raid10 or single or dup
    
-f  强制格式化

[root@localhost 
~]# mkfs.btrfs  -f  -L  myBtrfs  /dev/sdb /dev/sdc
btrfs-progs v4.4.1
See http:
//btrfs.wiki.kernel.org for more information.

Label:              myBtrfs
UUID:               144d67a0
-5235-491b-bc0c-5edeb63e94f4
Node size:          
16384
Sector size:        
4096
Filesystem size:    
40.00GiB
Block group profiles:
  Data:             RAID0             
2.01GiB       发现数据以RAID0存放
  Metadata:         RAID1             
1.01GiB       发现元数据以RAID1存放
  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

二、调整Btrfs逻辑边界

查看Btrfs文件系统由sdb、sdc组成,大小为40G
[root@localhost 
~]# btrfs filesystem show /data/ 
Label: 'myBtrfs'  uuid: 144d67a0-5235-491b-bc0c-5edeb63e94f4
        Total devices 
2 FS bytes used 896.00KiB
        devid    
1 size 20.00GiB used 2.01GiB path /dev/sdb
        devid    
2 size 20.00GiB used 2.01GiB path /dev/sdc
将Btrfs文件系统缩减10G的大小
[root@localhost 
~]# btrfs  filesystem resize   -10G /data/
Resize '/data/' of '-10G'

[root@localhost 
~]# btrfs filesystem show /data/ 
Label: 'myBtrfs'  uuid: 144d67a0-5235-491b-bc0c-5edeb63e94f4
        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

三、为原Btrfs文件系统添加、删除物理设备

添加sdd、sde设备
[root@localhost 
~]# btrfs  device add  /dev/sdd  /dev/sde /data/

[root@localhost 
~]# btrfs  filesystem show  /data/
Label: 'myBtrfs'  uuid: 144d67a0-5235-491b-bc0c-5edeb63e94f4
        Total devices 
4 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
        devid    
3 size 20.00GiB used 0.00B path /dev/sde
        devid    
4 size 20.00GiB used 0.00B path /dev/sdd

删除sde设备
[root@localhost 
~]# btrfs device  del  /dev/sde /data

[root@localhost 
~]# btrfs filesystem show /data
Label: 'myBtrfs'  uuid: 144d67a0-5235-491b-bc0c-5edeb63e94f4
        Total devices 
3 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
        devid    
4 size 20.00GiB used 0.00B path /dev/sdd

相比LVM ,Btrfs不需要人工把数据此该磁盘中移出来,Btrfs自动完成,功能更为强大
四、管理数据、元数据存放磁盘及方式
当新添加一块硬盘进来后,需要将数据均匀存放到各个磁盘上,此时可以这样做:
[root@localhost 
~]# btrfs  balance  start /data/
Done, had to relocate 3 out of 3 chunks

当数据过大时可以使用pause暂停,resume恢复。

修改数据的存放方式为RAID5:
[root@localhost 
~]# btrfs  balance start -dconvert=raid5 /data/
Done, had to relocate 1 out of 3 chunks
修改元数据的存放方式为RAID1:
[root@localhost 
~]# btrfs  balance start -mconvert=raid1 /data/
Done, had to relocate 2 out of 4 chunks

五、启用透明压缩机制

压缩算法有lzo与zlib两种,通过mount重新挂载时选择
[root@localhost 
~]# mount -o remount,compress=lzo /dev/sdb /data/
[root@localhost ~]# cp /var/log/messages /data/
对比查看还是有点效果的,原来128K现在压缩后127K
[root@localhost 
~]# ll -h /var/log/messages /data/messages 
-rw-------1 root root 127K Jan  4 06:24 /data/messages
-rw-------1 root root 128K Jan  4 06:25 /var/log/messages

六、管理子卷

创建子卷log、Coo:
[root@localhost 
~]# btrfs  subvolume  create  /data/log
Create subvolume '/data/log'
[root@localhost 
~]# btrfs  subvolume  create  /data/Coo
Create subvolume '/data/Coo'

查看子卷的简要信息:
[root@localhost data]
# btrfs  subvolume list /data/ 
ID 264 gen 95 top level 5 path log
ID 
265 gen 92 top level 5 path Coo

查看子卷的详细信息:
[root@localhost 
~]# btrfs  subvolume  show  /data/log/
/data/log
        Name:                   log         
#子卷名字
        UUID:                   b22a5c9d-05f7-da41-89c7-d4dcceae9a0e    #子卷UUID
        Parent UUID:            -
        Received UUID:          
-
        Creation time:          
2018-01-04 06:32:19 -0800
        Subvolume ID:           
264             #子卷ID
        Generation:             91
        Gen at creation:        
91
        Parent ID:              
5
        Top level ID:           
5
        Flags:                  
-
        Snapshot(s):

[root@localhost 
~]# btrfs  subvolume  show  /data/Coo
/data/Coo
        Name:                   Coo
        UUID:                   a5552185
-a8b4-2543-b2ac-f0e348668c8e    
        Parent UUID:            
-
        Received UUID:          
-
        Creation time:          
2018-01-04 06:32:46 -0800
        Subvolume ID:           
265
        Generation:             
92
        Gen at creation:        
92
        Parent ID:              
5
        Top level ID:           
5
        Flags:                  
-
        Snapshot(s):

挂载子卷,一般如果挂载父卷则自动挂载所有子卷。

还能单独挂载子卷:
[root@localhost 
~]# mount  -o subvol=log  /dev/sdb /mnt/
[root@localhost ~]# mount | grep mnt
/dev/sdb on /mnt type btrfs (rw,relatime,seclabel,compress=lzo,space_cache,subvolid=264,subvol=/log)

[root@localhost 
~]# mount -o  subvolid=265 /dev/sdb /media/ 
[root@localhost ~]# mount | grep media
/dev/sdb on /media type btrfs (rw,relatime,seclabel,compress=lzo,space_cache,subvolid=265,subvol=/Coo)

七、快照卷的管理

创建快照卷:
[root@localhost 
~]# btrfs subvolume  snapshot  /data/log /data/log_snap
Create a snapshot of '/data/log' in '/data/log_snap'
查看子卷的信息:
[root@localhost data]
# btrfs  subvolume list /data/ 
ID 264 gen 95 top level 5 path log
ID 
265 gen 92 top level 5 path Coo
ID 
266 gen 93 top level 5 path log_snap

删除快照卷:
[root@localhost data]
# btrfs  subvolume  delete /data/log_snap/
Delete subvolume (no-commit): '/data/log_snap'

对快照卷做快照:
注:创建快照之前最好将磁盘设为只读挂载
[root@localhost data]
# btrfs  subvolume  snapshot /data/log_snap/ /data/log_snap_snap
Create a snapshot of '/data/log_snap/' in '/data/log_snap_snap'
对文件做快照(只能在Btrfs中实现):
[root@localhost data]
# cp --reflink  1.t  1.t_snap

恢复快照卷:
[root@localhost data]
# btrfs  subvolume  delete  log
Delete subvolume (no-commit): '/data/log'

[root@localhost data]
# mv  log_snap log

八、文件系统转换、回退

将EXT4转换为Btrfs:
[root@localhost 
~]# fsck -f /dev/sde            #检查磁盘是否损坏、剩余空间
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/sde: 11/1310720 files (0.0% non-contiguous), 126322/5242880 blocks

[root@localhost 
~]# btrfs-convert  /dev/sde         #开始转换
create btrfs filesystem:
        blocksize: 
4096
        nodesize:  
16384
        features:  extref, skinny
-metadata (default)
creating btrfs metadata.
copy inodes [o] [         0
/        11]
creating ext2 image file.
cleaning up system chunk.
conversion complete.

[root@localhost 
~]# btrfs  filesystem show 
Label: 'myBtrfs'  uuid: 144d67a0-5235-491b-bc0c-5edeb63e94f4
        Total devices 
3 FS bytes used 10.77MiB
        devid    
1 size 10.00GiB used 3.00GiB path /dev/sdb
        devid    
2 size 20.00GiB used 2.31GiB path /dev/sdc
        devid    
4 size 20.00GiB used 2.31GiB path /dev/sdd

Label: none  uuid: 3e61c271
-cfcb-42c0-b3f5-a62e9dc8b98a
        Total devices 
1 FS bytes used 494.21MiB
        devid    
1 size 20.00GiB used 20.00GiB path /dev/sde

回滚:
[root@localhost 
~]# btrfs-convert  -r  /dev/sde 
rollback complete.
[root@localhost 
~]# blkid  /dev/sde
/dev/sde: UUID="39eb4603-ad53-4fb7-8d23-d69732921539" TYPE="ext4"

只有注册用户登录后才能发表评论。


网站导航: