转换AliOS到CentOS

本文提供给需要将AliOS(类似CentOS的给予RHEL的发行版本)转换到标准社区CentOS的人做参考

转换到CentOS 7.8.2003

2020年6月,CentOS 7已经发布到 7.8.2003 。本段落是完整的操作步骤记录,请参考这段记录

2021年4月,CentOS 7可以使用 7.9.2009

  • 卸载alios版本包

rpm -e --nodeps alios-release-server-7.2-24.alios7.x86_64
rpm -e alios-base-setup-7.2-33.alios7.noarch
rm -f /etc/yum.repos.d/CentOS-Base.repo
rm -f /etc/yum.repos.d/epel.repo
rm -f /etc/yum.repos.d/ops.repo
rm -f /etc/yum.repos.d/RHEL.repo
rm -f /etc/yum.repos.d/taobao.repo

有一个warning,不过,软件包还是删除了

warning: Unable to get systemd shutdown inhibition lock: Unit is masked.
  • 导入证书

#rpm --import http://mirrors.163.com/centos/7.8.2003/os/x86_64/RPM-GPG-KEY-CentOS-7

rpm --import http://mirrors.163.com/centos/7.9.2009/os/x86_64/RPM-GPG-KEY-CentOS-7
  • 安装CentOS系统配置

  • 删除 taobao-repo-utils 否则centos 的 yum报错

  • 卸载dnf (alios 7.2引入了Fedora使用的dnf,但是和官方yum冲突)

  • 卸载yum (alios 7.2由于使用了dnf,导致yum实际是dnf的软连接,并且有很多残留包需要一并删除)

  • 然后重新安装yum

  • 恢复yum的packages目录

  • 修订yum配置中版本变量 $releasever (我不知道为何alios不能如centos一样获得这个变量,所以强制改为7):

但是,这里一定要注意,在完成升级之后,一定要把 /etc/yum.conf.d 目录下文件再恢复原样,即恢复 $releasever 。因为此时已经可以正常工作,并且后续升级大版本到entOS 8需要读取这个变量配置。如果不恢复标准配置,会导致大版本升级失败,因为升级CentOS大版本会检查 /etc/yum.conf.d 目录下配置,如果配置不是发行版无修改到配置,会导致升级拿不到正确到 $releasever 版本。

由于升级后,正确的新的yum配置文件会存储为类似 CentOS-Base.repo.rpmnew 这样的格式,所以采用如下方法覆盖:

  • 清理以前残留的yum缓存

  • 有残留文件 /usr/lib64/rpm-plugins/systemd_inhibit.so 会导致rpm卸载报错

删除该文件之后可正常工作

不过建议直接卸载

  • 执行 yum update 有提示 warning: Found BDB Packages database while attempting lmdb backend: using bdb backend. ,不过完成升级后这个报错不再出现

现在可以执行升级

后面的记录是以前的历史记录,仅参考,2020年实际操作以上文为准

转换到CentOS 7.4(旧方法记录)

部分软件包版本号有冲突(AliOS采用了更高的版本编号),需要做降级:

如何降级软件包

要找到如何降级版本,基本方法就是:当yum upgrade报错某些软件包冲突,就通过rpm -qa | grep XXXX找到有哪些相关包,例如:

而在yum upgrade时候提示:

就说明需要从版本219-42.4.alios7降级到219-42.el7_4.10,对应相关的软件包systemdsystemd-libs等都要同时降级,所以执行命令:

最新转换方法(成功,整理稿)

alios最新版本引入了Fedora中使用的dnf包管理器,这个dnf包管理器和CentOS官方的yum冲突,所以在转换到CentOS时需要卸载dnf。

上述软件包版本可能会有出入,以实际操作系统版本为准,都需要卸载

具体以 rpm -qa | grep dnfrpm -qa | grep yum 为准,例如

然后重新安装yum

需要删除 taobao-repo-utils 否则centos 的 yum报错

此时 yum update 还是报错

这个 /var/lib/rpm/Packages 实际上是被alios部署dnf时候备份移动到 /var/lib/rpm.bdbbak/Packages ,可以复制回来就可以使用yum。

现在就可以使用 yum update 了,不过,还需要删除alios仓库信息并加入CentOS信息:

  • 安装EPEL

此时就可以使用

不过会提示,有其他repo占用了磁盘,用以下命令检查

可以看到

删除这些目录

  • 安装screen,并以screen启动后再进行系统升级,避免网络断开

  • 开始系统升级

由于当前CentOS 7.6大多数软件包版本都比alios新,所以几乎所有软件都会替换成标准的社区版本。

  • 有残留文件 /usr/lib64/rpm-plugins/systemd_inhibit.so 会导致rpm卸载报错

删除该文件之后可正常工作

  • 其他可能会有一些软件包需要降级,以便能够适配CentOS发行版提供的软件包,例如,安装kvm环境,会提示由于系统已经安装了高版本的rpm包,导致CentOS无法提供对应高版本依赖包,则需要降级系统已经安装的rpm包后才能使用CentOS软件包安装:

最新转换方法的各种探索折腾(仅做记录,整理见上文)

注意,alios引入了fedora中使用的dnf包管理工具,我尝试卸载dnf和恢复yum标准环境,但是发现导致了yum环境混乱无法正常工作。所以还是恢复DNF工作,采用 dnf管理软件包 来完成系统软件安装维护。(失败,最终未解决)

