btrfs磁盘管理

  • 热扩容

# 把/dev/sda5扩容到/目录 -f=强制追加(比如之前是ntfs会强制转为btrfs)
sudo btrfs device add /dev/sda5 /
sudo btrfs device add /dev/sda5 / -f

# resize root
sudo btrfs filesystem resize max /

# 查看是否添加成功
df -h
  • 热缩小磁盘并分离, 并把分离的空间进行格式化

# resize 命令不会操作基础分区的大小。如果要放大/缩小文件系统,则必须确保在扩大文件系统之前可以扩展分区,并在减小文件系统大小后缩小分区。这可以使用 fdisk(8) 或 parted(8) 来删除现有分区,并用新的所需大小重新创建它。重新创建分区时,请确保使用与以前相同的起始分区偏移量。

# 630.2G
sudo btrfs filesystem resize -1G /
# 缩小的是nvme0n1p4
# Resize device id 1 (/dev/nvme0n1p4) from 300.69GiB to 299.69GiB

# 操作分区前查看End的位置,多个物理分区会显示多个, [322865360896]就是实际大小
# fdisk -l
sudo btrfs filesystem show / --raw
# Label: none  uuid: 897d3141-a5b9-446a-b504-3f56c2fd5911
#         Total devices 2 FS bytes used 334994829312
#         devid    1 size [322865360896] used 322864283648 path /dev/nvme0n1p4
#         devid    2 size 698659471360 used 35433480192 path /dev/nvme0n1p2

# Number位置
parted /dev/nvme0n1p4
p/print

# 执行缩小物理分区 [Number] [End]
resizepart 1 322865360896
# 如果是ext也可以直接热缩小(未生效)
resizepart 1 10G
  • 查看文件系统结构

sudo btrfs filesystem show

# 在/的uuid挂载2devices 显示: sudo btrfs filesystem show
Label: none  uuid: 57314842-45ff-457a-8c7e-f2d6fce57d33
        Total devices 2 FS bytes used 102.96GiB
        devid    1 size 120.82GiB used 120.82GiB path /dev/nvme0n1p2
        devid    2 size 1.86GiB used 0.00B path /dev/nvme0n1p4
  • 开启压缩

# 查看当前卷的状态
findmnt -vno OPTIONS /
# 是否开启compress选项, 比如压缩等
findmnt -vno OPTIONS / | grep compress
# 查看压缩占比, 很慢
sudo compsize -x /
# Processed 2558504 files, 1062561 regular extents (1382788 refs), 1301158 inline.
# Type       Perc     Disk Usage   Uncompressed Referenced
# TOTAL       99%      127G         127G         158G
# none       100%      126G         126G         157G
# zstd        31%      3.1M         9.9M         9.8M
# prealloc   100%      199M         199M         380M Disk Usage 是实际分配在硬盘上的空间,
◈ Uncompressed 是如果没有压缩,文件所需要的空间,
◈ Referenced 是所有未压缩文件加起来的总大小。

# nixos开启ztsd压缩等级3, 压缩级别(1-19,默认值为3)
# fileSystems.
options = [ "compress=zstd:3" ];
# 在这时,如果你对现有文件系统采用压缩,然后通过 df 或类似命令检查空间利用率,你会发现什么都没变。这是因为 Btrfs 自身不会 “重新压缩” 所有已有的文件。压缩只会发生在往磁盘写新数据的时候。有一些方式去执行显式的重压缩:
# 1. 等待,什么都不做:只要文件被修改并被写回磁盘,Btrfs 根据配置压缩新写入的文件内容。如果我们等待足够长,越来越多的文件被重写,在某个时间点就会被压缩。
# 2. 移动文件到另一个文件系统然后移动回来:取决于你想压缩哪些文件,这可能是相当乏味的选项。
# 3. 执行一次 Btrfs 碎片整理。

cat /etc/fstab
# 之前
/dev/disk/by-uuid/897d3141-a5b9-446a-b504-3f56c2fd5911 / btrfs x-initrd.mount 0 0
# 之后
/dev/disk/by-uuid/897d3141-a5b9-446a-b504-3f56c2fd5911 / btrfs x-initrd.mount,compress=zstd:3 0 0