

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 问题排查
<a name="discovery-tool-troubleshooting"></a>

## 验证发现工具与 vCenter 的连接
<a name="discovery-tool-vcenter-connectivity"></a>

当您遇到 VMware 模块配置错误时，请按照以下步骤验证连接：

**访问发现工具 VM**
+ Log-in 进入发现工具 VM，在 vCenter 中打开远程控制台
  + 用户名：发现
  + 密码：密码

**测试 vCenter 连接**

1. 测试 vCenter API 访问权限：

   ```
   curl -v --insecure -u <username>:<password> https://<vcenter-ip-or-hostname>:443/mob
   ```

1. 预期成功输出：

   ```
   [ec2-user@discoverytool ~]$ curl -v --insecure -u <user>:<password> https://vcsa/mob > tmp.txt
     % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                    Dload  Upload   Total   Spent    Left  Speed
     0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0*   Trying 192.168.2.125:443...
   * Connected to vcsa (192.168.2.125) port 443 (#0)
   ...
   </xml>
   * Connection #0 to host vcsa left intact
   ```

**测试 SSL 证书**

1. 运行以下命令：

   ```
   openssl s_client -showcerts -servername <hostname> -connect <hostname>:443
   ```

1. 预期成功输出：
   + 应显示 vSphere 证书详细信息
   + 验证端口 4 SSL/TLS 43 上的连接

   ```
   [ec2-user@discoverytool ~]$ openssl s_client -showcerts -servername vcsa -connect vcsa:443
   CONNECTED(00000003)
   depth=0 CN = vcsa.onpremsim.env, C = US
   verify error:num=20:unable to get local issuer certificate
   verify return:1
   depth=0 CN = vcsa.onpremsim.env, C = US
   verify error:num=21:unable to verify the first certificate
   verify return:1
   ---
   Certificate chain
    0 s:/CN=vcsa.onpremsim.env/C=US
      i:/CN=CA/DC=vsphere/DC=local/C=US/ST=California/O=vcsa.onpremsim.env/OU=VMware Engineering
   -----BEGIN CERTIFICATE-----
   ...
   -----END CERTIFICATE-----
   ---
   Server certificate
   subject=/CN=vcsa.onpremsim.env/C=US
   issuer=/CN=CA/DC=vsphere/DC=local/C=US/ST=California/O=vcsa.onpremsim.env/OU=VMware Engineering
   ---
   ```

## WinRM 疑难解答
<a name="discovery-tool-winrm-troubleshooting"></a>

如果您在使用 WinRM 时遇到连接问题，请按照以下步骤测试连接。这些步骤也适用于 Hyper-V 连接问题，因为发现工具使用 WinRM 与 Hyper-V 主机通信。

使用端口 5985 (HTTP) 和 5986 (HTTPS) 测试基本的 WinRM 连接。我们需要确保在端口 5986 (HTTPS) 上连接正常

```
# Check WinRM listener configuration
winrm enumerate winrm/config/listener

# Note: Replace <HOST> with the target computer's hostname or IP address. Adjust the username and password as needed. 
# Test WinRM connection on port 5985 (HTTP)
$cred = Get-Credential
Test-WSMan -Computer <HOST> -Authentication Negotiate -Credential $cred -Port 5985

# Test WinRM connection on port 5986 (HTTPS)
Test-WSMan -Computer <HOST> -Authentication Negotiate -Credential $cred -Port 5986
```

如果上述测试失败，请尝试在禁用证书验证的情况下建立 PowerShell 会话：

```
$cred = Get-Credential
$so = New-PsSessionOption -SkipCACheck -SkipCNCheck -SkipRevocationCheck
Enter-PSSession -ComputerName <HOST> -Credential $cred -Port 5985 -SessionOption $so
```

## Kerberos 故障排除
<a name="discovery-tool-kerberos-troubleshooting"></a>

如果您在从 Windows 服务器收集数据时遇到 Kerberos 身份验证失败，请使用以下各节来诊断和解决常见问题。

