排查 SLES 随用随付注册问题

本文档介绍如何解决在将运行随用随付 (PAYG) SUSE Linux Enterprise Server (SLES) 的 Compute Engine 虚拟机实例连接到 SUSE 订阅管理工具 (SMT) 代码库时可能遇到的问题。

准备工作

  • 确保该虚拟机具有关联的服务账号
  • 确保可以从虚拟机访问 Service Metadata API
  • 确保虚拟机与各个区域服务器SMT 服务器之间的网络连接
  • 使用 sc-repocheck 工具自动排查问题。
  • 查看 SUSE PAYG 问题排查指南中所述的步骤。
  • 如果您尚未设置身份验证,请进行设置。身份验证用于验证您的身份,以便访问 Google Cloud 服务和 API。如需从本地开发环境运行代码或示例,您可以通过选择以下选项之一向 Compute Engine 进行身份验证:

    Select the tab for how you plan to use the samples on this page:

    Console

    When you use the Google Cloud console to access Google Cloud services and APIs, you don't need to set up authentication.

    gcloud

    1. 安装 Google Cloud CLI。 安装完成后,运行以下命令来初始化 Google Cloud CLI:

      gcloud init

      如果您使用的是外部身份提供方 (IdP),则必须先使用联合身份登录 gcloud CLI

    2. Set a default region and zone.

网络问题

无法解析域名

如果虚拟机无法连接到 smt-gce.susecloud.net SMT 服务器,您可能会遇到以下问题:

SUSEConnect error: SocketError: getaddrinfo: Name or service not known
ping: unknown host smt-gce.susecloud.net

这些问题通常是因 SMT 服务器域名 smt-gce.susecloud.net 解析不正确所致。此网域不可全局解析,因此您必须根据虚拟机区域设置其 IP 地址,具体操作如下:

检查 /etc/hosts 文件,确保它包含具有 smt-gce.susecloud.net 网域的条目。

cat /etc/hosts | grep -i smt

输出类似于以下内容,但 IP 地址可能不同:

# Added by SMT registration do not remove, retain comment as well
108.59.80.221   smt-gce.susecloud.net   smt-gce

如果 /etc/hosts 文件包含与上述示例不同的行,请执行以下操作:

  1. SUSE SMT IP 地址列表查找与您的虚拟机区域对应的 IP 地址。

  2. 修改该文件,添加 SUSE SMT IP 地址和缺少的任何其他信息。

网络不可用

即使虚拟机能够解析 Compute Engine 更新服务器域名,您也可能会由于网络不可用而遇到以下错误:

Unexpected exception.
Not ready to read within timeout.
Repository 'SLE-Module-Adv-Systems-Management12-Pool' is invalid.
Repository 'SLE-Module-Adv-Systems-Management12-Updates' is invalid.

以下是您在调查期间可能会在 /var/log/cloudregister 日志文件中发现的一些错误示例:

WARNING:Unable to remove client registration from server
WARNING:HTTPSConnectionPool(host='smt-gce.susecloud.net', port=443): Max retries exceeded with url: /connect/systems (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 110] Connection timed out',))
INFO:Region server arguments: ?regionHint=europe-central2
ERROR:No response from: [('34.118.112.80', None), ('34.116.251.218', None), ('34.116.224.144', None)]

如需详细了解问题的原因,请执行网络连接测试。以下示例展示了如何使用 cURL 测试 HTTPS 连接:

curl -sSI -m 5 -o /dev/null \
  -w 'Response code (>0 is OK): %{http_code}\n' \
  'https://smt-gce.susecloud.net'

该命令的输出包含 HTTP 响应代码或错误消息。下面是常见响应和错误:

  • 成功响应:

    Response code (>0 is OK): 200
    
  • 请求超时错误:

    Response code (>0 is OK): 000
    curl: (28) Connection timed out after 5001 milliseconds
    
  • 无法解析网域错误:

    Response code (>0 is OK): 000
    curl: (6) Could not resolve host: smt-gce.susecloud.net
    

在某些情况下(例如严格的主机防火墙规则),与 smt-gce.susecloud.net 网域关联的默认 IP 地址可能不可用。若要确保问题不仅与当前 IP 地址相关,请对备用区域服务器执行网络连接测试。检索区域服务器的列表:

转到 SUSE WebUI,获取区域更新服务器列表。

