Btrfs 文件系统的使用

目前 Btrfs 文件系统是 Fedora 安装时默认使用的文件系统,Btrfs 文件系统相对于以前的 ext3 ext4 xfs 有点不一样,它是对表 ZFS 文件系统,是一种融合文件系统和卷管理器的结合体。

管理文件系统

创建和管理文件系统使用不同的工具。

创建文件系统

使用 mkfs 创建 btrfs 文件系统:

[root@fedora39 ~]# mkfs.btrfs -f -L mydata /dev/vdb /dev/vdc
btrfs-progs v6.6.2
See https://btrfs.readthedocs.io for more information.

Performing full device TRIM /dev/vdc (20.00GiB) ...
Performing full device TRIM /dev/vdb (20.00GiB) ...

Label:              mydata
UUID:               0c1ea6df-f061-4f32-8801-d20f8191ca48
Node size:          16384
Sector size:        4096
Filesystem size:    40.00GiB
Block group profiles:
  Data:             single            8.00MiB
  Metadata:         RAID1           256.00MiB
  System:           RAID1             8.00MiB
SSD detected:       no
Zoned device:       no
Incompat features:  extref, skinny-metadata, no-holes, free-space-tree
Runtime features:   free-space-tree
Checksum:           crc32c
Number of devices:  2
Devices:
   ID        SIZE  PATH    
    1    20.00GiB  /dev/vdb
    2    20.00GiB  /dev/vdc

-L 是指定 label,除此之外,创建文件系统时还有以下常用的选项:

  • -d 数据存储类型 raid0,raid1,raid5,raid6,raid10,single
  • -m 元数据存储类型 raid0,raid1,raid5,raid6,raid10,single,dup
  • -O 特性,使用 -O list-all 列出支持的所有特性
    透明压缩机制 mount -o compress={lzo|zlib} DEVICE Mount_Point

查看 Filesystem:

root@fedora39 ~]# btrfs filesystem show
Label: 'mydata'  uuid: 0c1ea6df-f061-4f32-8801-d20f8191ca48
    Total devices 2 FS bytes used 144.00KiB
    devid    1 size 20.00GiB used 272.00MiB path /dev/vdb
    devid    2 size 20.00GiB used 264.00MiB path /dev/vdc

此时两块磁盘的 UUID 是一致的,但是 UUID_SUB 是不一样的:

[root@fedora39 ~]# blkid /dev/vdb /dev/vdc
/dev/vdb: LABEL="mydata" UUID="0c1ea6df-f061-4f32-8801-d20f8191ca48" UUID_SUB="52e96baa-cf75-4471-a339-f7ab17eaae64" BLOCK_SIZE="4096" TYPE="btrfs"
/dev/vdc: LABEL="mydata" UUID="0c1ea6df-f061-4f32-8801-d20f8191ca48" UUID_SUB="9d7cd584-f516-4d54-bb4d-671e5b204571" BLOCK_SIZE="4096" TYPE="btrfs"

挂载时建议使用 UUID:

[root@fedora39 ~]# mkdir /mydata
[root@fedora39 ~]# mount -t btrfs UUID="0c1ea6df-f061-4f32-8801-d20f8191ca48" /mydata
[root@fedora39 ~]# mount | grep mydata
/dev/vdb on /mydata type btrfs (rw,relatime,seclabel,discard=async,space_cache=v2,subvolid=5,subvol=/)
[root@fedora39 ~]# df -h /mydata
Filesystem      Size  Used Avail Use% Mounted on
/dev/vdb         40G  5.8M   40G   1% /mydata

调整文件系统大小

使用 btrfs filesystem resize 对文件系统进行大小的调整。
缩小文件系统大小:

[root@fedora39 ~]# btrfs filesystem show /mydata
Label: 'mydata'  uuid: 0c1ea6df-f061-4f32-8801-d20f8191ca48
    Total devices 2 FS bytes used 144.00KiB
    devid    1 size 20.00GiB used 272.00MiB path /dev/vdb
    devid    2 size 20.00GiB used 264.00MiB path /dev/vdc

