简介这篇概述文章将告诉您为什么以及如何将当前分区迁移到Btrfs文件系统。如果您有兴趣,请阅读本分步指南以完成它。从Fedora33开始,新安装的Fedora操作系统的默认文件系统是Btrfs。我相信大多数用户现在已经听说过它的优势:写时复制、内置校验和、灵活的压缩、简单的快照和回滚。它确实是一个为桌面存储带来新功能的现代文件系统。升级到Fedora33后,我想利用Btrfs,但就我个人而言,我不想“只是为了更改文件系统”而重装整个系统。我发现(只)很少有关于如何进行转换的教程,所以我决定在这里分享我的详细经验。小心!这样做是在玩火。希望您在阅读本文时不会感到惊讶:在编辑分区和转换文件系统时,您的数据可能会损坏和丢失。最后,您可能会遇到无法启动的操作系统并冒着数据恢复的风险。您可能会无意中删除您的分区,或者以其他方式损坏您的操作系统。即使对于生产系统,这些转换也是安全的——前提是您提前计划并为关键数据制定备份和回滚计划。作为拥有超级权限的系统管理员,您可以不受限制地做任何事情,也不需要任何正常的安全预防措施。安全方式:重新安装Fedora重新安装操作系统是将文件系统转换为Btrfs的“官方”方式,建议大多数用户使用。所以,如果您对本教程有一点不确定,那就去做吧。步骤大致如下:备份您的主文件夹和您可能在系统上使用的任何数据,例如/etc。(编者按:虚拟机也是如此)将安装好的安装包以列表的形式保存到文件中。重新安装Fedora,删除当前分区,然后选择新的Btrfs默认分区方案。恢复主文件夹的内容并使用包列表文件重新安装包。有关详细步骤和命令,请参阅ask.fedoraproject.org站点上社区用户的评论。如果操作正确,您最终会得到一个看起来与以前完全一样的操作系统,从而最大限度地降低丢失数据的风险。转换的优点和缺点让我们快速澄清一下:这种文件系统转换的优点和缺点是什么?优点:当然不需要重装!您系统中的所有文件都与以前完全相同。技术上可以在没有备份的情况下就地执行此操作。您将学到很多关于Btrfs的知识!如果一切按计划进行,这将是一个相当快的过程。缺点:您必须熟悉终端环境和shell命令。您可能会丢失数据,请参见上文。如果出现问题,您必须自己解决。特别之处:您需要大约20%的可用磁盘空间才能成功转换。但是对于完整备份和重新安装方法,您可能需要更多空间。您可以在转换过程中自定义您的分区的所有参数,但如果您选择重新安装,您也可以从Anaconda自定义它。LVM呢?LVM布局已成为最近几个Fedora安装的默认布局。如果您的LVM分区布局包含多个分区(例如/和/home),您可以以某种方式组合它们以获得Btrfs的所有性能。如果您选择这样做,您可以将分区单独转换为Btrfs文件系统,同时保留卷组。但是,迁移到Btrfs文件系统的优势之一是不受LVM分区布局强加的限制。您也可以使用Btrfs文件系统提供的发送和接收功能,在转换后合并分区。了解Btrfs建议阅读以下内容以基本了解什么是Btrfs文件系统。如果您不确定,唯一安全的方法是重新安装Fedora。必知:FedoraMagazine:BtrfscomestoFedora33Btrfs系统管理指南,特别是关于subvolume和flatsubvolumelayout。btrfs-convert指南的有用资源:man8btrfs–命令行界面man5btrfs–挂载参数manbtrfs-convert–使用转换工具manbtrfs-subvolume–管理子卷转换步骤创建一个实时镜像,因为它无法转换挂载的文件系统,我们会通过Fedora实时镜像LiveImage。安装Fedora映像写入工具,然后将Fedora33“刻录”到您的U盘以创建实时映像。可用磁盘空间btrfs-convert将在分区的剩余空间中重新创建文件系统元数据,同时将所有现有的ext4文件系统数据保留在其当前位置。不幸的是,无法预先知道所需剩余空间的大小:如果没有足够的空间,转换将失败(但不会破坏数据)。以下是一些释放空间的有用方法:使用baobab识别大文件和文件夹并将其删除。如果可能,请不要手动删除主文件夹之外的文件。清理旧系统日志:journalctl–vacuum-size=100M。如果您使用的是Docker,请谨慎使用dockervolumeprune、dockerimageprune-a等工具。清理GNOMEBoxes等虚拟机中未使用的映像。清理未使用的包和Flatpak包:dnfautoremove、flatpakremove–unused。清理包缓存:pkconrefreshforce-c-1,dnfcleanall。如果确定,您可以仔细清理~/.cache文件夹。切换到Btrfs以备份您所有宝贵的数据,确保您的系统已完全更新,然后重新启动以进行实时镜像。运行gnome-disks工具以找到您拥有的设备的路径,比如/dev/sda1(如果您使用的是LVM,它可能看起来会有所不同)。检查文件系统并进行转换:(编者注:以下命令以root用户运行,慎用!)$sudosu-#fsck.ext4-fyv/dev/sdXX(请替换为你的具体设备路径)#manbtrfs-convert(readit)#btrfs-convert/dev/sdXX(请替换为你具体的设备路径)这需要十分钟甚至几个小时,取决于分区的大小和是否是机械硬盘驱动器或固态驱动器。如果您看到错误,您可能需要更多可用空间。不得已,您可以尝试btrfs-convert-n。如何回滚?如果由于某种原因转换失败,您的分区将保留在ext4文件系统或之前的文件系统上。如果你想在成功转换后回滚,很简单:#btrfs-convert-r/dev/sdXX警告!如果您执行以下操作之一,您将永久失去回滚的能力:碎片整理、重新平衡或删除ext2_saved子卷。得益于Btrfs文件系统的写时复制功能,您可以安全地复制/移动甚至删除文件、创建子卷,因为ext2_saved将继续引用旧数据。挂载并检查现在分区应该已经有一个Btrfs文件系统了。安装它并查看您的文件......和子卷!#mount/dev/sdXX/mnt(请替换成你的具体设备路径)#manbtrfs-subvolume(阅读)#btrfssubvolumelist/(使用-t以表格形式查看)因为你已经阅读了相关的,你应该知道创建子卷快照是安全的,并且将ext2保存的子卷作为以前数据的简单备份。创建子卷我们要实现一个“扁平化”的子卷布局,和Anaconda默认创建的布局是一样的:toplevel(卷根目录,默认不能挂载)+--root(子卷根目录,也就是mountedto/)+--home(subvolumeroot,mountedat/home)你可以跳过这一步,或者使用不同的布局。这种特殊结构的优点是您可以轻松地为每个子卷使用不同的压缩和挂载参数创建/home的快照。#cd/mnt#btrfssubvolumesnapshot././root2#btrfssubvolumecreatehome2#cp-ahome/*home2/这里我们创建了两个子卷。Root2是一个完整的分区快照,而home2开始时是一个空的子卷,然后我们将内容复制到其中。(这个cp命令不会重复数据,所以会很快。)在/mnt目录(顶级子卷)中,删除root2,home2和除了ext2_saved之外的所有内容。将root2和home2子卷重命名为root和home。在根子卷中,清空主目录,以便我们稍后可以挂载主子卷。如果你做对了,那很容易!修改fstab分区表为了在重启后挂载新卷,必须修改fstab以用新行替换旧的ext4文件系统挂载行。您可以使用blkid命令查找分区的UUID。UUID=xx/btrfssubvol=root00(请替换成你具体的UUID)UUID=xx/homebtrfssubvol=home00(请替换成你具体的UUID)(注意如果指向同一个分区,那么这些两个UUID相同。)这些是Fedora33全新安装的默认值。在fstab中你也可以选择自定义压缩并添加noatime之类的参数。有关所有相关参数,请参阅有关压缩参数的wiki页面和man5btrfs。chroot到系统如果你做过系统恢复,我想你一定知道这些命令。在这里,我们将基本上在您的系统内部获得一个shell提示符,并且可以访问网络。首先,我们必须将根子卷重新挂载到/mnt目录,然后挂载/boot和/boot/efi分区(它们可能不同,取决于你的文件系统布局):#umount/mnt#mount-osubvol=root/dev/sdXX/mnt(请替换为您的具体设备路径)#mount/dev/sdXX/mnt/boot(请替换为您的具体设备路径)#mount/dev/sdXX/mnt/boot/efi(请替换成你具体的设备路径)然后我们继续挂载系统设备:#mount-tproc/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.confconf/mnt/etc#chroot/mnt/bin/bash$pingwww.fedoraproject.org重新安装GRUB和内核最简单的事情就是重新安装GRUB和内核,因为它完成了所有必要的配置-现在我们可以访问网络。因此,在chroot环境中:#mount/boot/efi#dnfreinstallgrub2-efishim#grub2-mkconfig-o/boot/efi/EFI/fedora/grub.cfg#dnfreinstallkernel-core...或者简单地重新安装生成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|grepbtrfs你应该有正确的分区UUID或在grubenv和grub.cfg中指向它(grubenv可能不会更新,必要时编辑它),以及在grub中。请参阅cfg中的insmodbtrfs配置和initramfs映像中的btrfs模块。另请参阅:《Fedora系统管理指南》中的重新安装GRUB2和验证初始RAM磁盘映像。现在重新启动系统正常启动。如果不行,不要惊慌,回到实时镜像修复这个问题。最坏的情况是,您可以从那里重新安装Fedora。首次启动后检查新的Btrfs文件系统,一切正常。如果您认为还可以,则需要回收旧的ext4快照所占用的空间,对子卷进行碎片整理和平衡。后两者可能需要一些时间并且非常耗费资源。为此,您必须像这样安装顶级子卷:#mount/dev/sdXX-osubvol=//mnt/someFolder#btrfssubvolumedelete/mnt/someFolder/ext2_saved然后,当机器有空闲时间时,运行这些命令:#btrfsfilesystemdefrag-v-r-f/#btrfsfilesystemdefrag-v-r-f/home#btrfsbalancestart-m/最后还有一个“non-copy-on-write”属性,用于新系统,此属性会自动为虚拟机映像文件夹设置。如果你使用虚拟机,你可以设置它:#chattr+C/var/lib/libvirt/images$chattr+C~/.local/share/gnome-boxes/images这个属性只会在这些文件夹中新的文件生效。复制镜像并删除原镜像,可以用lsattr确认结果。总结我真心希望您发现本教程有用,并使您能够就是否在您的系统上转换为Btrfs做出谨慎而明智的决定。祝您转换顺利!
