将 EXT4 转换为 BTRFS 是否安全?

将 EXT4 转换为 BTRFS 是否安全?

Ubuntu 20.04 使得使用 BTRFS 文件系统创建加密安装变得非常困难。因此,我有一个在 ext4 上运行的加密安装。出于多种原因,我想使用 BTRFS 文件系统。

我听到很多谣言说就地转换很危险,可能会导致奇怪的行为从长远来看。现在它是否可以完美运行,还是我应该坚持使用 ext4?

我知道另一个问题但它更多地讨论如何做,而不是是否安全。而且它已经很老了。

答案1

不,这不安全。

我做了测试。我拿了一台旧的 ThinkPad,在上面安装了全新的 Ubuntu 20.04(没有网络配置,因此没有更新)。在安装过程中,我选中了创建托管加密分区的 LVM 的复选框。然后

  1. 我确保安装成功
  2. 再次启动直播系统
  3. 解密分区
  4. 使用以下方式转换文件系统sudo btrfs-convert
  5. 将文件系统类型条目更改/etc/fstabbtrfs
  6. sudo reboot

然后,在解密分区后,启动立即挂起。不幸的是,我没有收到有用的错误消息。它似乎试图运行,fsck但我不确定。

我重复了两次。两次结果都一样。

答案2

是的,很安全。这是一个有点复杂的过程,但我刚刚用 Ubuntu 20.04 完成了它。这里的目标是保留我的旧/子卷@oldroot,同时能够并行安装新系统。我还想进入/home它自己的@home子卷。