使用 pint 工具通过 CLI 获取区域级更新服务器列表。

  1. 安装必需的软件包

    sudo zypper install python3-susepubliccloudinfo
  2. 使用带特定区域的以下命令

    pint google servers --region us-central1
  3. 成功的输出包含 XML 格式的条目列表

    <?xml version='1.0' encoding='UTF-8'?>
        <servers>
          <server ip="146.148.73.14" name="" region="us-central1" type="regionserver-sles"/>
          <server ip="162.222.182.90" name="" region="us-central1" type="regionserver-sap"/>
          <server ip="108.59.80.221" name="smt-gce.susecloud.net" region="us-central1" type="smt"/>
          <server ip="108.59.85.41" name="smt-gce.susecloud.net" region="us-central1" type="smt"/>
          <server ip="108.59.80.58" name="smt-gce.susecloud.net" region="us-central1" type="smt"/>
        </servers>
    

如需查找 Google Cloud的 SUSE 服务器 IP 的完整列表,请查看以下文档:

虚拟机配置错误可能会导致网络不可用。如果您遇到问题,请执行网络诊断来确定根本原因。

注册失败

如果您的虚拟机在 Cloud NAT 中具有专用 IP 地址,您可能会遇到以下错误:

ERROR:  Registration failed: Registering system to registration proxy https://smt-gce.susecloud.net
command '/usr/bin/zypper --non-interactive refs Python_3_Module_x86_64' failed
Error: zypper returned 4 with 'Problem retrieving the repository index file for service 'Python_3_Module_x86_64':
Timeout exceeded when accessing 'https://smt-gce.susecloud.net/services/2045/repo/repoindex.xml?credentials=Python_3_Module_x86_64'.

如需解决此问题,请查看 Cloud NAT 配置,并验证您是否已将每个虚拟机实例的端口数下限参数设置为至少 256

如需了解详情,请参阅 Cloud NAT 后面的 Compute Engine 实例注册和 zypper 失败 SUSE 支持公告。

无响应

如果您的虚拟机在与更新服务器和区域服务器通信时遇到问题,您可能会看到以下错误:

  • SUSEConnect 错误:

    SUSEConnect error: Errno::ETIMEDOUT: Connection timed out - connect(2) for "smt-gce.susecloud.net" port 443
    
  • zypper 错误:

    Error retrieving metadata for 'SLE-Module-Adv-Systems-Management12-Pool':
    Not ready to read within timeout.
    ...
    

如果更新服务器和区域服务器不响应,则可能会出现这些错误。若要验证是否属于这种情况,请检查 /var/log/cloudregister 日志中是否存在类似内容:

INFO:Region server arguments: ?regionHint=europe-central2
INFO:Using API: regionInfo
INFO:Region server arguments: ?regionHint=europe-central2
INFO:Getting update server information, attempt 1
INFO:   Using region server: 130.211.242.136
ERROR:  No response from: 130.211.242.136
INFO:   Using region server: 35.187.193.56
ERROR:  No response from: 35.187.193.56
INFO:   Using region server: 162.222.182.90
ERROR:  No response from: 162.222.182.90
INFO:   Using region server: 130.211.88.88
ERROR:  No response from: 130.211.88.88
ERROR:  None of the servers responded
ERROR:  Attempted: [IPv4Address('130.211.242.136'), IPv4Address('35.187.193.56'), IPv4Address('162.222.182.90'), IPv4Address('130.211.88.88')]
...
...
...
ERROR:Request not answered by any server after 3 attempts
ERROR:Exiting without registration

