如何将我的根分区从 BTRFS 转换为 EXT4?

如何将我的根分区从 BTRFS 转换为 EXT4?

是否可以将 btrfs 转换为 ext4 而不丢失数据?我发现 btrfs 上的读/写操作速度非常慢。

答案1

我只是在介绍可用的工具,而不是经验或文档。您可能想使用一个分区(即使只是一个映像)来测试这一点,即使一切都出错了,您也不介意丢失它。如果没有备份,请勿尝试此操作。

btrfs-convert具有回滚功能,可以撤消转换。我不确定此功能是否适用于未使用 转换为 的btrfs分区btrfs-convert

  1. 首先卸载文件系统。如果这对系统很重要,请启动 LiveCD。

  2. 安装btrfs-tools

    sudo apt-get install btrfs-tools
    
  3. 回滚转换

    sudo btrfs-convert -r /dev/sdXn
    

答案2

据我所知,您不能将 btrfs 转换为任何其他文件系统。

答案3

我使用具有多启动发行版的系统(ext4 上的 Ubuntu,btrfs 上的 Xubuntu)执行此操作。运行 Ubuntu 时,我获取了 Xubuntu btrfs 主分区,并使用 fsarchiver 对其进行了存档。然后,我能够再次使用 fsarchiver 将其还原到不同的分区并指定 ext4 文件系统类型。这似乎没问题。

仍在 Ubuntu 中,我将 Xubuntu 根分区挂载在 /mnt 上,并编辑 /mnt/@/etc/fstab 以将 /home 的挂载更改为指向新的 ext4 分区,更改 UUID 和 fs 类型,并删除子卷数据。我保存了文件,然后重新启动进入 Xubuntu。

启动时出现错误,启动停止。错误是我想将另一个分区挂载到 ~/Documents 目录,但失败了。我选择手动修复该问题。结果发现我的根分区可以正常挂载为 ext4,但当我执行 list 命令时,我得到了

#ls /home
@home

因此,原始的 btrfs 子卷结构仍然存在于 ext4 文件系统中。我发出了命令

mount --bind /home/@home /home

然后我按下 ctrl-D 继续启动,Xubuntu 继续启动,一切正常。我还没有这样做,因为我还在初始启动,但我确信我可以把绑定命令放在我的 fstab 文件中。或者我可能把子卷信息留在 fstab 条目中,我不知道。

不过,我要做的是(这是题外话),从另一台计算机中获取一个更成熟的 Xubuntu /home (ext4) 分区实例并使用它。我已经证明这是可行的。

答案4

**在所有情况下都有效的解决方案当然是将所有内容从根分区复制到另一个分区上的目录(假设您有一个具有足够可用空间的目录),重新格式化,/然后ext4复制回来。我刚刚这样做了,遇到了一些问题,所以我想写一点操作方法:

  • 在救援 USB 密钥上启动,挂载两个分区(假设/mnt是真正的根分区,以及/dest作为临时目标的分区)
  • 请注意,您还应该挂载 BTRFS 子卷(我没有这样做,结果丢失了所有/var/opt/root...)。最好的方法可能是执行通常的chroot舞蹈(mount --bind /dev /mnt/dev; mount --bind /sys /mnt/sys; mount --bind /proc /mnt/proc; chroot /mnt),然后mount -a -t btrfs这样描述的子卷/etc/fstab就全部挂载了。
  • 退出 chroot 或使用另一个 TTY(Ctrl+Alt+F2),然后启动副本,例如cp -a /mnt /dest
  • 重新格式化分区:
  • umount /mnt
  • mkfs.ext4 /dev/*the_root_device*
  • mount /dev/*the_root_device* /mnt
  • 使用以下命令复制回数据,cp -a /dest/mnt/* /mnt 现在(在 chroot 中)不要忘记
  • 编辑/etc/fstab以删除所有子卷,将文件系统类型从 更改为btrfsext4并更新UUID(查看 的输出,或执行 后blkid切换到标签)LABEL=rootfstune2fs -L rootfs /dev/*the_root_device*
  • mkinitrd或者dracut,然后重新创建引导加载程序(我使用另一个发行版,因此在 ubuntu 上没有此步骤的确切命令)。祈祷并重新启动。最后,记得清理临时目标中的 /dest 副本。**

相关内容