[root@fedora39 ~]# btrfs filesystem resize 2:-5G /mydata/
Resize device id 2 (/dev/vdc) from 20.00GiB to 15.00GiB
[root@fedora39 ~]# btrfs filesystem show /mydata
Label: 'mydata'  uuid: 0c1ea6df-f061-4f32-8801-d20f8191ca48
    Total devices 2 FS bytes used 144.00KiB
    devid    1 size 20.00GiB used 272.00MiB path /dev/vdb
    devid    2 size 15.00GiB used 264.00MiB path /dev/vdc

缩小文件系统需要注意文件系统实际使用的容量。

扩展文件系统大小:

[root@fedora39 ~]# btrfs filesystem resize 2:+3G /mydata/
Resize device id 2 (/dev/vdc) from 15.00GiB to 18.00GiB

扩展至设备最大可用的空间:

[root@fedora39 ~]# btrfs filesystem resize 2:max /mydata/
Resize device id 2 (/dev/vdc) from 18.00GiB to max
[root@fedora39 ~]# btrfs filesystem show /mydata/
Label: 'mydata'  uuid: 0c1ea6df-f061-4f32-8801-d20f8191ca48
    Total devices 2 FS bytes used 144.00KiB
    devid    1 size 20.00GiB used 272.00MiB path /dev/vdb
    devid    2 size 20.00GiB used 264.00MiB path /dev/vdc

设备管理

使用 btrfs device 命令可对 btrfs 所使用的设备进行管理。

添加设备到文件系统

使用 bttfs device add 将设备添加到文件系统中:

[root@fedora39 ~]# btrfs filesystem show /mydata
Label: 'mydata'  uuid: 0c1ea6df-f061-4f32-8801-d20f8191ca48
    Total devices 2 FS bytes used 144.00KiB
    devid    1 size 20.00GiB used 272.00MiB path /dev/vdb
    devid    2 size 20.00GiB used 264.00MiB path /dev/vdc

[root@fedora39 ~]# btrfs device add /dev/vdd /mydata
Performing full device TRIM /dev/vdd (20.00GiB) ...
[root@fedora39 ~]# btrfs filesystem show /mydata
Label: 'mydata'  uuid: 0c1ea6df-f061-4f32-8801-d20f8191ca48
    Total devices 3 FS bytes used 144.00KiB
    devid    1 size 20.00GiB used 272.00MiB path /dev/vdb
    devid    2 size 20.00GiB used 264.00MiB path /dev/vdc
    devid    3 size 20.00GiB used 0.00B path /dev/vdd

刚添加的磁盘是没有任何数据的,为了能够更加均衡,可以使用 btrfs balance start 命令来使得数据的平衡:

[root@fedora39 ~]# btrfs balance start --full-balance /mydata/
Done, had to relocate 3 out of 3 chunks
[root@fedora39 ~]# btrfs filesystem show /mydata
Label: 'mydata'  uuid: 0c1ea6df-f061-4f32-8801-d20f8191ca48
    Total devices 3 FS bytes used 144.00KiB
    devid    1 size 20.00GiB used 1.03GiB path /dev/vdb
    devid    2 size 20.00GiB used 256.00MiB path /dev/vdc
    devid    3 size 20.00GiB used 288.00MiB path /dev/vdd

从文件系统中移除设备

使用 btrfs device delete 命令从文件系统中移除特定的磁盘设备:

[root@fedora39 ~]# btrfs device delete /dev/vdb /mydata/
[root@fedora39 ~]# btrfs filesystem show /mydata/
Label: 'mydata'  uuid: 0c1ea6df-f061-4f32-8801-d20f8191ca48
    Total devices 2 FS bytes used 144.00KiB
    devid    2 size 20.00GiB used 1.28GiB path /dev/vdc
    devid    3 size 20.00GiB used 288.00MiB path /dev/vdd

修改数据存储模式

当创建文件系统时,不指定任何存储模式,默认的存储模式如下:

[root@fedora39 ~]# btrfs filesystem df /mydata/ | column -t
Data,           single:  total=1.00GiB,    used=0.00B
System,         RAID1:   total=32.00MiB,   used=16.00KiB
Metadata,       RAID1:   total=256.00MiB,  used=128.00KiB
GlobalReserve,  single:  total=5.50MiB,    used=0.00B

