蚊章汇 - Btrfs
type: channel
link: https://linuxcn.bwsl.wang/tag/Btrfs/
items: Btrfs 详解：压缩
items: Btrfs 详解：快照
items: 使用 Btrfs 快照方便升级 Fedora Linux 且易于回退
items: Btrfs 详解：子卷
items: Btrfs 详解：基础概念
items: 如何将你的文件系统转换为 Btrfs
items: 硬核观察 #453 微软 Edge 浏览器变成了广告软件
items: Btrfs 文件系统入门
items: Btrfs 和 LVM-ext4 该如何选择？
items: 使用 Btrfs 快照进行增量备份

Btrfs 详解：压缩
type: item
date: 2023-10-19T23:34:00+08:00
description: 这篇文章将探索 Btrfs 中的透明文件系统压缩，以及它如何帮助节省存储空间。这篇文章是《Btrfs 详解》系列文章中的一篇。从 Fedora Linux 33 开始，Btrfs 就是 Fedora Workstation 和 Fedora Silverblue 的默认文件系统。如果你错过了，这里是本系列的上一篇文章：Btrfs 详解：快照。简介很多人都经历过存储空间用完的情况。也许你想从互联网下载一个大文件，或者你需要快速从你的手机中复制些照片，然后操作突然失败。虽然存储空间成本正在稳步降低，但越来越多的设备要么制造时就是固定数量的存储容量，要么最终用户难以扩展其存储容量。但当你的存储空间不足时你可以做什么呢？也许你会求助于云存储，或者你可以随身携带一些外部存储设备。在这篇文章里我会研究该问题的另一种解决方案：透明的文件系统压缩，这是 Btrfs 的一个特性。理想情况下，这将解决你的存储问题，同时几乎不需要对你的系统进行修改！让我们来看看是如何做到的。透明压缩的解释首先，让我们来探寻 透明 压缩是什么意思。你可以通过像 gzip、xz 或者 bzip2 这些压缩算法去压缩文件。这通常是显式操作：你利用一个压缩工具并且让它操作你的文件。虽然根据文件的内容，节约了空间，这有一个主要的缺点：当你想读取文件或者修改的时候，你得先解压缩。这不仅是一个乏味的过程，而且也暂时打破了你之前节省的空间。再者，你最终解压了你不想访问的那部分文件内容。明显有比这更好的方法！相反，透明压缩发生在文件系统级别。在这里，压缩的文件对用户看起来像常规的未压缩文件一样。但是，它们是被压缩后存储在硬盘上的。这之所以可行，是因为操作系统仅仅选择性地访问那部分文件，并且确保在向磁盘写入更新时再次压缩它们。这里的压缩是透明的在于它不被用户感知，除了在文件访问时可能的 CPU 负载小量增加。因此，你可以应用在已有的系统而不是进行硬件修改或者求助于云存储。压缩算法对比Btrfs 提供了多个压缩算法的选择。出于技术原因它不能选用任意的压缩算法。它现在支持：zstdlzozlib好消息是，由于透明压缩的工作原理，你不需要安装这些程序供 Btrfs 使用。在下面的文章里，你会看到如何去运行一个简单的性能测试来对比压缩算法。但是，为了运行性能测试，你必须安装必要的可执行文件。事后不需要留着它们，所以你将使用 Podman 容器来确保不会在系统中留下任何痕迹。注意 ：因为 Btrfs 使用的压缩依赖于内核对这些压缩算法的（重新）实现，用户空间版本的算法得出的结果应该认为是粗略估计。因为一次次敲重复的命令是枯燥的工作，我已经在 Gitlab 上准备了一个可以运行的 Bash 脚本 （https://gitlab.com/hartang/btrfs-compression-test）。这会用上面提到的每个算法在不同的压缩级别运行一次简单的压缩和解压缩。首先，下载脚本：$ curl -LO https://gitlab.com/hartang/btrfs-compression-test/-/raw/main/btrfs_compression_test.sh 下一步，启动一个 Fedora Linux 容器去挂载你当前的工作目录，以便你可以和主机交换文件同时在那里运行脚本：$ podman run --rm -it --security-opt label=disable -v "$PWD:$PWD" \ -w "$PWD" registry.fedoraproject.org/fedora:37 最后运行脚本：$ chmod +x ./btrfs_compression_test.sh $ ./btrfs_compression_test.sh 在我机器上的输出是这样：[INFO] Using file 'glibc-2.36.tar' as compression target [INFO] Target file 'glibc-2.36.tar' not found, downloading now... ################################################################### 100.0% [ OK ] Download successful! [INFO] Copying 'glibc-2.36.tar' to '/tmp/tmp.vNBWYg1Vol/' for benchmark... [INFO] Installing required utilities [INFO] Testing compression for 'zlib' Level | Time (compress) | Compression…

