【Linux】Centos 7.9 2009升级到Centos Stream 8详细指南
  W7xauqsNtuHG 2023年11月13日 28 0

环境介绍

OS:Centos 7 2009(也有人叫Centos 7.9)

硬件:Dell R740+光纤网卡+HBA卡直连存储

网卡绑定:Team(2个FC-NIC Port)

关键系统服务:SSHd

关键业务:无

查看系统的版本信息:

[root@xiamingliang ~]# uname -a
Linux devops 3.10.0-957.el7.x86_64 #1 SMP Thu Nov 8 23:39:32 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
[root@xiamingliang ~]# cat /etc/redhat-release 
CentOS Linux release 7.9.2009 (Core) 
[root@xiamingliang ~]#

升级前准备

正式环境升级,请务必做好数据备份以及重要配置备份!

正式环境升级,请务必做好数据备份以及重要配置备份!

正式环境升级,请务必做好数据备份以及重要配置备份!

升级后有可能升级会导致ssh的root用户无法登陆和网卡名称发生改变;尤其是网卡名称的变更会导致网卡绑定等设定的失效导致网络的中断!!

系统数据备份

<略过>

业务数据备份

<根据自己的实际业务系统的需要进行备份>

升级过程

升级步骤1

  • 首先需要安装EPEL仓库:
yum install epel-release -y
  • 更新系统至最新版本,减少报错概率
yum -y update

然后重启系统reboot

  • 安装yum-utils工具:
yum install yum-utils -y
  • 解析RPM包:
yum install rpmconf -y
rpmconf -a

注意,这里 rpmconf -a 如果有一些交互问答,采用默认选项。(即一路回车即可;默认是Y就是Y,默认是N就是N)

如果没提示,直接进行下一步操作即可。

  • 清理所有不需要的软件包:
package-cleanup --leaves
package-cleanup --orphans

###安装dnf

  • 需要首先安装CentOS 8的默认包管理器 dnf
yum install dnf -y
  • 然后移除yum包管理器(预防和dnf冲突):
dnf -y remove yum yum-metadata-parser
rm -Rf /etc/yum

安装Centos-8-Stream的源和升级epel源(源选择自己喜欢的源;例如:阿里/腾讯/163等都可以)

# 卸载centos-release包
rpm -e --nodeps `rpm -qa|grep centos-release`

# 安装Centos-8-Stream包
rpm -ivh --nodeps --force http://mirrors.nju.edu.cn/centos/8-stream/BaseOS/x86_64/os/Packages/centos-stream-release-8.6-1.el8.noarch.rpm

rpm -ivh --nodeps --force http://mirrors.nju.edu.cn/centos/8-stream/BaseOS/x86_64/os/Packages/centos-stream-repos-8-6.el8.noarch.rpm

rpm -ivh --nodeps --force http://mirrors.nju.edu.cn/centos/8-stream/BaseOS/x86_64/os/Packages/centos-gpg-keys-8-6.el8.noarch.rpm

rpm -ivh --nodeps --force http://mirrors.nju.edu.cn/centos/8-stream/BaseOS/x86_64/os/Packages/dracut-network-049-223.git20230119.el8.x86_64.rpm

# 升级EPEL仓库
dnf -y upgrade https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm

# 移除所有临时文件
dnf clean all
  • 现在执行CentOS 7升级到CentOS 8前需要线升级从:【重复步骤与上一步二选一,不同的只是源】
dnf upgrade -y
#或者
dnf -y upgrade https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm
  • 然后安装CentOS 8的release软件包:【重复步骤与上一步二选一,不同的只是源】
#dnf -y install http://mirrors.163.com/centos/8/BaseOS/x86_64/os/Packages/centos-repos-8.2-2.2004.0.1.el8.x86_64.rpm \
#http://mirrors.163.com/centos/8/BaseOS/x86_64/os/Packages/centos-release-8.2-2.2004.0.1.el8.x86_64.rpm \
#http://mirrors.163.com/centos/8/BaseOS/x86_64/os/Packages/centos-gpg-keys-8.2-2.2004.0.1.el8.noarch.rpm