如果需要将 Data 的存储方式设置为 raid1 Metadata 的存储方式设置为 raid5,可以使用 btrfs balance start 命令进行操作:

[root@fedora39 ~]# btrfs balance start -mconvert=raid5 /mydata
Starting conversion to RAID5/6.
Done, had to relocate 2 out of 3 chunks
[root@fedora39 ~]# btrfs balance start -dconvert=raid1 /mydata
Done, had to relocate 1 out of 3 chunks
[root@fedora39 ~]# btrfs filesystem df /mydata/ | column -t
Data,           RAID1:   total=2.00GiB,    used=0.00B
System,         RAID5:   total=32.00MiB,   used=16.00KiB
Metadata,       RAID5:   total=256.00MiB,  used=128.00KiB
GlobalReserve,  single:  total=5.50MiB,    used=0.00B

-mconvert 修改 Metadata 存储方式,-dconvert 修改 Data 存储方式。

子卷

Btrfs 文件系统拥有子卷的功能,子卷类似于逻辑卷,可以单独创建并将子卷挂载到特定的挂载点上。

创建子卷

使用 btrfs subvolume create 命令创建子卷:

[root@fedora39 ~]# btrfs subvolume create /mydata/logs
Create subvolume '/mydata/logs'
[root@fedora39 ~]# btrfs subvolume create /mydata/cache
Create subvolume '/mydata/cache'
[root@fedora39 ~]# btrfs subvolume list /mydata
ID 256 gen 7 top level 5 path logs
ID 257 gen 9 top level 5 path cache
[root@fedora39 ~]# ls /mydata/
cache  logs

使用 subvolsubvolid 选项挂载子卷:

[root@fedora39 ~]# umount /mydata/
[root@fedora39 ~]# mkdir /mnt/{logs,cache}
[root@fedora39 ~]# mount -o subvol=logs /dev/vdb /mnt/logs
[root@fedora39 ~]# mount -o subvol=cache /dev/vdb /mnt/cache
[root@fedora39 ~]# df -h | grep mnt
/dev/vdb                  60G  5.9M   58G   1% /mnt/logs
/dev/vdb                  60G  5.9M   58G   1% /mnt/cache

查看子卷的信息:

[root@fedora39 ~]# btrfs subvolume show /mnt/logs
logs
    Name:           logs
    UUID:           927c09ec-1a12-f64c-b2f4-d0a97730a5c0
    Parent UUID:        -
    Received UUID:      -
    Creation time:      2024-04-02 13:34:21 +0000
    Subvolume ID:       256
    Generation:         7
    Gen at creation:    7
    Parent ID:      5
    Top level ID:       5
    Flags:          -
    Send transid:       0
    Send time:      2024-04-02 13:34:21 +0000
    Receive transid:    0
    Receive time:       -
    Snapshot(s):
    Quota group:        n/a

删除子卷

子卷删除前,需要卸载,然后通过 btrfs subvolume delete 从父卷中删除子卷:

[root@fedora39 ~]# mount /dev/vdb /mydata/
[root@fedora39 ~]# umount /mnt/logs/

[root@fedora39 ~]# btrfs subvolume delete /mydata/logs/
Delete subvolume (no-commit): '/mydata/logs'
[root@fedora39 ~]# btrfs subvolume list /mydata/
ID 257 gen 9 top level 5 path cache

子卷快照

子卷的快照可以通过 btrfs subvolume snapshot 进行管理。

创建快照:

[root@fedora39 ~]# cp /var/log/dnf.log  /mnt/logs/
[root@fedora39 ~]# btrfs subvolume snapshot /mydata/logs/ /mydata/logs_snapshot
Create a snapshot of '/mydata/logs/' in '/mydata/logs_snapshot'
[root@fedora39 ~]# diff /mnt/logs/dnf.log /mydata/logs_snapshot/dnf.log