把它们加起来:

  • 前面的状态:ext4对于//boot以及启动安装的系统(在我的情况下,它也是问题中的 Ubuntu 20.04!)
  • 转换后的状态:ext4对于/boot但是现在btrfs对于/再次引导安装(即“迁移”到的同一系统btrfs

为什么我说它是安全的?因为btrfs-convert提供回滚选项。所有可能导致故障的情况(断电、磁盘故障)同样适用,无需转换。请注意但是,手册页确实btrfs-convert提到了你应该使用的选项不是在转换后的卷上运行直到你确定你不需要回滚!尤其是btrfs balance应该不是被运行。

先决条件

你需要的是btrfs-progs和其他一些工具一些知识。实时启动的 Linux。

需要记住的要点:

  1. 旧卷的卷 UUIDext4将与新btrfs卷的卷 UUID 不同
  2. 每个btrfs子卷都有自己的 UUID,可以使用以下命令列出btrfs subvolume list -u /path
  3. /etc/fstab转换后需要调整
  4. 为了更好的措施你应该再次:
    • update-initramfs -ck all
    • grub-install
    • update-grub

流程

最多以下命令需要以超级用户身份运行(root)。

  1. (可选)假设您想要将ext4正在运行的 Linux 安装的根驱动器转换为其自己的子卷btrfs,并/home在此过程中 迁移到
    • 在您的系统上短暂启用root并输入密码可能是一个好主意,因为用户root不必/home像其他用户那样依赖额外的挂载点……成功转换后可以禁用此功能
  2. 启动实时系统,这样所涉及的分区就不会被挂载(“正在使用”)
    • 注意:我使用了 Manjaro ISO,因此它甚至不依赖于 Ubuntu
    • 我强烈建议将输出存储在文本文件中blkidlsblk -f并保存在方便的地方(或者打印出来...... |lpr)以供日后参考
      • 您最感兴趣的是此程序/及其/boot范围
  3. 在实时系统中使用blkid或识别要从 转换为 的lsblk -f分区,假设是你的ext4btrfs/dev/sda2@oldroot
  4. 开始转换:(btrfs-convert -p -L /dev/sda2根据需要进行调整,-L据称复制了标签但对我来说不起作用并-p显示进度)
  5. (可选)转换完成后,我运行了partprobe一个
  6. (可选)重复步骤 1 中的blkidlsblk -f步骤,记下新状态
  7. 创建/target目录
  8. mount -t btrfs /dev/sda2 /target
  9. 现在使用 查询转换后的分区上现有的子卷btrfs subvolume list -u /。它应该显示类似以下内容的内容:
    ID 256 gen 3 top level 5 uuid -    path ext2_saved
    
    注意:亲爱的读者,这是你回到过去的门票ext4(我没有必要这么做,所以在这里我不会讨论这个)
  10. 的旧内容/现已安装在,/target但我们希望将它们放在子卷中,因此我们需要创建它们:
    1. 旧内容/btrfs subvolume create /target/@oldroot
    2. 旧内容/homebtrfs subvolume create /target/@home
  11. 现在是时候将旧数据移到子卷中了:
    1. mv /target/home/* /target/@home/应该注意移动内容原始/home文件夹
    2. 然后cd /targetmv其他所有不是@home@oldroot进入的东西/target/@oldroot/
  12. 此时/target应该只包含顶层的子卷,这就是我们想要的
  13. 是时候chroot进入我们的“旧系统”了@oldroot
    1. cd; umount /target因为我们不想挂载btrfs现在的根
    2. mount -t btrfs -o subvol=@oldroot /target挂载旧的根文件系统
    3. mount /dev/sda1 /target/boot... 你做过记下你的旧设备/boot,对吧?将其插入这里,而不是/dev/sda1
    4. 将实时启动系统中的某些内容绑定安装到/targetfor i in sys proc dev dev/pts run sys/firmware/efi/efivars; do mount -o bind "/$i" "/target/$i"; done...如果您使用的是 BIOS 而不是 EFI 系统,则最后一项将不可避免地失败,这应该不是问题
    5. 是时候“进入”我们的原始系统了:(chroot /target /bin/bash当然,如果你知道安装了另一个 shell,请随意使用它)
      • 一旦进入你的系统,chroot你应该root(就像在外面一样, but if you ran it viasudo chances are you need toexport HOME=/root` 来纠正错误设置的主目录
      • 同样,你可能需要export PATH=$PATH:/sbin:/usr/sbin让这些二进制文件对你可用
    6. 现在您已进入旧系统,请编辑它/etc/fstab,我喜欢做的是将类似的输出附加blkid|grep btrfs到它,然后编辑它
      • 将正确的 UUID 插入到 的条目中/,例如:
        UUID=946838ea-c227-40a2-aa2c-ae17dd4dfece / btrfs subvol=@oldroot 0 1
        
      • 并且不要忘记/home现在也是一个挂载点:
        UUID=946838ea-c227-40a2-aa2c-ae17dd4dfece /home btrfs subvol=@home 0 1
        
        注意:注意 UUID 是相同的,因为我们正在安装子卷同一音量
      • 也许验证其他挂载点和目前禁用那些你不是绝对需要的;然而/boot这非常重要,应该仍然无需编辑即可有效
      • 退出编辑器/etc/fstab
      • 按顺序运行(如果您按照正确的步骤进行设置,chroot它们都应该可以正常工作):
        • update-initramfs -ck all
        • grub-install
        • update-grub
      • 验证中是否提到了根分区/boot/grub/grub.cfg,例如使用:
        grep -P --color '(946838ea-c227-40a2-aa2c-ae17dd4dfece|subvol=@\w+)' /boot/grub/grub.cfg
        
  14. 退出chroot(当然,在重启之前你可以随意操作)
  15. 重启实时系统
  16. 从现在起,您应该已经成功启动到“新”旧系统btrfs(如果没有,请参阅下面的故障排除)

故障排除

显然,有很多事情可能会出错,其中一些适用于任何ext4即使没有从 转换为,也可以使用计算机btrfs。这里无法涵盖所有​​这些内容。但是,我将提到我遇到的一个问题,并提示如何解决您可能遇到的问题:

  • 当我尝试启动时,我被带到 TTY 进行登录,并按 进行操作root。在登录提示出现之前,我曾短暂地看到过很多错误。
    • 当我以 身份登录时root,结果发现/它被以只读方式挂载
    • 尝试mount -o remount,rw /失败,抱怨自己errors=remount-ro是一个未知的选择......哦,好吧
    • 这个选项仍然设置 - 因为我把它从ext4时代延续下来 -/
    • 所以我在几个可写位置之一创建了一个临时目录,将子卷挂载在那里,然后按如下方式@oldroot进行编辑/etc/fstab
    • 事实上,在我再次发出命令后,系统继续启动mount -o remount,rw /,但我还是重新启动了
  • 如果出现问题,不要惊慌!
    • 检查您是否严格按照说明进行操作(考虑允许的偏差)
    • 根据收到的错误,确保您了解自己的问题是什么,即阅读错误信息并对其进行处理
    • 如果您认为这无济于事,请使用btrfs-convert回滚到旧版本ext4,但这也需要撤消其他更改(例如,/etc/fstab重新生成 initrd 以及安装/更新 grub 配置)。

附言:这个答案是在昨天从运行的系统上写的,ext4现在运行的是完全相同的安装btrfs

相关内容