btrfs文件系统从原理到实践 [1]

news/2025/1/18 15:48:00/文章来源:https://www.cnblogs.com/potatso/p/18678520

作为Linux用户,我经常羡慕macOS系统的Time Machine功能。Time Machine就像是系统的最后一道防线,无论系统发生什么变化,它都能保护我们的数据安全,避免因误操作导致系统无法启动的困境。那么,Linux系统下是否也有类似的解决方案呢?基于这样的需求,我发现了Btrfs文件系统。

在深入了解Btrfs前,强烈建议你学习一下git的原理。二者有着很多相似之处。在后面我将大量使用通俗易懂的方式帮你掌握btrfs。

Btrfs基本文件组织

在Btrfs中,文件系统的组织结构与Git非常相似:普通文件类似于Git中的blob对象,而目录则对应Git中的tree对象。以Linux的根目录为例,它是一个tree对象,其中包含了文件(blob对象)以及子目录(子tree对象)。

在这里插入图片描述

在Btrfs中,这些Tree对象被称为子卷(Subvolume)。子卷是Btrfs的一个核心概念,它本质上是一个特殊的目录,能够捕获并保存特定时刻的文件系统状态。这与快照(Snapshot)的概念密切相关。

创建一个空子卷


# 创建一个空子卷:btrfs subvolume create <path># 例如,要在/mnt/btrfs下创建一个名为my_subvol的空子卷:sudo btrfs subvolume create /mnt/btrfs/my_subvol

当Linux系统安装在Btrfs分区上时,系统默认会将根目录(/)设置为名为"@"的子卷。这是许多Linux发行版的标准做法,它为系统提供了更好的快照和回滚能力。

Btrfs子卷具有双重特性:它既可以作为普通目录在文件系统中进行管理,又可以像独立的分区一样被挂载到Linux系统的任意挂载点。这种灵活的特性为实现系统级别的快照和回滚功能奠定了重要基础。

快照

类似于Git的分支(branch)概念,Btrfs也实现了一种称为快照(Snapshot)的机制来保存文件系统的历史状态。在Btrfs中创建快照时,系统只会复制tree对象的结构,而不会复制实际的文件内容。这种设计与Git的存储机制非常相似:不同的快照之间会共享相同的文件数据(blob对象),每个快照只需要存储发生变化的部分。这种写时复制(Copy-on-Write)的策略使得快照操作既快速又节省存储空间。

在这里插入图片描述

在Btrfs的实现中,子卷和快照共享相同的底层数据结构。它们的主要区别在于创建方式:子卷可以作为独立的空白容器创建,而快照则必须基于现有的子卷创建,并会继承该子卷的全部数据状态。

在这里插入图片描述

btrfs创建快照的命令


# 创建一个名为snap的快照btrfs subvolume snapshot -r /path/to/subvolume /path/to/snap

在拍摄快照的时候 -r参数代表创建一个只读快照。在这种情况下,快照只允许读取数据,不能进行写入操作。

快照的恢复

虽然Btrfs没有提供快照的直接恢复机制,但由于快照本质上是一个只读的子卷,我们可以直接访问快照中的文件内容。这种特性使得快照特别适合于选择性文件恢复的场景,用户可以方便地浏览快照中的文件,并选择所需的文件进行恢复。

首先查看系统中的快照


# 列出指定Btrfs文件系统中的所有子卷和快照# 参数为Btrfs文件系统的挂载点或者子卷路径btrfs subvolume list /

