Btrfs文件系统

Btrfs(B-tree文件系统)是一种新型的Linux文件系统,它支持写时复制(Copy-on-Write,简称COW)功能。

在传统的文件系统中,如果多个进程并发读写同一个文件时,会产生数据竞争和文件损坏等问题。为了避免这种情况,通常需要使用锁机制来控制文件访问,但是这会降低文件系统的吞吐量和性能。

Btrfs采用了写时复制技术来解决这个问题。当有多个进程同时要修改同一个文件时,Btrfs会先将原始数据复制一份,然后在副本上进行修改。这样每个进程都拥有自己的文件副本,不会相互干扰,也不会对原始数据造成影响。

具体来说,Btrfs的写时复制功能主要涉及到两个方面:

  1. 快照

Btrfs可以创建文件和目录的快照,每个快照都保存了一个磁盘区域的元数据和数据信息。当用户对文件或目录进行修改时,Btrfs会在快照之上创建新的副本,并将修改内容存储在新的副本上,不会影响原始数据和其他快照。

  1. 子卷

Btrfs可以将物理磁盘分为多个子卷,每个子卷支持独立的文件系统,并且可以动态地调整大小。当用户向某个子卷写入数据时,Btrfs会复制原始数据并在副本上进行操作,不会改变子卷中原有的数据内容。

写时复制是Btrfs的一个重要特性,它提高了文件系统的可靠性和安全性,并且能够更好地支持多进程读写、数据共享和数据备份等应用场景。

如何安装

Debian系统

  1. 安装btrfs工具包

    1
    sudo apt-get install btrfs-progs
  2. 创建btrfs分区

    1
    sudo mkfs.btrfs /dev/sda1
  3. 挂载btrfs分区

    1
    sudo mount /dev/sda1 /mnt/btrfs
  4. 卸载btrfs分区

    1
    sudo umount /mnt/btrfs
  5. 自动挂载Btrfs系统,编辑/etc/fstab文件

    1
    /dev/sda1 /mnt/btrfs btrfs defaults 0 0
  6. 验证

MacOS系统

安装依赖项与btrfs工具包

1
2
brew install autoconf automake libtool gettext
brew install btrfs-progs

验证btrfs文件系统

  1. 验证文件系统类型:使用lsblk命令列出所有可用的块设备,查看需要验证的分区上挂载的文件系统类型。如果该分区上的文件系统类型为“btrfs”,则该分区使用了Btrfs文件系统。

  2. 验证文件系统一致性:使用btrfs scrub 命令来检查Btrfs文件系统的一致性。这个命令会扫描文件系统并报告任何错误和修复问题。例如,运行以下命令以检查名为/dev/sda1的Btrfs文件系统:

    1
    sudo btrfs scrub start /dev/sda1
  3. 验证快照:使用btrfs subvolume list 命令来列出Btrfs文件系统中的快照。例如,运行以下命令以列出名为/mydata的Btrfs子卷中的所有快照:

    1
    sudo btrfs subvolume list /mydata
  4. 验证压缩率:使用btrfs filesystem df命令来检查Btrfs文件系统中每个子卷或目录的压缩比。例如,运行以下命令以检查名为/mydata的Btrfs子卷的压缩比:

    1
    sudo btrfs filesystem df /mydata

创建btrfs文件系统

两块硬盘组RAID0建立btrfs文件系统

1
mkfs.btrfs -d raid0 /dev/sda /dev/sdb

此命令将在/dev/sda和/dev/sdb上创建一个RAID 0卷

报错”ERROR: use the -f option to force overwrite of /dev/sdd”这个错误通常是因为/dev/sdd设备上已经存在一个文件系统,而Btrfs工具不允许在没有覆盖现有文件系统的情况下创建RAID 0。

解决这个问题的方法是使用-f选项来强制覆盖/dev/sdd上的现有文件系统。可以运行以下命令:

1
复制代码mkfs.btrfs -f -d raid0 /dev/sda /dev/sdb

使用-f选项将覆盖现有文件系统并创建新的Btrfs文件系统,即使该设备上已经存在数据或其他文件系统。请注意,在使用此选项时应谨慎操作,以确保不会丢失重要的数据。

如果您确定要覆盖现有文件系统并创建新的Btrfs文件系统,则可以使用上面给出的命令。否则,请务必备份/dev/sdd上的所有数据,并检查是否有其他选项可用于创建Btrfs文件系统而无需强制覆盖现有文件系统。

创建子卷

首先,您需要确保已经安装了Btrfs文件系统工具,并且硬盘已经格式化并且在RAID 0组中。

接下来,您可以按照以下步骤在/mnt目录下挂载两个子卷:

  1. 创建两个子卷

使用以下命令创建两个子卷,即subvol1和subvol2:

1
2
sudo btrfs subvolume create /mnt/subvol1
sudo btrfs subvolume create /mnt/subvol2
  1. 挂载子卷

使用以下命令将子卷挂载到/mnt目录下:

1
2
sudo mount -o subvol=subvol1 /dev/sda /mnt/subvol1
sudo mount -o subvol=subvol2 /dev/sda /mnt/subvol2

其中,/dev/sda是您的硬盘设备名称,您需要根据实际情况进行替换。

  1. 自动挂载子卷

如果您希望在启动时自动挂载子卷,可以编辑/etc/fstab文件并添加以下行:

1
2
/dev/sda  /mnt/subvol1  btrfs  subvol=subvol1  0  0
/dev/sda /mnt/subvol2 btrfs subvol=subvol2 0 0

如何将新的硬盘扩展到当前的btrfs系统中

例如将3块2T硬盘扩展到目前的btrfs系统,需按如下操作:

  1. 在服务器上安装新的2T硬盘,并确保它们已正确连接并检测到。
  2. 将新的硬盘添加到RAID0阵列中。您可以使用命令如下:
1
# btrfs device add /dev/sdc /dev/sdd /dev/sde /mnt

这会将/dev/sdc、/dev/sdd和/dev/sde三个设备添加到/mnt目录下的btrfs文件系统中。

  1. 现在,您可以使用以下命令将btrfs文件系统扩展到新的硬件设备:
1
# btrfs filesystem balance /mnt

这个命令将重新平衡数据并将其存储在新增加的硬盘上,以便您可以开始使用更多的空间。

  1. 您还可以运行以下命令来检查文件系统使用情况:
1
# btrfs filesystem df /mnt

此命令将显示关于文件系统的信息,如总大小、已用空间和可用空间等。

  1. 确定文件系统已经正确地扩展到新增加的硬盘,然后您可以开始使用额外的存储空间了。

需要注意的是,在扩展/ btrfs文件系统时,请确保对数据进行备份,以免意外数据丢失。

快照与子卷的区别

  • 子卷是Btrfs文件系统中的一个独立的分区或子目录。您可以将文件和目录存储在子卷中,并在需要时挂载该子卷。与子目录不同,子卷具有自己的磁盘配额和属性设置,可用于实现多个用户或应用程序之间的隔离。
  • 快照是一个当前文件系统状态的只读副本。它记录了特定时间点的文件系统状态,包括所有已创建的文件和目录。您可以使用快照来恢复文件系统状态,或者使用它作为备份,以便在需要时还原到以前的状态。Btrfs还支持递增式快照,这意味着每个新的快照只记录自上次快照以来所做的更改。