# deepin-v23-to-v25-python-script **Repository Path**: kingecg/deepin-v23-to-v25-python-script ## Basic Information - **Project Name**: deepin-v23-to-v25-python-script - **Description**: 它可以将 Deepin V23 的软件、用户家目录迁移到 Deepin V25。因为不支持无缝升级,所以写了这个东西。(注意:如果帮助到你,请捐助帮我渡过经济难关,当前日期2025-08-17) - **Primary Language**: Python - **License**: GPL-3.0 - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2025-10-28 - **Last Updated**: 2025-10-28 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # deepin-v23-to-v25-python-script 它可以将 Deepin V23 的**软件**、**用户家目录**迁移到 Deepin V25。因为不支持无缝升级,所以写了这个东西。 **如果帮助到你,请给我0.99元帮我渡过经济难关,留下这句话的日期是:2025-08-17** ## 快速开始 ### 一、确定需求 定义,我们把旧系统Deepin V23定义为:源系统 我们把新系统Deepin V25定义为:目标系统 类似的: - 源路径、目标路径 - 源家目录、目标家目录 - 源用户名、目标用户名 规范的描述有助于防止混淆。 --- 它需要在目标系统中运行,也就是新系统,而不是旧系统,也不是其他的Ubuntu或者live。 它可以,扫描到你,旧系统中,安装的以下软件: - 通过应用商店、星火应用商店、apt命令、ll-cli命令,安装的**deb软件包**和**玲珑应用** - 通过`.deb`文件安装的deb软件包 它可以帮你迁移以下用户文件: - 用户家目录里面的文件 而其他的,例如`/opt`下的文件,你自行编译安装到其他位置的软件,它做不到。 ### 二、切换到root用户并进入工作目录 ```bash sudo su - git clone https://gitee.com/deng_wenyi/deepin-v23-to-v25-python-script mv deepin-v23-to-v25-python-script/migrate_workdir /root/ cd migrate_workdir ``` ### 三、扫描软件包 ```bash python3 scan_soft.py <源系统的根目录,可能是/media/likewendy/c5b68963-7f31-453f-8a33-11d45badf8cc这样的> ``` 它会创建两个文本文件,里面记载了软件包名 >apt_installed.txt 对应:通过应用商店、星火应用商店、apt命令、ll-cli命令,安装的**deb软件包**和**玲珑应用** >deb_installed.txt 对应:通过`.deb`文件安装的deb软件包 ![输入图片说明](%E6%88%AA%E5%9B%BE_deepin-terminal_20250806222618.png) 文件里面的内容是这样的: ![输入图片说明](%E6%88%AA%E5%9B%BE_deepin-terminal_20250806222655.png) ![输入图片说明](%E6%88%AA%E5%9B%BE_deepin-terminal_20250806222703.png) **下一步你需要根据软件包名,手动安装它们。** 一些指引: - 对于通过`.deb`文件安装的软件包,你需要去那个软件发布的地方,例如github、官网,去下载新的`.deb`并安装。 - 对于(通过应用商店、星火应用商店、apt命令、ll-cli命令,安装的**deb软件包**和**玲珑应用**),命令行软件优先通过apt命令安装,玲珑应用和常见的deb软件包优先通过应用商店安装,其次考虑星火应用商店,遇到玲珑应用安装错误再使用ll-cli。 ### 四、迁移用户家目录 当你安装好软件包之后,就可以开始迁移用户家目录了。 你可以使用`python migrate_home.py -h`来查看命令行参数,如图所示: ![输入图片说明](image.png) 我将解释以下选项的意义和用法,你仍需要查看-h的输出,我这里做一些额外的补充: - -e,用于排除一些文件/文件夹,往往是这些内容太大,一次性迁移不了,需要**多次迁移**。所以通过排除一部分内容的方式,实现分多次迁移它们。 - -s,这里填**源用户家目录**,可能是/media/likewendy/c5b68963-7f31-453f-8a33-11d45badf8cc/home/likewendy这样的。 - -u,目标用户名,需要在目标系统中存在,不能是root(因为没测试root的情况)。你可以在目标系统中,非root用户下执行`whoami`来查看用户名。 - -c,以复制的形式迁移,通常情况下,两个分区之间迁移,从一个分区移动到另一个分区之后便可以缩小第一个分区的大小。类似的,如果是同一个分区,那么移动等同于更换所属的上层目录,理论上速度又快、分区的大小占用也不会发生改变。但是,如果你当前的剩余空间>源用户家目录大小x2,你可以考虑使用复制,这样不会删除源家目录的文件。 - -nb,--no-backup-src-home,默认情况下它会备份目标用户家目录,但是如果你是**多次迁移**或者目标用户家目录有太多文件/文件夹的情况,你可以使用该参数避免备份目标用户家目录。 脚本的大致逻辑: 1. 解析命令行参数 2. 检查执行该命令的终端所在的工作目录 3. 检查当前脚本的绝对路径 4. 检查路径,要求末尾不带/ 5. 检查是否以sudo命令或者root用户运行 6. 检查UID/GID是否匹配 7. 获取目标用户家目录 8. 创建备份 9. 准备排除列表(添加额外排除项) ``` /.config/deepin 存储了 deepin 自带的应用程序的设置 /.config/systemd/user 含有一些会导致音频服务挂掉的软链接 ``` 10. 检查存储空间 11. 用户确认 12. 执行迁移 **对于硬链接,硬连接只作用于同一个文件系统(分区),通常情况下迁移会将一个分区里面的一些文件移动或者复制到另一个分区,这会破坏硬连接。它不会重建硬链接,会变成两个相同的文件(md5相同),这会产生不必要的空间占用。如果你之前手动对某些文件或者目录建立过硬链接,那么你需要再次手动重新建立它们,如果你没进行过这样的操作,则忽略。对于建立硬连接,特别是以节省存储空间为目的,可以看我的一篇文章:[使用rdfind建立硬连接](https://blog.csdn.net/Deng_Xian_Sheng/article/details/144118785)** **代码中计算文件大小时,没统计文件夹本身的元数据占用的大小,通常不大。建议在迁移时,给目标用户家目录所在的分区,预留部分缓冲空间,例如5~10GB** **迁移是使用rsync实现的** 然后,**根据上述命令行参数构造命令,并执行**,输出可能是这样的: ![输入图片说明](%E6%88%AA%E5%9B%BE_%E9%80%89%E6%8B%A9%E5%8C%BA%E5%9F%9F_20250812170638.png) ![输入图片说明](%E6%88%AA%E5%9B%BE_%E9%80%89%E6%8B%A9%E5%8C%BA%E5%9F%9F_20250812170748.png) ![输入图片说明](%E6%88%AA%E5%9B%BE_%E9%80%89%E6%8B%A9%E5%8C%BA%E5%9F%9F_20250812205815.png) 如果你的空间不足,会产生这样的输出: ![输入图片说明](%E6%88%AA%E5%9B%BE_deepin-terminal_20250807181251.png) 默认会备份目标用户家目录,输出是这样的: ![输入图片说明](%E6%88%AA%E5%9B%BE_deepin-terminal_20250811212657.png) ## 进阶 ### 用于生成排除项参数的脚本 你在迁移源用户家目录的时候,如果一个文件夹比较大,无法一次迁移,里面又有**很多**文件/文件夹,你不容易获取这些文件夹的**大小**并**设计合理的排除项参数**,这个脚本会帮到你。 命令行参数: ![输入图片说明](1755456218783.png) 例子: ```bash python gen_nb_arg.py /media/likewendy/c5b68963-7f31-453f-8a33-11d45badf8cc/home/likewendy/Desktop/学习资料 481 /Desktop/学习资料 ``` 它会扫描路径(第一个命令行参数)下的文件/文件夹(一层),然后分别获取它们的大小。 它会生成一些排除项,将这些文件/文件夹排除之后,刚好小于传入的大小(第二个命令行参数)-5。 它会尽可能的让保留的项,文件大小最大化。 具体来说,它使用动态规划算法来解决“背包问题”,也就是说:有若干文件夹和对应的大小,有一个大小限制,在不超过这个大小限制的情况下,排除哪些项才能使保留的项的文件大小最大化。 **第三个命令行参数是为了让输出符合migrate_home.py脚本的排除项语法(准确的说是rsync的语法)而设计的参数。它会打印诸如`-e /xxx/xxx/xxx -e /xxx/xxx/xxx`这样的内容** **注意,它不会统计文件夹元数据的大小占用,这个东西通常不大,5GB的缓冲是为了防止层级太深的文件夹元数据占用一部分空间。传入的可用空间完全取决于你(第二个命令行参数),如果不放心你可以再添加一部分缓冲。** 其他帮助内容,你可以通过这个来查看剩余空间: ![输入图片说明](image2.png) ## 捐助 截止2025年8月18日,我已经离职接近两年的时间,财务状况严峻。 如果这个脚本能帮助到你,且你手头的资金允许支付0.99元人民币的话,请帮助我,感激不尽! ![输入图片说明](IMG_8271.jpeg) ![输入图片说明](IMG_8270.jpeg)