Btrfs 详解：快照
type: item
date: 2023-10-16T17:24:00+08:00
description: 这篇文章会探讨什么是 Btrfs 快照，它们如何工作的，你在日常生活中进行快照的好处。这篇文章是《Btrfs 详解》系列文章中的一篇。从 Fedora Linux 33 开始，Btrfs 就是 Fedora Workstation 和 Fedora Silverblue 的默认文件系统。如果你错过了，这里是本系列的上一篇文章：Btrfs 详解：子卷简介想象一下，你长时间处理一个文件，反复添加和撤销修改。然后，在某个时刻你意识到：两小时前你撤销的部分修改，现在会非常有用。而昨天在你销毁那个设计之前，你也已经修改了这个特殊的部分。当然，由于你会定期保存文件，所以旧的改动会丢失。很多人可能都遇到过这样的情况。如果能恢复旧版本的文件，而无需定期手动复制，岂不美哉？这是一个 Btrfs 快照可以帮助你的特别场景。当你使用正确的话，快照同时也为你的电脑提供了很好的备份方案。下面你会找到一些关于快照的例子。如果你想跟着操作，你必须拥有访问某些 Btrfs 文件系统的权限和 root 权限。你可以通过下面命令来验证一个目录的文件系统。$ findmnt -no FSTYPE /home btrfs 这个命令会输出你 /home/ 目录的文件系统名称。如果它是 btrfs，那就可以了。让我们创建一个新的目录去做实验：$ mkdir ~/btrfs-snapshot-test $ cd ~/btrfs-snapshot-test 在下面的文本中，你会看到很多像上面显示的那样的命令输出框。请在阅读/比较命令输出时请记住，框中的内容在行末会被换行。这使得识别跨多行的长行变得困难，降低了可读性。如果有疑问，试着调整浏览器窗口的大小，看看文本的变化！Btrfs 快照让我们从一个基本的问题开始：什么是 Btrfs 快照？如果你在文档 [1] 和维基 [2] 中查找，你不会立刻找到这个问题的答案。事实上，从“功能”一节里是找不到的。如果你搜索一下，你会发现快照和 Btrfs 子卷一起被大量地提及 [3] 。所以现在做什么呢？还记得快照在系列前面的文章里两次被提到吗？是这样说的：CoW 的优势在哪里？简单的说：文件被修改和编辑的历史被保存了下来。Btrfs 保存文件旧版本的引用（inode）可以轻易地被访问。这个引用就是快照：文件系统在某个时间点的状态镜像。这将是这系列文章里的单独的一篇，所以暂时留到后面介绍。—— Btrfs 详解：基础概念以及：另外一个分离 / 和 /home 的优势是我们可以分别进行 快照 。子卷是快照的边界，对一个子卷的快照永远不会包含该子卷下面的其他子卷的内容。快照的更多细节会在后续的文章中介绍。—— Btrfs 详解：子卷看起来快照是和 Btrfs 子卷相关的。你可能之前在其他地方听到过快照，比如说 LVM（逻辑卷管理器）。虽然技术角度上它们都是为了同一个目的，但它们在实现方面有所不同。每个 Btrfs 快照是一个子卷。但是，不是每个子卷都是一份快照。区别在于子卷里面包含的内容。一个快照是子卷加上一些内容：它包含对现在和过去版本的文件的引用（inode）。让我们看看快照是从哪来的！创建 Btrfs 快照想使用快照功能，你需要一个 Btrfs 子卷来进行快照。让我们在测试目录（~/btrfs-snapshot-test）里创建一个：$ cd ~/btrfs-snapshot-test $ sudo btrfs subvolume create demo Create subvolume './demo' $ sudo chown -R $(id -u):$(id -g) demo/ $ cd demo 因为 Btrfs 子卷默认是被 root 所有的，你必须用 chown 去修改子卷里的文件的所有权到普通用户上。现在我们在里面新加一些文件：$ touch foo bar baz $ echo "Lorem ipsum dolor sit amet, " > foo 你的目录现在看起来像这样：$ ls -l total 4 -rw-r--r--. 1 hartan hartan 0 Dec 20 08:11 bar -rw-r--r--. 1 hartan hartan 0 Dec 20 08:11 baz -rw-r--r--. 1 hartan hartan 29 Dec 20 08:11 foo 让我们从这里创建第一次快照：$ cd .. $ sudo btrfs subvolume snapshot demo demo-1 Create a snapshot of 'demo' in './demo-1' 这就好了。让我们看看发生了什么：$ ls -l total 0 drwxr-xr-x. 1 hartan hartan 18…