dnf -y install http://mirrors.163.com/centos/8/BaseOS/x86_64/os/Packages/centos-linux-repos-8-2.el8.noarch.rpm \
http://mirrors.163.com/centos/8/BaseOS/x86_64/os/Packages/centos-linux-release-8.3-1.2011.el8.noarch.rpm \
http://mirrors.163.com/centos/8/BaseOS/x86_64/os/Packages/centos-gpg-keys-8-2.el8.noarch.rpm
  • 升级EPEL仓库:【重复步骤与上一步二选一,不同的只是源】
dnf -y upgrade https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm
  • 在升级了EPEL仓库后,移除所有临时文件:【重复步骤与上一步二选一,不同的只是源】
dnf clean all
  • 删除CentOS 7的旧内核core:
rpm -e `rpm -q kernel`
  • 移除冲突的软件包:(非必须)
rpm -e --nodeps sysvinit-tools
  • 然后执行CentOS 8升级:
dnf -y --releasever=8 --allowerasing --setopt=deltarpm=false distro-sync

解决报错

执行完上面的命令之后如果报下面的错,如果没报下面的错跳过这一步即可(请认真阅读错误提示!)。

报错:(你的报错中提示的软件包可能是不同的)

Running transaction check
Error: transaction check vs depsolve:
(gcc >= 8 with gcc < 9) is needed by annobin-8.78-1.el8.x86_64
rpmlib(RichDependencies) <= 4.12.0-1 is needed by annobin-8.78-1.el8.x86_64
(annobin if gcc) is needed by redhat-rpm-config-120-1.el8.noarch
rpmlib(RichDependencies) <= 4.12.0-1 is needed by redhat-rpm-config-120-1.el8.noarch
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'.

不过,此时 cat /etc/redhat-release 已经显示是 CentOS Linux release 8.1.1911 (Core) 所以我们需要解决这个软件依赖的冲突问题:

  • 升级gcc(升级以后gcc版本是8.3.1):【无效操作可以不做】
dnf upgrade gcc -y

但是升级以后报错依旧,看起来是因为依赖 rpm-4.14.2-26.el8_1.x86_64 才能完成。

参考 dnf upgrade and dnf update fails 这是因为升级CentOS 7到8时候broken了7系统导致的。

检查发现当前系统使用的 rpm 版本还是el7使用的 rpm-4.11.3-43.el7.x86_64 ,似乎是这个版本没有满足要求,所以先升级rpm:【无效操作可以不做】

dnf upgrade --best --allowerasing rpm

正确的解决办法:【本人亲测】

【Linux】Centos 7.9 2009升级到Centos Stream 8详细指南_夏明亮

请把红框里面的包名(可能有多个包,重复下面的步骤)替换到下面命令:命令:

find /var/cache/dnf/ -name *包名*

如:【有时候某些包名无法find到,那么就去掉后面的版本号信息再find一遍,对找到的包进行安装】

find /var/cache/dnf/ -name *dracut-network-049-218.git20221019.el8.x86_64*

【Linux】Centos 7.9 2009升级到Centos Stream 8详细指南_升级_02

安装rpm包如:

rpm -ivh --nodeps --force /var/cache/dnf/baseos-055ffcb2ec25a27f/packages/dracut-network-049-218.git20221019.el8.x86_64.rpm

【Linux】Centos 7.9 2009升级到Centos Stream 8详细指南_夏明亮_03

安装好所有的包之后往下操作:

dnf -y --releasever=8-stream --allowerasing --setopt=deltarpm=false distro-sync

但是上述会遇到很多文件冲突:【没有遇到的忽略这部分;遇到的根据自己的提示中每一行最后的那个package逐一通过rpm执行从rpmdb(仅rpmdb)中卸载】;这里每个人遇到的都是不同的。

file /usr/lib/python3.6/site-packages/setuptools/command/__pycache__/upload_docs.cpython-36.pyc from install of platform-python-setuptools-39.2.0-5.el8.noarch conflicts with file from package python3-setuptools-39.2.0-10.el7.noarch
file /usr/lib/python3.6/site-packages/rpmconf/__pycache__/__init__.cpython-36.opt-1.pyc from install of python3-rpmconf-1.0.21-1.el8.noarch conflicts with file from package python36-rpmconf-1.0.22-1.el7.noarch

