时间进入到2024年,CentOS 7也将在今年6月份停止维护,加之越来越多软件已不提供CentOS 7的支持,所以系统升级是早晚的事情。
摆在眼前的路有两条,一是直接重装服务器系统,喜欢用啥就用啥(比方说Ubuntu或者是Debian),一切从新;另一条就是把CentOS 7升级(CentOS 9 Stream)或转换(比如Alma Linux或Rocky Linux,它们跟CentOS内核同源)。
无论从哪方面来看,两条路都难免折腾。第一条系统虽然会是全新的,但是所有程序和配置都要重新来过,而且停机的时间难免过长;第二条的话可能停摆时间较短,但是不确定的因素很多,比如系统升级或转换后是否稳定,否则一旦将来有任何错误都无法确定是否是由于系统造成的,另外跟原有的程序是否存在不兼容问题。
正好虚拟机上有个CentOS 7的系统,就拿它来测试一下升级或转化的效果吧。
第一步:更新系统软件包
以超级管理员的身份运行以下命令:
sudo yum update -y
sudo yum clean all --verbose
必要的话重新启动系统以启动新的内核更新(如果刚更新完也重启过,那就跳过这一步,不过建议保险起见还是重启一下为妙)。
sudo reboot
第二步:确认操作系统版本
检查操作系统的版本:
$ cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)
$ cat /etc/os-release
NAME="CentOS Linux"
VERSION="7 (Core)"
ID="centos"
$ sudo rpm -ql centos-release | grep release$
/etc/centos-release
/etc/os-release
/etc/redhat-release
/etc/system-release
/usr/lib/os-release
/usr/share/doc/redhat-release
/usr/share/redhat-release
$ rpm -qf /etc/redhat-release
centos-release-7-9.2009.1.el7.centos.x86_64
当前系统运行在CentOS Linux 版本 7.9.2009(核心)。当然在本地服务器上的话,你开机进入系统前可能就会见到版本号。
第三步:从CentOS 7转换为CentOS 8
首先,安装转换所需的依赖包。
sudo yum install epel-release -y
sudo yum install -y yum-utils rpmconf
找到并删除以前安装中未使用和冲突的软件包:
sudo rpmconf -a
列出系统上不需要的包
sudo package-cleanup --leaves
获取重复包列表
sudo package-cleanup --orphans
使用yum命令将上述命令输出的软件包(包括--leaves和--orphans)删除
sudo yum remove -y <package>
安装DNF包管理器(这是CentOS 8的默认包管理器)。
sudo yum install -y dnf
删除yum包管理器。
sudo dnf remove -y yum yum-metadata-parser
删除yum配置。
sudo rm -Rf /etc/yum
对操作系统进行升级
sudo dnf upgrade -y
sudo reboot
在系统上安装CentOS 8存储库:
sudo dnf install http://vault.centos.org/8.5.2111/BaseOS/x86_64/os/Packages/{centos-linux-repos-8-3.el8.noarch.rpm,centos-linux-release-8.5-1.2111.el8.noarch.rpm,centos-gpg-keys-8-3.el8.noarch.rpm}
更新EPEL存储库
sudo dnf -y upgrade https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm
更新CentOS 8存储库:
cd /etc/yum.repos.d
sudo mkdir backups
sudo mv CentOS-* backups
# Create new for CentOS BaseOS repo
sudo tee CentOS-Linux-BaseOS.repo<<EOM
[baseos]
name=CentOS Linux \$releasever - BaseOS
baseurl=http://vault.centos.org/8.5.2111/BaseOS/\$basearch/os/
gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial
EOM
# Create new for CentOS AppStream repo
sudo tee CentOS-Linux-AppStream.repo<<EOM
[appstream]
name=CentOS Linux \$releasever - AppStream
baseurl=http://vault.centos.org/8.5.2111/AppStream/\$basearch/os/
gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial
EOM
# Create new for CentOS PowerTOols repo
sudo tee CentOS-Linux-PowerTools.repo<<EOM
# CentOS-Linux-PowerTools.repo
[powertools]
name=CentOS Linux \$releasever - PowerTools
baseurl=http://vault.centos.org/8.5.2111/PowerTools/\$basearch/os/
gpgcheck=1
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial
EOM
删除当前的CentOS内核
sudo rpm -e `rpm -q kernel` --nodeps
删除所有冲突的包
sudo rpm -e --nodeps sysvinit-tools
使用以下命令启动 CentOS 8系统升级:
sudo dnf -y --releasever=8 --allowerasing --setopt=deltarpm=false distro-sync
注意:你可能会遇到包冲突错误。要解决这些问题,请删除有问题的现有软件包。具体见安装提示信息。
另外如果提示GCC问题,比如:
Error: transaction check vs depsolve:
(gcc >= 8 with gcc < 9) is needed by annobin-8.90-1.el8.0.1.x86_64
rpmlib(RichDependencies) <= 4.12.0-1 is needed by annobin-8.90-1.el8.0.1.x86_64
(annobin if gcc) is needed by redhat-rpm-config-122-1.el8.noarch
rpmlib(RichDependencies) <= 4.12.0-1 is needed by redhat-rpm-config-122-1.el8.noarch
(flatpak-selinux = 1.6.2-2.el8 if selinux-policy-targeted) is needed by flatpak-1.6.2-2.el8.x86_64
rpmlib(RichDependencies) <= 4.12.0-1 is needed by flatpak-1.6.2-2.el8.x86_64
To diagnose the problem, try running: 'rpm -Va --nofiles --nodigest'.
You probably have corrupted RPMDB, running 'rpm --rebuilddb' might fix the issue.
The downloaded packages were saved in cache until the next successful transaction.
You can remove cached packages by executing 'dnf clean packages'.
可以使用以下命令:
dnf -y --releasever=8 --allowerasing --setopt=deltarpm=false distro-sync --disablerepo=appstream
根据提示删除冲突文件包,比如提示vim-minimal冲突,删除后继续执行上面的系统升级命令。如果还是不行的话,可以尝试删除以下两项:
sudo dnf remove perl
sudo dnf remove python3
安装新的CentOS 8内核:
sudo dnf install -y kernel-core
CentOS 8最小化安装。
sudo dnf -y groupupdate "Core" "Minimal Install"
安装成功后,重新启动系统以加载新内核:
sudo systemctl reboot
验证系统是否已成功升级并且你仍然拥有你的应用程序。
$ cat /etc/redhat-release
CentOS Linux release 8.5.2111
至此,我们现在可以确认我们已经成功从CentOS 7升级到CentOS 8。下一步是将CentOS 8 转换为AlmaLinux 8或RockyLinux。
第四步A:将CentOS 8转换为AlmaLinux 8
我们现在下载 almalinux-deploy.sh 脚本。该脚本有助于转换过程。该脚本可以从Github repo下载。
sudo dnf -y install curl
curl -O https://raw.githubusercontent.com/AlmaLinux/almalinux-deploy/master/almalinux-deploy.sh
使脚本文件可执行:
chmod +x almalinux-deploy.sh
要将 CentOS 7转换为AlmaLinux 8,请执行almalinux-deploy.sh
脚本。首先检查脚本是否会输出错误:
sudo bash almalinux-deploy.sh
成功安装示例输出:
.....
Complete!
Run dnf distro-sync -y OK
Restoring of alternatives is done OK
Install AlmaLinux kernel OK
Generating grub configuration file ...
done
All Secure Boot related packages which were not released by AlmaLinux are reinstalledOK
Migration to AlmaLinux is completed
升级后重启系统
sudo reboot -f
升级后查看操作系统版本:
$ cat /etc/os-release
NAME="AlmaLinux"
VERSION="8.9 (Midnight Oncilla)"
ID="almalinux"
ID_LIKE="rhel centos fedora"
VERSION_ID="8.9"
PLATFORM_ID="platform:el8"
PRETTY_NAME="AlmaLinux 8.5 (Midnight Oncilla)"
ANSI_COLOR="0;34"
LOGO="fedora-logo-icon"
CPE_NAME="cpe:/o:almalinux:almalinux:8::baseos"
HOME_URL="https://almalinux.org/"
DOCUMENTATION_URL="https://wiki.almalinux.org/"
BUG_REPORT_URL="https://bugs.almalinux.org/"
ALMALINUX_MANTISBT_PROJECT="AlmaLinux-8"
ALMALINUX_MANTISBT_PROJECT_VERSION="8.9"
REDHAT_SUPPORT_PRODUCT="AlmaLinux"
REDHAT_SUPPORT_PRODUCT_VERSION="8.9"
转换成功。
第四步B:将CentOS 8转换为RockyLinux 8
同转换AlmaLinux类似,RockyLinux同样提供了转换脚本,所以首先要做的就是下载脚本文件:
curl -O https://raw.githubusercontent.com/rocky-linux/rocky-tools/main/migrate2rocky/migrate2rocky.sh
使脚本文件可执行:
chmod a+x migrate2rocky.sh
使用 sudo 权限运行下载的脚本以初始化迁移过程。
sudo ./migrate2rocky.sh -r
系统报错:
Invalid conf iguration value:failovermethod=priority in /etc/yum.repos.d/nodesource-el7.repo; Config uration:OptionBinding with id "failovermethod"does not exist
执行命令
sudo sed -i '/^failovermethod=/d' /etc/yum.repos.d/*.repo
上述错误没有了,再次提示
Modular dependency problems:
Problem 1: conflicting requests
- nothing provides module(perl:5.26) needed by module perl-IO-Socket-SSL:2.066:8090020231016070024:88fd4976.x86_64
Problem 2: conflicting requests
- nothing provides module(perl:5.26) needed by module perl-libwww-perl:……
运行以下命令,安装上述缺少的模块(比如我上面信息中提到的perl模块):
dnf module enable -y perl
模块全部安装完毕后,再次执行脚本。
这次因"found a full or partial RockyLinux install already in place"错误中断。
结果发现,之所以会出现这个是因为RockyLinux已经安装好了,也就是意味着升级成功了。
# cat /etc/os-release
NAME="Rocky Linux"
VERSION="8.9 (Green Obsidian)"
ID="rocky"
ID_LIKE="rhel centos fedora"
VERSION_ID="8.9"
PLATFORM_ID="platform:el8"
PRETTY_NAME="Rocky Linux 8.5 (Green Obsidian)"
ANSI_COLOR="0;32"
CPE_NAME="cpe:/o:rocky:rocky:8:GA"
HOME_URL="https://rockylinux.org/"
BUG_REPORT_URL="https://bugs.rockylinux.org/"
SUPPORT_END="2029-05-31"
ROCKY_SUPPORT_PRODUCT="Rocky-Linux-8"
ROCKY_SUPPORT_PRODUCT_VERSION="8.9"
REDHAT_SUPPORT_PRODUCT="Rocky Linux"
REDHAT_SUPPORT_PRODUCT_VERSION="8.9"
安装成功。
总结
不管是要转换为AlmaLinux还是RockyLinux,都无法从CentOS 7升级,所以必须先升级到CentOS 8再开始。因为最终还是要转换成其他系统,所以也无需介意CentOS 8的具体版本,毕竟只是作为过渡的。
上述安装过程在我用快照回滚并重试的过程中存在失败的情况,因此在实际生产环境中情况可能更加复杂。
参考资料
https://techviewleo.com/how-to-convert-from-centos-7-to-almalinux-8/
https://techviewleo.com/how-to-migrate-from-centos-7-to-rocky-linux-8/
https://forums.centos.org/viewtopic.php?t=75172
https://www.tecmint.com/upgrade-centos-7-to-centos-8/