这里的技巧是:移除所有非社区repo配置,但是保留 CentOS官方repo 和 EPEL官方repo,然后立即升级 dnf ,这样可以使用EPEL官方repo提供的DNF覆盖alios的DNF,后续就可以切换到社区软件仓库继续滚动升级。

  • 升级DNF:

出现报错

改为执行:

此时提示

注意,完成后还有一些残留alios的dnf软件包会影响工作,则检查系统看有哪些残留的 dnf form alios 软件包,逐个清理:

执行清理命令

会报错

检查上述python文件涉及的rpm包

其中 python-libs 是alios版本,在CentOS中找到对应版本进行升级

但是还是没有解决上述报错,检查 /usr/lib64/python2.7/site-packages/libdnf/conf.py :

系统已经安装了swig,我尝试升级到刚放版本

尝试 yum install python3 提示有

所以卸载

尝试安装python3

错误依旧

将所有alios的python2相关包搜索出来重新升级

尝试删除 python2-rpm-4.14.1-13.alios7.x86_64

但是系统并没有安装 rpm-python 而是安装了 python2-rpm-4.14.1-13.alios7.x86_64 ,似乎是这个冲突?

已经安装的 python2-rpm-4.14.1-13.alios7.x86_64 版本高于官方 rpm-python-4.11.3-35.el7.x86_64

  • 手工安装swig?(不行)

然后从 https://sourceforge.net/projects/swig/files/swig/swig-2.0.12/ 下载

但是没有解决

突然看到 https://forums.fedoraforum.org/showthread.php?314779-DNF-Python-failure-after-upgrade-to-F26 :

I solved the problem by pointing the dnf script to python3.5 (which did have the dnf module installed).

First edit /usr/bin/dnf.

I changed the shebang statement to:

Code:

! /usr/bin/python3.5

then, I re-ran:

Code:

sudo dnf system-upgrade reboot

根据 https://people.redhat.com/mskinner/rhug/q3.2018/MSP-RHUG-YUM-is-dead-Long-live-YUM.pdf 说明:

在 7.6 beta中,yum/yum4/dnf 是指向 dnf-2 的,我查看了系统

但是从fedora 28开始,应该同时指向 dnf-3

目前已经安装的python2版本dnf相关包

可以尝试升级到python3

和dnf的冲突(这里执行可能错误,需要修正)

最新的alios引入了fedora中使用的dnf包管理工具,实际上这个工具尚未引入centos 7,需要移除避免冲突。

然后重新安装yum

此时就可以使用

不过会提示,有其他repo占用了磁盘,用以下命令检查

可以看到

删除这些目录

需要删除 taobao-repo-utils 否则centos 的 yum报错

此时还是报错

这个错误我找到了解决方法(见下文)

另外需要移除一些冲突软件包

请参考 How to Rebuild Corrupted RPM Database in CentOS 重建:

这里显示报错

我检查了在虚拟机中安装的CentOS 7,确实有一个 /var/lib/rpm/Packages 这个文件是一个 Berkeley DB (Hash, version 9, native byte-order)

由于这里出现报错,则足需要dump和重新加载新的数据库

同样报错

经过多次失败,我突然想到,这个存在问题的系统,或许有一个Packages文件位于某处,只是之前软件包管理不是标准位置导致的问题。

/var/lib 目录下执行 find . -name Packages ,果然发现了一个 ./rpm.bdbbak/Packages 文件,或许就是之前alios切换到DNF时候备份的系统原先使用yum管理的库文件。 另外,在 ./rpm.lmdbbak/data.mdb lock.mdb

  • 尝试复制回文件

然后再次执行:

这次没有报错,显示

再次执行

这次提示信息似乎正常

现在解决了,可以使用yum了,只不过每次都会提示 warning: Found BDB Packages database while attempting lmdb backend: using bdb backend.

dcrpm(修复工具,实际也没有解决,仅记录)

尝试采用 dcrpm 可以检测和修复rpm,所以尝试如下:

这里有报错

则先安装

再次执行

报错

由于系统没有安装 python-devel ,所以通过以下命令一次安装升级 python-devel

再次执行安装成功。

然后执行:

报错

安装pip,通过pip安装:

再通过pip安装typing

然后继续执行dcrpm

但是没有输出也没有修复。

参考 How to rebuild RPM database on a Red Hat Enterprise Linux system?

  • 清理本地锁

  • 删除所有 /var/spool/up2date 目录下文件

  • 确保没有进程在使用rpm

  • 删除db文件

  • 备份

  • 验证Packages文件

同样报错

比较奇怪,使用 rpm -qa 是可以正常输出系统已经安装的RPM包

Red Hat提供了另外一个参考文档 How to recover rpm database using /var/log/rpmpkgs? ,此外提供了一个 How to rebuild RPM database on a Red Hat Enterprise Linux system?

  • 创建工作目录

  • 确保所有yum-util软件包已经安装:

  • 如果失败,则下载软件包手工安装

  • 安装完成后,执行以下命令下载所需要的软件包

  • 重建rpm数据库

出现报错

由于报错都是 .i686 并且检查下载的rpm包中有 *.el7.i686.rpm ,推测是系统纯 x86_64 系统,所以缺乏相关依赖包。

先升级glibc x86_64,然后再安装i686版本

此时还报告缺少

参考 https://zhidao.baidu.com/question/362945838409899652.html ,这个库位于 nss-softokn-freebl ,并且要和 glibc 一起安装

再次尝试 yum update 依然出现报错

Last updated

Was this helpful?