这是因为,CentOS 7 的软件包 python36-rpmconf 到 CentOS 8改成了 python3-rpmconf ,所以由于包名字不同,所以没有对应进行升级,导致了文件冲突。注意类似和rpm相关到依赖不能直接卸载否则会导致rpm无法正常工作,所以改成删除 python36-rpmconf 包信息但是不实际删除文件:

rpm -e --justdb python36-rpmconf-1.0.22-1.el7.noarch rpmconf-1.0.22-1.el7.noarch
rpm -e --justdb --nodeps python3-setuptools-39.2.0-10.el7.noarch
#rpm -e --justdb --nodeps python3-pip-9.0.3-7.el7_7.noarch
rpm -e --justdb --nodeps python3-pip-9.0.3-8.el7.noarch
#rpm -e --justdb --nodeps iptables-1.4.21-34.el7.x86_64
rpm -e --justdb --nodeps iptables-1.4.21-35.el7.x86_64
rpm -e --justdb --nodeps vim-minimal

注解

CentOS 7到CentOS 8中,有包名字修改的有:

python36-rpmconf => python3-rpmconf python3-setuptools => platform-python-setuptools vim-minimal (CentOS 7) 和 vim-common (CentOS 8)冲突

rpm -e --justdb --nodeps vim-minimal 会遇到卡死问题,实际上此时是rpm的数据库损坏了,需要强制杀掉 kill -9 这个卡住的rpm命令,然后执行一次 rpm --rebuilddb 修复,再继续进行安装。


正确的解决办法:【本人亲测过】

【Linux】Centos 7.9 2009升级到Centos Stream 8详细指南_夏明亮_04

发现报错之后先卸载类似于图上from package后面的包名

rpm -e --nodeps python36-rpmconf-1.0.22-1.el7.noarch
rpm -e --nodeps sysvinit-tools-2.88-14.dsf.el7.x86_64

【Linux】Centos 7.9 2009升级到Centos Stream 8详细指南_夏明亮_05

卸载完后再次执行升级

dnf -y --releasever=8-stream --allowerasing --setopt=deltarpm=false distro-sync

  • 然后重新执行一次升级rpm:
dnf upgrade --best --allowerasing rpm
  • 然后再次执行CentOS 8升级就可以成功:
dnf -y --releasever=8 --allowerasing --setopt=deltarpm=false distro-sync

再加一步

重新安装yum、rpmconf和yum-utils

rm -rf /etc/yum
dnf clean all
dnf -y install yum rpmconf yum-utils

安装内核(防止有些时候没安装内核开机失败,开机失败的可以用Centos8 ISO镜像救援模式安装内核)

dnf -y install kernel kernel-core shim

安装基础环境

dnf -y groupinstall "Minimal Install"

执行rpmconf,会出现如下界面,一直回车即可

rpmconf -a

  • 安装CentOS 8的新Kernel Core:
dnf -y reinstall kernel-core

注解:

这里比较奇怪,虽然 /boot 目录下没有 vmlinuz-4.18.0-147.8.1.el8_1.x86_64 文件,显示内核并没有安装成功。但是系统提示我 kernel-core 已经安装,所以我采用的是 reinstall 指令。

  • 最后安装CentOS 8最小化包:
dnf -y groupupdate "Core" "Minimal Install"

注解:

这里可能会提示需要安装的 rsyslog 和 syslog-ng 冲突(原因是原先CentOS 7安装的是syslog-ng,虽然升级到了CentOS 8版本,但是和CentOS 8的rsyslog冲突),所以我先卸载syslog-ng,然后再重新执行上述CentOS 8最小化包安装:

rpm -e syslog-ng-3.23.1-1.el8.x86_64
  • 现在可以检查CentOS版本信息:
cat /etc/redhat-release

注意,上述步骤中每一步都需要仔细检查是否正确执行,千万不能跳过失败都步骤,否则会导致升级错乱失败。

到目前为止,已经完成了CentOS 7升级到CentOS 8的过程,现在重启操作系统:

reboot

升级步骤2(备选)

注解:

How to Upgrade Centos 7 to 8 的comments中,stafwag提出解决方法是删除 gcc 和所有 devel 软件包:

rpm -qa | grep -i devel | xargs -n 1 dnf remove -y

但是我验证这个方法没有成功,所以还是采用我自己摸索出来的方法。

  • 然后再次执行CentOS 8升级就可以成功:
