zoukankan      html  css  js  c++  java
  • btrfs文件系统简单学习

    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
    

      

  • 相关阅读:
    【Kubernetes学习笔记】-kubeadm 手动搭建kubernetes 集群
    教你快速搭建NFS服务
    【Kubernetes学习笔记】-服务访问之 IP & Port & Endpoint 辨析
    【Kubernetes学习笔记】-使用Minikube快速部署K8S单机学习环境
    Linux RDP 会话中无法打开VSCode 解决办法
    Jenkins 凭证管理
    linux 后台运行进程:& , nohup
    使用私有gitlab搭建gitbook持续集成
    VS Code 使用
    Markdown Rules 详解
  • 原文地址:https://www.cnblogs.com/blog-tim/p/12053757.html
Copyright © 2011-2022 走看看