TranslateProject/translated/tech/20210122 Convert your filesystem to Btrfs.md
北梦南歌 ea46b01373
Translated
翻译完成
2022-05-01 21:51:03 +08:00

15 KiB
Raw Blame History

将你的文件系统转换为 Btrfs

引言

这篇文章是关于为什么,怎样来迁移你的当前分区到 Btrfs 文件系统的一个概述。如果你对自己做这件事感到好奇,请通过一步步阅读跟着这个操作这是怎样来完成的。

启动 Fedora 33新安装的操作系统默认文件系统为 Btrfs。我非常确定许多用户已经听说过它的优势写时复制内置校验灵活的压缩参数简易的快照和回滚方式。它真的时一个现代化的文件系统为桌面存储带来新的功能。

更新到 Fedora 33我想充分利用 Btrfs 的优势,但是对我个人来说不想因为 ‘只是文件系统变化’ 去重装整个系统。我发现关于怎样具体的去做 [没有] 多少教程,所以我决定在这里分享我的详细经验。

小心 !

这样做你是在玩火。希望你阅读一下内容不要感到惊讶:

在编辑分区和转换文件系统时,你的数据可能会被破坏和丢失。最终,你可能会得到一个不能启动的操作系统并面临数据恢复的风险。你可能会无意删除你的分区或者伤害到你的操作系统。

这些转换过程即使对于生产系统来说也是安全的 - 前提是你提前做好计划已经对关键数据做好备份和回滚计划。作为一个_系统管理员_在没有任何常规安全警告保护你的情况下你可以无限制的做任何事情。

安全的方式: 重装 Fedora

重装操作系统是转换文件系统到 Btrfs 的 ‘官方’ 操作,简易大多数用户使用。因此,如果在这个教程中对于一些点不那么确定,就选择这种方式。步骤大致如下:

  1. 备份你的 home 文件夹和你系统中可能会用到的任何数据,比如 /etc。[编者按:虚拟机也是这样]
  2. 已安装的安装包已列表形式保存到到文件中。
  3. 通过移除当前分区并选择有 Btrfs 文件系统的新默认分区来重新安装系统。
  4. 恢复 home 文件夹的内容并使用软件包列表文件重装软件包。

对于详细的步骤和命令,查看一个社区用户在 ask.fedoraproject.org 站点的评论。如果你做的好,你将得到一个和之前一样的操作系统,是丢失数据的风险最小化。

转换的利弊

让我们快速搞清楚:这个文件系统转换有什么优势和劣势?

优势
  • 当然,不必要重新安装!系统里的所有文件和之前一模一样。
  • 技术上来说,没有备份的情况下,就地进行是可能的。
  • 你会学到许多关于 Btrfs 的知识!
  • 如果所有都按计划进行,会是相当快的一个过程。
劣势
  • 你必须熟悉终端环境和 shell 命令。
  • 你可能会丢失数据,参见以上。
  • 如果出了什么问题,你得自己解决。
危险
  • 你将需要大约磁盘容量 20% 的剩余空间来成功转换。但是因为完全备份和重装环境,可能需要的空间更多。
  • 你可以在转换过程中自定义你分区的所有参数,但如果选择重装,你也可以从 Anaconda 自定义。

LVM逻辑卷管理 怎么办?

在近期几次 Fedora 安装中LVM 布局是默认出现的。如果你有多个分区的 LVM 分区布局,例如 //home,你可以以某种方式合并他们来获得 Btrfs 所有性能。

如果选择这样做,你可以单独转换分区到 Btrfs 文件系统,同时保留卷组。然而,迁移到 Btrfs 文件系统的优势之一是摆脱 LVM 分区布局强加的限制。你也可以利用 btrfs 文件系统提供的收发功能在转换后来合并分区。

另见 Fedora 杂志: 利用LVM回收硬盘空间, 从 Btrfs 快照中恢复文件 以及 在 Btrfs 和 LVM-ext4 两者之间做选择.

了解 Btrfs

建议阅读以下内容对 Btrfs 文件系统是什么有一个基础的了解。如果你不确信,只有选择重装 Fedora 这种安全的方式。

必须了解的
有用的资源

转换步骤

创建一个 live 镜像

由于不能转换挂载了的文件系统,我们将在 Fedora live 镜像进行。安装 Fedora 镜像写入工具 然后 ‘烧录’ Fedora 33 到你的 U 盘中。

