在上一次我们谈到一些 Btrfs 文件系统的基础,比方碎片整理,扩容卷或者收缩卷,负载均衡还有 Btrfs 上的磁盘阵列等等。那么,这一期内容呢,我们主要聊一聊下面这几个部分,首先是聊一聊子卷功能;然后呢,会谈到 Btrfs 的透明压缩;再往后呢,我们会聊一聊 Btrfs 快照、文件系统克隆、最后是关于数据和元数据的校验和。也是和往常一样,我会将整个视频的时间节点放在这里,大家按需食用。好的,那么我们就开始吧。

首先我们来聊一聊子卷功能:

Btrfs 的子卷不同于块设备,从表面上来看,更像是个可独立挂载的文件树。当然,你也可以简单将 Btrfs 文件系统的子卷看作是一个文件夹或者目录。对于其他常见的 POSIX 文件系统而言,比方 ext4,那么大部分都有一个 inode table 和一棵目录结构树,即使像 NTFS 这样的文件系统,也是一个 mft 和一棵目录结构树组成的。而对于 Btrfs 而言,每个子卷都具有独立的 inode table 和目录结构树,当然,这里谈到的 inode table 在 btrfs 文件系统中被称为 fs tree,它的顶层子卷和其他的子卷都具有独立可挂载的根。那么从这一点来看,整个 Btrfs 文件系统就区别于其他传统文件系统。一方面因为子卷具有独立的 inode table 从而为以子卷为单位拍快照,打下了基础;另一方面,我们传统的文件系统,具象化后,就像是一颗树;Btrfs 因 为子卷的存在,就更类似一片森林了。

谈到 Btrfs 文件系统创建子卷,我们可以在系统目录的任何地方,甚至都不用担心文件系统等级和嵌套。而嵌套的子卷会作为一个子目录,出现在父目录内;通俗的理解就是在父目录下的一个子目录这么简单。但这里需要区别于 ZFS 的 dataset ,dataset 具有从属关系,而 btrfs 下是没有的。那么假设你需要删除子卷,里面又包含嵌套的话,可以直接使用 mv 这样的命令,把嵌套的子卷移出,也可以用 rm -rf 递归删除子卷,或者,使用 rmdir 刪空子卷,所以实际应用起来,并不像官方 Wiki 文档提到的那样,比较复杂。

任何一个 Btrfs 文件系统都有一个默认的顶层子卷,在默认情况下,系统启动如果没有在挂载选项中定义子卷选项,那么顶层子卷会默认挂载。如果有特别的需求,再修改相关挂载选项就可以了。

我们再来横向对比下目前常见的卷管理器,比方和 LVM 这样的块设备卷管理器对比。逻辑卷和 Btrfs 的子卷类似,同样具有类似于快照或者动态调整容量的能力,但是,就 LVM 的逻辑卷而言,它本身是一个块设备,可以对它进行格式化成不同文件系统;但是 Btrfs 的子卷并不是块设备,对它进行类似于 dd 操作是不行的。

再与 ZFS 对比,Btrfs 的子卷概念和 ZFS 的 dataset 类似。在不深究的情况下,可以大致理解一个东西的。但仔细看还是有所区别,比方 ZFS 具有检查点功能,Btrfs 一方面因为不能对顶层子卷做递归快照,另外还有一些其他功能限制。所以 Btrfs 不具有检查点的功能的。

那么检查点是什么呢?简单的说就是整个储存池级别的快照,能够快速将整个储存池恢复到上一个状态的功能。使用场景要区别于快照功能,检查点是文件系统基本配置时的后悔药,会对文件系统增加很多限制,不适合长期启用。

通过上面简单的介绍了 Btrfs 的子卷,下面我们通过一些简单的实例再来认识下 Btrfs 文件系统的子卷。

聊完了子卷,我们再来看看透明压缩功能:

透明压缩是什么,其实就是在用户,不知不觉的情况下对文件系统上的数据进行压缩,从而在一定程度上减少占用磁盘空间的一种技术。

在 Btrfs 文件系统中,默认支持的透明压缩算法包括了 zlib lzo 和 zstd ,不过,需要注意的是 zstd 算法是从 4.14 这个版本才开始支持的。那么,通过透明压缩这样的技术不仅仅能够对 Btrfs 文件系统下的目录进行压缩,还能对整个卷实现。而具体实现起来有三种方法,一种就是通过定义挂载选项;另一种方法是修改 btrfs 属性。而最后一种方法是通过 defrag 实现。这些方法的区别在于前两种都能够对后续数据写入实现压缩,而最后一种方法能够对已有数据实现压缩,具体怎么操作,我们稍后再来看一看。