### 验证网络要求
<a name="kerberos-verify-network"></a>

在对 Kerberos 身份验证进行故障排除之前，请验证发现工具是否可以到达所需的网络端点。

**验证 Kerberos 的网络要求**

1. 验证域控制器的 DNS 解析。从发现工具 VM 中运行以下命令：

   ```
   nslookup dc01.example.com
   ```

   或者，您也可以使用 `dig`：

   ```
   dig dc01.example.com
   ```

   如果 DNS 解析失败，请验证发现工具 VM 是否已配置为使用可以解析您的 Active Directory 域的 DNS 服务器。检查`/etc/resolv.conf`并确认域名服务器条目是否指向您的域 DNS 服务器。

1. 通过端口 88 验证与密钥分发中心 (KDC) 的连接。运行以下命令：

   ```
   nc -zv dc01.example.com 88
   ```

   预期输出：

   ```
   Connection to dc01.example.com 88 port [tcp/kerberos] succeeded!
   ```

   如果连接失败，请确认没有防火墙规则阻止从发现工具 VM 到端口 88 上的域控制器的流量。

1. 通过 WinRM 端口验证与目标 Windows 服务器的连接。运行以下 命令：

   ```
   nc -zv <windows-server> 5985
   nc -zv <windows-server> 5986
   ```

   如果连接失败，请确认目标服务器上已启用 WinRM，以及防火墙规则是否允许端口 5985 和 5986 上的入站流量。

### 常见的 Kerberos 问题
<a name="kerberos-common-issues"></a>

以下是常见的 Kerberos 问题及其解决方案。

**区分大小写错误**

症状：在身份验证期间，您收到 “在 Kerberos 数据库中找不到服务器” 错误。

当 Kerberos 领域名称不是大写时，通常会发生此错误。在您的文件中必须以大写形式指定 Kerberos 领域。`krb5.conf`例如，使用 `EXAMPLE.COM` 而不是 `example.com`。

**账户锁定预防**

该发现工具使用退避机制来防止因身份验证尝试重复失败而导致账户锁定。如果您的服务帐号被锁定，则可以通过以下方式重置收集过程：通过发现工具 Web UI 停止收集模块，然后启动收集模块，网址为`https://<discovery-tool-vm-ip>:5000`。

**来自 CLI 的 kinit 失败**

下表列出了常见`kinit`错误及其解决方案。


| 错误 | 原因 | 解决方案 | 
| --- | --- | --- | 
| 找不到领域的 KDC | 无法访问 KDC 主机名或 IP 地址，或者未在中krb5.conf配置领域。 | 确认该krb5.conf文件包含正确的 KDC 主机名和领域。在端口 88 上确认 DNS 解析和与 KDC 的网络连接。 | 
| 预身份验证失败 | 服务帐户的密码不正确。 | 请验证密码并重试。如果该帐户已被锁定，请在重试之前在 Active Directory 中将其解锁。 | 
| 在 Kerberos 数据库中找不到客户端 | 主体名称与 Active Directory 中的任何账户都不匹配。 | 验证主体名称是否与账户名称完全匹配，包括大小写。使用领域为大写的格式username@REALM。 | 
| 无法解析 KDC 的网络地址 | DNS 无法解析 KDC 主机名。 | 在中验证 DNS 配置/etc/resolv.conf。确认 DNS 服务器可以解析 KDC 主机名。使用nslookup或进行测试dig。 | 

**尽管成功了 kinit，但收集失败了**

如果`kinit`成功但数据收集仍然失败，请检查以下内容：

1. 验证用于收集的主体名称是否与期间使用的大小写`kinit`完全匹配。

1. 验证服务帐户在目标服务器上是否具有所需的权限。

1. 确认目标服务器上已启用 WinRM。

1. 验证用于收集的主机名是否与 Active Directory 中注册的主机名相匹配。

**Kerberos 适用于某些服务器，但不适用于其他服务器**

