zoukankan      html  css  js  c++  java
  • Linux学习笔记之 Btrfs文件系统简介及使用

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

    Btrfs相关介绍:

    Btrfs 是一个 Linux 中的新的写时复制(copy-on-write (COW))的文件系统,目的是实现高级功能的同时着重与容错功能,修复功能以及易于管理。目前由Oracle, Red Hat, 富士通, Intel, SUSE以及其他组织共同开发,在 GPL 许可证下发行,同时向任何人公开代码。

    Btrfs核心特性:

    多物理卷支持:btrfs可由多个底层物理卷组成;支持RAID,以联机“添加”、“移除”、“修改”;

    写时复制更新机制(CoW):复制、更新及替换指针,而非“就地”更新;在文件进行修改的时候,首先将文件复制一份出来,在复制出来的文件上进行修改,修改完成之后,将指向原有文件的指针修改指向到修改完成的文件上,若修改完成的文件出现了错误,则我们可以通过原文件进行修复

    数据及元数据校验码:checksum ,当存储某个文件时,checksum会将数据的源数据和数据的校验码,分别通过文件的属性扩展进行保存,当我们再次读取数据时可以方便的检测数据是否受损,如果文件受损系统可以完成自动修复;

    子卷:sub_volume,在一个卷上创建多个子卷,在每一个子卷上创建文件系统,并挂载使用;

    快照:支持快照的快照;因此可以实现类似增量快照的机制

    透明压缩 :如果我们在存储文件时,进行压缩存储,那么在文件发往btrfs时,会自动的占用时钟周期,完成数据的压缩存放,而用户并不知道,在用户读取文件时,会自动的进行文件的解压缩,可以实现节约磁盘空间。但是压缩和解压缩会占用时钟周期;

    Btrfs文件系统如何创建:


    mkfs.btrfs
    -L ‘LABEL‘:指定文件系统的卷标;
    -d <type>: raid0, raid1, raid5, raid6, raid10, single  指明数据的存放方式,支持RAID机制;
    -m <profile>: raid0, raid1, raid5, raid6, raid10, single, dup 指明元数据的存放方式,是否可跨越多个物理卷,支持RAID机制;
    -O <feature>:在格式化文件系统的时候,是否直接开启文件系统的某些特性;
    -O list-all: 列出支持的所有特性;
    [root@centos7 ~]# fdisk -l  #有三块硬盘sdb,sdc,sdd 用于创建btrfs 文件系统,大小均为20G
    Disk /dev/sdd: 21.5 GB, 21474836480 bytes, 41943040 sectors
    Units = sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    Disk /dev/sdb: 21.5 GB, 21474836480 bytes, 41943040 sectors
    Units = sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    Disk /dev/sdc: 21.5 GB, 21474836480 bytes, 41943040 sectors
    Units = sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    [root@centos7 ~]# mkfs.btrfs -L mydata  /dev/sdb /dev/sdc #将sdb,sdc创建为btrfs文件系统
    Btrfs v3.16.2
    See http://btrfs.wiki.kernel.org for more information.
    Turning ON incompat feature ‘extref‘: increased hardlink limit per file to 65536
    adding device /dev/sdc id 2
    fs created label mydata on /dev/sdb
    nodesize 16384 leafsize 16384 sectorsize 4096 size 40.00GiB
    [root@centos7 ~]# btrfs filesystem show   #查看系统上的所有btrfs文件系统
    Label: ‘mydata‘  uuid: 70cf9f41-8977-4265-bf27-ca38b6459940
    Total devices 2 FS bytes used 112.00KiB
    devid    1 size 20.00GiB used 2.03GiB path /dev/sdb
    devid    2 size 20.00GiB used 2.01GiB path /dev/sdc
    [root@centos7 ~]# blkid /dev/sdb    #查看设备sdb的属性
    /dev/sdb: LABEL="mydata" UUID="70cf9f41-8977-4265-bf27-ca38b6459940" UUID_SUB="b8c340e2-6165-4b31-90df-278b5ac77a2f" TYPE="btrfs" 
    [root@centos7 ~]# blkid /dev/sdc    #查看设备sdc的属性
    /dev/sdc: LABEL="mydata" UUID="70cf9f41-8977-4265-bf27-ca38b6459940" UUID_SUB="a80e87bb-9564-488a-9c8f-a403d0e4090a" TYPE="btrfs"
    可见/sdb,/sdc UUID一直,子卷UUID不同
    [root@centos7 ~]# mkdir /mydata    #创建挂载点/mydata
    [root@centos7 ~]# mount /dev/sdb /mydata   #挂载刚刚创建的文件系统,此时挂载/dev/sdc是一样的效果
    [root@centos7 ~]# mount | grep /mydata    #挂载成功
    /dev/sdb on /mydata type btrfs (rw,relatime,seclabel,space_cache)
    #man btrfs filesystem 可用来查看命令帮助文档

    调整btrfs文件系统大小(逻辑边界):


    命令格式:btrfs filesystem resize  [<devid>:]<size>[gkm]|[<devid>:]max <path>

    联机缩减文件系统大小

    [root@centos7 ~]# btrfs filesystem resize -10G /mydata    #将文件系统大小缩减去10G
    Resize ‘/mydata‘ of ‘-10G‘
    [root@centos7 ~]# df -lh /mydata    #此时文件系统大小变为了30G
    Filesystem      Size  Used Avail Use% Mounted on
    /dev/sdb         30G  1.0M   18G   1% /mydata

    联机扩张文件系统大小:

    [root@centos7 ~]# btrfs filesystem resize +5G /mydata    #将文件系统大小扩展5G
    Resize ‘/mydata‘ of ‘+5G‘
    [root@centos7 ~]# df -lh /mydata    #建系统此时增加到了35G
    Filesystem      Size  Used Avail Use% Mounted on
    /dev/sdb         35G  1.0M   28G   1% /mydata
    [root@centos7 ~]# btrfs filesystem resize max /mydata    #max,将文件系统大小调整至其物理边界40G
    Resize ‘/mydata‘ of ‘max‘
    [root@centos7 ~]# df -lh /mydata/
    Filesystem      Size  Used Avail Use% Mounted on
    /dev/sdb         40G  1.0M   38G   1% /mydata

    调整btrfs物理边界大小:

    命令格式:btrfs device add/delete/scan <dev>  MOUNT_POINT
    [root@centos7 ~]# btrfs device add /dev/sdd /mydata    #为btrfs文件系统,增加一块硬盘sdd
    [root@centos7 ~]# df -lh /mydata #完成后,总大小为60G
    Filesystem      Size  Used Avail Use% Mounted on
    /dev/sdb         60G  1.0M   56G   1% /myda

    透明压缩:


    只需在挂载时候,使用-o 并指定压缩方式即可,对用户是透明的,可以选择lzo或zlib两种压缩方式

    命令格式:mount -o compress={lzo|zlib} DEVICE MOUNT_POINT

    btrfs文件均衡:


    命令格式: btrfs balance start [OPTIONS] <FILTERS> MOUNT_POINT

    常用选项有:

    -d: 指定数据的组织机制

    -s:指定元数据的组织机制

    -m:指定文件系统的组织机制

    [root@centos7 ~]# btrfs device add /dev/sdd /mydata    #添加 sdd设备到btrfs文件系统
    [root@centos7 ~]# btrfs filesystem show   #查看btrf文件系统信息
    Label: ‘mydata‘  uuid: 70cf9f41-8977-4265-bf27-ca38b6459940
    Total devices 3 FS bytes used 640.00KiB
    devid    2 size 20.00GiB used 2.03GiB path /dev/sdc
    devid    3 size 20.00GiB used 0.00 path /dev/sdb
     devid    4 size 20.00GiB used 1.03GiB path /dev/sdd
    [root@centos7 ~]# btrfs balance start -mconvert=raid5 /mydata  #均衡文件,并使用raid5组织文件系统
    Done, had to relocate 2 out of 3 chunk
    注:raid5,至少需要3块磁盘。
    删除btrfs的物理卷:
    [root@centos7 ~]# btrfs device delete /dev/sdb /mydata    #将sdb设备移除
    [root@centos7 ~]# df -lh /mydata
    Filesystem      Size  Used Avail Use% Mounted on
    /dev/sdc         40G  1.0M   38G   1% /mydata
    [root@centos7 ~]# btrfs filesystem show /mydata    #可见sdb 设备已经移除
    Label: ‘mydata‘  uuid: 70cf9f41-8977-4265-bf27-ca38b6459940
    Total devices 2 FS bytes used 640.00KiB
    devid    2 size 20.00GiB used 2.03GiB path /dev/sdc
    devid    3 size 20.00GiB used 1.03GiB path /dev/sdd
    Btrfs v3.16.2

    btrfs子卷管理:


    创建子卷:

    命令格式: btrfs subvolume create  /PATH 此路径必须是在btrfs文件系统的挂载目录下
    [root@centos7 ~]# btrfs subvolume create /mydata/subvol    #创建子卷,子卷名为subvol
    Create subvolume ‘/mydata/subvol‘
    [root@centos7 ~]# btrfs subvolume create /mydata/subvol1    #再创建子卷,子卷名为subvol1
    Create subvolume ‘/mydata/subvol1‘
    [root@centos7 ~]# btrfs subvolume list /mydata    #查看btrfs 文件系统下的所有子卷信息
    ID 262 gen 73 top level 5 path subvol    #ID 262 是子卷subvol的ID,可以用该ID来挂载该卷
    ID 263 gen 74 top level 5 path subvol1

    挂载子卷:

    命令格式:  mount -o subvol=SUBVOLUME  DEVICE /MOUNT_POIN
    [root@centos7 ~]# mount -o subvol=subvol /dev/sdb /mnt    #将子卷单独挂载到/mnt目录下
    [root@centos7 ~]# ls /mnt    #此时是没有任何内容的
    查看子卷相关信息:
    命令格式:btrfs subvolume show MOUNT_POINT
    [root@centos7 ~]# btrfs subvolume show /mnt    #查看子卷信息
    /mnt
    Name: subvol
    uuid: f0b08e73-e73e-774c-9f3e-262f52eea64f
    Parent uuid: -
    Creation time: 2015-09-29 00:23:14
    Object ID: 262
    Generation (Gen): 76
    Gen at creation: 73
    Parent: 5
    Top Level: 5
    Flags: -
    Snapshot(s):
    [root@centos7 ~]# cp /var/log/messages /mnt    #复制messages文件到子卷subvol
    [root@centos7 ~]# ls /mnt
    messages
    [root@centos7 ~]# umount /mnt    #卸载子卷subvol
    [root@centos7 ~]# mount /dev/sdb /mydata    #将这个btrfs文件系统挂载到/mydata目录
    [root@centos7 ~]# ls /mydata
    subvol  subvol1
    [root@centos7 ~]# ls /mydata/subvol    #可见子卷subvol的内容是可见的,所以说一旦父卷挂载,子卷就被自动挂载了
    messages
    注:由于是子卷,如果父卷已经挂载,则子卷就自动被挂载了
    反之,如果只挂载子卷,父卷内容是不会自动挂载的,其内容,不可见
    [root@centos7 ~]# umount /mydata    #卸载父卷,
    [root@centos7 ~]# mount -o subvol=subvol /dev/sdb /mydata    #单独挂载子卷
    [root@centos7 ~]# ls /mydata/    #此时/mydata下只有子卷的内容,并不会有父卷的内容:如subvol,subvol1目录
    messages
    子卷,父卷也可以分别挂载:(可是没必要单独挂载子卷,父卷挂载完成后,子卷也就被自动挂载了)
    [root@centos7 ~]# umount /mydata    #卸载子卷
    [root@centos7 ~]# mount -o subvol=subvol /dev/sdb /mnt    #挂载子卷到/mnt目录
    [root@centos7 ~]# mount /dev/sdb /mydata           #挂载父卷到/mydata目录
    [root@centos7 ~]# ls /mydata/    #此时父卷挂载成功
    f1.txt  subvol  subvol1
    [root@centos7 ~]# ls /mnt     #子卷内容也可单独显示
    messages

    删除子卷:


    命令格式:btrfs subvolume delete /MOUNT_POINT
    [root@centos7 ~]# btrfs subvolume delete /mydata/subvol    #删除子卷subvol
    Transaction commit: none (default)
    Delete subvolume ‘/mydata/subvol‘
    [root@centos7 ~]# btrfs subvolume list /mydata    #已经没有了子卷subvol信息了
    ID 263 gen 74 top level 5 path subvol1
    [root@centos7 ~]# btrfs subvolume snapshot /mydata/subvol1/ /mydata/subvol1_snapshot
    Create a snapshot of ‘/mydata/subvol1/‘ in ‘/mydata/subvol1_snapshot‘

    子卷快照

    命令格式:btrfs subvolume snapshot /PATH/TO/SUBVOLUME /PATH/TO/SNAPSHOT
    [root@centos7 ~]# cp /etc/passwd /mydata/subvol1/    #复制passwd文档到子卷subvol1内
    [root@centos7 ~]# btrfs subvolume snapshot /mydata/subvol1/ /mydata/subvol1_snapshot     #创建快照subvol1_snapshot
    Create a snapshot of ‘/mydata/subvol1/‘ in ‘/mydata/subvol1_snapshot‘
    [root@centos7 ~]# btrfs subvolume list /mydata    #快照子卷subvol1_snapshot创建完成
    ID 263 gen 84 top level 5 path subvol1
    ID 264 gen 84 top level 5 path subvol1_snapshot
    [root@centos7 ~]# echo "TEST FOR SNAPSHOT" >> /mydata/subvol1/passwd #在passwd文档后追加一行 "TEST FOR SNAPSHOT" 
    [root@centos7 ~]# tail -1 /mydata/subvol1/passwd     #此时子卷中数据更新了
    TEST FOR SNAPSHOT
    [root@centos7 ~]# tail -1 /mydata/subvol1_snapshot/passwd  #此时快照中的passwd并没有更新,末尾没有"TEST FOR SNAPSHOT" 这行
    root1:x:1000:1000:root1:/home/root1:/bin/bash
    注:在子卷创建快照后,对原子卷做的修改操作并不会反映到快照中。

    ext文件系统和btrfs文件系统互转:


    命令格式:btrfs-convert [-r] Device 
        不使用-r 代表从普通文件系统,转化成btrfs文件系统
        -r:从btrfs回滚到之前的文件系统
    [root@centos7 subvol1]# btrfs balance start  -mconvert=raid1 /mydata   #将之前的RAID5降级到RAID1,接下来才可以拆去三块硬盘中的其中一块
    Done, had to relocate 2 out of 3 chunks
    [root@centos7 subvol1]# btrfs balance start  -dconvert=raid1 /mydata    
    Done, had to relocate 1 out of 3 chunks
    [root@centos7 subvol1]# btrfs device  delete /dev/sdd /mydata   #此时移除设备sdd
    [root@centos7 ~]# fdisk /dev/sdd       #将sdd重新创建分区sdd1
    [root@centos7 ~]# mkfs.ext4 /dev/sdd1    #格式化为ext4文件系统
    [root@centos7 subvol1]# mount /dev/sdd1 /mnt    #挂载sdd1
    [root@centos7 subvol1]# ls /mnt 
    lost+found
    [root@centos7 subvol1]# cp /etc/fstab /mnt    #复制文件fstab到 /mnt
    [root@centos7 ~]# ls /mnt
    fstab  lost+found
    [root@centos7 subvol1]# umount /mnt    #卸载文件系统,不要在线做文件系统转换
    [root@centos7 subvol1]# fsck -f /dev/sdd1    #做强制检测
    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/sdd1: 12/1310720 files (0.0% non-contiguous), 126323/5242624 blocks
    [root@centos7 ~]# btrfs-convert /dev/sdd1
    creating btrfs metadata.
    creating ext2fs image file.
    cleaning up system chunk.
    conversion complete.
     
    [root@centos7 ~]# btrfs filesystem show
    Label: ‘mydata‘  uuid: cce40d16-b7ff-4346-9bbd-a498ad6d7633
    Total devices 2 FS bytes used 896.00KiB
    devid    1 size 20.00GiB used 2.03GiB path /dev/sdb
    devid    2 size 20.00GiB used 2.01GiB path /dev/sdc
    Label: none  uuid: 7d62e69a-574b-41f8-ab83-718be0d2f5f4
    Total devices 1 FS bytes used 493.50MiB
    devid    1 size 20.00GiB used 20.00GiB path /dev/sdd1   #可见sdd1已经转化成了btrfs文件系统
    [root@centos7 ~]# mount /dev/sdd1 /mnt
    [root@centos7 ~]# ls /mnt
    ext2_saved  fstab  lost+found
    [root@centos7 ~]# cat /mnt/fstab    #之前的文件fstab仍旧可以正常访问
    #
    # /etc/fstab
    # Created by anaconda on Wed Aug 19 11:07:17 2015
    #
    # Accessible filesystems, by reference, are maintained under ‘/dev/disk‘
    # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
    #
    /dev/mapper/centos-root /                       xfs     defaults        0 0
    UUID=d4443e1c-7ecc-4393-9193-94beffba73e7 /boot                   xfs     defaults        0 0
    /dev/mapper/centos-home /home                   xfs     defaults        0 0
    /dev/mapper/centos-swap swap                    swap    defaults

    将btrfs文件系统回滚到原普通文件系统


    [root@centos7 ~]# umount /mnt
    [root@centos7 ~]# btrfs-convert -r /dev/sdd1
    rollback complete.
    [root@centos7 ~]# mount /dev/sdd1 /mnt
    [root@centos7 ~]# ls /mnt
    fstab  lost+found
    [root@centos7 ~]# blkid /dev/sdd1    #参考sdd1信息,可见其为ext4文件系统
    /dev/sdd1: UUID="698281c8-c549-46dc-976f-ba509d531f83" TYPE="ext4" 
    [root@centos7 ~]# cat /mnt/fstab #且原文件仍旧可以正常访问
    #
    # /etc/fstab
    # Created by anaconda on Wed Aug 19 11:07:17 2015
    #
    # Accessible filesystems, by reference, are maintained under ‘/dev/disk‘
    # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
    #
    /dev/mapper/centos-root /                       xfs     defaults        0 0
    UUID=d4443e1c-7ecc-4393-9193-94beffba73e7 /boot                   xfs     defaults        0 0
    /dev/mapper/centos-home /home                   xfs     defaults        0 0
    /dev/mapper/centos-swap swap                    swap    defaults        0 0

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

  • 相关阅读:
    微信小程序----map组件实现检索【定位位置】周边的POI
    nginx负载均衡和inotify+rsync文件同步
    mysql主从同步配置和读写分离实现(中间件Amoeba)
    微信小程序----Uncaught ReferenceError: ret is not defined
    微信小程序----wx:key(Now you can provide attr "wx:key" for a "wx:for" to improve performance.)
    回档|NOIP2012 同余方程
    回档|欧几里得算法和扩展欧几里得算法
    回档|Splay tree应用之郁闷的出纳员
    回档|史观小结
    回档|乘积最大
  • 原文地址:https://www.cnblogs.com/baomaggie/p/11081947.html
Copyright © 2011-2022 走看看