那么有了透明压缩,就带来了以下一些问题。

  • 第一个问题就是,哪一个透明压缩更适合自己?

先来看看 zlib 这个透明压缩算法,这个算法比较慢,但是压缩率很高,适合用于作为备份使用;

再者是 lzo 这个算法,它的压缩和解压的速度比 zlib 快,但是压缩率比较低。这也是 btrfs 文件系统默认提供的透明压缩算法,即能兼顾速度,又能拥有一个比较好的压缩率;

最后是 zstd 这个算法,这个算法的优势和 lzo 差不多,但是因为压缩和解压速度更加优秀,同时又提供了很多压缩级别供用户选择,所以在目前更受到用户的青睐。

  • 第二个问题就是,压缩级别有些什么?

这里就简单的介绍下压缩级别,比方 zlib 压缩算法,提供了9个等级,默认使用的是3,这个级别刚刚好能够同时兼顾比较好的加压和解压速度,还可以得到一个满意的压缩效果。另外像 zstd 这个算法,提供了15个级别,关于具体怎么设置,我们稍后再看。

  • 第三个问题就是,透明压缩功能目前还有什么需要注意的细节?

第一、将来还会不会增加其他的透明压缩算法?目前得到的消息是不会,不过开发者文档中也没有明确的打算;

第二、从什么时候开始对 Btrfs 文件系统中的数据开始透明压缩的?一般情况下,从文件系统挂载的时候开始,就采用挂载选项中定义的透明压缩算法对后续写入的文件开始透明压缩了;

第三、我如何才能知道 Btrfs 文件系统中的数据采用了什么类型的透明压缩?关于这个问题,我们可以使用 compsize 工具进行查看,它的原理是调用 btrfs ioctl 去读取文件的 extent 的属性;

第四、在挂载选项中我们注意到有压缩强制和压缩,这有什么区别吗?强制压缩就直接调用压缩算法对数据进行压缩了,但有些数据即使压缩也没有多少实际意义,也就没有压缩了,并不是真正的,全部数据进行压缩;而普通的压缩选项会对数据先跑一遍压缩预测进行分析,有些数据压缩后意义不大,就不采用透明压缩了。那么问题来了,这两个选项其实从我的观点来看,没有必要提供普通的压缩选项,因为预测算法不论运行与否,对最终的结果没有实质性的改变,甚至还增加了预测算法这个资源开销,不知道作为看官的你们怎么看待这个问题;

第五、目前透明压缩适用范围怎么样?官方的答复是能够对磁盘和卷进行透明压缩了,但是不能对每个子卷实现压缩,当然也有一种折衷的方法,就是对子卷目录,启用压缩来模拟这个过程。不过好消息是关于子卷支持透明压缩的功能已经在计划中了。

第六、透明压缩对于数据的写入还有写时复制有又怎样的影响?如果数据写入方式采用 Direct IO 的话,是不会使用到透明压缩的。但是如果一文件被使用 Direct IO 的模式打开了,那么实际上 Btrfs 将会使用缓存 IO 的模式来实现;另外,如果使用了透明压缩,默认情况下采用写时复制,但是在关闭写时复制功能的 btrfs 上,透明压缩也将无法启用。

这就是目前我所了解的 Btrfs 文件系统中透明压缩的一些小细节,下面我们就通过一些简单的实例(最后的视频)来看看 Btrfs 怎么操作关于透明压缩的。

Btrfs 文件系统除了之前我们谈过的阵列功能,子卷功能,还具有一个非常强大的功能,那就是同样建立在写时复制这个特性之上的快照:

其实很多朋友至今也很难以理解快照这个功能。下面简单的聊一聊,希望大家能够明白。现在我去照镜子,大家把我看作数据 A,镜子里的我就是看作数据 A’,我们就把 A’ 叫做 A 的快照。那么在计算机的储存中,A’ 和 A 其实是同一个东西,各位看官可以把 A‘ 理解成 A 的备份,因为两者的数据及数据属性是完全相同的。而实现这个技术的基础就是写时复制了。而关于写时复制这个技术我曾经在之前关于 ZFS 文件系统的视频中谈到过,如果各位看官有兴趣,可以回看一下之前的视频。

快照

