redhat 8默认自带yum源导致GBase 8a 远程ssh运行不存在的命令时卡住

在GBase 8a的centos 8版本安装时,偶发卡住,查看后发现是一个简单的ssh命令没有返回,经排查发现,在centos 8里,其自带了几个yum源,导致运行某些不存在的命令时,会【推荐】安装rpm包,导致卡住。

表现

GBase 8a安装时卡住

*********************************************************************************
Do you accept the above licence agreement ([Y,y]/[N,n])? y
*********************************************************************************
                     Welcome to install GBase products
*********************************************************************************
Environmental Checking on gcluster nodes.

查看代码,在ssh远程执行如下代码时

"export LANG=C; ret=`lssubsys -a`; echo $?

分析

手工执行不存在的命令出现推荐安装rpm

发现如下的输出

[root@redhat8_3 ~]# lssubsys -a
bash: lssubsys: command not found...
Install package 'libcgroup-tools' to provide command 'lssubsys'? [N/y]

除了打印出command not found之外,还额外出现了推荐安装rpm包的选择[Y/N],正是这个交互式输入,导致远程命令无法继续,从而卡住。

排查推荐的原因

经分析,在linux里对command not found的处理,有一个工具PackageKit.sh, 处理了command_not_found_handle

[root@redhat8_3 profile.d]# cat /etc/profile.d/PackageKit.sh
# Copyright (C) 2008 Richard Hughes <richard@hughsie.com>
#
# Licensed under the GNU General Public License Version 2
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.

command_not_found_handle () {
        local runcnf=1
        local retval=127

        # only search for the command if we're interactive
        [[ $- == *"i"* ]] || runcnf=0

        # don't run if DBus isn't running
        [[ ! -S /run/dbus/system_bus_socket ]] && runcnf=0

        # don't run if packagekitd doesn't exist in the _system_ root
        [[ ! -x '/usr/libexec/packagekitd' ]] && runcnf=0

        # don't run if bash command completion is being run
        [[ -n ${COMP_CWORD-} ]] && runcnf=0

        # don't run if we've been uninstalled since the shell was launched
        [[ ! -x '/usr/libexec/pk-command-not-found' ]] && runcnf=0

        # run the command, or just print a warning
        if [ $runcnf -eq 1 ]; then
                '/usr/libexec/pk-command-not-found' "$@"
                retval=$?
        elif [[ -n "${BASH_VERSION-}" ]]; then
                printf >&2 'bash: %scommand not found\n' "${1:+$1: }"
        fi

        # return success or failure
        return $retval
}

if [[ -n "${ZSH_VERSION-}" ]]; then
        command_not_found_handler () {
                command_not_found_handle "$@" && return 127
        }
fi

内部会调用command_not_found_handle命令,该命令对应的程序是 /usr/libexec/pk-command-not-found,查看进程,发现了lssubsys的命令

[root@redhat8_3 ~]# ps -ef | grep lssub
root       56417   56416  0 Jan20 pts/7    00:00:00 /usr/libexec/pk-command-not-found lssubsys -a
root       60747   21328  0 00:00 pts/6    00:00:00 grep --color=auto lssub

排查推荐的安装包来自哪里

查看yum数据源,发现有enable的

[root@redhat8_3 profile.d]# yum repolist all
repo id                                  repo name                                                                        status
appstream                                CentOS Linux 8 - AppStream                                                       enabled
appstream-source                         CentOS Linux 8 - AppStream - Source                                              disabled
baseos                                   CentOS Linux 8 - BaseOS                                                          enabled
baseos-source                            CentOS Linux 8 - BaseOS - Source                                                 disabled
cr                                       CentOS Linux 8 - ContinuousRelease                                               disabled
debuginfo                                CentOS Linux 8 - Debuginfo                                                       disabled
devel                                    CentOS Linux 8 - Devel WARNING! FOR BUILDROOT USE ONLY!                          disabled
extras                                   CentOS Linux 8 - Extras                                                          enabled
extras-source                            CentOS Linux 8 - Extras - Source                                                 disabled
fasttrack                                CentOS Linux 8 - FastTrack                                                       disabled
ha                                       CentOS Linux 8 - HighAvailability                                                disabled
media-appstream                          CentOS Linux 8 - Media - AppStream                                               disabled
media-baseos                             CentOS Linux 8 - Media - BaseOS                                                  disabled
plus                                     CentOS Linux 8 - Plus                                                            disabled
plus-source                              CentOS Linux 8 - Plus - Source                                                   disabled
powertools                               CentOS Linux 8 - PowerTools                                                      disabled
[root@redhat8_3 profile.d]#

这些数据源配置在/etc/yum.repos.d/下面

