TongXu-Server

btrfs

btrfs

  • 准备

    • 安装用户空间工具 btrfs-progs
  • 创建文件系统

    • 单设备文件系统

      mkfs.btrfs -L 自定义标签 /dev/分区名
      #默认元数据节点大小为16kiB,数据的默认扇区大小等于系统页大小(自动检测),-n选项指定节点大小nodesize
      mkfs.btrfs -L 自定义标签 -n 32k /dev/分区名#指定元数据节点大小为32kiB
      
    • 多设备文件系统

      #-d 和 -m参数分别为数据和元数据配置RAID级别,默认情况下数据只有一份,元数据则镜像存储raid1
      mkfs.btrfs -d single -m raid1 /dev/分区1 /dev/分区2 ...
      #必须在/etc/mkinitcpio.conf中加入udev、systemd或btrfs钩子之一才能使用多设备btrfs文件系统
      
      • profiles
        • btrfs使用profiles这个概念来表示镜像、奇偶校验和条带属性,对应RAID术语中的RAID级别
  • 配置文件系统

    • COW写时复制

      • 默认btrfs总是对所有文件使用cow,写入操作不会就地覆盖数据,而是将修改后的数据写入新位置,同时更新元数据指向新位置。

      • 禁用COW会禁用数据校验

      • 使用nodatacow选项挂载子卷只会影响新建的文件,而不会影响已存在的写时复制文件。

        #将目录中已存在的所有文件禁用写时复制
        mv /path/to/dir /path/to/dir_old 
        mkidr /path/to/dir 
        chattr +C /path/to/dir
        cp -a --reflink=never /path/to/dir_old/ /paht/to/dir
        rm -rf /path/ro/dir_old
        
      • nodatacow会禁用压缩和数据校验和

      #禁用空文件或目录中新文件的COW特性
      chattr +C 目录或文件路径
      
      • 对复制的影响
        • 使用cp复制时,+C属性相当于在目标路径新建的文件,当原文件与目标文件都具有/不具有+C属性时,才能通过reflink进行复制
          • –reflink =auto 若原文件与目标文件都具有或不具有+C属性,则直接reflink,否则进行深拷贝
          • –reflink 或 –reflink=always 若原文件与目标文件都具有或不具有+C,则直接reflink,否则报错
          • –reflink=never 强制深拷贝
      • 对快照的影响
        • 快照会锁定原文件快位置,每一次快照后的第一次写入都会出发写时复制,可以把所有禁用写时复制的文件放在一个单独的子卷中冰面为该子卷创建快照
    • 压缩

      • btrfs支持透明压缩,通常采用压缩算法越快性能越好。

        • 支持的压缩算法zlib\lzo\zstd,lzo无压缩级别,zlib 1-9 zstd 1-15
        • 挂在指定压缩compress=算法[:级别],btrfs会检测文件写入数据的首个数据块压缩后体积是否缩小,缩小会压缩本次写入的全部内容,否则被标记为nocompress,整个写入过程及该文件后续的所有写入过程都不会触发压缩
        • compress-force=算法[:级别] 会检查每次写入的每个数据块并分别决定是否压缩
      • 为现有文件启用

        #不具有持久性,其他写入操纵将应用原有压缩设置
        btrfs filesystem defragment -r -v -czstd 
        #持久性启用对单个文件的压缩
        chattr +C 文件
        btrfs property set 文件 compression zstd
        
    • 子卷

      • btrfs子卷是可独立挂载的POSIX文件树,而不是也不能被看作是块设备;btrfs不仅为整个卷提供了可挂载根,每个子卷也拥有独立的可挂载根
      • 每个btrfs文件系统都有一个ID=5的顶层子卷,这个子卷不能被移除或被其他子卷替代。子卷可以在文件系统中移动,可以嵌套在任意其他子卷下,但子卷ID不变。
      • 挂载文件系统时默认情况下挂载顶层子卷,除非更改默认子卷
      #必须先挂载其上层子卷才能创建子卷
      btrfs subvolume create 子卷父目录/子卷名称
      #以@开头知识一个常见的命名约定
      btrfs subvolume create /mnt/@sub
      #--parents 选项可以自动创建不存在的父目录
      btrfs subvolume create /mnt/home/@userme 
      
      #-t选项 表格视图查看路径所属文件系统的所有子卷列表
      btrfs subvolume list -t path
      
      #删除子卷,确定在删除子卷前不要挂载该子卷,可能会导致文件系统不一致
      btrfs subvolume delete 子卷路径
      
      #挂载子卷
      mount -o subvol=子卷path(相对于顶层子卷) /path
      #将顶层子卷作为/,可以简化子卷布局的更改
      
      #更改默认子卷
      btrfs subvolume set-default 子卷路径
      #将路径所在的文件系统的默认子卷设置为ID为子卷ID的子卷
      btrfs subvolume set-default 子卷ID 路径
      
    • 配额

      • quota group 在频繁创建大量快照的环境中,仍可以导致性能下降,特别是在删除快照时。
      • 磁盘配额,传统unix配额通过限制用户拥有的所有文件总大小来控制空间使用。
      • btrfs采用基于子卷的配额组的机制,通过为用户创建独立子卷与配额组并限制配额组来实现。
      #启用配额
      btrfs quota enable 路径
      
      #创建/销毁配额组
      btrfs qgroup create  层级/ID 路径
      #若存在子配额组,必须先解除关系
      btrfs qgroup destory 层级/ID 路径
      
      #分配/解除子配额组
      btrfs qgroup assign 子配额组 父配额组 路径
      btrfs qgroup remove 子配额组 父配额组 路径
      
      #限制/取消限制配额组
      #路径所在文件系统中限制配额组的总引用空间不超过1GB
      btrfs qgroup limit 1G 配额组 路径
      # -e 独占引用空间
      btrfs qgroup -e limie 20G 配额组 路径
      #none 取消限制
      btrfs qgroup limit none 配额组 路径
      
      #列出配额组
      #使用的是磁盘中的数据,可能需要sync后才能限制准确的统计数据
      btrfs qgroup show 路径
      # --sync 强制同步
      btrfs qgroup --sync show 路径
      
      • 总引用空间和独占引用空间

        • 总引用空间 所有能够从配额组内访问到的数据占用的存储空间
        • 独占引用空间 只被配额组所属的子卷引用的数据所占用的存储空间
      • 配额冲扫描

        • quota rescn 能够都市圈文件系统的所有区段的元数据,据其更新各配额组的统计值
        • 手动分配和接触分配子配额组时会自动触发配额重扫描,开销太大,无法等待重扫描结束后再返回,添加–no-rescan选项避免自动触发,后面手动触发
        btrfs quota rescan 路径
        
      • 提交间隔

        • 将数据写入文件系统的频率由btrfs本身和系统的设置决定,btrfs默认30s检查点间隔。可以在/etc/fstab 增加commit挂载参数来修改
        LABEL=arch64 / btrfs defaults,noatime,compress=zstd,commit=120 0 0
        
      • 简单配额

        • 将所有区段归属于首次分配它的子卷
        btrfs quota -s enable 路径
        
      • 固态硬盘TRIM

        • btrfs支持TRIM命令的SSD驱动器中释放未使用的块,挂载参数使用discard=async
  • 使用

    • 交换文件

      • 创建交换文件
      btrfs subvolume create /swap 
      btrfs filesystem mkswapfile --size 4G --uuid clear /swap/swapfile
      swapon /swap/swapfile
      
      #/etc/fstab
      /swap/swapfile none swap defaults 0 0 
      
    • 显示使用和空闲空间

      • df这样的用户空间工具可能不会准确计算剩余空间

        btrfs filesystem usage /
        btrfs fielsystem df /
        
      • 碎片整理

        • 支持配置挂载参数autodefrag来实现在线的碎片整理
        btrfs filesystem defragment -r /
        
      • btrfs提供对RAID自修复冗余阵列和在线数据平衡

        • 检修scrub 能读取文件系统中的文件和元数据,并使用校验值和RAID存储上的景象区分三并修复损坏的数据
        #手动启动一个后台文件系统的在线检查任务
        btrfs scrub start /
        
        #检查该任务的运行状态
        btrfs scrub status /
        
        • 数据平衡balance 通过分配器再次传递文件系统中的所有数据,用于在添加或删除设备时跨设备重新平衡文件系统中的数据。
        btrfs balance start --bg /
        btrfs balance status /
        
        • 快照 是和其他子卷共享数据和元数据的简单子卷

          #source为要创建快照的对象,[dest/]name 快照安放的位置
          btrfs subvolume snapshot source [dest/]name
          
          #-r 参数创建一个只读快照,为只读快照创建一个快照可以获得一个只读快照的可写入版本。
          
        • 发送和接收

        #send发送一个快照,receive接收结束后会创建对应子卷
        btrfs send /root_backup | btrfs receive /backup
        
        #--proto 2 --compressed-data 增加效率
        btrfs send --proto 2 --compressed-data '/mnt/arch/snapshots/@var' | btrfs receive 'mnt/arch-v2/subvolumes/'
        
        #增量发送
        btrfs send -p /root_backup /root_backup_new | btrfs receive /backup
        
      • 调整大小

      #扩展到最大可用大小
      btrfs filesystem resize max /
      #扩展到特定的大小
      btrfs filesystem resize size /
      
      #指定增加或减少的大小
      btrfs filesystem resize +size /
      btrfs filesystem resize -size /
      
  • 提示和技巧

    • 无分区btrfs磁盘
    mkfs.btrfs /dev/sdX
    mkfs.btrfs -f /dev/sdX
    
    • 从EXT4转换
      • 从安装cd启动,转化分区,修改/etc/fstab 并指定分区类型,最后一列fs_passno = 0
      • chroot到系统重建引导加载程序
    #转化分区
    btrfs-convert /dev/partition
    #删除备份子卷 
    btrfs subvolume delete /ext2_saved
    
    • 引导进入快照
      • 在grub-btrfs帮助下,在重新生成配置文件时用btrfs快照启动填充启动菜单