恢复快照可以从快照的子卷中将需要恢复的文件拷贝回子卷即可,这种方式比较简陋,也可以使用一些快照管理工具来进行快照的恢复和管理,这个留到后面有时间再去研究。

列出快照:

[root@fedora39 ~]# btrfs subvolume show /mydata/logs
logs
    Name:           logs
    UUID:           bf5df43e-74e4-9b48-9846-8b1d8175c797
    Parent UUID:        -
    Received UUID:      -
    Creation time:      2024-04-02 13:43:50 +0000
    Subvolume ID:       258
    Generation:         15
    Gen at creation:    12
    Parent ID:      5
    Top level ID:       5
    Flags:          -
    Send transid:       0
    Send time:      2024-04-02 13:43:50 +0000
    Receive transid:    0
    Receive time:       -
    Snapshot(s):
                logs_snapshot
    Quota group:        n/a

删除快照(其实等同于删除子卷):

[root@fedora39 ~]# btrfs subvolume delete /mydata/logs_snapshot/
Delete subvolume (no-commit): '/mydata/logs_snapshot

文件系统的转换

可以通过 btrfs-convert 对现有的非 Btrfs 文件系统转换为 Btrfs 文件系统,也可以将 Btrfs 文件系统转成其它文件系统。

从其它文件系统转换为 Btrfs 文件系统

使用 btrfs-convert 进行转换,转换前需要将文件系统进行卸载:

[root@fedora39 ~]# mkfs.ext4 /dev/vdd
mke2fs 1.47.0 (5-Feb-2023)
Discarding device blocks: done                            
Creating filesystem with 5242880 4k blocks and 1310720 inodes
Filesystem UUID: 0be4568b-78de-4d9c-b45b-ef9eb1df3d1c
Superblock backups stored on blocks: 
    32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 
    4096000

Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done   

[root@fedora39 ~]# btrfs-convert /dev/vdd
btrfs-convert from btrfs-progs v6.6.2

Source filesystem:
  Type:           ext2
  Label:          
  Blocksize:      4096
  UUID:           0be4568b-78de-4d9c-b45b-ef9eb1df3d1c
Target filesystem:
  Label:          
  Blocksize:      4096
  Nodesize:       16384
  UUID:           6a1b1a92-63b4-4201-ae1a-804961f96bb9
  Checksum:       crc32c
  Features:       extref, skinny-metadata, no-holes, free-space-tree (default)
    Data csum:    yes
    Inline data:  yes
    Copy xattr:   yes
Reported stats:
  Total space:     21474836480
  Free space:      20691091456 (96.35%)
  Inode count:         1310720
  Free inodes:         1310708
  Block count:         5242880
Create initial btrfs filesystem
Create ext2 image file
Create btrfs metadata
Copy inodes [o] [         1/        12]
Free space cache cleared
Conversion complete

[root@fedora39 ~]# btrfs filesystem show
Label: 'mydata'  uuid: a18461d0-1a21-4f47-a6a1-d466ec4773f3
    Total devices 2 FS bytes used 176.00KiB
    devid    1 size 20.00GiB used 1.04GiB path /dev/vdb
    devid    2 size 20.00GiB used 1.03GiB path /dev/vdc

Label: none  uuid: 6a1b1a92-63b4-4201-ae1a-804961f96bb9
    Total devices 1 FS bytes used 496.21MiB
    devid    1 size 20.00GiB used 782.30MiB path /dev/vdd

从 Btrfs 文件系统转换为原始文件系统

使用 btrfs-convert -r 进行恢复,-r 代表 rollback 的意思:

[root@fedora39 ~]# btrfs-convert -r /dev/vdd
btrfs-convert from btrfs-progs v6.6.2

Open filesystem for rollback:
  Label:           
  UUID:            6a1b1a92-63b4-4201-ae1a-804961f96bb9
  Restoring from:  ext2_saved/image
Rollback succeeded

[root@fedora39 ~]# file -s /dev/vdd
/dev/vdd: Linux rev 1.0 ext4 filesystem data, UUID=0be4568b-78de-4d9c-b45b-ef9eb1df3d1c (extents) (64bit) (large files) (huge files)

发表评论

您的电子邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部