Slashdot问:你对Btrfs有什么感觉?

2020-10-25 07:36:38

多年来,btrfs文件系统一直在嘲弄Linux社区,它提供了一系列令人惊叹的特性和功能,但从未赢得普遍赞誉。Btrfs可能更值得耐心,因为它承诺的能力让所有同行相形见绌,为它赢得了具有巨大影响力的直言不讳的支持者。尽管如此,没有人能否认btrfs尚未完成,许多特性非常新,常见功能的稳定性问题依然存在。

“贸易自由贸易框架”的大部分预期目标已经实现。然而,众所周知,RedHat从7.4版中切断了对持续btrf的支持,并允许代码在此后的后端口内核中停滞不前。Fedora项目宣布他们打算采用btrfs作为其发行版变体的默认文件系统,这似乎是并列的。多年来,SUSE一直为自己的发行版和更大的社区维护btrf支持。

对于用户来说,btrf最理想的特性是透明压缩和快照;这些特性很稳定,并且相对容易作为单板添加到库存CentOS(及其同行)中。管理员还被可调整的校验和、擦除以及放大和(令人惊讶地)缩小文件系统映像的能力所驱使,而一些高级btrfs主题(即重复数据删除、RAID、ext4转换)实际上与最少的环回使用无关。Systemd init包也依赖于btrf,其中包括machinectl和systemd-nspawn。尽管有这些功能,但仍有许多使用模式不直接适合与btrf一起使用。它对大多数数据库和许多具有不兼容I/O的其他程序都是有害的,应该谨慎对待。

支持CentOS兼容btrfs的内核的两个最易访问的提供商是El Repo Mainline和Oracle UnBreak Enterprise Kernel(UEK),但是每个选项在支持和功能方面都有重要的附带条件。Oracle的内核没有实现强制文件系统完整性的btrfs校验和的最新标准,而且从CentOS的角度来看,还有其他组织问题,Oracle已经失败。El Repo主线具有最新功能,但不鼓励使用它,也不支持它。目前的Fedora内核似乎也可以在CentOS8上运行,但这些安装在删除现有内核组件方面更具侵入性。用户将面临霍布森的选择,这取决于他们对高级功能或商业支持的需求。

不过,使用功能强大的内核,当在默认的XFS主机文件系统上运行时,可以通过环回挂载在任何CentOS、RedHat或Oracle Linux OS上轻松启用这些特性(但会降低一些性能)。在这些功能必不可少的情况下,它们可以阻止迁移到高级存储功能更为常见的Solaris、FreeBSD甚至SuSE。

在这里,我将引用我上一篇关于ZFS for Linux的文章,以澄清和翻译这两个流行文件系统之间的术语。要理解btrf的讨论,不需要了解ZFS,但是对比会很有帮助。

与CentOS安装最兼容的两个支持btrfs的内核提供商在支持和功能方面提供了截然不同的体验。安装用于评估的两个内核可能是最方便的,下面的发送/接收部分假设它们的特性都存在。

CentOS 7确实支持将本机btrfs作为操作系统安装程序中的自定义选项(作为技术预览),但该选项已从CentOS 8安装程序中删除,因此不会在此提及。CentOS8用于所有示例;CentOS7用户可能更喜欢UEK。

要安装Oracle UEK,请将以下文件添加为/etc/yum.repos.d/uek-olx.repo(对于CentOS 7,将";OL8/OL8";更改为";OL7/OL7";):

加载相关回购的GPG密钥,如Oracle的说明中所述(有些不正确):

要自动安装UEK,请执行以下命令(如果没有C编译器,请省略devel包):

我添加了选项--disablerepo=AppStream、--disablerepo=BaseOS和--disablerepo=Extras,以强制DNF穿过受限的防火墙,仅从Oracle的存储库中提取:

