[deepin exploration] 可以通过迁移操作系统分区的方式移除ostree么
Tofloor
poster avatar
文盲振伟🍀
deepin
2026-01-22 09:23
Author

比如把系统装在a分区,然后rsync到b分区,迁移过程中只保留了穿透所有只读层后最终看到的文件版本,即只复制所有文件的当前状态而丢弃其历史镜像。然后从b分区引导系统。是不是就得到了避开ostree管理的v25?

Reply Favorite View the author
All Replies
文盲振伟🍀
deepin
2026-01-22 09:41
#1

你的想法在技术上是可行的,但需要非常谨慎操作,并且要理解 OSTree 的工作原理 和 Deepin V25 基于 OSTree 的系统结构。下面我来详细分析:

✅ 你的目标是否合理?

“把根目录所有文件 cp -a 到另一个分区 → 丢弃 OSTree 历史层 → 脱离 OSTree 管控 → 直接从新分区启动”

这个思路的核心是:将 OSTree 管理的只读/版本化系统“扁平化”为传统可写根文件系统。

这在原理上可以做到,类似的操作也被用于:

将 Fedora Silverblue / Ubuntu Core / Endless OS 等 OSTree 系统“去 OSTree 化”

迁移容器化或原子更新系统到传统模式

但 Deepin V25 是基于 Deepin Desktop + OSTree + systemd-sysupdate / rpm-ostree(可能) 构建的,所以有特殊性。

⚠ 关键挑战与注意事项

  1. / 根目录本身可能不是真实文件系统

在 OSTree 系统中:

/usr 通常是只读挂载(来自 OSTree commit)

/etc、/var、/home 等是 overlay 或 bind mount

真实的根文件系统可能是 tmpfs 或 minimal stub

你执行 cp -a / /mnt/newroot 时,可能复制的是挂载后的视图,但缺少底层 OSTree 提供的完整内容(比如某些文件只在 OSTree repo 中,运行时通过 fuse/overlay 挂载)。

✅ 建议:不要直接复制 /,而是从 OSTree 部署的实际目录复制。

通常 OSTree 部署路径在:

/var/lib/ostree/deploy/deepin/deploy/

里面会有类似 xxxx.0 的目录,那就是完整的根文件系统快照。

你可以这样操作:

查看当前部署

ostree admin status

假设当前部署在 /var/lib/ostree/deploy/deepin/deploy/abcd1234.0

cp -a /var/lib/ostree/deploy/deepin/deploy/abcd1234.0/* /mnt/newroot/

这样能确保复制的是完整、静态的根文件系统。

  1. 需要重建 /etc 和 /var

OSTree 系统中:

/etc 是从 commit 中 checkout 出来的,并允许本地修改(通过 overlay)

/var 完全是本地可写的,不属于 OSTree

所以你在复制时:

必须同时复制当前系统的 /etc(包含你的网络、用户、hostname 等配置)

复制 /var(含日志、数据库、包缓存等)

但注意:不要覆盖新系统的 /var 中的关键子目录如 /var/lib/dpkg 或 /var/lib/rpm,除非你知道自己在做什么。

建议:

cp -a /etc /mnt/newroot/

cp -a /var /mnt/newroot/ # 可选,但注意冲突

  1. 引导加载器(GRUB / systemd-boot)必须重新安装

新分区没有引导记录!你需要:

挂载新根分区(假设为 /dev/sda2)到 /mnt/newroot

挂载必要虚拟文件系统:mount --bind /dev /mnt/newroot/dev

mount --bind /proc /mnt/newroot/proc

mount --bind /sys /mnt/newroot/sys

chroot 进去:chroot /mnt/newroot

重新安装 GRUB(以 BIOS+ext4 为例):grub-install /dev/sda

update-grub # 或 grub-mkconfig -o /boot/grub/grub.cfg

如果是 UEFI,还需挂载 /boot/efi 并确保 EFI 分区正确。

  1. fstab 必须更新

检查 /mnt/newroot/etc/fstab,确保它指向新分区的 UUID 或设备名,否则启动时会找不到根文件系统。

用 blkid 查看新分区的 UUID,然后编辑 fstab。

  1. 内核和 initramfs 是否完整?

OSTree 系统通常把内核放在 /usr/lib/modules/ 和 /boot(或 /usr/lib/ostree-boot)。

当你从部署目录复制时,这些应该已经包含在内。

但为了保险,chroot 后可以运行:

update-initramfs -u -k all # Debian/Deepin 系

dracut --force --kver $(uname -r) # 如果是 RHEL 系

  1. 后续包管理可能异常

Deepin V25

Reply View the author
deepin流云
Super Moderator
Community OP
2026-01-22 10:11
#2

https://bbs.deepin.org/post/294583

可以参考这个自行构建不带磐石的版本镜像,或者下社区用户构建好的。25现在默认的文件架构就是ostree,这个乱改系统容易炸

Reply View the author
文盲振伟🍀
deepin
2026-01-22 10:19
#3
deepin流云

https://bbs.deepin.org/post/294583

可以参考这个自行构建不带磐石的版本镜像,或者下社区用户构建好的。25现在默认的文件架构就是ostree,这个乱改系统容易炸

没太看懂 他这个是把自己当前系统克隆成ISO了么,然后拿iso去安装系统?

Reply View the author
新手小白
deepin
2026-01-22 11:07
#4
文盲振伟🍀

没太看懂 他这个是把自己当前系统克隆成ISO了么,然后拿iso去安装系统?

跟lfs原理一样

Reply View the author
electricface
deepin
2026-01-22 11:15
#5

建议先在虚拟机中做实验。然后使用 live 系统在真机做操作。

可以先备份系统,然后回退到备份系统,之后磐石系统的主线部署的上修改层的内容可以抛弃。

/persistent/ostree/deploy/deepin/var 会挂载到 /var ,需要写到 /etc/fstab 中去自动挂载 /var 。
findmnt /usr -un
/usr
usr-overlay
overlay ro,relatime,lowerdir=/root/persistent/overlay/data/af0efb5fdeb21ad80b75dfb2085440b250c6f2355e26a6dcfd346ac588e25cd9.0/usr-upper:/root/persistent/ostree/data/af0efb5fdeb21ad80b75dfb2085440b250c6f2355e26a6dcfd346ac588e25cd9.0/checkout/usr:/root/ostree/deploy/deepin/deploy/c1156d98e9aa8eac38e14aaa9de3163e3de15cacde96ac449d6ee22fd5f4be3d.0/usr,upperdir=/root/persistent/overlay/data/layer-b08dd0b71a053875/usr,workdir=/root/persistent/overlay/data/af0efb5fdeb21ad80b75dfb2085440b250c6f2355e26a6dcfd346ac588e25cd9.0/usr-work,uuid=on

获取到 lowerdir 的最下2层:
/root/persistent/ostree/data/af0efb5fdeb21ad80b75dfb2085440b250c6f2355e26a6dcfd346ac588e25cd9.0/checkout/usr (上)
/root/ostree/deploy/deepin/deploy/c1156d98e9aa8eac38e14aaa9de3163e3de15cacde96ac449d6ee22fd5f4be3d.0/usr (下)

使用 overlay FS 的合并 merge 方法,将它们合并为一层。

然后得到了合并后的 /usr, 再同样处理 /etc, /opt 。
就得到了简单的Linux 文件系统,有正常的 /usr, /etc, /opt, /var 了。

最后通过 update-grub 生成 /boot/grub/grub.cfg 配置。

Reply View the author