Ubuntu 20.04 使得使用 BTRFS 文件系统创建加密安装变得非常困难。因此,我有一个在 ext4 上运行的加密安装。出于多种原因,我想使用 BTRFS 文件系统。
我听到很多谣言说就地转换很危险,可能会导致奇怪的行为从长远来看。现在它是否可以完美运行,还是我应该坚持使用 ext4?
我知道另一个问题但它更多地讨论如何做,而不是是否安全。而且它已经很老了。
答案1
不,这不安全。
我做了测试。我拿了一台旧的 ThinkPad,在上面安装了全新的 Ubuntu 20.04(没有网络配置,因此没有更新)。在安装过程中,我选中了创建托管加密分区的 LVM 的复选框。然后
- 我确保安装成功
- 再次启动直播系统
- 解密分区
- 使用以下方式转换文件系统
sudo btrfs-convert
- 将文件系统类型条目更改
/etc/fstab
为btrfs
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。
需要记住的要点:
- 旧卷的卷 UUID
ext4
将与新btrfs
卷的卷 UUID 不同 - 每个
btrfs
子卷都有自己的 UUID,可以使用以下命令列出btrfs subvolume list -u /path
/etc/fstab
转换后需要调整- 为了更好的措施你应该再次:
update-initramfs -ck all
grub-install
update-grub
流程
最多以下命令需要以超级用户身份运行(root
)。
- (可选)假设您想要将
ext4
正在运行的 Linux 安装的根驱动器转换为其自己的子卷btrfs
,并/home
在此过程中 迁移到- 在您的系统上短暂启用
root
并输入密码可能是一个好主意,因为用户root
不必/home
像其他用户那样依赖额外的挂载点……成功转换后可以禁用此功能
- 在您的系统上短暂启用
- 启动实时系统,这样所涉及的分区就不会被挂载(“正在使用”)
- 注意:我使用了 Manjaro ISO,因此它甚至不依赖于 Ubuntu
- 我强烈建议将输出存储在文本文件中
blkid
,lsblk -f
并保存在方便的地方(或者打印出来......|lpr
)以供日后参考- 您最感兴趣的是此程序
/
及其/boot
范围
- 您最感兴趣的是此程序
- 在实时系统中使用
blkid
或识别要从 转换为 的lsblk -f
分区,假设是你的ext4
btrfs
/dev/sda2
@oldroot
- 开始转换:(
btrfs-convert -p -L /dev/sda2
根据需要进行调整,-L
据称复制了标签但对我来说不起作用并-p
显示进度) - (可选)转换完成后,我运行了
partprobe
一个 - (可选)重复步骤 1 中的
blkid
或lsblk -f
步骤,记下新状态 - 创建
/target
目录 mount -t btrfs /dev/sda2 /target
- 现在使用 查询转换后的分区上现有的子卷
btrfs subvolume list -u /
。它应该显示类似以下内容的内容:
注意:亲爱的读者,这是你回到过去的门票ID 256 gen 3 top level 5 uuid - path ext2_saved
ext4
(我没有必要这么做,所以在这里我不会讨论这个) - 的旧内容
/
现已安装在,/target
但我们希望将它们放在子卷中,因此我们需要创建它们:- 旧内容
/
:btrfs subvolume create /target/@oldroot
- 旧内容
/home
:btrfs subvolume create /target/@home
- 旧内容
- 现在是时候将旧数据移到子卷中了:
mv /target/home/* /target/@home/
应该注意移动内容原始/home
文件夹- 然后
cd /target
,mv
其他所有不是@home
或@oldroot
进入的东西/target/@oldroot/
- 此时
/target
应该只包含顶层的子卷,这就是我们想要的 - 是时候
chroot
进入我们的“旧系统”了@oldroot
cd; umount /target
因为我们不想挂载btrfs
现在的根mount -t btrfs -o subvol=@oldroot /target
挂载旧的根文件系统mount /dev/sda1 /target/boot
... 你做过记下你的旧设备/boot
,对吧?将其插入这里,而不是/dev/sda1
- 将实时启动系统中的某些内容绑定安装到
/target
:for i in sys proc dev dev/pts run sys/firmware/efi/efivars; do mount -o bind "/$i" "/target/$i"; done
...如果您使用的是 BIOS 而不是 EFI 系统,则最后一项将不可避免地失败,这应该不是问题 - 是时候“进入”我们的原始系统了:(
chroot /target /bin/bash
当然,如果你知道安装了另一个 shell,请随意使用它)- 一旦进入你的系统,
chroot
你应该root
(就像在外面一样, but if you ran it via
sudochances are you need to
export HOME=/root` 来纠正错误设置的主目录 - 同样,你可能需要
export PATH=$PATH:/sbin:/usr/sbin
让这些二进制文件对你可用
- 一旦进入你的系统,
- 现在您已进入旧系统,请编辑它
/etc/fstab
,我喜欢做的是将类似的输出附加blkid|grep btrfs
到它,然后编辑它- 将正确的 UUID 插入到 的条目中
/
,例如:UUID=946838ea-c227-40a2-aa2c-ae17dd4dfece / btrfs subvol=@oldroot 0 1
- 并且不要忘记
/home
现在也是一个挂载点:
注意:注意 UUID 是相同的,因为我们正在安装子卷同一音量UUID=946838ea-c227-40a2-aa2c-ae17dd4dfece /home btrfs subvol=@home 0 1
- 也许验证其他挂载点和目前禁用那些你不是绝对需要的;然而
/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
- 将正确的 UUID 插入到 的条目中
- 退出
chroot
(当然,在重启之前你可以随意操作) - 重启实时系统
- 从现在起,您应该已经成功启动到“新”旧系统
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
。