Btrfs 文件系统作为一个写时复制文件系统,最明显的优势就是拍快照的速度非常快,几乎是瞬间完成,不论是固态硬盘还是机械硬盘。但是我们仍然会感觉到机械硬盘会慢一些,这是因为建立快照的操作在內核內部会先等待被快照的子卷的內容同步到磁盘上,所以给人一种因为数据承载媒介的不同,而出现人们感知上的差异。然而,拍快照本身复制的数据量,是固定的一个 leaf node ,所以,硬盘设备速度是不会影响拍快照的速度的。不过要强调的是,对子卷拍快照并不是递归操作,换句话说,就是拍快照只是对子卷拍,如果下面有嵌套,是不会对它们做快照的,实际操作下来,那些嵌套都是空目录而已。

另外在 Btrfs 并不是随便什么都能拍快照的,比方你想对一个目录拍快照,就不行了。不过,也不是完全不行,我们可以动动脑筋,比方说,创建一个新的子卷,在子卷中做指向目标目录的跨子卷引用链接。这样给子卷拍快照就能就能包含那个目录的内容了。

之前,我们谈到过 Btrfs 的子卷,其实 Btrfs 快照,它就是一种子卷的表现形式,共享了其他子卷数据和元数据,具有写时复制,并针对原先子卷的快照的修改是不可见的。所以,从快照所具有各种特点来看,快照最常用的功能就是作为备份,比方我们创建一个可读写的快照,在必要的时候,我们可以将原先的子卷卸载,使用挂载的命令将这个子卷之前的快照挂载上去,实现系统恢复或者找回误删除文件。

下面我们通过一些简单的实例来给大家看下快照都能给我们管理计算机数据带来什么便利(视频操作)。

快照最直观的好处就是,备份数据变得简单了,短短一个命令,在毫秒间就能把数百G的数据备份好。这也给我们带来下面一个非常方便的特性,就是 Btrfs 文件系统克隆:

理解 Btrfs 文件系统克隆,我们可以先回顾下早期的 Windows XP 利用 Ghost 快速安装系统。及方便又快捷,而且利用 Ghost 安装好的系统基本上开机即用,因为很多驱动也是完成安装了的。那么 Btrfs 文件系统的克隆也类似于这样的技术,但是实现起来已经更加多样化和便捷化。

设想一个场景,需要为一个单位部署成百上千台计算机系统。我们还是一台一台的去安装吗?这样不仅费时费力,而且还要花费大量的人力资源。我们利用 Btrfs 文件系统的克隆功能,即使你坐在家里,也能够方便为所有计算机部署系统,唯一的要求就是有足够快的网络。而具体的操作,就由我来吧(视频部分)。

其实这种基于文件系统级别的系统克隆,据我目前了解,只有 zfs,btrfs 和 xfs 可以,另外还有 rsync 这个工具可以实现。而具体实践操作起来,唯一的要求就是网络通畅且高带宽。最终方便了用户和 IT 员工。即使系统后续出现问题,容灾成本也是最小的。

关于 Btrfs 这个文件系统,大家一定很想知道如何保证磁盘上的数据写入时和读取时保持一致性?会不会被篡改的?这就要谈到 Btrfs 文件系统中另一个功能,校验和:

当数据 A 写入到 Btrfs 文件系统上的时候,会产生一个校验值,当这个数据被下一次读取的时候,会再产生一个校验值用于前后的对比,如果一致,说明这个文件没有损坏,或者没有被篡改;如果发生了变化,一种可能就是文件损坏了,被篡改了;或者就是硬盘出现问题,数据损坏了。从而利用这种方法,来实现数据传输的准确性和一致性。

默认提供的校验算法是 crc32c ,同时应用到数据和元数据。当然也许会有朋友问道,是否能够关闭校验和功能。当然是可以的,但是随之失去的就是写时复制功能。有趣的是,如果只是简单的关闭了写时复制,同样是可以拥有校验和功能的。

通过上面简短的理论阐述和实例演示,不知道各位朋友是否理解了 Btrfs 文件系统这些特别的功能。后续还会带来最后一起关于 Btrfs 文件系统的视频,希望大家喜欢这期的内容,我是你们的 Houge Langley,一个喜欢折腾 Linux 的极客,感谢大家的观看,我们下期视频再见喽,88

最后鸣谢 FC 老师的帮助,没有你,就没有这一期视频。

2 thoughts on “Linux 头脑风暴第十六期——认识 Btrfs(二)

  1. Btrfs 的透明压缩功能用起来真的是很舒服。处理一些比较大的文本数据库(几个G到几十G),存放在硬盘上很节省空间。

发表回复

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