如需解决此问题,请尝试以下一项或多项操作:

  • 确认该虚拟机具有外部 IP 地址,或者 Virtual Private Cloud 子网使用 NAT(Cloud NAT 或自定义解决方案)。

  • 如果您修改了默认网络路由规则(例如限制公共互联网访问或通过本地网络路由流量),请执行以下操作,通过默认的 Compute Engine 网关为 SMT IP 手动添加路由:

    1. 前往 Google Cloud 控制台中的路由页面。

      转到“路由”页面

    2. 路由管理标签页下,查找包含 SUSE SMT IP 地址的路由,并验证其 Compute Engine 默认网关是否为下一个跃点。

    3. 如果缺少路由,请点击创建路由并输入必要信息来添加路由。

  • 如果您使用的是内部直通式网络负载均衡器,以及其他中间网络软件(例如防火墙或自定义 NAT),请执行以下操作,确保该负载均衡器是虚拟机流量的下一个跃点:

    1. 在 Google Cloud 控制台中,前往虚拟机实例页面。

      转到“虚拟机实例”页面

    2. 点击要检查的虚拟机的名称。虚拟机详情页面随即打开。

    3. 网络接口部分中,点击查看详细信息

    4. 防火墙和路由详细信息部分中,找到用于定义所选 IP 地址范围的路径的路由。

    5. 点击相应路由的名称,并确认内部直通式网络负载均衡器或其 IP 地址是下一个跃点。

    如果没有路由定义所选 IP 地址范围的路径,或者该路由的下一个跃点与内部直通式网络负载均衡器不同,则设置内部直通式网络负载均衡器作为下一个跃点

  • 如果您使用的是内部直通式网络负载均衡器,请确认它与虚拟机位于同一区域。

    1. 在 Google Cloud 控制台中,前往虚拟机实例页面。

      转到“虚拟机实例”页面

    2. 找到您要检查的虚拟机并记下其区域。

    3. 前往 Google Cloud 控制台中的负载均衡页面。

      转到“负载平衡”页面

    4. 找到所使用的内部直通式网络负载均衡器,并检查该负载均衡器是否与虚拟机位于同一区域。

    5. 如果虚拟机和内部直通式网络负载均衡器不在同一区域,请启用全球访问权限

代理背后的注册

如果您的虚拟机使用非透明代理或执行中间人 (PITM) 检查的其他软件(例如 Barracuda CloudGen 防火墙、Palo Alto),则可能会遇到问题。以下示例演示了如何尝试通过 HTTP 代理注册 SLES。

ERROR: Baseproduct registration failed
ERROR: Registering system to registration proxy https://smt-gce.susecloud.net

Announcing system to https://smt-gce.susecloud.net ...
SUSEConnect error: Net::HTTPFatalError: 503 "Service Unavailable"

SUSE 并不正式支持在 Compute Engine 上通过中间人 (PITM) 代理和非透明代理注册 SLES。由于证书锁定,在注册期间 PITM 代理配置失败。

我们建议您使用 Cloud NAT 配置或设置自定义 SMTP 服务器。

VPC Service Controls 违规

如果您的组织使用 VPC Service Controls (VPC-SC),注册可能会失败,并且您可能会看到 Request is prohibited by organization's policy 错误消息。如果您未在 VPC-SC 政策中为 SUSE 更新基础架构配置例外情况,则入站或出站违规可能会导致此失败。

如需解决此问题,请将以下组件添加到 VPC-SC 政策中的许可名单,以允许虚拟机与 SUSE 更新基础架构通信:

  • 更新了基础设施项目:Suse-gce-smt(项目编号:778092048372)
  • 服务账号:778092048372@project.gserviceaccount.com
  • 所需方法:compute.alpha.InstancesService.GetLicenses

操作系统配置问题

注册状态未知

如果您不知道随用随付 (PAYG) SUSE Linux Enterprise Server (SLES) 是否已注册,请运行以下命令:

sudo SUSEConnect --status-text

输出包含 SUSE 产品(包括 SUSE Linux Enterprise Server)的版本和注册状态。

Installed Products:
------------------------------------------

  SUSE Linux Enterprise Server 12 SP5
  (SLES/12.5/x86_64)

  Registered

------------------------------------------
...

如果状态为 Not Registered,请重新注册虚拟机以解决此问题:

sudo registercloudguest --force-new

如果基础产品链接指向错误的产品文件,您可能会遇到以下错误:

2020-06-17 12:03:56,124 ERROR:Unable to obtain product information from server "108.59.85.41,None"
        Unprocessable Entity
        {"type":"error","error":"Unmet product dependencies, activate one of these products first: SUSE Linux Enterprise Server 12 x86_64, SUSE Linux Enterprise Server for SAP Applications 12 x86_64, SUSE Linux Enterprise Server 12 SP1 x86_64, ...","localized_error":"..."}
Unable to register modules, exiting.

/etc/products.d/baseproduct 符号链接指向不正确的产品文件(例如 sle-module-toolchain.prod)时,就会发生此错误。

若要解决此问题,请更新 /etc/products.d/baseproduct 处的符号链接,使其指向相应的基础产品文件:

  1. 导航到 /etc/products.d 目录

      cd /etc/products.d
  2. 如果您已安装 SLES for SAP,请运行以下命令,并将 SLES.prod 替换为 SLES_SAP.prod

      sudo ln -sf SLES.prod baseproduct

实例身份信息不可用

如果实例身份信息不适用于虚拟机,您可能会遇到以下错误。如果服务账号未附加到实例,或者附加的服务账号已停用,则可能会出现此问题。

