是否可以将 btrfs 转换为 ext4 而不丢失数据?我发现 btrfs 上的读/写操作速度非常慢。
答案1
我只是在介绍可用的工具,而不是经验或文档。您可能想使用一个分区(即使只是一个映像)来测试这一点,即使一切都出错了,您也不介意丢失它。如果没有备份,请勿尝试此操作。
btrfs-convert
具有回滚功能,可以撤消转换。我不确定此功能是否适用于未使用 转换为 的btrfs
分区btrfs-convert
。
首先卸载文件系统。如果这对系统很重要,请启动 LiveCD。
安装
btrfs-tools
sudo apt-get install btrfs-tools
回滚转换
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
以删除所有子卷,将文件系统类型从 更改为btrfs
,ext4
并更新UUID
(查看 的输出,或执行 后blkid
切换到标签)LABEL=rootfs
tune2fs -L rootfs /dev/*the_root_device*
mkinitrd
或者dracut
,然后重新创建引导加载程序(我使用另一个发行版,因此在 ubuntu 上没有此步骤的确切命令)。祈祷并重新启动。最后,记得清理临时目标中的 /dest 副本。**