使用 Btrfs 快照方便升级 Fedora Linux 且易于回退
type: item
date: 2023-10-09T19:37:24+08:00
description: 在 2018 年的一篇 早前的文章 中，我们介绍了在升级 Fedora Linux 前如何利用 LVM 复制根文件系统，以便在可能出现错误的情况下能有一个回退机制。然而如今，Fedora 工作站的默认安装已经是 Btrfs 文件系统了。现在，你可以利用 Btrfs 快照来更简便地创建一个可引导的回退系统。注意，本文不涉及会如何从其它文件系统转换或迁移到 Btrfs 上。确认根文件系统是否为 Btrfs本示例采用的是 Pinebook aarch64 笔记本电脑。在开始前，务必确认你的根文件系统是否采用 Btrfs。要明确，不是所有的定制版或者镜像文件默认都使用 Btrfs。$ df -T Filesystem Type 1K-blocks Used Available Use% Mounted on devtmpfs devtmpfs 4096 0 4096 0% /dev tmpfs tmpfs 998992 0 998992 0% /dev/shm tmpfs tmpfs 399600 6360 393240 2% /run /dev/mmcblk2p3 btrfs 56929280 39796116 15058348 73% / tmpfs tmpfs 998996 24 998972 1% /tmp tmpfs tmpfs 5242880 0 5242880 0% /var/lib/mock /dev/mmcblk2p3 btrfs 56929280 39796116 15058348 73% /f34 /dev/mmcblk2p3 btrfs 56929280 39796116 15058348 73% /home /dev/mmcblk2p2 ext4 996780 551888 376080 60% /boot /dev/mmcblk2p1 vfat 194348 31648 162700 17% /boot/efi tmpfs tmpfs 199796 100 199696 1% /run/user/1000 tmpfs tmpfs 199796 84 199712 1% /run/user/0 列出当前的 Btrfs 子卷以上的示例输出显示挂载在 “根”（/）的文件系统类型是 Btrfs。你会注意到，有三个挂载点显示了相同的备份设备以及 已用 和 可用 的块数。这是因为它们是从同一 Btrfs 文件系统挂载的不同部分（子卷）。比如，/f34 子卷是我去年创建的那个可引导快照。默认的 Fedora Btrfs 安装会创建一个 Btrfs 文件系统，并在其上分别挂载两个子卷，root 和 home ，挂载路径分别为 / 和 /home。让我们一起来看看我还添加了哪些其它的子卷：$ sudo btrfs subvol list / ID 272 gen 110428 top level 5 path root ID 273 gen 110426 top level 5 path home ID 300 gen 109923 top level 5 path f34 ID 301 gen 95852 top level 5 path home.22Jul26 ID 302 gen 95854 top level 5 path f36.22Jul26 在这里，我们有一个来自最近一次系统升级的 f34 子卷，以及两个只读快照 home 和 f36。要添加和删除这些快照，最简单的方法就是挂载 Btrfs 的根目录。我会更新系统并创建当前 f36 root 子卷的新快照。如果你已经重命名了你的 root 子卷，我相信你知道该如何调整以下的示例以适应你的系统。创建 Btrfs 的回退快照$ sudo dnf update --refresh ...更新了很多部分（如果升级了内核还需要重启） $ sudo mkdir -p /mnt/root $ sudo mount /dev/mmcblk2p3 /mnt/root $ cd /mnt/root $ ls f34 f36.22Jul26 home home.22Jul26 root $ sudo btrfs subvol snapshot root f36 Create a snapshot of 'root' in './f36' 因为 Btrfs 快照是以文件系统为基础的，所以并不需要在创建快照之前进行 “同步”，正如我在 LVM 中建议的。要从新的子卷引导为回退，你需要使用你喜欢的编辑器编辑 /mnt/root/f36/etc/fstab。如果你是刚入门的话，nano 就是一款十分简单的文本编辑器，功能基本够用。以下是我 fstab 文件中的一些行：LABEL=PINE …

Btrfs 详解：子卷
type: item
date: 2023-10-03T19:13:00+08:00
description: 这篇文章是《Btrfs 详解》系列文章中的一篇。从 Fedora Linux 33 开始，Btrfs 就是 Fedora Workstation 和 Fedora Silverblue 的默认文件系统。以防你忘记，这是系列文章中的前一篇：Btrfs 详解：基础概念。简介 子卷 Subvolume 允许将一个 Btrfs 文件系统划分成多个独立的子文件系统。这意味着你可以从 Btrfs 文件系统挂载子卷，就好像它们是独立的文件系统。除此之外，例如，你还可以通过 限额组 qgroup （我们将在本系列的另一篇文章里介绍）定义子卷能够占据的最大空间，或者用子卷去包含或排除快照中的文件（我们会后面的文章中会讲到）。自 Fedora Linux 33 后每个 Fedora Workstation 和 Fedora Silverblue 默认安装过程中会利用子卷。在这篇文章中我们会介绍它是如何工作的。下面你会找到很多关于子卷的例子。如果你想跟着操作，你必须拥有访问某些 Btrfs 文件系统的权限和 root 权限。你可以通过下面命令来验证你的 /home/ 目录是否是 Btrfs 。$ findmnt -no FSTYPE /home btrfs 这个命令会输出你 /home/ 目录的文件系统名。如果它是 btrfs，那就可以了。让我们创建一个新的目录去做实验：$ mkdir ~/btrfs-subvolume-test $ cd ~/btrfs-subvolume-test 在下面的文本中，你会看到很多像上面显示的那样的命令输出框。请在阅读/比较命令输出时请记住，框中的内容在行末会被换行。这使得识别跨多行的长行变得困难，降低了可读性。如果有疑问，试着调整浏览器窗口的大小，看看文本的变化!创建和使用子卷我们可以通过以下命令创建一个 Btrfs 子卷：$ sudo btrfs subvolume create first Create subvolume './first' 当我们检查当前目录，我们可以看到现在有一个名为 first 的新目录。注意到下面输出的第一个字符 d：$ ls -l total 0 drwxr-xr-x. 1 root root 0 Oct 15 18:09 first 我们可以像常规目录一样操作它：我们可以重命名它，移动它，在里面创建新文件和目录，等等。注意到目录属于 root，所以我们必须以 root 身份去做这些事情。如果它表现和看起来就像个目录，那我们如何知道这是不是一个 Btrfs 子卷呢？我们可以使用 btrfs 工具去列出所有子卷：$ sudo btrfs subvolume list . ID 256 gen 30 top level 5 path home ID 257 gen 30 top level 5 path root ID 258 gen 25 top level 257 path root/var/lib/machines ID 259 gen 29 top level 256 path hartan/btrfs-subvolume-test/first 如果你安装的是最新的 Fedora Linux，且未修改过，你很可能会看到和上面一样的输出。我们会在之后检查 home 和 root ，还有全部数字的含义。现在，我们看到在我们指定的路径下有一个子卷。我们可以将输出限制在我们当前位置下面的子卷：$ sudo btrfs subvolume list -o . ID 259 gen 29 top level 256 path home/hartan/btrfs-subvolume-test/first 让我们重命名子卷：$ sudo mv first second $ sudo btrfs subvolume list -o . ID 259 gen 29 top level 256 path home/hartan/btrfs-subvolume-test/second 我们还可以嵌套子卷：$ sudo btrfs subvolume create second/third Create subvolume 'second/third' $ sudo btrfs subvolume list . ID 256 gen 34 top level 5 path home ID 257 gen 37 top level 5 path root ID 258 gen 25 top level 257 path root/var/lib/machines ID 259 gen 37 top level 256 path hartan/btrfs-subvolume-test/second ID 2…