释放磁盘空间

btrfs-转换 将会在分区的剩余空间重建文件系统的元数据,同时保持所有存在的 ext4 文件系统数据还在它当前的位置上。

不幸的是,剩余空间的大小无法提前知道 - 如果没有足够的空间,转换将会失败 (不会伤害数据) 。这里有一些释放空间有用的方法:

  • 利用 baobab 来识别大容量文件和文件夹然后移除。如果可能的话,不要手动删除 home 文件夹意外的文件。
  • 清理旧的系统日志: journalctl vacuum-size=100M
  • 如果你正使用 Docker小心的使用类似 docker volume prune, docker image prune -a 这样的工具。
  • 清理内部闲置的虚拟机镜像,比如 GNOME Boxes 。
  • 清理闲置的软件包和 flatpaks 包: dnf autoremove, flatpak remove unused
  • 清理软件包缓存: pkcon refresh force -c -1, dnf clean all
  • 如果你足够自信,你可以谨慎的清理 ~/.cache 文件夹。
转换到 Btrfs

备份你所有有价值的数据,确保你的系统是完全更新了的,然后重启到 live 镜像。运行 gnome-disks 工具找到你所拥有的设备,比如 /dev/sda1 (如果你在使用 LVM ,它可能看起来有所不同)。检查文件系统然后执行转换: [编者按:以下命令使用 root 用户运行,谨慎使用!]

$ sudo su -
# fsck.ext4 -fyv /dev/sdXX
# man btrfs-convert (read it!)
# btrfs-convert /dev/sdXX

这将会花十几分钟甚至几个小时,依据分区的大小和你是机械硬盘还是固态硬盘。如果你看到错误,你可能需要更多剩余空间。作为最后的手段,你可以尝试 btrfs-convert -n

怎样回滚?

如果因为某些原因转换失败,你的分区会保留 ext4 文件系统或者它之前的内容。成功转换之后如果你想回滚,就这么简单

# btrfs-convert -r /dev/sdXX

警告! 如果你做了这些中的一个,你将永久失去回滚的功能:碎片整理,均衡或者删除 ext2_保留的 子卷。

由于 Btrfs 文件系统写时复制的天然属性,你可以安全的复制,移动甚至删除文件,创建子卷,因为 保留的_ext2 能保留旧数据。

挂载和检查

现在这个分区已经有了 btrfs 文件系统。挂载它然后查看你的文件...和子卷!

# mount /dev/sdXX /mnt
# man btrfs-subvolume (read it!)
# btrfs subvolume list / (-t for a table view)

因为你已经阅读了 相关的手册页,你应该知道创建子卷快照是安全的,并且有 保留的_ext2 子卷作为你之前数据的简易备份。

是时候阅读 Btrfs 系统管理指南了,这样你就不会吧常规文件和子卷混淆了。

创建子卷

我们将完成一个 flat 子卷布局,和 Anaconda 默认创建的是相同的:

toplevel (volume root directory, not to be mounted by default)
  +-- root (subvolume root directory, to be mounted at /)
  +-- home (subvolume root directory, to be mounted at /home)

你可以跳过这个步骤,或者决定使用一个不同的布局。这个特定结构的优势是你可以轻松的创建 /home 快照,并且对每个子卷使用不同的压缩和挂载参数。

# cd /mnt
# btrfs subvolume snapshot ./ ./root2
# btrfs subvolume create home2
# cp -a home/* home2/

这里我们已经创建了两个子卷。 root2 是分区的完整快照,而 home2 开始作为一个空子卷然后我们往里复制内容。(这个 cp 命令不会查重数据,所以会很快。)

  • /mnt 目录(顶层子卷)除了_root2_, home2保留的_ext2 ,删除所有文件。
  • 重命名 root2home2 子卷为 roothome
  • root 子卷里, 空出 home 目录, 以至于之后我们能够挂载 home 子卷。

都做对了,那就很简单了!

修改 fstab 分区表

为了重启之后挂载新卷, fstab 必须要修改,用新的来代替旧的 ext4 文件系统挂载行。

你可以使用 blkid 命令来了解你的分区的 UUID。

UUID=xx / btrfs subvol=root 0 0
UUID=xx /home btrfs subvol=home 0 0