dnf -y --releasever=8 --allowerasing --setopt=deltarpm=false distro-sync
  • 安装CentOS 8的新Kernel Core:
dnf -y reinstall kernel-core

注解:

这里比较奇怪,虽然 /boot 目录下没有 vmlinuz-4.18.0-147.8.1.el8_1.x86_64 文件,显示内核并没有安装成功。但是系统提示我 kernel-core 已经安装,所以我采用的是 reinstall 指令。

  • 最后安装CentOS 8最小化包:
dnf -y groupupdate "Core" "Minimal Install"

注解

这里会提示需要安装的 rsyslog 和 syslog-ng 冲突(原因是原先CentOS 7安装的是syslog-ng,虽然升级到了CentOS 8版本,但是和CentOS 8的rsyslog冲突),所以我先卸载syslog-ng,然后再重新执行上述CentOS 8最小化包安装:

rpm -e syslog-ng-3.23.1-1.el8.x86_64
  • 现在可以检查CentOS版本信息:
cat /etc/redhat-release

注解

注意,上述步骤中每一步都需要仔细检查是否正确执行,千万不能跳过失败都步骤,否则会导致升级错乱失败。

到目前为止,已经完成了CentOS 7升级到CentOS 8的过程,现在重启操作系统:

shutdown -r now

纯指令版

# 
yum update -y
# 
yum install -y epel-release
# 
yum install -y yum-utils rpmconf
# 
rpmconf -a
# 
package-cleanup --leaves
# 
package-cleanup --orphans
# 
yum install -y dnf
# 
dnf -y remove yum yum-metadata-parser
# 
rm -Rf /etc/yum
# 
dnf upgrade -y
# 
dnf install http://mirror.centos.org/centos/8/BaseOS/x86_64/os/Packages/{centos-linux-release-8.3-1.2011.el8.noarch.rpm,centos-gpg-keys-8-2.el8.noarch.rpm,centos-linux-repos-8-2.el8.noarch.rpm}
# 
dnf -y upgrade https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm
# 
dnf clean all
# 
rpm -e `rpm -q kernel` --nodeps
# 
rpm -e --nodeps sysvinit-tools
# 
dnf -y --releasever=8 --allowerasing --setopt=deltarpm=false distro-sync
# 
dnf -y install kernel-core
# 
dnf -y groupupdate "Core" "Minimal Install"
# 
cat /etc/redhat-release
# 
dnf swap centos-linux-repos centos-stream-repos
# 
dnf distro-sync

升级后检查与清理(建议做,非必须)

CentOS 7旧软件包和升级

现在已经完成了操作系统大版本升级。但是系统中依然有一些软件包是el7版本,原因可能是旧操作系统软件包名字在新版本已经不同,所以没有得到直接升级。可以通过 rpm -qa | grep el7 检查列表,并进行清理。

除了少数el7软件包被依赖,例如 nss-pem-1.0.3-7.el7.x86_64rpm 工具包依赖,不能删除。其他非重要的软件包可以手工清理。

rpm -qa | grep .el7. | xargs -n 1 dnf remove -y

清理无用软件包

DNF包管理器 提供了类似apt的autoremove的功能,可以自动清理不需要的(没有被依赖的)软件包:

dnf autoremove

注解

参考 How to remove orphaned packages on CentOS Linux 对于CentOS 7版本, yum-utils 提供了类似功能:

yum install yun-utils
# 获取孤儿软件包
package-cleanup --leaves
# 删除孤儿软件包
yum remove `package-cleanup --leaves`

特殊项目的验证

  • 网卡绑定
  • 外界存储设备的检查
  • 系统关键服务
  • sshd服务启动

sshd(没遇到的就不用管)

升级到CentOS 8之后,遇到 sshd 服务无法启动问题。登陆到终端检查:

systemctl status sshd.service

显示:

● sshd.service - OpenSSH server daemon
   Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: enabled)
   Active: activating (auto-restart) (Result: exit-code) since Sat 2020-06-06 22:58:23 CST; 7s ago
     Docs: man:sshd(8)
           man:sshd_config(5)
  Process: 12412 ExecStart=/usr/sbin/sshd -D $OPTIONS $CRYPTO_POLICY (code=exited, status=255)
 Main PID: 12412 (code=exited, status=255)

