[Share Experiences] btrfs的压缩功能简介、使用方法以及实际体验
Tofloor
poster avatar
enforcee
deepin
2023-07-24 09:41
Author

btrfs是一种现代的文件系统,拥有很多高级的特性,比如子卷、文件校验、在线调整大小等功能。Linux支持的文件系统实在不少,用户可以有很多选择。对于新人和不太关注文件系统特性的用户来说,我最推荐的还是ext4,简单快捷、性能优异、稳定而且不需要花费心思管理。而btrfs由于功能十足也逐渐被更多喜欢定制的坛友所青睐。过去其他坛友的文章已经讨论过使用btrfs作为系统安装分区的优点(快照备份等),这次来介绍一下作为数据盘的特点:压缩。

和我们平常使用的压缩文件不同,btrfs的文件系统级别压缩是基于文件区段(file extent)的。我们现在作为系统安装分区的文件系统都是采用这种方法存储数据,即文件实际上是以各个小片段存在于文件系统中,而非整体连续存储。这样来避免空间浪费并提升写入性能。 这样的小片段称为extent。btrfs可以通过压缩这样的区段来节约磁盘空间。在btrfs中,未压缩的区段和压缩的区段可以共存,而多种压缩算法和压缩等级的区段也可以共存。一个文件由于是多个区段组成,所以他可能是一部分被压缩的,一部分是没有压缩的。所以文件系统的压缩要比通常的压缩文件更加灵活,而最大的优势是文件依然可以随时读写,免去了来回解压的麻烦。

btrfs不会理会已经存储的文件是否被压缩、使用了什么算法,他只会考虑下一次写入的数据。btrfs的压缩需要在文件系统挂载选项中设置(经常使用mount等命令的玩家应该很熟悉了,这里不会过多介绍)。对于已经存储的文件,就需要重新存储来压缩他,这个功能也被集成进了磁盘碎片整理(没错,btrfs需要整理碎片,和ext4不同。不过可以使用autodefrag选项自动进行碎片整理,这是题外话了)。手动调用命令sudo btrfs filesystem defragment -r -v -c算法 目录或文件 就可以执行对应文件的压缩。

btrfs的挂载选项中压缩有两种:compress[=算法[:等级]]compress-force[=算法[:等级]]。两者只能指定一个。如果使用前者,btrfs会首先压缩文件的一部分,如果发现这个文件不适合进行压缩,就会以非压缩的方式存储。如果使用后者,btrfs会全心全意压缩每一个区段,除非发现压缩后的区段反而比没有压缩时还大,这时才会以非压缩的方式存储。

btrfs支持的算法有三种:lzo(没有压缩等级的区别)、zlib(可以指定压缩等级1-9)和zstd(可以指定压缩等级1-15)。zstd是最先进的算法,压缩率和zlib相近并且有更快的压缩和解压速度,不过需要Linux 5.1以后的版本才能支持。

我采用compress-force:zstd:8测试,我在分区里存储了91GiB的各种数据,其中有29GiB是以压缩方式存储,被压缩到22GiB,总共占用84GiB的硬盘空间。改用压缩等级11后效果甚微,而改成最高的压缩等级15后,大约又节约了600MiB的空间。(可以看出,就算增加压缩等级,不适宜压缩的区段大多还是没有被压缩。)在这个模式下,存储文件会让CPU占用率直接跑满,但是存储文件的速度很快;读取文件(如播放视频)等操作并不会特别明显地增加CPU负担(可能是因为视频文件本身就是压缩过的,因此包含的被压缩的区段不是很多)。因此就算是这种很极端的模式,作为数据分区也不会特别影响日常使用;而如果选择一个中低压缩率,能在保持优异的磁盘用量时节约大量CPU资源。无论是哪种模式,btrfs都能提供非常好的读写性能。

