1 btrfs文件系统

  btrfs文件系统在生产环境应用还不多,因此,本文仅仅简单学习.

1.1 btrfs文件系统核心特性

  1)多物理卷支持:btrfs可由多个底层物理卷组成(可以是单块物理磁盘,也可以是某一分区等);支持RAID,支持联机在线热“添加”、“移除”,“修改”;
  2)写时复制更新机制(CoW):复制、更新及替换指针,而非“就地”更新;
  3)数据及元数据校验码:checksum ,此机制可以保证数据的可靠性;
  4)支持多子卷:sub_volume;
  5)快照:支持快照的快照(增量快照);
  6)透明压缩:(lzo|zlib压缩算法自动压缩)节约存储空间,但会消耗更多的CPU时钟周期.

  注意:仅仅在单块物理磁盘的不同分区创建btrfs文件系统没有太大意义,多块磁盘组合创建为btrfs文件系统才有意义.

1.2 管理btrfs文件系统需要掌握的命令

  掌握btrfs管理命令就可以熟练操作btrfs文件系统了,其主要命令如下(其命令中还有很多子命令,具体查看man帮助手册):

命令 说明
mkfs.btrfs

含义:mkfs.btrfs - create a btrfs filesystem 创建btrfs文件系统

Usage: mkfs.btrfs [options] dev [ dev ... ]

指定物理磁盘设备或者磁盘分区,并将其创建为btrfs文件系统

btrfs filesystem

含义:btrfs-filesystem - command group of btrfs that usually work on the whole filesystem

  查看btrfs属性信息

usage: btrfs filesystem [<group>] <command> [<args>]

btrfs device

含义:btrfs-device - manage devices of btrfs filesystems ,管理btrfs文件系统设备

usage: btrfs device <command> [<args>]

btrfs balance

含义:btrfs-balance - balance block groups on a btrfs filesystem ,均衡btrfs文件系统数据相关

usage: btrfs balance <command> [options] <path>

btrfs-convert

含义:btrfs-convert - convert from ext2/3/4 filesystem to btrfs in-place 文件系统格式互转

usage: btrfs-convert [options] device

btrfs subvolume

含义:btrfs-subvolume - manage btrfs subvolumes ,管理btrfs文件系统子卷

usage: btrfs subvolume <command> <args>

btrfs check

含义:btrfs-check - check or repair an unmounted btrfs filesystem

  检测一个未被挂载的btrfs文件系统

usage: btrfs check [options] <device>

btrfs rescue

含义:btrfs-rescue - Recover a damaged btrfs filesystem

  恢复救援损坏的btrfs文件系统

usage: btrfs rescue <command> [options] <path>

btrfs inspect-internal

含义:btrfs-inspect-internal - query various internal information

usage: btrfs inspect-internal <command> <args>

btrfs property  
btrfs qgroup  
btrfs quota  
btrfs receive  
btrfs replace  
btrfs restore

含义:Try to restore files from a damaged filesystem (unmounted)

  尝试从一个未被挂载的损坏的btrfs文件系统中恢复数据

usage: btrfs restore [options] <device> <path> | -l <device>

btrfs scrub  
btrfs send  
btrf stune  

1.3 简单实践btrfs文件系统

  实践过程:虚拟机新添加3块20G虚拟磁盘测试并创建btrfs文件系统.

  系统环境:centos7.6