上次元数据到期检查:0:04:38之前,于2020年9月15日星期二11:43:34 AM CDT。依赖项resolved.====包架构版本回溯Size====Installing:btrfs-progs x86_64 5.4.0-1.el8 OL8_UEKR6 869 k btrfs-progs-devel x86_64 5.4.0-1.el8 OL8_UEKR6 52 k kernel-uek x86_64 5.4.17-2011.6.2.el8uek OL8_UEKR6 60 M升级:linux-Firmware noArch 999:20200124-999.4.git1eb2408elc.8。MTransaction Summary====Install 3包升级1级包总下载大小:161mis this ok[y/N]:y下载包:(1/4):btrfs-progs-devel-5.4.0-1.el8.x86_64.rpm 21 kB/s|52 kB 00:02(2/4):btrfs-progs-5.4.0-1.el8.x86_64.rpm 225 kB/s|869 kB 00:03(3/4):kernel-uek-5.4.17-2011.6.2.el8uek.x86_。642.1MB/s|60MB 00:29(4/4):linux-固件-20200124-999.4.git1eb24081.1MB/s|100MB 01:27--。--总计1.8 MB/s|161 MB 01:30最新UnBreak Enterprise Kernel Release 6 3.0 MB/s|3.1 kB 00:00导入GPG密钥0xAD986DA3:userid:";Oracle OSS集团(开源软件集团)";指纹:76FD 3DB1 3AB6 7410 B89D B10E 8256 2ea9 ad98 6DA3来自:/etc/pki/rpm-gpg/rpm-gpg-key-oracle这是否正常[y/N]:y密钥导入成功运行事务检查事务检查成功。运行事务测试事务测试成功。运行事务准备:1/1升级:linux-firmware-999:20200124-999.4.git1eb2408c.el8.no 1/5安装:btrfs-progs-5.4.0-1.el8.x86_64 2/5安装:btrfs-progs-devel-5.4.0-1。El8.x86_64 3/5运行脚本小程序:内核-uek-5.4.17-2011.6.2.el8uek.x86_64 4/5安装:内核-uek-5.4.17-2011.6.2.el8uek.x86_64 4/5运行脚本:内核-uek-5.4.17-2011.6.2.el8uek.x86_64 4/5清理:内核5/5运行脚本:linux-firmware-20191202-97.gite8a0f4c9.el8.noarch-uek-5.4.17-2011。.6.2.el8uek.x86_64 5/5运行脚本小程序:内核5/5验证:btrfs-progs-5.4.0-1.el8.x86_64 1/5验证:btrfs-progs-devel-5.4.0-1.el8.x86_64 2/5验证:linux-firmware-20191202-97.gite8a0f4c9.el8.noarch-uek-5.4.17-2011.6.2.el8uek.x86_64 3/5验证:linux-firmware-999:20200124-999.4.git1eb2408c.。El8.no 4/5验证:linux-firmware-20191202-97.gite8a0f4c9.el8.noarch 5/5安装的产品已更新。升级:安装的linux-firmware-999:20200124-999.4.git1eb2408c.el8.noarch:btrfs-progs-5.4.0-1.el8.x86_64 btrfs-progs-devel-5.4.0-1.el8.x86_64 kernel-uek-5.4.17-2011.6.2.el8uek.x86_64Complete!

对于手动安装,请直接从存储库中提取最新的UEK和关联的RPM:

安装后,UEK将自身配置为默认引导内核。另请注意,上面的DNF会话中安装了一个新的固件软件包(如果卸载UEK,请准备将其降级回CentOS版本)。

UEK有两个主要问题,总体上和从CentOS的角度来看都是如此。

首先,Oracle UEKR6(当前)太旧,无法使用btrf的最新校验和特性(将在下一节进行说明)。

