启动与虚拟机故障

由于权限和所有权问题,与 Azure Linux VM 的 SSH 连接失败 - Virtual Machines

· 52CE 我爱测

适用于:✔️ Linux VM 总结 本文提供了当通过安全外壳(SSH)连接到 Linux 虚拟机(VM)失败时的解决方案。可能的问题包括:在 RHEL 中 /var/empty/sshd 目录、SUSE 中 /var/lib/empty 目录或 Ubuntu 中 /var/run/sshd 目录不存在,这些目录不属于根用户拥有,或者具有组可写或全局可写权限。 重要 新功能! 请尝试使用 VM 协助解决首要问题。 建议您运行 Windows 的 VM 辅助

适用于:✔️ Linux VM

总结

本文提供了当通过安全外壳(SSH)连接到 Linux 虚拟机(VM)失败时的解决方案。可能的问题包括:在 RHEL 中 /var/empty/sshd 目录、SUSE 中 /var/lib/empty 目录或 Ubuntu 中 /var/run/sshd 目录不存在,这些目录不属于根用户拥有,或者具有组可写或全局可写权限。

重要

新功能! 请尝试使用 VM 协助解决首要问题。 建议您运行 Windows 的 VM 辅助 或 Linux 的 VM 辅助。 这些基于脚本的诊断工具可帮助你识别影响Azure VM 来宾代理和整体 VM 运行状况的常见问题。

如果在 VM 上遇到性能问题,请先运行这些工具,然后再联系Microsoft 支持部门。

症状

通过 SSH 连接到 Linux 虚拟机(VM)时,连接会失败。 可能会收到有关受影响目录的以下错误消息,具体取决于 Linux 分发版。

RHEL

sudo tail /var/log/messages
sshd: /var/empty/sshd must be owned by root and not group or world-writable.  

SUSE

sudo tail /var/log/messages
sshd[4022]: /var/lib/empty must be owned by root and not group or world-writable.

Ubuntu

sudo tail /var/log/auth.log
sshd[1850]: /var/run/sshd must be owned by root and not group or world-writable.

原因

如果受影响的目录不是根用户拥有的,或者它是组可写目录或可写目录,则可能会出现此问题。

若要解决此问题,请使用以下解决方法之一:

  • 解决方法 1:联机修复 VM。
  • 解决方法 2:脱机修复 VM。

解决方法 1:联机修复 VM

下面是两种脱机修复 VM 的方法:

  • 使用串行控制台。
  • 使用“运行命令”扩展。

使用串行控制台

  1. 从 Azure 门户连接到 VM 的 串行控制台。
  2. 使用本地管理帐户及其相应的凭据或密码登录到 VM。
  3. 运行以下命令来解决权限和所有权问题:

RHEL

    sudo mkdir -p /var/empty/sshd
    sudo chmod 755 /var/empty/sshd
    sudo chown root:root /var/empty/sshd
    ```

# [SUSE](#tab/slests1)
```bash
    sudo mkdir -p /var/lib/empty
    sudo chmod 755 /var/lib/empty
    sudo chown root:root /var/lib/empty
    ```

# [Ubuntu](#tab/ubuntuts1)
```bash
    sudo mkdir -p /var/run/sshd
    sudo chmod 755 /var/run/sshd
    sudo chown root:root /var/run/sshd
    ```

---

### 使用“运行命令”扩展功能

备注

此方法依赖于 Azure Linux VM 代理(waagent)。 因此,请确保代理安装在 VM 中,并且其服务正在运行。

在 Azure 门户中,打开 VM 的 **Properties** 窗口以检查代理状态。 如果代理已启用且状态为 **“就绪** ”,请按照以下步骤更改权限:

1. 转到 Azure 门户,找到 VM 设置,然后在 **Operations** 下选择 **Run Command**。
2. 通过选择 **RunShellScript>Run** 执行以下 shell 脚本:

# [RHEL](#tab/rhelts2)
```bash
    #!/bin/bash
    
    #Script to change permissions on a file
    mkdir -p /var/empty/sshd;chmod 755 /var/empty/sshd;chown root:root /var/empty/sshd
    ```

# [SUSE](#tab/slests2)
```bash
    #!/bin/bash
    
    #Script to change permissions on a file
    mkdir -p /var/lib/empty;chmod 755 /var/lib/empty;chown root:root /var/lib/empty
    ```

# [Ubuntu](#tab/ubuntuts2)
```bash
    #!/bin/bash
    
    #Script to change permissions on a file
    mkdir -p /var/run/sshd;chmod 755 /var/run/sshd;chown root:root /var/run/sshd
    ```

备注

在 Ubuntu 中 *,/var/run/sshd* 目录在内存中运行。 重启 VM 也会解决此问题。

---

1. 脚本执行完成后,输出控制台窗口将显示“启用成功”消息。

如果可以通过 SSH 连接到 VM,并且想要分析运行命令脚本执行的详细信息,请检查 */var/log/azure/run-command 目录中的handler.log文件*。

## 解决方法 2:脱机修复 VM

备注

- 如果 VM 串行控制台访问不可用且 waagent 未准备就绪,请使用此解决方法。
- 在 Ubuntu 中 *,/var/run/sshd* 目录在内存中运行。 重启 VM 也会解决此问题。 因此,不需要在 Ubuntu VM 中进行脱机故障排除。

下面是两种脱机修复 VM 的方法:

- 使用 az vm repair
- 使用手动方法。

### 使用 az vm repair

Azure CLI vm-repair 扩展的一部分 `az vm repair`,详见 [使用 Azure 虚拟机修复命令修复 Linux VM](repair-linux-vm-using-azure-virtual-machine-repair-commands)。

按照以下步骤将手动的离线过程实现自动化:

备注

在以下步骤中,相应地替换 `$RGNAME`、`$VMNAME`、`$USERNAME`、`$PASSWORD` 和 `repairdiskcopy` 值。

1. [使用 az vm repair create](/zh-cn/cli/azure/vm/repair#az-vm-repair-create) 命令创建修复 VM。 修复 VM 具有附加有问题的 VM 的 OS 磁盘副本。

    ```azurecli
    az vm repair create --verbose -g $RGNAME -n $VMNAME --repair-username $USERNAME --repair-password $PASSWORD --copy-disk-name repairdiskcopy
    ```
2. 登录修复虚拟机。 挂载 OS 磁盘的副本,并 chroot 至其文件系统。 按照详细的 [chroot 步骤](chroot-environment-linux)。
3. 运行以下命令以解决权限和所有权问题:

# [RHEL](#tab/rhelts3)
```bash
    mkdir -p /var/empty/sshd
    chmod 755 /var/empty/sshd
    chown root:root /var/empty/sshd
    ```

# [SUSE](#tab/slests3)
```bash
    mkdir -p /var/lib/empty
    chmod 755 /var/lib/empty
    chown root:root /var/lib/empty
    ```

# [Ubuntu](#tab/ubuntuts3)
```bash
    mkdir -p /var/run/sshd
    chmod 755 /var/run/sshd
    chown root:root /var/run/sshd
    ```

---
4. 应用更改后,运行以下命令 `az vm repair restore` 以执行与原始 VM 的自动 OS 磁盘交换。

    ```azurecli
    az vm repair restore --verbose -g $RGNAME -n $VMNAME
    ```

### 使用手动方法

如果串行控制台和 `az vm repair` 方法都不适用于你或失败,则必须手动执行修复。 按照以下步骤将 OS 磁盘手动附加到恢复 VM,并将 OS 磁盘交换回原始 VM:

- [将 OS 磁盘附加到恢复 VM,使用 Azure 门户。](troubleshoot-recovery-disks-portal-linux)
- 使用 Azure CLI 将 OS 磁盘附加到恢复 VM

成功将 OS 磁盘附加到恢复 VM 后,请按照详细的 [chroot 说明](chroot-environment-linux) 将附加 OS 磁盘的文件系统装载,并使用 chroot 进入。 然后,按照“使用 az vm repair”部分中的步骤 3来解决权限和所有权问题。

资料来源与适用范围

资料来源
微软官方 Linux 虚拟机排障文档
适用范围
Azure Linux 虚拟机;按正文发行版、内核及代理版本
内容语言
中文;命令、路径和错误标识保留技术原文
本地收录日期
2026-10-26
授权说明
CC BY 4.0

正文与所需资源由本站本地存储。查看来源及更新记录 ↗

请按适用版本和实际日志确认原因;本站没有对每一种系统或设备逐项执行文中的操作。