云网牛站
所在位置:首页 > Linux教程 > 将文件系统转换为Btrfs,即将当前分区迁移到Btrfs文件系统

将文件系统转换为Btrfs,即将当前分区迁移到Btrfs文件系统

2021-01-27 16:00:34作者:王沸稿源:云网牛站

从Fedora 33 Linux版本开始,新安装的默认文件系统现在为Btrfs,它有很多的优点:写时复制、内置校验和、灵活的压缩选项、简单的快照和回滚方法,它实际上是一个现代文件系统,为桌面存储带来了新功能。更新到Fedora 33时,我想利用Btrfs的优势,但个人不想为了只是更改文件系统而重新安装整个系统,所以本文介绍将文件系统转换为Btrfs的方法。可先参考在Btrfs和LVM-ext4之间怎么选择:附详细的高级功能介绍

将文件系统转换为Btrfs,即将当前分区迁移到Btrfs文件系统

 

声明和安全的方法

1、声明

在编辑分区和转换文件系统期间,您可能会损坏或丢失数据。您可能会遇到无法启动的系统的情况,并且可能要面对数据恢复。您可能会无意中删除分区或以其他方式损害系统。

即使对于生产系统,这些转换过程也将是安全的,但前提是您事先计划好。

2、安全的方法:重新安装Fedora

重新安装操作系统是向大多数用户推荐的转换为Btrfs的稳定方式。因此,如果不确定本文中的任何内容,请选择此选项。这些步骤大致如下:

1]、备份您的主文件夹以及系统中可能使用的所有数据,例如/etc。

2]、将已安装软件包的列表保存到文件中。

3]、通过删除当前分区并使用Btrfs选择新的默认分区方案来重新安装Fedora。

4]、恢复主文件夹的内容,然后使用软件包列表重新安装软件包。

参考:安装Fedora 33指导:附Fedora 33安装全过程截图

3、关于LVM的说明

在最近的Fedora安装中,LVM布局已成为默认设置。如果您具有包含多个分区的LVM分区布局,例如/和/home,您必须以某种方式将它们合并才能享受Btrfs的所有好处。

如果选择这样做,则可以在保留卷组的同时将分区分别转换为Btrfs。但是,迁移到Btrfs的优点之一是摆脱了LVM分区布局带来的限制。您还可以使用btrfs提供的收发功能在转换后合并分区。

 

转换步骤

1、创建实时图像

由于您无法转换已挂载的文件系统,因此我们将使用Fedora实时映像进行工作。安装Fedora Media Writer并将Fedora 33刻录到您的USB stick中。

2、释放磁盘空间

btrfs-convert将在分区的可用磁盘空间中重新创建文件系统元数据,同时将所有现有ext4数据保留在其当前位置。

不幸的是,所需的可用空间量无法事先得知,如果您的转换空间不足,转换将失败(并且不会造成任何损害)。以下是一些释放空间的有用想法:

使用baobab识别要删除的大文件和文件夹。如果可能,请不要手动删除主文件夹之外的文件。

清理旧系统日志:journalctl –vacuum-size=100M。

如果使用的是Docker,请仔细使用docker volume prune,docker image prune -a等工具。

清理内部未使用的虚拟机映像GNOME Boxes。

清理未使用的软件包和Flatpaks:dnf自动删除,flatpak remove –unused。

清理软件包缓存:pkcon refresh force -c -1,dnf清理所有。

如果您有足够的信心,可以谨慎清理~/.cache文件夹。

3、转换为Btrfs

将所有有价值的数据保存到备份中,确保系统已完全更新,然后重新启动到实时映像。运行gnome-disks以找出您的设备句柄,例如/dev/sda1(如果使用的是LVM,则外观可能会有所不同)。检查文件系统并进行转换,以下命令以root用户身份运行,请谨慎使用:

$ sudo su -

# fsck.ext4 -fyv /dev/sdXX

# man btrfs-convert (read it!)

# btrfs-convert /dev/sdXX

根据分区的大小以及您使用的是旋转硬盘驱动器还是固态硬盘驱动器,这可能需要10分钟甚至几个小时的时间。如果发现错误,则可能需要更多可用空间。作为最后的选择,您可以尝试btrfs-convert -n。

4、如何回滚?

如果由于某种原因转换失败,您的分区将保留为ext4或以前的分区。如果您希望在成功转换后回滚,则只需:

# btrfs-convert -r /dev/sdXX

警告:如果执行以下任何操作,将永久失去回滚的能力:碎片整理,平衡或删除ext2_saved子卷。

由于Btrfs的写时复制特性,因此您可以安全地复制,移动甚至删除文件,创建子卷,因为ext2_saved始终引用旧数据。

5、安装和检查

现在该分区应该具有btrfs文件系统。挂载它并查看您的文件和子卷:

# mount /dev/sdXX /mnt

# man btrfs-subvolume (read it!)

# btrfs subvolume list / (-t for a table view)

如果您已经阅读了相关的手册页,应该知道创建子卷快照是安全的,并且已将ext2保存的子卷作为以前数据的方便备份。

6、创建子卷

我们希望实现一个“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命令不会复制数据,因此会很快:

1]、在/mnt(顶级子卷)中,删除除root2,home2和ext2_saved之外的所有内容。

2]、将root2和home2子卷重命名为root和home。

3]、在根子卷中,清空home文件夹,以便稍后可以将home子卷安装到该目录中。

如果一切正确,这很简单。

7、修改fstab

为了在重新引导后挂载新卷,必须修改fstab,方法是用新的ext4挂载线替换旧的ext4挂载线。

您可以使用命令blkid来了解分区的UUID:

UUID=xx / btrfs subvol=root 0 0

UUID=xx /home btrfs subvol=home 0 0

请注意,如果两个UUID引用相同的分区,则它们是相同的。

这些是新安装的Fedora 33的默认设置。在fstab中,您还可以选择自定义压缩并添加诸如noatime之类的选项。

8、Chroot进入您的系统

如果您曾经进行过系统恢复,那么我很确定您知道这些命令。在这里,我们得到一个shell提示,该提示基本上在您的系统内部,并且具有网络访问权限。

首先,我们必须将根子卷重新安装到/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

9、重新安装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

您应该在grubenv和grub.cfg中具有适当的分区UUID或引用,可能尚未更新grubenv,如果需要,请对其进行编辑,并在initramfs映像中的grub.cfg和btrfs模块中查看insmod btrfs。

10、重启

现在,您的系统应该可以正常启动。如果没有,请不要着急,返回实时图像并解决问题。在最坏的情况下,您可以从那里重新安装Fedora。

 

第一次启动后

使用新的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 /

最后,对于新安装的虚拟机映像文件夹,会自动设置“no copy-on-write”属性。如果使用的是VM,请进行设置:

#

chattr +C /var/lib/libvirt/images

$ chattr +C

~/.local/share/gnome-boxes/images

此属性仅对这些文件夹中的新文件生效,复制图像并删除原稿,您可以使用lsattr确认结果。

 

相关主题

使用Btrfs对Linux系统进行快照回滚

精选文章
热门文章