其次,在CentOS上为UEK提供付费支持,但仅在将整个系统转换到Oracle Linux之后。加载UEK不会触发此转换。此外,CentOS 8的转换过程似乎已中断。当尝试运行centos2ol.sh转换器脚本时,它会停止,并显示需要python2的错误。从AppStream安装python2后,脚本失败,并显示消息:";您似乎正在运行不受支持的分发版本。如需帮助,请通过电子邮件向<;[email protected]>;发送电子邮件。";检查脚本时,只允许使用CentOS版本5、6和7,Oracle网站上还提示您不支持CentOS 8(";centos2ol.sh可以将您的CentOS 6和7系统转换为Oracle Linux)。由于CentOS8平台已经推出一年多了,甲骨文的脚本似乎已经严重过时了。甲骨文是否完全支持CentOS 8平台是值得怀疑的。

El Repo项目之前维护了最终的Red Hat后端btrfs源代码的历史档案。虽然这个空闲版本从未从测试中发布,并且已经被移除,但是最新的btrfs内核模块可以在它们的软件包中的其他地方获得。

El Repo将它们的主线称为最后的内核,它通常是用于向后移植硬件驱动程序的开发工具。它恰好包含具有最新功能的btrfs模块,这些模块将与这里提供的所有功能完美地配合使用。要加载它,请从El Repo Mainline存储库获取并安装以下文件(或安装yum存储库本身的条目):

验证.。#[100%]正在准备...。#[100%]正在更新/安装...。1:kernel-ml-core-5.8.5-1.el8.elrepo##[33%]内核[67%]3:2:kernel-ml-modules-5.8.5-1.el8.elr##-ml-。5.8.5-1.el8.elrepo#[100%]。

完成后,重新启动,一个新的Red Hat内核(提到Oopta)应该出现在GRUB菜单中。选择省略UEK的El Repo主线内核用户应该加载Oracle的btrfs-progs,因为这将允许用户空间维护。

下面列出的Fedora内核似乎可以在CentOS上运行,但安装Fedora组件时应该格外小心,因为在升级模式下安装时,它们可能会删除CentOS提供的常用内核软件包(主线和UEK都会保留常用内核)。在这种情况下,使用Fedora yum存储库可能不安全。

验证.。#[100%]正在准备...。#[100%]正在更新/安装...。1:kernel-core-5.9.0-0.rc8.20201007g##[17%]2:kernel-modules-5.9.0-0.rc8.202010##[33%]3:内核-5.9.0-。0.rc8.20201007git757##[50%]正在清理/删除...。4:kernel-4.18.0-193.el8#5:kernel-module-4.18.0-193.el8#。#[100%]kernel-5.9.0-0.rc8.20201007git7575fdda569b.30.fc34.x86_64kernel-core-5.9.0-0.rc8.20201007git7575fdda569b.30.fc34.x86_64kernel-ml-5.8.5-1.el8.elrepo.x86_64kernel-ml-core-5.8.5-1.el8.elrepo.x86_64kernel-ml。-modules-5.8.5-1.el8.elrepo.x86_64kernel-modules-5.9.0-0.rc8.20201007git7575fdda569b.30.fc34.x86_64kernel-tools-4.18.0-193.el8.x86_64kernel-tools-libs-4.18.0-193.el8.x86_64kernel-uek-5.4.17-2011.6.2.el8uek.x86_64

在Fedora中也可以找到btrfs-progs包,如果甲骨文的包存在,它同样会清除它们。

验证.。#[100%]正在准备...。#[100%]正在更新/安装...。1:libbtrfsutil-5.7-4.fc33#2:libbtrfs-5.7-4.fc33#。#4:btrfs-progs-devel-5.7-4.fc33#。5:btrfs-progs-devel-5.4.0-1.el8#6:btrfs-progs-5.4.0-1.el8#。

El Repo主线的问题是缺乏支持,正在积极劝阻其使用。Feddora很可能是一个更不得已的选择,因为除非非常小心地安装,否则它可以删除CentOS内核软件包。最新的SUSE内核可能也会让人感兴趣,但这不是针对CentOS的,这里也没有尝试过。构建自定义内核可能会提供最好的结果,但会牺牲任何和所有支持。

在创建btrfs文件系统时固有的是选择块级校验和,用于记录和实施所有内容的完整性和准确性。在最近的历史中,此选择仅限于CRC32C算法,该算法容易发生冲突,不太适合重复数据删除(此处不介绍)。

校验和的选择受到两个感兴趣的内核的限制,选项非常简单。

Btrfs最近实现了新的校验和,详细信息由man 5 btrfs描述,此处摘录了3.5 GHz英特尔CPU的校验和(如手册页所述):

密码应用程序的技术用户可能熟悉上述散列。NSA的SHA256算法通常支持CPU原语以实现快速处理,并且对于重复数据删除具有足够的抗冲突性。XXHASH算法在对吞吐量影响最小的情况下,在避免散列冲突方面比CRC32C有很大改进。

上述散列选择的问题在手册页中已明确说明:要挂载这样的[a]文件系统,内核也必须支持校验和。";必须了解,当前的Oracle UEKR6只支持CRC32C,不会挂载使用任何其他散列函数创建的btrfs文件系统,即使它分发的用户空间工具既允许也鼓励这样做。

对于本文档的其余部分,将假定我们的主btrfs文件系统具有以下挂载点。请创建此装载点以遵循所有其他示例:

对于crc32c xxhash sha256 blake2do falocate-l 50g/home/CALDRON.BTRFS mkfs.btrfs--csum=";$CSUM";/home/CALDRON.BTRFS mount-o loop/home/CALDRON.BTRFS/bvault umount/bvault rm-v/home/CALDRON.BTRFSone。

我选择上面的名称是为了识别ZFS zpool&34;TANK";作为我们正在编写的功能BREW的一个更清晰的名称,我偶尔会将其称为后备存储。";在Oracle UEK上,只有CRC32挂载尝试会成功,而El Repo主线将使用所有校验和类型运行脚本,而不会出现任何错误。在Oracle UEK上,只有CRC32挂载尝试会成功,而El Repo主线将使用所有校验和类型运行脚本,而不会出现错误。(注:在Oracle UEK上,只有CRC32挂载尝试会成功,而El Repo主线会正确运行所有校验和类型的脚本)。

上面使用falocate的灵感来自于上一篇关于btrfs环回设备的文章,该文章引发了本讨论。环回装载通常用于历史上写入光学介质的.ISO映像。请注意,回送文件系统挂载通常很快,但当fsync()调用过多时可能会受到影响。

Oracle UEK是最近的5.4.17内核,但还不够新,不足以支持CRC32C以外的任何东西,从man 5 btrfs:";从内核5.5开始,又有三个[校验和]具有不同的特性,并在速度和强度方面进行了权衡。当甚至连Oracle都忽略了支持新功能时,我们就会看到Red Hat";的观点。

运行UEK时,这是新btrfs文件系统上可用的最佳校验和:

如果El Repo主线是活动内核,则可以使用Oracle的mkfs.btrfs实现的任何校验和。

从ZFS的角度来看,这一切都非常原始。ZFS允许动态选择任何校验和/散列函数,以应用于任何文件系统对象。在任何情况下,SHA256很可能是那些需要极端数据完整性并愿意放弃支持的人的首选。

可以将三种压缩类型应用于btrfs文件系统内的目录或文件对象。可用类型优先为:zstd、lzo、zlib和NONE。这些压缩属性的分配保持为btrfs&34;元数据,并且内核将在写入内容时执行文件压缩。

Zstd-由Facebook贡献的代码,允许指定介于1和11之间的数字选择符,控制内核应用的文件的压缩系数。

Zlib-使用传统的gzip算法,并允许应用介于1和9之间的因子。

虽然可以将压缩全局设置为整个已挂载文件系统的挂载选项,但也可以将其应用于特定的目录或文件。断言此属性的语法如下所示:

Mkdir/bvault/tmpbtrfs属性集/bvault/tmp压缩zstdmkdir/bvault/logbtrfs属性集/bvault/log压缩lzobtrfs属性集/bvault/log压缩zlib:9btrfs属性集/bvault/log压缩zstd:11。

包含文件和目录对象压缩设置的元数据不能使用tar或其他不知道此特殊状态的btrfs内部机制的实用程序进行备份。下面的发送/接收部分能够将所有元数据复制到新的btrfs文件系统,并且是唯一捕获这些隐藏设置的文件移动实用程序。

不幸的是,btrfs-progs包中没有报告工具来识别磁盘上文件的压缩比。有一种暴力方法可用,它缺少粒度报告,在一个简单的shell函数中使用df只报告所需的挂载。

下面的shell函数将在后面的示例中使用,请注意。

函数ddf{type set a b IFS=\|;df|同时读取a do[[-z";$b";]]&;&;printf';%s\n';";$a";;对于*";$b";$b";中的b;do case";$b";*)printf';%s\n';";$a";ESAC;Done;Done}。

文件系统1K-已用数据块可用使用率装载在/dev/loop0 52428800 1989740 50009460 4%/test1/dev/loop1 52428800 19106016 32844480 37%/test2。

有一个更细粒度的实用程序可以作为C源代码使用。";[the]compsize[program]获取btrfs文件系统上的文件列表,并测量使用的压缩类型和有效压缩比。有一个补丁添加了对此的支持;目前它还没有合并。如果可以的话,您可以通过比较df命令在写文件前后的输出来猜测它的压缩大小。

要使用此精细报告实用程序,假设您有权访问Linux C编译器并能够准备compsize,请确保您已安装了以下软件包:

测试程序。请注意,下面的sync事件-compsize在没有它的情况下可能会失败,因为同步事件似乎会提示内核压缩:

已处理2个文件,15个常规扩展区(15个参考),0个内联。类型Perc磁盘使用未压缩引用总计17%316k 1.7M 1.7M zstd 17%316k 1.7M 1.7M。

传统UNIX系统的管理员经常面临从备份恢复的请求,而且通常由于tar的cron计划在关键活动之外且不捕获关键活动,这些请求无法得到满足。一天一次的备份不包括在触发的备份周期之间传递、处理和删除的临时数据。

快照是非常快速地创建的文件系统状态的即时照片。当文件系统更改数据块时,快照将保留旧内容,并保持其显示的原样。只要磁盘空间可用,就可以对btrfs文件系统拍摄许多快照并保留这些快照。

在btrf中创建的默认快照不是只读对象;可以在其中添加或更改内容:

可以使用-r选项创建只读快照。这对于备份可能更可取,并且发送/接收功能需要只读状态,如下所述。

Noatime mount选项的手册页中有一些专门与快照相关的讨论,其中提到URL作为扩展讨论的资源。人们很早就知道noatime选项可以提高大多数UNIX系统上的文件系统性能,在btrfs中,它在防止快照增长方面具有额外的意义,在btrfs中发挥了进一步的作用,如下所述。

快照是SPE。

.