ID 256 gen 169953 top level 5 path var/lib/portablesID 257 gen 169953 top level 5 path var/lib/machinesID 1529 gen 192141 top level 5 path @ID 1530 gen 192141 top level 5 path @homeID 1532 gen 191492 top level 5 path timeshift-btrfs/snapshots/2024-12-26_10-13-46/@ID 1533 gen 171944 top level 5 path timeshift-btrfs/snapshots/2024-12-26_10-13-46/@homeID 1534 gen 171908 top level 5 path timeshift-btrfs/snapshots/2024-12-26_10-41-36/@ID 1535 gen 171944 top level 5 path timeshift-btrfs/snapshots/2024-12-26_10-41-36/@homeID 1544 gen 191492 top level 5 path timeshift-btrfs/snapshots/2024-12-27_13-39-08/@ID 1545 gen 191492 top level 5 path timeshift-btrfs/snapshots/2024-12-31_14-51-04/@ID 1588 gen 189590 top level 5 path timeshift-btrfs/snapshots/2025-01-02_08-39-31/@

输出结果中的path字段显示了每个子卷的路径。通常情况下,我们可以直接通过这个路径访问快照的内容。但需要注意的是,如果你的系统本身就安装在Btrfs文件系统上(根目录挂载在@子卷),那么这些快照可能无法通过常规路径直接访问,因为它们位于Btrfs文件系统的根层级。

手动挂载

linux的mount在挂载Btrfs的时候,同时支持挂载的子卷或快照。这样我们同样实现了查看快照内容的目的。


# 挂载快照# 手动挂载快照以访问sudo mount -o subvol=快照路径 /dev/硬盘 /mnt/临时目录

虽然单个文件的恢复需要一些额外步骤,但对于整个系统的恢复,Btrfs提供了更优雅的解决方案:GRUB引导加载器支持直接从Btrfs的子卷或快照启动系统。这意味着我们可以在启动时选择任意一个系统快照作为根文件系统,从而实现完整的系统状态回滚。

从GRUB配置中可以看到,通过在rootflags参数中指定subvol选项,我们可以轻松地选择要启动的Btrfs子卷或快照。这种优雅的设计使得系统回滚变得异常简单。


insmod ext2if [ x$feature_platform_search_hint = xy ]; thensearch --no-floppy --fs-uuid --set=root 35669a62-1315-4b0b-be17-92f89eebffc2elsesearch --no-floppy --fs-uuid --set=root 35669a62-1315-4b0b-be17-92f89eebffc2fiecho 'Loading Snapshot: 2024-10-28 16:48:06 .snapshots/1/snapshot'echo 'Loading Kernel: vmlinuz-6.8.0-51-generic ...'linux "/vmlinuz-6.8.0-51-generic" root=UUID=0841c522-e696-4499-8f39-3de52d1a4120 rootflags=defaults,subvol=".snapshots/1/snapshot"echo 'Loading Initramfs: initrd.img-6.8.0-51-generic ...'initrd "/initrd.img-6.8.0-51-generic"

在上面的GRUB启动linux的参数中,rootflags中的subvol就是启动linux目录的btrfs子卷或快照。是不是很简单。

Btrfs快照备份与恢复

Btrfs快照备份

Btrfs同样也支持把快照同步到外部存储设备上。命令也很简单


sudo btrfs send /path/to/snapshot | pv > 备份文件路径

因为btrfs send 发送快照的时候,默认使用输出,并且没有任何进度提示。使用pv命令可以实现进度提示,但是需要安装pv工具。

这时,你可能发现,既然压缩一下快照岂不美哉。我们可以在pv后面直接使用gzip或者tar等命令实现快照的压缩。


sudo btrfs send /path/to/snapshot | pv | gzip > 备份文件路径.gz

btrfs send命令需要快照为可读才能被发送到外部设备。如果快照不是可读,你需要下面的命令去设置快照为可读属性


sudo btrfs prop set /path/to/snapshot ro false

ro为true代表把快照设置为可读,false代表把快照设置为可读可写。

Btrfs 快照恢复

Btrfs同样也支持从外部存储设备恢复快照。命令也很简单


pv 备份文件路径 | btrfs receive /path/to/subvolume

嗯,聪明的你应该想到了,可以配合btrfs快照备份功能与Grub的启动参数,实现间接的系统迁移。