ERROR:Data collected from stderr for instance data collection "b'Unable to access instance identity information\n'"

如需访问身份令牌的实例元数据,所有虚拟机都必须具有关联的服务账号

如需了解详情,请参阅公有云基础架构更新

如需检查虚拟机的服务账号的状态,请在虚拟机上运行以下命令:

curl -s -H 'Metadata-Flavor: Google' \
  'http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/identity?audience=test'

返回身份令牌的成功响应示例:

eyJhbGciOiJSUzI1NiIsImtpZCI6IjkzOTd0MDQxSHQ2NDNxNzkzUjY1MDIwNzEyMjZPNnppaTdqNTl3eTciLCJ0eXAiOiJKV1QifQ.eyJhdWQiOiJ0ZXN0IiwiYXpwIjoiMjY1MDIwMDUyMzgzMjYyNTk0ODU2IiwiZXhwIjoxNjgzNzEyNTQzLCJpYXQiOjE2ODM3MTI4NjQsImlzcyI6Imh0dHBzOi8vYWNjb3VudHMuZ29vZ2xlLmNvbSIsInN1YiI6IjQ1NjA2MzQ5MDg5Mzc0Njg3ODI5NyJ9.EpzQ3NZ8mKStdpH10fL34qsKG0rjQEflzvLJLm2tVNX4xBJAkMhi8lcs5InUEY-QMK3njgbzdzNtD1fXoIfKoeWsqkA8vG3NkBz5zqRrtaB2STcO14H5tjIdTBsrCtET447tRXlGG5cvgMcWnRDZG92-jUZEpWki_Ri4T69X5-bBWkfE2Thm3oSUW4fScdeVOEmOgWnzD2jeVqQ_2YniywvpkT-rLzKfN-5AgN66zgBfXqJVTC90KFMebfiaOoL7z6ZSM9AjZGf45QEMZjxjd-Xzyee6ZWK8s0RE3hJlytb3zYcLt3tJwQ1WhnrC2ToJ-ZmKxxK3xKDLCvCQ6Ny5to

如果虚拟机不受影响,您会收到一个令牌。如果虚拟机受到影响,返回的元数据将是类似于以下内容的错误消息:

{
  "error": "invalid_request",
  "error_description": "Service account not enabled on this instance"
}

如需解决此问题,请执行以下步骤:

  1. 停止虚拟机:

    gcloud compute instances stop VM_NAME
  2. 将服务账号添加到虚拟机:

    gcloud compute instances set-service-account VM_NAME \
      --service account SERVICE_ACCOUNT \
      --no-scopes
  3. 启动该虚拟机:

    gcloud compute instances start VM_NAME
  4. 添加缺少的服务账号后,请从虚拟机运行以下命令来重新注册 SLES:

    sudo registercloudguest --force-new

缺少必需的软件包

如果您的虚拟机缺少 cloud-regionsrv-clientregionServiceClientConfigGCEcloud-netconfig-gcesuseconnect-ng 等必需软件包,注册可能会失败。