Btrfs 详解：基础概念
type: item
date: 2023-09-14T07:51:00+08:00
description: 这篇文章是《Btrfs 详解》系列文章中的一篇。从 Fedora Linux 33 开始，Btrfs 就是 Fedora Workstation 和 Fedora Silverblue 的默认文件系统。介绍文件系统是现代计算机的基础之一。它是任何操作系统必不可少的一部分，且通常不为人注意。但是，像 Btrfs 这样的现代文件系统提供了许多很棒的特性，使计算机的使用更加方便。例如，它可以无感地为你压缩文件，或者为增量备份建立可靠的基础。这篇文章将带你高屋建瓴地了解 Btrfs 文件系统是如何工作的，有什么特性。本文既不会过多涉及技术细节，也不会研究其底层实现，系列后续的文章会详细介绍一些重要特性。什么是文件系统如果你基本了解过文件系统是如何工作的，那么下面的内容对你应该是不陌生的，你可以直接跳到下一节。否则，请先阅读下面对文件系统的简短介绍。简单来说，文件系统允许你的 PC 去寻找存储在磁盘上的数据。这听起来像是微不足道的工作，但实际上时至今日各种类型的非易失性存储设备（比如机械硬盘、固态硬盘、SD 卡等等）仍然与 1970 年代 PC 被发明时基本相同：一个（巨大的）存储块集合。“ 块 Block ” 是最小的可寻址存储单元。PC 上的每个文件内容被存储在多个块中。一个块通常是 4096 字节的大小。这取决于你的硬件和在这之上的软件（即文件系统）。文件系统允许我们从海量的存储块中查找文件的内容，这是通过所谓的 inode 去实现的。一个 inode 在特殊格式的存储块里记录了文件的信息。这包含文件的大小，哪里去寻找组成文件内容的存储块，访问规则（即谁可读，可写，可执行）等等。下面是 inode 的示意图：inode 的结构对文件系统的功能有巨大的影响，因此它是各种文件系统诸多的重要数据结构之一。出于这个原因，每个文件系统有各自的 inode 结构。如果你想了解更多信息，看看下面 链接 关于 Btrfs 文件系统 inode 结构的内容。如需更详细地了解各个字段的含义，你可以 参考 ext4 文件系统的 inode 结构。写时复制（CoW）文件系统相比 ext4，Btrfs 拥有的杰出特性之一是，它是一个 写时复制 Copy-on-Write （CoW）文件系统。当一个文件被改变和回写磁盘，它不会故意写回它原来的位置，而是被复制和存储在磁盘上的新位置。从这个意义上，可以简单地认为 Cow 是一种 “重定向”，因为文件写入被重定向到不同的存储块上。这听起来很浪费，但实际上并不是。这是因为被修改的数据无论如何一定会被写到磁盘上，不管文件系统是如何工作的。Btrfs 仅仅是确保了数据被写入在之前没被占据的块上，所以旧数据保持完整。唯一真正的缺点就是这种行为会导致文件碎片化比其他文件系统要快。在日常的电脑使用中，你不太可能会注意到这点差异。CoW 的优势在哪里？简单的说：文件被修改和编辑的历史被保存了下来。Btrfs 保存文件旧版本的引用（inode）可以轻易地被访问。这个引用就是快照：文件系统在某个时间点的状态镜像。这将是这系列文章里的单独的一篇，所以暂时留到后面介绍。除了保存文件历史，CoW 文件系统永远处于一致的状态，即使之前的文件系统事务（比如写入一个文件）由于断电等原因没有完成。这是因为文件系统的元数据更新也是写时复制的：文件系统本身永远不会被覆写，所以中断不会使其处于部分写入的状态。对文件的写时复制你可以将文件名视为对 inode 的指针。在写入文件的时候，Btrfs 创建一个被修改文件内容（数据）的拷贝，和一个新的 inode（元数据），然后让文件名指向新的 inode，旧的 inode 保持不变。下面是一个假设示例来阐述这点：这里 myfile.txt 增加了三个字节。传统的文件系统会更新中间的 Data 块去包含新的内容。CoW 文件系统不会改变旧的数据块（图中灰色），写入（复制）更改的数据和元数据在新的地方。值得注意的是，只有被改变的数据块被复制，而不是全部文件。如果没有空闲的块去写入新内容，Btrfs 将从被旧文件版本占据的数据块中回收空间（除非它们是快照的一部分，本系列后续文章会看到）。对目录的写时复制从文件系统的角度看，目录只是特殊类型的文件。与常规文件不同，文件系统直接解释数据块的内容。一个目录有自身的元数据（inode，就像上面说的文件一样）去记录访问权限或修改时间。最简单的形式，存在目录里的数据（被叫作目录项）是一个 inode 引用的列表，每个 inode 又是另外的文件或目录。但是，现代文件系统在目录项中至少会存储一个文件名和对应的 inode 引用。之前已经指出，写入一个文件会创建之前 inode 的副本，并相应修改其内容。从根本上，这产生了一个和之前无关的新的 inode 。为了让被修改的文件对文…