Btrfs的错误检查与恢复

与传统文件系统相比,Btrfs提供了更强大的错误检查和修复功能。它不仅能够检测文件系统的错误,还能在某些情况下自动修复这些问题。

文件系统检查

Btrfs提供了专门的工具用于检查文件系统的完整性:


# 只读模式检查文件系统sudo btrfs check /dev/sdX# 使用--repair选项进行修复(需要谨慎使用)sudo btrfs check --repair /dev/sdX

需要注意的是,在执行修复操作之前,强烈建议先创建一个完整的数据备份。--repair选项虽然强大,但在某些情况下可能会导致数据丢失。

文件系统清理

Btrfs还提供了清理(scrub)功能,用于主动检测和修复数据错误:


# 启动清理操作sudo btrfs scrub start /mount/point# 查看清理状态sudo btrfs scrub status /mount/point

清理操作会读取文件系统中的所有数据,验证校验和,并在可能的情况下自动修复发现的错误。这是一个后台进程,不会影响系统的正常使用,但可能会占用一些磁盘I/O带宽。

常见问题修复

  1. 空间不足问题

# 删除旧快照和不需要的数据sudo btrfs subvolume delete /path/to/old_snapshot# 平衡文件系统sudo btrfs balance start /mount/point

Btrfs平衡操作详解

Btrfs平衡操作(Balance)是系统维护的一个重要方面。它通过重新分配数据块来优化存储空间的使用,确保文件系统保持健康和高效。

为什么需要平衡?

随着文件系统的使用,数据块的分布可能变得不均匀。这种情况可能导致:

  • 某些存储区域过度使用而其他区域闲置

  • 可用空间虽然足够,但过于分散而无法分配大文件

  • 元数据和数据的分布不合理,影响性能

平衡操作的作用

通过执行平衡操作,Btrfs会:

  • 重新组织数据块的分布

  • 回收被标记为已删除的空间

  • 优化元数据的存储位置

  • 提高整体存储效率

执行平衡操作


# 平衡文件系统sudo btrfs balance start /mount/point

注意事项

  • 在执行平衡操作之前,建议先备份重要数据

  • 平衡操作可能需要较长时间,具体取决于文件系统的大小和复杂度

  • 在平衡操作期间,系统可能会占用更多的磁盘I/O带宽

  1. 元数据备份恢复

# 重新扫描设备以查找备份的元数据sudo btrfs rescue super-recover /dev/sdX
  1. 碎片整理

# 对指定目录进行碎片整理sudo btrfs filesystem defragment -r /path/to/directory

最佳实践

  1. 定期执行清理操作以及早发现潜在问题

  2. 保持充足的可用空间(建议至少保留10%的空闲空间)

  3. 定期创建数据备份,特别是在执行修复操作之前

  4. 监控系统日志以及时发现文件系统警告或错误

通过这些工具和实践,我们可以有效地维护Btrfs文件系统的健康,及时发现并解决潜在的问题。

下一节,我们将重点讲一下,如何使用Btrfs去实现linux系统的备份与恢复。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/871266.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

常用图像增强算法(MATLAB实现)

1 引言 图像增强是指按照某种特定的需求,突出图像中有用的信息,去除或者削弱无用的信息。图像增强的目的是使处理后的图像更适合人眼的视觉特性或者易于机器识别。在医学成像、遥感成像、人物摄影等领域,图像增强技术都有着广泛的应用。图像增强同时可以作为目标识别,目标跟…

【PE文件结构】导入表

导入表(Import Table)是Windows可执行文件中的一部分,它记录了程序所需调用的外部函数(或API)的名称,以及这些函数在哪些动态链接库(DLL)中可以找到。在PE文件运行过程需要依赖哪些模块,以及依赖这些模块中的哪些函数,这些信息就记录在导入表中。在Win32编程中我们会…

ciscn_2019_es_2(栈迁移)