想知道btrfs的磁盘用量,可以使用sudo btrfs filesystem usage 文件或目录,而另一个小工具compsize(https://github.com/kilobyte/compsize)可以按照不同的压缩算法来展示数据。在看各种磁盘用量数据时要注意GiB(1024进制)和GB(1000进制)的差别。

最后再提醒一下,无论是哪种压缩算法,不可能对所有文件效果都很好。因此不要总是指望文件系统帮你节约很多硬盘空间。不过对于某些特殊需求的用户来说,这个功能也许帮助很大。

Reply Favorite View the author
All Replies
enforcee
deepin
2023-07-24 09:59
#1

我过去的文章合集:

https://bbs.deepin.org/zh/post/259765

blush

Reply View the author
忘记、过去
deepin
2023-07-24 11:52
#2

咳咳,不过注意几点......很容易翻车 doubt


zstd 压缩方式需要 grub 和内核都支持才行(grub 需要 2.04,目前没啥问题)


然后就是 btrfs 启用压缩功能之后,如果出现数据损坏,就很难恢复了...... sob

之前作死开了 zstd:1 压缩,又配置了休眠到 swap 文件,休眠的时候还好好的......结果手贱在 Windows 上装了 btrfs 驱动,就访问了一下 btrfs 分区,再重启进 Deepin 就突然黑屏提示 /var 分区只读了。然后就再也进不去了......

胡乱尝试了 btrfs 自己的恢复命令,结果自然是越恢复越完蛋,最后直接提示分区元数据损坏了,连 Windows 里都显示无法读取该分区,提示要不要格式化......

P.S. 万幸只是刚装好的 V23,没啥东西,只是浪费了好多配置环境的时间就是了......

Reply View the author
阿尼樱奈奈
Moderator
2023-07-24 14:07
#3

like

Reply View the author
xuqi
deepin testing team
2023-07-24 16:34
#4
  • nice~👍
Reply View the author
Feng Yu
deepin
2023-07-24 18:06
#5

有没有介绍zfs的,现在ubuntu默认已经支持了zfs了,arch及其衍生发行版似乎都支持安装的时候选zfs,个人感觉zfs似乎更有搞头

Reply View the author
enforcee
deepin
2023-07-24 18:20
#6
忘记、过去

咳咳,不过注意几点......很容易翻车 doubt


zstd 压缩方式需要 grub 和内核都支持才行(grub 需要 2.04,目前没啥问题)


然后就是 btrfs 启用压缩功能之后,如果出现数据损坏,就很难恢复了...... sob

之前作死开了 zstd:1 压缩,又配置了休眠到 swap 文件,休眠的时候还好好的......结果手贱在 Windows 上装了 btrfs 驱动,就访问了一下 btrfs 分区,再重启进 Deepin 就突然黑屏提示 /var 分区只读了。然后就再也进不去了......

胡乱尝试了 btrfs 自己的恢复命令,结果自然是越恢复越完蛋,最后直接提示分区元数据损坏了,连 Windows 里都显示无法读取该分区,提示要不要格式化......

P.S. 万幸只是刚装好的 V23,没啥东西,只是浪费了好多配置环境的时间就是了......

我总看见各种文章说btrfs check有问题,没想到真有现身说法的
scream
不过那个个人开发者做的windows驱动看着很诱人,不知道是不是安全

Reply View the author
enforcee
deepin
2023-07-24 18:39
#7
Feng Yu

有没有介绍zfs的,现在ubuntu默认已经支持了zfs了,arch及其衍生发行版似乎都支持安装的时候选zfs,个人感觉zfs似乎更有搞头

毕竟ZFS不是Linux原生的文件系统,所以不受待见吧
blush

Reply View the author
Feng Yu
deepin
2023-07-24 18:58
#8
enforcee

毕竟ZFS不是Linux原生的文件系统,所以不受待见吧
blush

好像还真是这样,除了ubuntu对这玩意感兴趣之外,别的发行版鲜有跟进的。查了下资料,ubuntu 22.04开始似乎默认使用zfs了,发行版也内置了zfs相关。arch应该要做一些配置才能使用zfs,manjaro应该是内置了linux-zfs包,可以在安装界面直接使用zfs,别的发行版暂未测试

Reply View the author