[root@localhost ~]# fdisk -l|grep "^Disk /dev/sd[abcd]\>"|cut -d":" -f1
Disk /dev/sda #<==系统盘
Disk /dev/sdb #<==新添加的20G虚拟磁盘
Disk /dev/sdc #<==新添加的20G虚拟磁盘
Disk /dev/sdd #<==新添加的20G虚拟磁盘
[root@localhost ~]# mkfs.btrfs -L mydata /dev/sdb /dev/sdc #<==直接使用此命令即可创建指定卷标的btrfs文件系统
btrfs-progs v4.9.1
See http://btrfs.wiki.kernel.org for more information. Label: mydata #<==卷标
UUID: 8c6abba9-73dc-4e60-a87f-e313dca6a007 #<==UUID
Node size: 16384
Sector size: 4096 #<==扇区大小
Filesystem size: 40.00GiB #<==文件系统大小
Block group profiles:
Data: RAID0 2.00GiB
Metadata: RAID1 1.00GiB
System: RAID1 8.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: 'mydata' uuid: 8c6abba9-73dc-4e60-a87f-e313dca6a007
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 ~]# btrfs filesystem show /dev/sdb #<==同一个btrfs文件系统卷,其UUID是一样的
Label: 'mydata' uuid: 8c6abba9-73dc-4e60-a87f-e313dca6a007
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 ~]# btrfs filesystem show /dev/sdc
Label: 'mydata' uuid: 8c6abba9-73dc-4e60-a87f-e313dca6a007
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 ~]# blkid /dev/sdb #<==同一个btrfs文件系统卷UUID一样,但子卷的UUID不一样,因此,支持多卷
/dev/sdb: LABEL="mydata" UUID="8c6abba9-73dc-4e60-a87f-e313dca6a007" UUID_SUB="1a163afe-6733-4f11-9961-24c125bf5927" TYPE="btrfs"
[root@localhost ~]# blkid /dev/sdc
/dev/sdc: LABEL="mydata" UUID="8c6abba9-73dc-4e60-a87f-e313dca6a007" UUID_SUB="a3306dfe-2a00-45a5-b25b-f82fafe7649a" TYPE="btrfs"
[root@localhost ~]# btrfs filesystem show --mounted #<==显示已挂载的btrfs文件系统
[root@localhost ~]# btrfs filesystem show --all-devices #<==默认不加,就是显示所有
Label: 'mydata' uuid: 8c6abba9-73dc-4e60-a87f-e313dca6a007
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 ~]# btrfs filesystem show /dev/sdb #<==指定某一个磁盘设备,同一个btrfs文件系统卷下的物理磁盘设备会全部显示
Label: 'mydata' uuid: 8c6abba9-73dc-4e60-a87f-e313dca6a007
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 /data
[root@localhost ~]# mount -t btrfs /dev/sdb /data/ #<==挂载使用,指定任意一个物理磁盘设备都代表了所属的同一个btrfs文件系统卷
[root@localhost ~]# mount |tail -1 #<==同一个btrfs文件系统卷只挂载一个物理磁盘设备即代表挂载了全局的物理磁盘
/dev/sdb on /data type btrfs (rw,relatime,space_cache,subvolid=5,subvol=/)
[root@localhost /]# umount /dev/sdb
###启用透明压缩算法(lzo|zlib,此2种算法可以选择其中一种)
[root@localhost /]# mount -t btrfs -o compress=lzo /dev/sdb /data/ #<==注意,如果被blkid命令识别的文件系统,可以不加-t参数,忽略指定文件系统类型步骤
###调整btrfs文件系统大小,须先挂载使用(使用resize子命令,但调整大小取决于底层物理磁盘设备是否加入了btrfs文件系统卷中)
[root@localhost /]# btrfs filesystem resize -10G /data/ #<==指定挂载点,缩减btrfs文件系统大小
Resize '/data/' of '-10G'
[root@localhost /]# btrfs filesystem df /data/ #<==此命令看不出变化
Data, RAID0: total=2.00GiB, used=768.00KiB #<==存储数据默认使用raid0,所以2块20G磁盘加起来是40G
System, RAID1: total=8.00MiB, used=16.00KiB #<==文件系统内部机制使用raid1
Metadata, RAID1: total=1.00GiB, used=112.00KiB #<==元数据使用raid1存储
GlobalReserve, single: total=16.00MiB, used=0.00B
[root@localhost /]# df -lh
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/centos-root 39G 1.8G 37G 5% /
devtmpfs 898M 0 898M 0% /dev
tmpfs 910M 0 910M 0% /dev/shm
tmpfs 910M 9.5M 901M 2% /run
tmpfs 910M 0 910M 0% /sys/fs/cgroup
/dev/sda1 1014M 133M 882M 14% /boot
tmpfs 182M 0 182M 0% /run/user/0
/dev/sdb 30G 17M 18G 1% /data #<==此命令看到btrfs文件系统已减少10G
[root@localhost /]# btrfs filesystem resize +10G /data/ #<==此步骤调整的是逻辑边界
Resize '/data/' of '+10G'
[root@localhost /]# df -lh
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/centos-root 39G 1.8G 37G 5% /
devtmpfs 898M 0 898M 0% /dev
tmpfs 910M 0 910M 0% /dev/shm
tmpfs 910M 9.5M 901M 2% /run
tmpfs 910M 0 910M 0% /sys/fs/cgroup
/dev/sda1 1014M 133M 882M 14% /boot
tmpfs 182M 0 182M 0% /run/user/0
/dev/sdb 40G 17M 38G 1% /data
[root@localhost /]# btrfs filesystem resize max /data/ #<==直接调整至最大,要更大,就要新加底层物理卷进来
Resize '/data/' of 'max'
###添加底层物理磁盘
[root@localhost /]# btrfs device add /dev/sdd /data/ #<==直接使用btrfs device子命令添加
[root@localhost /]# df -lh
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/centos-root 39G 1.8G 37G 5% /
devtmpfs 898M 0 898M 0% /dev
tmpfs 910M 0 910M 0% /dev/shm
tmpfs 910M 9.5M 901M 2% /run
tmpfs 910M 0 910M 0% /sys/fs/cgroup
/dev/sda1 1014M 133M 882M 14% /boot
tmpfs 182M 0 182M 0% /run/user/0
/dev/sdb 60G 17M 56G 1% /data #<==容量已变为60G,因为添加多了一块20G物理磁盘
注意:数据如果需要均衡存储到各个底层物理磁盘,需要使用btrfs balance命令及其子命令
[root@localhost /]# btrfs balance start /data/ #<==生产环境有大量数据均衡存储到各底层物理磁盘(视情况)
[root@localhost /]# btrfs balance status /data/ #<==查看状态
No balance found on '/data/'
###移除底层物理卷(必须剩余的物理卷可以存储现有的数据:btrfs文件系统会自动把数据移走到其他物理磁盘)
[root@localhost /]# btrfs device delete /dev/sdd /data #<==联机时移除设备
[root@localhost /]# btrfs filesystem show /data/ #<==被移除的设备上的数据会自动被btrfs文件系统移走到其他底层物理卷
Label: 'mydata' uuid: 8c6abba9-73dc-4e60-a87f-e313dca6a007
Total devices 2 FS bytes used 1.44MiB
devid 1 size 20.00GiB used 1.28GiB path /dev/sdb
devid 2 size 20.00GiB used 1.28GiB path /dev/sdc
[root@localhost /]# ls /data/ #<==数据还在
a.txt
###修改btrfs的数据组织机制,使用btrfs balance命令及其子命令(注意,如果是raid,低层物理磁盘个数需要满足组raid的要求)
[root@localhost /]# btrfs device add /dev/sdd /data
[root@localhost /]# btrfs filesystem show /data/
Label: 'mydata' uuid: 8c6abba9-73dc-4e60-a87f-e313dca6a007
Total devices 3 FS bytes used 704.00KiB
devid 1 size 20.00GiB used 1.28GiB path /dev/sdb
devid 2 size 20.00GiB used 1.28GiB path /dev/sdc
devid 3 size 20.00GiB used 0.00B path /dev/sdd
[root@localhost /]# btrfs balance start -mconvert=raid5 /data/ #<==使用raid5,低层物理磁盘个数必须满足最低3个
Done, had to relocate 2 out of 3 chunks
[root@localhost /]# btrfs filesystem df /data/
Data, RAID0: total=2.00GiB, used=768.00KiB
System, RAID5: total=64.00MiB, used=16.00KiB #<==文件系统内部机制及元数据已使用raid存储
Metadata, RAID5: total=1.00GiB, used=112.00KiB
GlobalReserve, single: total=16.00MiB, used=0.00B
###创建子卷,使用btrfs subvolmue命令及其子命令
[root@localhost /]# btrfs subvolume list /data/ #<==列出父卷下的所有子卷
[root@localhost /]# btrfs subvolume create /data/logs #<==在父卷下指定名称创建子卷,这里不是创建目录,而是创建子卷
Create subvolume '/data/logs'
[root@localhost /]# btrfs subvolume list /data/ #<==查看父卷下已有的子卷及其卷ID
ID 263 gen 62 top level 5 path logs
注意:挂载了父卷,所有已创建的子卷会被自动挂载在父卷的基础上
###单独挂载某个子卷,须先卸载父卷,并指明某子卷的名称进行挂载(或指定子卷的ID进行挂载)
[root@localhost /]# umount /data/
[root@localhost /]# mount -o subvol=logs /dev/sdd /mnt
[root@localhost /]# mount -o subvolid=263 /dev/sdd /mnt
mount: /dev/sdd is already mounted or /mnt busy
[root@localhost /]# btrfs subvolume show /mnt/ #<==查看子卷的挂载信息
[root@localhost /]# mount /dev/sdd /data/ #<==挂载父卷才可以删除子卷
[root@localhost /]# btrfs subvolume delete /data/logs
Delete subvolume (no-commit): '/data/logs'
[root@localhost /]# btrfs subvolume list /data/
###将ext系列与btrfs互转
[root@localhost /]# btrfs balance start -mconvert=raid1 /data/
Done, had to relocate 2 out of 3 chunks
[root@localhost /]# btrfs device delete /dev/sdd /data/
#将/dev/sdd1格式化为ext4文件系统
[root@localhost /]# mke2fs -t ext4 /dev/sdd1
[root@localhost /]# partx /dev/sdd
NR START END SECTORS SIZE NAME UUID
1 2048 20973567 20971520 10G
[root@localhost /]# fsck -f /dev/sdd1
[root@localhost /]# btrfs-convert /dev/sdd1 #<==将ext4转换为btrfs
create btrfs filesystem:
blocksize: 4096
nodesize: 16384
features: extref, skinny-metadata (default)
creating ext2 image file
creating btrfs metadatacopy inodes [o] [ 2/ 11]
[root@localhost /]# btrfs filesystem show
Label: 'mydata' uuid: 8c6abba9-73dc-4e60-a87f-e313dca6a007
Total devices 2 FS bytes used 704.00KiB
devid 1 size 20.00GiB used 1.28GiB path /dev/sdb
devid 2 size 20.00GiB used 1.28GiB path /dev/sdc Label: none uuid: 4eb42c5e-f260-4e64-ac2d-080f488c747b
Total devices 1 FS bytes used 325.27MiB
devid 1 size 10.00GiB used 583.66MiB path /dev/sdd1
#挂载使用
[root@localhost /]# mount /dev/sdd1 /mnt/
#回滚至ext文件系统
[root@localhost /]# umount /mnt/
[root@localhost /]# btrfs-convert -r /dev/sdd1
rollback complete
[root@localhost /]# blkid /dev/sdd1
/dev/sdd1: UUID="a88d5de4-620d-41d3-bd0e-3ff88c787362" TYPE="ext4" ###将某磁盘的单个分区添加至现有的btrfs文件系统中
[root@localhost /]# partx /dev/sdd
NR START END SECTORS SIZE NAME UUID
1 2048 20973567 20971520 10G
2 20973568 31459327 10485760 5G
[root@localhost /]# mkfs.btrfs /dev/sdd2
btrfs-progs v4.9.1
See http://btrfs.wiki.kernel.org for more information. Label: (null)
UUID: 3b7731a0-af8a-488c-bf23-23b207bdf6da
Node size: 16384
Sector size: 4096
Filesystem size: 5.00GiB
Block group profiles:
Data: single 8.00MiB
Metadata: DUP 256.00MiB
System: DUP 8.00MiB
SSD detected: no
Incompat features: extref, skinny-metadata
Number of devices: 1
Devices:
ID SIZE PATH
1 5.00GiB /dev/sdd2 [root@localhost /]# btrfs device add /dev/sdd2 /data/
/dev/sdd2 appears to contain an existing filesystem (btrfs).
ERROR: use the -f option to force overwrite of /dev/sdd2   #<==强制覆盖数据后添加
[root@localhost /]# btrfs device add -f /dev/sdd2 /data/
[root@localhost /]# btrfs filesystem show
Label: 'mydata' uuid: 8c6abba9-73dc-4e60-a87f-e313dca6a007
Total devices 3 FS bytes used 704.00KiB
devid 1 size 20.00GiB used 1.28GiB path /dev/sdb
devid 2 size 20.00GiB used 1.28GiB path /dev/sdc
devid 3 size 5.00GiB used 0.00B path /dev/sdd2

  