(注意如果引用的是相同的两个分区,那么这两个 UUID 是相同的。)

对于新的 Fedora 33 安装来说这些都是缺省的。在_fstab_ 你也可以选择自定义压缩和添加类似 noatime 这样的参数。

查看 关于压缩的维基页面man 5 btrfs 了解所有相关的参数。

从镜像 Chroot 到系统

如果你曾经做过系统恢复,我确信你知道这些命令。这里,我们将得到一个 shell 提示符,在你的带有网络访问的系统 里面 ,这是必要的。

首先,我们必须重新挂载 root 子卷到 /mnt 目录,然后挂载 /boot/boot/efi 分区 (依赖于你的文件系统布局,它们可能有所不同)

# umount /mnt
# mount -o subvol=root /dev/sdXX /mnt
# mount /dev/sdXX /mnt/boot
# mount /dev/sdXX /mnt/boot/efi

然后我们继续挂载系统设备:

# mount -t proc /proc /mnt/proc
# mount --rbind /dev /mnt/dev
# mount --make-rslave /mnt/dev
# mount --rbind /sys /mnt/sys
# mount --make-rslave /mnt/sys
# cp /mnt/etc/resolv.conf /mnt/etc/resolv.conf.chroot
# cp -L /etc/resolv.conf /mnt/etc
# chroot /mnt /bin/bash
$ ping www.fedoraproject.org
重装 GRUB & 内核

最容易的方法就是重装 GRUB 和 内核,因为它完成了所有必要的配置 - 现在我们可以网络访问了 。所以,在 chroot 内部:

# mount /boot/efi
# dnf reinstall grub2-efi shim
# grub2-mkconfig -o /boot/efi/EFI/fedora/grub.cfg
# dnf reinstall kernel-core
...or just renegenerating initramfs:
# dracut --kver $(uname -r) --force

如果你是支持 UEFI 功能的系统,这里是适用的。如果你是 BIOS 功能的系统,查看一下文档。重启之前,让我们查看是否一切就绪:

# cat /boot/grub2/grubenv
# cat /boot/efi/EFI/fedora/grub.cfg
# lsinitrd /boot/initramfs-$(uname -r).img | grep btrfs

你应该有合适的分区 UUIDs 或者在 grubenvgrub.cfg 查阅 (grubenv 可能没有更新, 如有必要可以编辑它) 并且在 initramfs 镜像中的 grub.cfgbtrfs 模块里查看 insmod btrfs

另见: 重装 GRUB 2 和 在 Fedora 系统管理指南针中 验证初始化 RAM 磁盘映像

重启

现在系统能够正常启动。如果不能,别慌,回到 live 镜像修理问题。最次了,你可以从那里重装 Fedora 。 Now your system should boot properly. If not, dont panic, go back to the live image and fix the issue. In the worst case, you can just reinstall Fedora from right there.

首次启动之后

检查你的新 Btrfs 文件系统一切都好。如果你乐意,你需要回收旧的 ext4 快照用过的空间,碎片和平衡子卷。后两者可能要花一些时间,并且资源会很紧张。

你必须这样挂载顶级子卷:

# mount /dev/sdXX -o subvol=/ /mnt/someFolder
# btrfs subvolume delete /mnt/someFolder/ext2_saved

然后,当机器有空闲时间时,运行这些:

# btrfs filesystem defrag -v -r -f /
# btrfs filesystem defrag -v -r -f /home
# btrfs balance start -m /

最后, 新安装的系统会将 “写时复制” 属性 为虚拟机镜像文件夹自动设置。如果你使用虚拟机的话,可以设置它:

#  chattr +C /var/lib/libvirt/images
$  chattr +C ~/.local/share/gnome-boxes/images

这些属性只会对在这些文件夹里的新文件生效。有重复镜像删除旧的镜像。你可以通过 lsattr 确认结果。

结尾

我真心希望你发现这个教程是有用的并且能够并就是否在您的系统上转换为Btrfs做出谨慎而明智的决定。祝你成功转换

在评论中分享你的经验,或者遇到更加深刻的问题,请访问 ask.fedoraproject.org


via: https://fedoramagazine.org/convert-your-filesystem-to-btrfs/

作者:Gergely Gombos 选题:lujun9972 译者:hwlife 校对:校对者ID

本文由 LCTT 原创编译,Linux中国 荣誉推出