如何将你的文件系统转换为 Btrfs
type: item
date: 2022-05-11T23:46:14+08:00
description: 引言这篇概述文章将告诉你为何以及如何迁移你的当前分区到 Btrfs 文件系统。如果你对此感兴趣，请阅读这篇分步指南来完成。从 Fedora 33 开始，新安装的 Fedora 操作系统默认文件系统为 Btrfs。我确信大部分用户现在已经听说了它的优势：写时复制、内置校验、灵活的压缩方式、简易的快照和回滚方式。它确实是一个现代化的文件系统，为桌面存储带来新的功能。在升级到 Fedora 33 后，我想利用 Btrfs 的优势，但对我个人来说，我不想因为“只是为了改变文件系统”而去重装整个系统。我发现（只有）寥寥无几的具体如何做转换的教程，所以我决定在这里分享我的详细经验。小心！这样做你是在玩火。希望你阅读以下内容时不要感到惊讶：在编辑分区和转换文件系统时，你的数据可能会被破坏和丢失。最终，你可能会得到一个不能启动的操作系统，并面临数据恢复的风险。你可能会无意删除你的分区，或者以其它方式破坏了你的操作系统。这些转换过程即使对于生产系统来说也是安全的 —— 前提是你提前做好了计划，对关键数据做好了备份和回滚计划。作为一个 可以执行超级权限的系统管理员，你可以在没有限制、没有任何常规安全防护措施的情况下，做任何事情。安全的方式：重装 Fedora重装操作系统是转换文件系统到 Btrfs 的 “官方” 方式，推荐给大多数用户使用。因此，如果在这个教程中有那么一点不确定，就选择这种方式。步骤大致如下：备份你的主文件夹和你系统中可能会用到的任何数据，比如 /etc。（编者按：虚拟机也是这样）将已安装的安装包以列表形式保存到到文件中。重新安装 Fedora，删除你当前的分区，并选择新的 Btrfs 默认分区方案。恢复主文件夹的内容，并使用软件包列表文件重装软件包。对于详细的步骤和命令，请看一位社区用户在 ask.fedoraproject.org 站点的评论。如果正确完成，你将得到一个和之前一样的操作系统，使丢失数据的风险最小化。转换的利弊让我们快速澄清一下：这种文件系统转换有什么优势和劣势？优势：当然，不需要重新安装！你的系统里的所有文件和之前一模一样。技术上来说，没有备份的情况下，就地进行是可能的。你会学到许多关于 Btrfs 的知识！如果所有都按计划进行，会是相当快的一个过程。劣势：你必须熟悉终端环境和 shell 命令。你可能会丢失数据，参见上文。如果出了什么问题，你得自己解决。特别之处：你需要大约 20% 的可用磁盘空间才能成功转换。但对于完整的备份和重装方式，你可能需要的空间更多。你可以在转换过程中自定义你分区的所有参数，但如果选择重装，你也可以从 Anaconda 自定义。LVM 怎么办？在近期几次 Fedora 安装中，LVM 布局一直是默认的。如果你有一个带有多个分区（例如 / 和 /home）的 LVM 分区布局，你得以某种方式合并它们，来获得 Btrfs 所有性能。如果选择这样做，你可以单独转换分区到 Btrfs 文件系统，同时保留卷组。然而，迁移到 Btrfs 文件系统的优势之一是摆脱 LVM 分区布局强加的限制。你也可以利用 Btrfs 文件系统提供的收发功能在转换后来合并分区。另见 《Fedora 杂志》： 利用 LVM 回收硬盘空间、从 Btrfs 快照中恢复文件 以及 在 Btrfs 和 LVM-ext4 两者之间做选择。了解 Btrfs建议阅读以下内容对 Btrfs 文件系统是什么有一个基础的了解。如果你没有把握，只有选择重装 Fedora 这种安全的方式。必须了解的：Fedora Magazine：Btrfs 来到 Fedora 33Btrfs 系统管理指南, 尤其是 关于子卷和 flat 子卷布局。btrfs-convert 指南有用的资源：man 8 btrfs – 命令行界面man 5 btrfs – 挂载参数man btrfs-convert – 要用到的转换工具man btrfs-subvolume – 管理子卷转换步骤创建一个实时镜像由于不能转换已挂载的文件系统，我们将通过 Fedora 实时镜像 Live Image 进行。安装 Fedora 镜像写入工具，然后 “烧录” Fedora 33 到你的 U 盘中来创建实时镜像。释放磁盘空间btrfs-convert 会在分区的剩余空间重新创建文件系统的元数据，同时保持所有已有的 ext4 文件系统数据还在它当前的位置上。不幸的是，所需的剩余空间的大小无法提前知道：如果没有足够的空间，转换将会失败（但不会破坏数据）。这里有一些释放空间有用的方法：利用 baobab 来识别大容量的文件和文件夹，然后移除。如果可能的话，不要手动删除主文件夹以外的文件。清理旧的系统日志：journalctl –vacuum-size=100M。如果你正使用 Docker…