如果某些服务器的 Kerberos 身份验证成功但其他服务器失败，请调查以下方面：

如果您的服务器跨越多个 Active Directory 域，请为每个域配置单独的 Kerberos 凭据。确保您的`/etc/krb5.conf`文件包含所有领域的条目。每个域名都需要自己的凭证，且`username@REALM`主体正确。

将工作服务器上的 WinRM 配置与故障服务器上的 WinRM 配置进行比较。在每台服务器上运行以下命令：

```
winrm get winrm/config
```

测试与远程桌面的连接以找出问题。发现工具使用该格式`username@DOMAIN`，而远程桌面使用该格式`DOMAIN\username`。

确认服务帐户是故障服务器上本地管理员组的成员。在目标服务器上运行以下命令：

```
net localgroup Administrators
```

WMI 需要本地管理员权限才能访问操作系统信息。SQL Server 收集还要求服务帐户在目标服务器上具有本地管理员访问权限。

### Kerberos 配置清单
<a name="kerberos-checklist"></a>

在开始数据收集之前，请使用以下清单验证您的 Kerberos 配置。
+ 该`krb5.conf`文件存在于发现工具 VM 上。
+ 中的领域名称是大写的。`krb5.conf`
+ `kinit`使用服务帐号成功运行，不会出现错误。
+ 跑步`klist`会显示一张有效的、未过期的门票。
+ 主体名称与 Active Directory 账户名完全匹配。
+ DNS 解析适用于 KDC 主机名。
+ 已确认通过端口 88 与 KDC 的网络连接。
+ 通过端口 5985 和 5986 与目标 Windows 服务器的网络连接已得到确认。
+ (Multi-domain) 每个 Active Directory 域都有在发现工具中配置的自己的凭据，`[realms]`并且`krb5.conf`包含所有域名和`[domain_realm]`条目。

## 甲骨文数据库故障排除
<a name="discovery-tool-oracle-troubleshooting"></a>

要诊断 Oracle 数据库收集问题，例如数据丢失或错误，请检查以下内容。

**连接被拒绝或超时**

症状：Oracle 收集状态显示服务器的连接错误。

要对此问题进行故障排除，请检查以下步骤：
+ 验证 Oracle 监听器是否正在目标主机上运行：`lsnrctl status`
+ 验证通过端口 1521（或您的自定义端口）从发现工具到 Oracle 主机的网络连接：`nc -zv <oracle-host> 1521`
+ 确认防火墙规则允许 Oracle 侦听器端口上的入站连接。
+ 通过在 Oracle 主机`lsnrctl services`上运行来验证服务名称。如果服务名称不正确，Oracle 监听器会拒绝连接。

**身份验证失败 (ORA-01017)**

症状：由于用户名或密码无效错误，收集失败。

要对此问题进行故障排除，请检查以下步骤：
+ 验证 Oracle 服务帐户是否存在且未被锁定：`SELECT account_status FROM dba_users WHERE username = 'DISCOVERY_USER';`
+ 通过手动连接来验证密码是否正确：`sqlplus discovery_user/<password>@<host>:1521/<service_name>`
+ 如果账户已被锁定，请将其解锁：`ALTER USER discovery_user ACCOUNT UNLOCK;`

**权限不足 (ORA-01031)**

症状：连接成功但收集返回的数据不完整。

要对此问题进行故障排除，请检查以下步骤：
+ 确认已授予 SELECT\_CATALOG\_ROLE：`SELECT * FROM dba_role_privs WHERE grantee = 'DISCOVERY_USER';`
+ 如果缺少所需角色，则授予该角色：`GRANT SELECT_CATALOG_ROLE TO discovery_user;`

**手动凭证显示错误但自动连接起作用**

当您将凭据手动固定到服务器时，如果连接失败，发现工具不会回退。验证您在凭据上配置的端口和服务名称是否与该特定服务器上的 Oracle 监听器相匹配。如果服务器具有非标准端口或服务名称，请相应地更新凭据配置。