看一下ida两个read函数都是读取0x30(48),然后s距离ebp有0x28(40),所以虽然有溢出但只溢出了两个4字节,也就是只能覆盖到ebp和ret。 这时候就需要运用栈迁移 栈迁移就是当溢出不够多的时候,这时候可以考虑把栈给迁移去其它地方,利用leave_ret指令控制ebp,使其指向我们…

Nexpose 7.3.0 for Linux Windows - 漏洞扫描

Nexpose 7.3.0 for Linux & Windows - 漏洞扫描Nexpose 7.3.0 for Linux & Windows - 漏洞扫描 Rapid7 on-prem Vulnerability Management, released Jan 15, 2025 请访问原文链接:https://sysin.org/blog/nexpose-7/ 查看最新版。原创作品,转载请保留出处。 作者主页…

ABB机器人3HNE00313-1示教器黑屏故障维修

随着工业自动化的快速发展,ABB机器人示教器在生产线上的应用越来越广泛。然而,在使用过程中,示教器偶尔也会出现故障,其中比较常见的一种是ABB工业机械手示教器黑屏故障。 一、ABB工业机器人示教盒黑屏故障原因分析 1. 硬件故障:硬件故障是导致示教器黑屏的主要原因之一。…

windows双击查看ip

如何方便查看本地电脑的ip? 直接上干货: 1、在桌面右击,新建 => 文本文档; 2、重命令为ip.txt 3、双击打开,输入 ipconfig pause , 然后保存; 4、右击文档,重命令为“ip.bat”;5、再次双击此文档,ip地址就出来了; ps: ipconfig:是系统命令,用于查看ip的地址…

一个日h站的Nday

0x00 前言 今天先来无事的我翻起了qq收藏夹。忽然发现了一个去年EDUSRC群里一个老表发的洞。今天就给大家发出来耍耍。 抵制黄色网站人人有责,打造绿色上网环境。 面对正规网站时候,请不要做非法测试!!! 废话就不多说了。 0x01正文 fofa语句 body="<script type=t…

【触想智能】工业电脑一体机在数控机床设备上应用的注意事项以及工业电脑日常维护知识分享

数控技术的应用不但给传统制造业带来了革命性的变化,使制造业成为工业化的象征,而且随着数控技术的不断发展和应用领域的扩大,它对国计民生的一些重要行业(IT、汽车、轻工、医疗等)的发展起着越来越重要的作用,因为这些行业所需装备的数字化已是现代发展的大趋势。随着数控…

day0java准备

Java-001 Markdown 暂时跳过,vscode里未能实现编译 java 1.已配置环境 2.继续学黑马程序员:已到50/200 3.内存4.学到方法(C里函数)

NB!一款基于java开发的漏洞检测工具,集合了泛微、用友、大华、海康、致远、红帆、万户、帆软等漏洞

1、工具介绍 基于 https://github.com/yhy0/ExpDemo-JavaFX 上添加poc 2、工具下载链接: 工具下载:工具下载 3、新增检测漏洞用友NC-Cloud系统接口getStaffInfo存在SQL注入漏洞 用友U8-Cloud ReleaseRepMngAction存在SQL注入漏洞复现(CNVD-2024-33023) 用友U8-CRM系统getDeptN…

网络购物数据分析

#获取数据 import pandas as pd infor=pd.read_csv(buy_input_1.csv) infor.head(20) #选取预观察数据#方法1 # x1=infor["Annual Income"] # print(x1) # x2=infor["Spending Score"] # print(x2)# """ #方法2 # x1=infor.iloc[:,3] # …

了解ESP32睡眠模式及其功耗

转载自:https://lastminuteengineers.com/esp32-sleep-modes-power-consumption/ Insight Into ESP32 Sleep Modes & Their Power ConsumptionThe ESP32 is undeniably a worthy competitor to many WiFi/MCU SoCs, outperforming them in both performance and price. Ho…