硬核观察 #453 微软 Edge 浏览器变成了广告软件
type: item
date: 2021-11-13T02:41:30+08:00
description: 微软 Edge 浏览器变成了广告软件不少用户反馈在升级到 Edge 新版本中出现了 更多的提醒和广告，例如推荐用户使用 Microsoft Start（此前叫做 MSN feed）的服务。微软正在试验更多的广告/推荐，这些广告将出现在浏览器的新标签页中。此外，微软的弹出广告也显示，它正在利用浏览器的新协助功能，从你执行的搜索中收集结果改进其必应搜索引擎。老王点评：这种情况特别像早些年流行的一种软件 AD-Ware。Btrfs 文件系统将改变格式以解决一些严重问题Btrfs 文件系统开发者正在开发一个重磅更新，以解决文件系统设计中的一些“糟糕的部分”，如全局根文件系统中的锁争夺，以及块组项在整个范围树上的传播问题。但这个更新会导致其磁盘格式发生变化，之前的 Btrfs 文件系统需要转换才行。这项工作预计持续 6~12 个月。老王点评：虽然这种开发的初衷是好的，但是引入不兼容性还是要慎重，可以考虑叫 Btrfs2。Chrome 推送企业策略补丁，以阻止查看网页 HTML 源码谷歌在 Chrome 98 中提供了一个 Chrome 企业策略补丁，允许学校 IT 管理员设置 禁止查看 HTML 源代码。开发团队声称这项功能旨在解决学校中某些持续存在的问题，尤其是涉及学生通过查看 HTML 源码来偷看线上测验的答案、或通过技术手段绕过屏蔽站点。这个更新补丁的推出时机，正值前段时间美国密苏里州州长声称“查看 HTML 源码等同于黑客攻击”，因而引发了不少争议。老王点评：其实他们就是想把互联网变成一个不透明的黑盒。

Btrfs 文件系统入门
type: item
date: 2021-05-30T15:02:32+08:00
description: B-tree 文件系统（Btrfs）融合了文件系统和卷管理器。它为 Linux 操作系统提供了高级文件系统应当拥有的诸多不错的功能特性。好几年前 Btrfs 就已经可以在 Linux 中使用了，所以你可能已经熟悉它了。如果没有，你可能对它尚有疑虑，尤其是如果你使用的是 Fedora 工作站 （Btrfs 现在是它的默认文件系统）。本文旨在帮助你熟悉它及其高级功能，例如 写时复制 和 校验和。Btrfs 是 “B-Tree Filesystem” 的缩写，实际上是文件系统和卷管理器的结合体。它通常被视为对 ZFS 的回应，ZFS 早在 2005 年就被引入 Sun 微系统的 Solaris 操作系统中，现在基本上被一个名为 OpenZFS 的开源实现所取代。Ubuntu 和 FreeBSD 常常使用 OpenZFS。其他具有类似特性的示例有红帽的 Stratis 和 Linux 逻辑卷管理器 Logical Volume Manager （LVM）。安装为了尝试 Btrfs，我下载了 Fedora 33 工作站 ISO 文件 并将其安装到一个新的虚拟机（VM）中。安装过程与以前的版本没有变化。我没有自定义任何设置，包括驱动器分区和格式化，以保持本教程的准确“开箱即用”设置。当虚拟机启动并运行后，我安装并运行了 GNOME 分区编辑器（GParted），以获得一个良好的、工厂级的驱动器布局视图。从安装这一点来说，与你以前所习惯的情况没什么不同；事实上，你可以正常使用该系统，甚至可能没有注意到文件系统是 Btrfs。然而，拥有这个新的默认文件系统使你能够利用几个很酷的特性。检查 Btrfs 文件系统我暂时没有找到特定于 Btrfs 的图形工具，尽管它的一些功能已经被合并到现有的磁盘管理工具中。在命令行中，你可以更仔细地查看 Btrfs 格式：# btrfs filesystem show Label: 'fedora_localhost-live' uuid: f2bb02f9-5c41-4c91-8eae-827a801ee58a Total devices 1 FS bytes used 6.36GiB devid 1 size 10.41GiB used 8.02GiB path /dev/vda3 修改 Btrfs 标签我首先注意到的是安装程序设置的文件系统标签：fedora_localhost-live。这是不准确的，因为它现在是一个已安装的系统，不再是 livecd。所以我使用 btrfs filesystem label 命令对其进行了更改。修改 Btrfs 标签非常的简单：# btrfs filesystem label / fedora_localhost-live # btrfs filesystem label / fedora33workstation # btrfs filesystem label / fedora33workstation 管理 Btrfs 子卷子卷看起来像是可以由 Btrfs 管理的标准目录。我的新 Fedora 33 工作站上有几个子卷：# btrfs subvolume list / ID 256 gen 2458 top level 5 path home ID 258 gen 2461 top level 5 path root ID 265 gen 1593 top level 258 path var/lib/machines 使用 btrfs subvolume Create 命令创建新的子卷，或使用 btrfs subvolume delete 删除子卷：# btrfs subvolume create /opt/foo Create subvolume '/opt/foo' # btrfs subvolume list / ID 256 gen 2884 top level 5 path home ID 258 gen 2888 top level 5 path root ID 265 gen 1593 top level 258 path var/lib/machines ID 276 gen 2888 top level 258 path opt/foo # btrfs subvolume delete /opt/foo Delete subvolume (no-commit): '/opt/foo' 子卷允许设置配额、拍摄快照以及复制到其他位置和其他主机等操作。那么系统管理员如何利用这些功能？用户主目录又是如何操作的呢？添加用户就像从前一样，添加一个新的用户帐户会创建一个主目录供该帐户使用：# useradd student1 # getent passwd s…