**OS-level 回退未检测到 Oracle**

如果未配置数据库凭据，并且 OS-level 回退操作未检测到 Oracle：
+ 验证 SSH 或 WinRM 操作系统凭据是否已配置且适用于服务器（检查操作系统指标收集状态）。
+ 对于 Linux 主机，请验证是否`/etc/oratab`存在或 Oracle 进程监视器 (`pmon`) 进程是否正在运行。
+ 对于 Windows 主机，请验证 Oracle 注册表项是否存在`HKLM\SOFTWARE\Oracle`或`oracle.exe`进程正在运行。

## SNMP 故障排除
<a name="discovery-tool-snmp-troubleshooting"></a>

**访问发现工具 VM**
+ Log-in 进入发现工具 VM，在 vCenter 中打开远程控制台
  + 用户名：发现
  + 密码：密码

**安装 SNMP 工具（如果需要）**
+ `sudo yum install net-snmp-utils -y`

**测试与 Linux 服务器的 SNMP 连接**

1. `snmptable -v 2c -c <COMMUNITY_STRING> <REMOTE_SERVER_IP> .1.3.6.1.2.1.6.13.1`

1. 示例：

   ```
   #SNMPv2c:
   snmptable -v 2c -c public 192.168.1.100 .1.3.6.1.2.1.6.13.1
   
   #SNMPv3 (with authentication):
   snmptable -v 3 -u <username> -a MD5 -A <auth_password> 192.168.1.100 .1.3.6.1.2.1.6.13.1
   
   #SNMPv3 (with privacy):
   snmptable -v 3 -u <username> -a MD5 -A <auth_password> -x DES -X <priv_password> 192.168.1.100 .1.3.6.1.2.1.6.13.1
   ```

## 网络收集错误
<a name="discovery-tool-network-collection-errors"></a>

### 需要终端才能读取密码
<a name="discovery-tool-terminal-required"></a>

**错误**：

```
ss command failed on <host>: sudo: a terminal is required to read the password; either use the -S option to read from standard input or configure an askpass helper sudo: a password is required
```

ss 命令提示输入用户密码。配置的 ssh 用户必须在 sudoers 组中，并且必须为该命令配置无密码 sudo。 ss/netstat 要配置无密码 sudo，请执行以下操作：

1. 创建一个新的 sudoers 文件：

   ```
   sudo vi -f /etc/sudoers.d/<username>
   ```

1. 添加以下行：

   ```
   <username> ALL=(ALL) NOPASSWD: /usr/sbin/ss, /usr/bin/netstat
   ```

1. 进行此更改后，运行`sudo ss -tnap`并`sudo netstat -tnap`应在不提示输入密码的情况下执行

### 网络集合在没有 sudo 的情况下运行
<a name="discovery-tool-non-sudo-warning"></a>

如果您在 “已**发现库存**” 页面上看到以下警告：

```
Network collection ran without sudo. Process-level connection data may be missing.
```

此警告表明 SSH 用户帐户在目标服务器上没有 sudo 访问权限。如果没有 sudo，发现工具仍然可以收集网络连接数据，但它无法确定哪个进程拥有每个连接。要收集完整的进程级连接数据，请确保 SSH 用户在目标服务器上具有 sudo 访问权限。

## 操作系统指标收集错误
<a name="discovery-tool-os-metrics-collection-errors"></a>

### 缺少 Linux 服务器的服务器 UUID
<a name="discovery-tool-missing-uuid"></a>

如果发现工具无法收集 Linux 服务器的服务器 UUID（显示为空或缺失），请验证为这些服务器配置的 SSH 凭据是否具有 sudo 权限。该工具用于读`dmidecode`取服务器 UUID。如果未安装，`dmidecode`则该工具将恢复读取`/sys/class/dmi/id/product_uuid`，这也需要 sudo 访问权限。如果没有 sudo，则两种方法都无法检索 UUID。