btrfs文件系统简单学习的更多相关文章

  1. Linux学习笔记之 Btrfs文件系统简介及使用

    Btrfs 也有一个重要的缺点,当 BTree 中某个节点出现错误时,文件系统将失去该节点之下的所有的文件信息.而 ext2/3 却避免了这种被称为”错误扩散”的问题. Btrfs相关介绍: Btrf ...

  2. Linux学习笔记之Btrfs 文件系统

    0x00 btrfs文件系统简介 btrfs文件系统:技术预览版(Centos7)Btrfs(B-tree.Butter FS.Better FS),GPL授权,Orale2007提出是想用来取代Ex ...

  3. 存储那些事儿(五):BTRFS文件系统之Btree结构详解

    Btree数据结构可以说是BTRFS文件系统的基础.它提供了一个通用的方式去存储不同的数据类型.它仅仅存储3个数据类型:key, item和block header. btrfs_header的定义如 ...

  4. Linux btrfs文件系统

    btrfs,它名字挺多:B-tree fs;Butter fs;Better fs 开源协议是GPL,2007年由Oracle研发 核心特性: 多物理卷支持,btrfs可由多个物理卷组成:支持RAID ...

  5. RAID、LVM和btrfs文件系统

    一.RAID: Redundant Arrays of Inexpensive Disks,廉价磁盘冗余阵列: Redundant Arrays of Independent Disks,独立磁盘冗余 ...

  6. Log4j简单学习笔记

    log4j结构图: 结构图展现出了log4j的主结构.logger:表示记录器,即数据来源:appender:输出源,即输出方式(如:控制台.文件...)layout:输出布局 Logger机滤器:常 ...

  7. shiro简单学习的简单总结

    权限和我有很大渊源. 培训时候的最后一个项目是OA,权限那块却不知如何入手,最后以不是我写的那个模块应付面试. 最开始的是使用session装载用户登录信息,使用简单权限拦截器做到权限控制,利用资源文 ...

  8. CentOS 简单学习 firewalld的使用

    1. centos7 开始 使用firewalld 代替了 iptables 命令工具为 firewall-cmd 帮助信息非常长,简单放到文末 2. 简单使用 首先开启 httpd 一般都自带安装了 ...

  9. Windows 下 Docker 的简单学习使用过程之一 dockertoolbox

    1. Windows 下面运行 Docker 的两个主要工具1): Docker for Windows2): DockerToolbox区别:Docker For Windows 可以理解为是新一代 ...

