转换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,对应相关的软件包systemd和systemd-libs等都要同时降级,所以执行命令:
最新转换方法(成功,整理稿)
alios最新版本引入了Fedora中使用的dnf包管理器,这个dnf包管理器和CentOS官方的yum冲突,所以在转换到CentOS时需要卸载dnf。
上述软件包版本可能会有出入,以实际操作系统版本为准,都需要卸载
具体以
rpm -qa | grep dnf和rpm -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?