**解决方案：**确保提供给发现工具的 SSH 用户帐户在目标 Linux 服务器上具有 sudo 访问权限。

## 已发现清单中的访问问题
<a name="discovery-tool-access-issues"></a>

如果您看到**服务器收集状态**的消息，例如缺少凭据或访问被拒绝：

1. 在搜索到的服务器列表中选择服务器。

1. 选择**管理访问凭证**您可以选择：

   1. 从 “选择凭据” 下拉列表**中选择备用凭据**。

   1. 选择 “**使用新凭据**并提供新凭据”。

1. **保存** 。

保存更改后，发现工具会重试连接。

## SSH 密钥认证疑难解答
<a name="discovery-tool-ssh-key-troubleshooting"></a>

**通过发现工具测试 SSH 密钥连接**

如果 SSH 密钥身份验证失败，请验证发现工具与目标服务器的连接：

1. 登录发现工具（通过 vSphere 控制台或 SSH 登录到 Linux 主机）。

1. 使用您的私钥测试 SSH 连接：

   ```
   ssh -i /path/to/private_key -o StrictHostKeyChecking=no <username>@<target_ip>
   ```

1. 如果连接成功，则问题在于如何将密钥上传到发现工具。 Re-upload 密钥并验证用户名是否匹配。

1. 如果连接失败，请查看下表中的错误消息。


| 错误消息 | 原因 | 解决方案 | 
| --- | --- | --- | 
| Permission denied (publickey) | 公钥不在目标服务器authorized\_keys的文件中，或者用户名错误。 | 在目标服务器\~/.ssh/authorized\_keys上为正确的用户添加公钥。验证文件权限:chmod 700 \~/.ssh && chmod 600 \~/.ssh/authorized\_keys. | 
| Connection timed out after 20s | 发现工具无法访问端口 22。 | 确认发现工具和目标服务器之间的端口 22 已打开。检查防火墙和安全组。 | 
| Connection refused | 目标服务器上未运行 SSH 服务。 | 启动 SSH 服务：sudo systemctl start sshd。 | 
| Invalid SSH key for credential '{{name}}' | 不支持密钥格式，密钥数据已损坏，或者密码缺失或不正确。 | 验证密钥格式是否为 PEM、OpenSSH 或 PKCS \#8 格式的 RSA、ECDSA 或 Ed25519。如果密钥已加密，请确保密码正确。 | 

## Linux 安装程序故障
<a name="discovery-tool-linux-installer-troubleshooting"></a>

**端口 5000 已在使用中**

**症状：**安装后发现工具服务无法启动。

**解决方案：**使用端口 5000 识别并停止进程：

```
sudo ss -tlnp | grep :5000
```

停止冲突进程，然后重新启动发现工具：

```
sudo ./AWS-Transform-discovery-tool.sh start
```

## 常见错误消息
<a name="discovery-tool-ui-messages"></a>

下表描述了常见的错误消息及其解释：


| Message | 位置 | 说明 | 
| --- | --- | --- | 
| 密码已创建 | 创建密码页面 | 两个用户同时创建密码时的竞争条件；刷新 | 
| 导出失败 | 库存页面 | 重试或发送日志 | 
| 按需收集已在进行中 | 库存页面 | 两个用户同时开始手动收集时的竞争条件；当前手动收集完成后重试 | 
| Command timed out after 60s | 服务器集合状态 | 目标服务器上的命令未在 60 秒内完成。这可能发生在负载较重的服务器上。重试收集或调查目标服务器的负载。 | 
| 一个或多个凭证包含未知的 UUID | 操作系统访问页面 | 两个用户同时编辑操作系统凭据时的竞争条件；重试 | 
| 密码无效 | Sign-in 页面 | 登录密码不正确；请联系管理员或联系我们 | 
| 您的会话已过期。请重新登录。 | Sign-in 页面 | 会话已超时，需要重新登录 | 
| 发生了内部错误 | 各种页面 | 重试或发送日志 | 