Btrfs 和 LVM-ext4 该如何选择？
type: item
date: 2021-01-23T21:31:51+08:00
description: Fedora 33 在其各类桌面版本中引入了新的默认文件系统 Btrfs。多年以来，Fedora 一直在 逻辑卷管理 Logical Volume Manager （LVM） 卷之上使用 ext4，引入 Brtfs 对 Fedora 来说是一个很大的转变。更改默认文件系统需要 令人信服的原因。虽然 Btrfs 是令人兴奋的下一代文件系统，但 LVM 上的 ext4 是成熟而稳定的。本指南旨在探索各自的高级特性，使得更容易在 Btrfs 和 LVM-ext4 之间进行选择。先说结论最简单的建议是坚持使用默认值。全新安装的 Fedora 33 环境默认为 Btrfs，升级之前的 Fedora 版本将继续使用最初安装的设置，通常是 LVM-ext4。对于现有的 Fedora 用户来说，获取 Btrfs 的最简单方式是全新安装。然而，全新安装比简单升级更具破坏性。除非有特殊需要，否则这种干扰可能是不必要的。Fedora 开发团队仔细考虑了这两个默认值，因此对任何一个选择都要有信心。那么其他文件系统呢？现在有很多 Linux 系统的文件系统。在加上卷管理器、加密方法和存储机制的组合后，这一数字呈爆炸式增长。那么，为什么要关注 btrfs 和 LVM-ext4 呢？对于 Fedora 的用户来说，这两种设置可能是最常见的。在 Fedora 11 中，LVM 之上的 ext4 成为了默认磁盘布局，在此之前则使用的是 ext3。既然 Btrfs 是 Fedora 33 的默认设置，那么绝大多数现有用户会考虑是应该原地踏步还是向前跳跃。面对全新安装的 Fedora 33 环境，有经验的 Linux 用户可能会想知道是使用这个新的文件系统，还是退回到他们熟悉的文件系统。因此，在众多可能的存储选项中，许多 Fedora 用户会想知道如何在 Btrfs 和 LVM-ext4 之间进行选择。两者的共性尽管两个文件系统之间存在核心差异，但 Btrfs 和 LVM-ext4 实际上有很多共同之处。两者都是成熟且经过充分测试的存储技术。从 Fedora Core 的早期开始，就一直在使用 LVM，而 ext4 在 2009 年成为 Fedora 11 的默认设置。Btrfs 在 2009 年并入 Linux 主线内核，并且 Facebook 广泛使用了该文件系统。SUSE Linux Enterprise 12 在 2014 年使其成为默认文件系统。因此，它在生产环境中也有着长久的运行时间。这两个系统都能很好地防止因意外停电而导致的文件系统损坏，尽管它们的实现方式不同。它们支持的配置包括使用单盘设置和跨越多个设备，并且这两种配置都能够创建近乎即时的快照。有各种工具可以帮助管理这两种系统，包括命令行和图形界面。这两种解决方案在家用台式机和高端服务器上都同样有效。LVM-ext4 的优势ext4 文件系统 专注于高性能和可伸缩性，没有太多额外的花哨之处。它能有效地防止长时间后的碎片化，并当碎片化出现后提供了 很好的工具。ext4 之所以坚如磐石，是因为它构建在前代的 ext3 文件系统之上，带来了多年的系统内测试和错误修复。LVM-ext4 环境中的大多数高级功能都来自 LVM 本身。LVM 位于文件系统的“下方”，这意味着它支持任何文件系统。 逻辑卷 Logical volume （LV）是通用的块设备，因此 虚拟机可以直接使用它们。这种灵活性使得每个逻辑卷都可以使用合适的文件系统，用合适的选项应对各种情况。这种分层方法还遵循了“小工具协同工作”的 Unix 哲学。从硬件抽象出来的 卷组 volume group （VG）允许 LVM 创建灵活的逻辑卷。每个逻辑卷都提取自同一个存储池，但具有自己的设置。调整卷的大小比调整物理分区的大小容易得多，因为没有数据有序放置的限制。LVM 物理卷 physical volume （PV）可以是任意数量的分区，甚至可以在系统运行时在设备之间移动。LVM 支持只读和读写的 快照，这使得从活动系统创建一致的备份变得很容易。每个快照都有一个定义的大小，更改源卷或快照卷将占用其中的空间。又或者，逻辑卷也可以是 稀疏配置池 thinly provisioned pool 的一部分。这允许快照自动使用池中的数据，而不是使用在创建卷时定义的固定大小的块。有多个磁盘驱动器的 LVM当有多个设备时，LVM 才真正大放异彩。它原生支持大多数 RAID 级别，每个逻辑卷可以具有不同的 RAID 级别。LVM 将自动为 RAID 配置选择适当的物理设备，或者用户可以直接指定它。基本的 RAID 支持包括用于性能的数据条带化（RAID0）和用于冗余的镜像（RAID1）。逻辑卷也可以使用 RAID5、RAID6 和 RAID10 等高级设置。LVM …