原因是原先CentOS 7上sshd配置 /etc/ssh/sshd_config 和升级到CentOS 8之后的sshd不兼容:

Jun 06 23:00:29 worker-1.huatai.me sshd[13564]: /etc/ssh/sshd_config line 21: Deprecated option KeyRegenerationInterval
Jun 06 23:00:29 worker-1.huatai.me sshd[13564]: /etc/ssh/sshd_config line 22: Deprecated option ServerKeyBits
Jun 06 23:00:29 worker-1.huatai.me sshd[13564]: /etc/ssh/sshd_config line 36: Deprecated option RSAAuthentication
Jun 06 23:00:29 worker-1.huatai.me sshd[13564]: /etc/ssh/sshd_config line 41: Deprecated option RhostsRSAAuthentication
Jun 06 23:00:29 worker-1.huatai.me sshd[13564]: /etc/ssh/sshd_config line 83: Deprecated option UseLogin
Jun 06 23:00:29 worker-1.huatai.me sshd[13564]: /etc/ssh/sshd_config line 84: Deprecated option UsePrivilegeSeparation
Jun 06 23:00:29 worker-1.huatai.me sshd[13564]: /etc/ssh/sshd_config line 98: Bad SSH2 cipher spec 'aes128-ctr,aes192-ctr,aes256-ctr,aes128-gcm>
Jun 06 23:00:29 worker-1.huatai.me systemd[1]: sshd.service: Main process exited, code=exited, status=255/n/a
Jun 06 23:00:29 worker-1.huatai.me systemd[1]: sshd.service: Failed with result 'exit-code'.
Jun 06 23:00:29 worker-1.huatai.me systemd[1]: Failed to start OpenSSH server daemon.

Jun 06 23:00:34 worker-1.huatai.me su[13589]: PAM unable to dlopen(/usr/lib64/security/pam_tally2.so): /usr/lib64/security/pam_tally2.so: canno>
Jun 06 23:00:34 worker-1.huatai.me su[13589]: PAM adding faulty module: /usr/lib64/security/pam_tally2.so
Jun 06 23:00:34 worker-1.huatai.me su[13589]: (to root) root on none
Jun 06 23:00:34 worker-1.huatai.me su[13589]: pam_unix(su:session): session opened for user root by (uid=0)
Jun 06 23:00:34 worker-1.huatai.me su[13589]: pam_unix(su:session): session closed for user root

解决的方法是使用新软件包配置覆盖:

cd /etc/ssh
cp sshd_config.rpmnew sshd_config
cp ssh_config.rpmnew ssh_config

现在sshd可以成功启动了,但是用户依然无法通过密码认证登陆,在 systemctl status sshd 中可以看到报错原因是PAM库加载错误:

Jun 06 23:05:36 worker-1.huatai.me sshd[16040]: PAM unable to dlopen(/usr/lib64/security/pam_tally2.so): /usr/lib64/security/pam_tally2.so: can>
Jun 06 23:05:36 worker-1.huatai.me sshd[16040]: PAM adding faulty module: /usr/lib64/security/pam_tally2.so

实际上系统缺少 /usr/lib64/security/pam_tally2.so 文件,原因是 /etc/pam.d/system-auth 包含了该认证策略。检查 /etc/pam.d 可以看到,升级CentOS 8的很多配置文件没有覆盖原先旧系统的配置文件,需要修正:

cd /etc/pam.d
mv sshd sshd.bak
mv sshd.rpmnew sshd
sysemctl restart sshd

然后就可以通过ssh远程登陆了。

  • 业务关键服务
  • 系统日志
【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月13日 0

暂无评论

推荐阅读
  wwLZeziuqjLR   2023年12月06日   17   0   0 sarcentos
  wwLZeziuqjLR   2023年12月11日   15   0   0 Dockercentos
  LE2wsiBPlOhg   2023年12月06日   15   0   0 Dockercentos
  wwLZeziuqjLR   2023年12月08日   67   0   0 Dockercentosbash
  wwLZeziuqjLR   2023年12月07日   16   0   0 Dockercentos
  wwLZeziuqjLR   2023年12月06日   17   0   0 abTime数据centos
W7xauqsNtuHG