如需解决此问题,请安装必需的软件包,清理注册文件,然后重新注册虚拟机。

  1. 安装所有缺失的软件包。

    sudo zypper install PACKAGE_NAME

    PACKAGE_NAME 替换为缺失的软件包的名称。

  2. 清理旧注册文件:

    sudo registercloudguest --clean
    sudo SUSEConnect --cleanup
    sudo rm -f /etc/zypp/credentials.d/*
    sudo rm -f /etc/zypp/repos.d/*
    sudo rm -f /etc/zypp/services.d/*
  3. 重新注册虚拟机:

    sudo registercloudguest --force-new

如果您运行 registercloudguest 并看到 ModuleNotFoundError: No module named 'requests' 错误,则可能是 /usr/bin/python3 符号链接不正确所致,例如,您手动覆盖了该链接。

Traceback (most recent call last):
File "/usr/sbin/registercloudguest", line 34, in <module>
import requests
ModuleNotFoundError: No module named 'requests'

如需解决此问题,请重新创建符号链接,使其指向正确的 Python 版本。

  1. 确认实例上安装的 Python 版本:

    sudo zypper info python3
  2. 检查 python3 符号链接:

    ls -ll /usr/bin | grep -i python3
  3. 如果链接不正确,请将其移除,然后创建一个指向正确 Python 版本(例如 python3.6)的新链接:

    sudo rm /usr/bin/python3
    sudo ln -sf /usr/bin/python3.6 /usr/bin/python3

SSL 证书验证失败

如果 /etc/pki/trust/anchors 目录中缺少证书文件,您可能会看到 Curl error 60ssl.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] 等错误。下面是一个更详细的示例,展示了您可能会在 /var/log/cloudregister 中看到的错误:

Traceback (most recent call last):
 File "/usr/lib/python3.6/site-packages/urllib3/connectionpool.py", line 677, in urlopen
 ...
 File "/usr/lib64/python3.6/ssl.py", line 689, in do_handshake
 self._sslobj.do_handshake()
 ssl.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:852)

您可以运行以下命令并查看是否输出为空,以确认证书文件是否缺失:

ls -lart /etc/pki/trust/anchors

如果缺少证书,输出应为空:

total 0

要解决此问题,请尝试以下方法之一:

  • 方法 1:清理并重新注册

    清理与注册相关的所有文件,然后强制执行新的注册。注册过程会从区域服务器下载必要的证书。

    sudo registercloudguest --clean && \
      sudo SUSEConnect --cleanup && \
      sudo rm -f /etc/zypp/credentials.d/* && \
      sudo rm -f /etc/zypp/repos.d/* && \
      sudo rm -f /etc/zypp/services.d/* && \
      sudo rm -f /etc/pki/trust/anchors/* && \
      sudo sed -i '/^# Added by SMT reg/,+1d' /etc/hosts && \
      sudo registercloudguest --force-new
  • 方法 2:从正常运行的实例复制证书

    如果清理并重新注册无法解决问题,您可以从正常运行的实例复制证书文件,方法是使用 gcloud compute scp 或将正常运行的实例的启动磁盘附加到出现故障的实例。

    如果您在 MOUNT_PATH 处挂接并装载正常运行的实例的磁盘,请运行以下命令:

    sudo cp MOUNT_PATH/etc/pki/trust/anchors/* /etc/pki/trust/anchors/
    sudo update-ca-certificates
    sudo cp -pr MOUNT_PATH/usr/lib/regionService /usr/lib/regionService
    sudo registercloudguest --force-new

libzypp 软件包不兼容

采用 SLES for SAP 15 的 PAYG SUSE 虚拟机可能无法注册,并显示类似于以下内容的错误:

ERROR:Baseproduct registration failed
Registering system to registration proxy https://smt-gce.susecloud.net
...
command '/usr/bin/zypper --non-interactive refs SUSE_Linux_Enterprise_Server_for_SAP_Applications_x86_64' failed
Error: zypper returned 1 with 'Error occurred while setting download (curl) options for 'https://smt-gce.susecloud.net/services/2294?credentials=SUSE_Linux_Enterprise_Server_for_SAP_Applications_x86_64':
Unexpected exception.
Unknown error reading from 'plugin:/susecloud?credentials=SUSE_Linux_Enterprise_Server_for_SAP_Applications_x86_64&path=/services/2294'
...
- Error occurred while setting download (curl) options for 'https://smt-gce.susecloud.net/services/2294?credentials=SUSE_Linux_Enterprise_Server_for_SAP_Applications_x86_64':

如果 libzypp 软件包的更新导致 libcurl4 软件包的版本不兼容,则可能会出现此问题。当 libzypp 尝试自行更新时,它无法再使用 libcurl4 向软件包位置发出请求。

如需解决此问题,请手动更新 libzypp 软件包。以下命令是一个示例,您可能需要调整版本号:

sudo rpm -i libzypp-17.31.31-150400.3.52.2.x86_64.rpm

操作系统版本不受支持或软件包过时

如果您运行的操作系统版本已超出其常规支持期限(例如,SLES 12 SP4 的常规支持已于 2020 年 6 月 30 日结束),则注册可能会失败。此故障可能是因为虚拟机上的过时软件包无法与 SUSE 更新基础架构通信。即使网络连接似乎部分成功(例如,使用 telnet 连接到 SMT 服务器时返回 403 Forbidden 错误),您也可能会在 /var/log/cloudregister 日志文件中看到有关无法访问的 IP 的错误。

如需查看软件包是否已过时,您可以查看其安装日期。超过一年未更新的软件包可能已过时。如需查看软件包的上次更新时间,请使用以下命令:

rpm -qa --qf '%{NAME}-%{VERSION} : %{INSTALLTIME:date}\n' | grep PACKAGE_NAME

如需解决此问题,请升级到受支持的 SLES 版本。您可能还需要按照 SUSE 技术信息文档 (TID)中所述更新特定软件包。