使用 Btrfs 快照进行增量备份
type: item
date: 2020-09-26T19:26:58+08:00
description: 快照 snapshot 是 Btrfs 的一个有趣的功能。快照是一个子卷的副本。生成快照是立即的。然而，生成快照与执行 rsync 或 cp 不同，快照并不是一创建就会占用空间。编者注：来自 BTRFS Wiki：快照简单的来说就是一个子卷，它使用 Btrfs 的 COW 功能与其他子卷共享其数据（和元数据）。占用的空间将随着原始子卷或快照本身（如果它是可写的）的数据变化而增加。子卷中已添加/修改的文件和已删除的文件仍然存在于快照中。这是一种方便的备份方式。使用快照进行备份快照驻留在子卷所在的同一磁盘上。你可以像浏览普通目录一样浏览它，并按照生成快照时的状态恢复文件的副本。顺便说一下，在快照子卷的同一磁盘上生成快照并不是一个理想的备份策略：如果硬盘坏了，快照也会丢失。快照的一个有趣的功能是可以将快照发送到另一个位置。快照可以被发送到外部硬盘或通过 SSH 发送到远程系统（目标文件系统也需要格式化为 Btrfs）。要实现这个，需要使用命令 btrfs send 和 btrfs receive。生成快照要使用 btrfs send 和 btrfs receive 命令，重要的是要将快照创建为只读，而快照默认是可写的。下面的命令将对 /home 子卷进行快照。请注意 -r 标志代表只读。sudo btrfs subvolume snapshot -r /home /.snapshots/home-day1 快照的名称可以是当前日期，而不是 day1，比如 home-$(date +%Y%m%d)。快照看起来像普通的子目录。你可以把它们放在任何你喜欢的地方。目录 /.snapshots 可能是一个不错的选择，以保持它们的整洁和避免混淆。编者注：快照不会对自己进行递归快照。如果你创建了一个子卷的快照，子卷所包含的每一个子卷或快照都会被映射到快照里面的一个同名的空目录。使用 btrfs send 进行备份在本例中，U 盘中的目标 Btrfs 卷被挂载为 /run/media/user/mydisk/bk。发送快照到目标卷的命令是：sudo btrfs send /.snapshots/home-day1 | sudo btrfs receive /run/media/user/mydisk/bk 这被称为初始启动，它相当于一个完整的备份。这个任务需要一些时间，取决于 /home 目录的大小。显然，后续的增量发送只需要更短的时间。增量备份快照的另一个有用的功能是能够以增量的方式执行发送任务。让我们再来生成一个快照。sudo btrfs subvolume snapshot -r /home /.snapshots/home-day2 为了执行增量发送任务，需要指定上一个快照作为基础，并且这个快照必须存在于源文件和目标文件中。请注意 -p 选项。sudo btrfs send -p /.snapshot/home-day1 /.snapshot/home-day2 | sudo btrfs receive /run/media/user/mydisk/bk 再来一次（一天之后）：sudo btrfs subvolume snapshot -r /home /.snapshots/home-day3 sudo btrfs send -p /.snapshot/home-day2 /.snapshot/home-day3 | sudo btrfs receive /run/media/user/mydisk/bk 清理操作完成后，你可以保留快照。但如果你每天都执行这些操作，你可能最终会有很多快照。这可能会导致混乱，并可能会在你的磁盘上使用大量的空间。因此，如果你认为你不再需要一些快照，删除它们是一个很好的建议。请记住，为了执行增量发送，你至少需要最后一个快照。这个快照必须存在于源文件和目标文件中。sudo btrfs subvolume delete /.snapshot/home-day1 sudo btrfs subvolume delete /.snapshot/home-day2 sudo btrfs subvolume delete /run/media/user/mydisk/bk/home-day1 sudo btrfs subvolume delete /run/media/user/mydisk/bk/home-day2 注意：第 3 天的快照被保存在源文件和目标文件中。这样，明天（第 4 天），你就可以执行新的增量 btrfs send。最后的建议是，如果 U 盘的空间很大，可以考虑在目标盘中保留多个快照，而在源盘中只保留最后一个快照。via: https://fedoramagazine.org/btrfs-snapshot…