[root@redhat8_3 profile.d]# cd /etc/yum.repos.d/
[root@redhat8_3 yum.repos.d]# ll
total 48
-rw-r--r--. 1 root root  719 Nov  9  2020 CentOS-Linux-AppStream.repo
-rw-r--r--. 1 root root  704 Nov  9  2020 CentOS-Linux-BaseOS.repo
-rw-r--r--. 1 root root 1130 Nov  9  2020 CentOS-Linux-ContinuousRelease.repo
-rw-r--r--. 1 root root  318 Nov  9  2020 CentOS-Linux-Debuginfo.repo
-rw-r--r--. 1 root root  732 Nov  9  2020 CentOS-Linux-Devel.repo
-rw-r--r--. 1 root root  704 Nov  9  2020 CentOS-Linux-Extras.repo
-rw-r--r--. 1 root root  719 Nov  9  2020 CentOS-Linux-FastTrack.repo
-rw-r--r--. 1 root root  740 Nov  9  2020 CentOS-Linux-HighAvailability.repo
-rw-r--r--. 1 root root  693 Nov  9  2020 CentOS-Linux-Media.repo
-rw-r--r--. 1 root root  706 Nov  9  2020 CentOS-Linux-Plus.repo
-rw-r--r--. 1 root root  724 Nov  9  2020 CentOS-Linux-PowerTools.repo
-rw-r--r--. 1 root root  898 Nov  9  2020 CentOS-Linux-Sources.repo

关闭yum数据源

修改对应的配置文件,将其中的enable=1改成enable=0

[root@redhat8_3 yum.repos.d]# cat CentOS-Linux-AppStream.repo
# CentOS-Linux-AppStream.repo
#
# The mirrorlist system uses the connecting IP address of the client and the
# update status of each mirror to pick current mirrors that are geographically
# close to the client.  You should use this for CentOS updates unless you are
# manually picking other mirrors.
#
# If the mirrorlist does not work for you, you can try the commented out
# baseurl line instead.

[appstream]
name=CentOS Linux $releasever - AppStream
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=AppStream&infra=$infra
#baseurl=http://mirror.centos.org/$contentdir/$releasever/AppStream/$basearch/os/
gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial
[root@redhat8_3 yum.repos.d]# vi CentOS-Linux-AppStream.repo
[root@redhat8_3 yum.repos.d]# cat CentOS-Linux-AppStream.repo
# CentOS-Linux-AppStream.repo
#
# The mirrorlist system uses the connecting IP address of the client and the
# update status of each mirror to pick current mirrors that are geographically
# close to the client.  You should use this for CentOS updates unless you are
# manually picking other mirrors.
#
# If the mirrorlist does not work for you, you can try the commented out
# baseurl line instead.

[appstream]
name=CentOS Linux $releasever - AppStream
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=AppStream&infra=$infra
#baseurl=http://mirror.centos.org/$contentdir/$releasever/AppStream/$basearch/os/
gpgcheck=1
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial
[root@redhat8_3 yum.repos.d]#

其它几个都关掉,我本地测试只关掉了前2个,那个extra我没关。

[root@redhat8_3 yum.repos.d]# yum repolist all
repo id                                  repo name                                                                        status
appstream                                CentOS Linux 8 - AppStream                                                       disabled
appstream-source                         CentOS Linux 8 - AppStream - Source                                              disabled
baseos                                   CentOS Linux 8 - BaseOS                                                          disabled
baseos-source                            CentOS Linux 8 - BaseOS - Source                                                 disabled
cr                                       CentOS Linux 8 - ContinuousRelease                                               disabled
debuginfo                                CentOS Linux 8 - Debuginfo                                                       disabled
devel                                    CentOS Linux 8 - Devel WARNING! FOR BUILDROOT USE ONLY!                          disabled
extras                                   CentOS Linux 8 - Extras                                                          enabled
extras-source                            CentOS Linux 8 - Extras - Source                                                 disabled
fasttrack                                CentOS Linux 8 - FastTrack                                                       disabled
ha                                       CentOS Linux 8 - HighAvailability                                                disabled
media-appstream                          CentOS Linux 8 - Media - AppStream                                               disabled
media-baseos                             CentOS Linux 8 - Media - BaseOS                                                  disabled
plus                                     CentOS Linux 8 - Plus                                                            disabled
plus-source                              CentOS Linux 8 - Plus - Source                                                   disabled
powertools                               CentOS Linux 8 - PowerTools                                                      disabled
[root@redhat8_3 yum.repos.d]#

验证命令是否不再出现推荐安装

再次运行,发现只报错command no found,不再出现推荐安装的选项了。

[root@redhat8_3 ~]# lssubsys -a
bash: lssubsys: command not found...
[root@redhat8_3 ~]#

尝试安装集群

正常安装,没有卡住。

*********************************************************************************
Do you accept the above licence agreement ([Y,y]/[N,n])? y
*********************************************************************************
                     Welcome to install GBase products
*********************************************************************************
Environmental Checking on gcluster nodes.
Cgconfig service is not exist on host ['10.0.2.181'], resource manangement can not be used, continue ([Y,y]/[N,n])? n

总结

linux的PackageKit工具,对不存在的命令进行了人性化推荐,导致远程运行不存在的命令时出现了推荐安装的选项,而调用方并没有处理这种情况,导致一直带等待客户输入,从而卡住。

解决方案

  • 等待新版本
  • 暂时关闭yum数据源(临时措施)
  • 手工安装上依赖的命令包(临时措施)