随机推荐

  1. cogs 2450. 距离 树链剖分求LCA最近公共祖先 快速求树上两点距离 详细讲解 带注释!

    2450. 距离 ★★   输入文件:distance.in   输出文件:distance.out   简单对比时间限制:1 s   内存限制:256 MB [题目描述] 在一个村子里有N个房子,一 ...

  2. PTA - 堆栈模拟队列

    设已知有两个堆栈S1和S2,请用这两个堆栈模拟出一个队列Q. 所谓用堆栈模拟队列,实际上就是通过调用堆栈的下列操作函数: int IsFull(Stack S):判断堆栈S是否已满,返回1或0: in ...

  3. git 工作中实用 多人协同开发

    多人协同开发 .克隆分支 git clone -b dev1. url .创建并关联远程分支 git checkout -b dev_wt origin/dev_wt 情况一获取其它分支的代码,并合并 ...

  4. 基于python的感知机

    一. 1.感知机可以描述为一个线性方程,用python的伪代码可表示为: sum(weight_i * x_i) + bias -> activation #activation表示激活函数,x ...

  5. Java容器解析系列(14) IdentityHashMap详解

    IdentityHashMap,使用什么的跟HashMap相同,主要不同点在于: 数据结构:使用一个数组table来存储 key:value,table[2k] 为key, table[2k + 1] ...

  6. Quantitative Trading with R(一):两个简单的策略

    下面是两个使用R中的Quantstrat包进行策略构建的例子,都是对600550.ss.600192.ss.600152.ss.600644.ss.600885.ss.600151.ss六只股票进行投 ...

  7. abp vnext2.0之核心组件模块加载系统源码解析与简单应用

    abp vnext是abp官方在abp的基础之上构建的微服务架构,说实话,看完核心组件源码的时候,很兴奋,整个框架将组件化的细想运用的很好,真的超级解耦.老版整个框架依赖Castle的问题,vnext ...

  8. SpringBoot消息篇Ⅲ --- 整合RabbitMQ

    知识储备:  关于消息队列的基本概念我已经在上一篇文章介绍过了(传送门),本篇文章主要讲述的是SpringBoot与RabbitMQ的整合以及简单的使用. 一.安装RabbitMQ 1.在linux上 ...

  9. IDEA启动报错Plugin Error Problems found loading plugins的解决办法

    错误描述 今天启动项目时发现IDEA控制台出错,tomcat的标志变成问号,启动不了服务器 Problems found loading plugins: Plugin "Persisten ...

  10. SpringBoot使用JMS(activeMQ)的两种方式 队列消息、订阅/发布

    刚好最近同事问我activemq的问题刚接触所以分不清,前段时间刚好项目中有用到,所以稍微整理了一下,仅用于使用 1.下载ActiveMQ 地址:http://activemq.apache.org/ ...