我刚刚继承了一个非常简单的 VM 设置,其中有一对 ESXi 服务器集群,所有东西都已连接好。问题是我没有服务器的 root 密码,而且没人知道它们是什么(尝试过猜测密码)。
据我所知,ESXi 没有单用户模式或任何等效模式。除了备份虚拟机和清除站点外,我还有什么选择?
答案1
为了ESXi,唯一支持的更改密码的方法是重新安装。
重新安装 ESXi 主机是重置 ESXi 密码的唯一受支持方法。由于 ESXi 架构的复杂性,任何其他方法都可能导致主机故障或不受支持的配置。ESXi 没有服务控制台,因此传统的 Linux 密码重置方法(例如单用户模式)不适用。
如果您有两台主机,并且它们有足够的资源来支持它,那么您可以将所有服务器通过 vMotion(和/或存储 vMotion)迁移到一台主机上,移除并重建空主机,将其重新添加到集群中。然后将所有客户机移动到重建的主机上,并移除/重建剩余的主机。这样您就可以重建而不会导致客户机停机。根据您的基础架构和要移动的虚拟机数量,除非您的主机配置非常大或非常复杂,否则两台主机的重建时间应该不到一天。
此外,如果您使用的是旧版本的 ESXi,这也是一个很好的时机来根据 HCL 检查您当前的硬件并升级到最新版本(如果支持)(当然,首先升级您的 vCenter 服务器之后)。
关于不受支持的方法,我会提及但不一定建议。
- 使用 vCenter 将每个主机加入 AD 域,并设置和配置 AD 用户作为主机的管理员,并允许 AD 身份验证。使用 vSphere 客户端直接连接到主机,使用 AD 凭据登录。通过这种方式连接后,您应该能够通过直接连接到主机的 vSphere 客户端更改 root 帐户的密码。我曾在紧急情况下使用过这个,它确实有效。
- 生成指定密码的主机配置文件并将其附加到主机。这可以完成,但仍需要将主机置于维护模式。我个人没有使用过这种方法。
答案2
那里是重置 ESXi 主机的 root 密码的方法,前提是您具有服务器的物理或带外访问权限。
- 我已经这样做了主机配置文件通过将收集自另一台主机的配置文件重新应用到受影响的服务器。但您可能没有支持此操作的许可。
- 我还必须使用启动 CD/Live CD 方法(还这里),该方法需要您具备一些 Linux 知识,并且涉及在影子文件中设置一个空密码或已知的加密密码。
至于为什么会发生这种情况...文档记录不全、管理员被恶意解雇、数据中心技术人员在构建服务器时忘记按大写键,我的记忆力不好, ETC, :)
答案3
ESXi root 密码已加密并存储在名为 /ect/shadow 的文件中。就像本文解释了你可以按照以下步骤删除 root 密码:
- 从 Ubuntu Live CD 启动您的服务器。
- 解压 state.tgz 和 local.tgz,删除影子文件内的密码哈希,然后重新打包档案。
- 之后,您可以以 root 帐户身份无需密码登录 ESXi 主机。
答案4
对于我来说,ESXi 6 的工作如下:
# https://www.linkedin.com/pulse/reset-esxi-root-password-through-vcenter-esxcli-method-buschhaus
#First, setup $vmhosts. You can do this many ways.$vmhosts = Get-Cluster -Name ClusterWithUnknownPassword | Get-VMHost
# Just so it contains one or more VMHost objects.
# To reset all ESXi host passwords use
# $vmhosts = Get-VMHost
$NewCredential = Get-Credential -UserName "root" -Message "Enter an existing ESXi username (not vCenter), and what you want their password to be reset to."
Foreach ($vmhost in $vmhosts) {
$esxcli = get-esxcli -vmhost $vmhost -v2 #Gain access to ESXCLI on the host.
$esxcliargs = $esxcli.system.account.set.CreateArgs() #Get Parameter list (Arguments)
$esxcliargs.id = $NewCredential.UserName #Specify the user to reset
$esxcliargs.password = $NewCredential.GetNetworkCredential().Password #Specify the new password
$esxcliargs.passwordconfirmation = $NewCredential.GetNetworkCredential().Password
Write-Host ("Resetting password for: " + $vmhost) #Debug line so admin can see what's happening.
$esxcli.system.account.set.Invoke($esxcliargs) #Run command, if returns "true" it was successful.
}