尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

ESXi Shell修改时区:原理、命令与批量运维实践

ESXi Shell修改时区:原理、命令与批量运维实践 1. 为什么要在ESXi Shell里改时区如果你管理过VMware ESXi服务器大概率遇到过虚拟机时间不准的问题。虚拟机的时间通常依赖于宿主机当宿主机ESXi的时区设置不正确时即使你给虚拟机安装了VMware Tools并启用了时间同步虚拟机里的系统时间显示也可能和实际时区对不上。比如服务器物理位置在北京但ESXi系统时区却设置成了UTC那么所有虚拟机内部显示的时间都会比北京时间晚8小时这会给日志分析、定时任务、业务系统运行带来一系列麻烦。修改ESXi时区最直观的方法是通过vSphere Client的Web界面在“管理”-“系统”-“时间和日期”里设置。但这个方法有个前提你的ESXi主机必须能正常连接到vCenter Server或者你能直接通过HTML5客户端访问其管理地址。在很多实际场景下这个“图形化”路径是走不通的。例如服务器处于纯命令行管理模式没有安装或无法启动Web界面、网络配置错误导致管理界面无法访问、或者你需要通过脚本批量修改大量ESXi主机的时区。这时候直接进入ESXi Shell进行操作就成了唯一可靠的选择。ESXi Shell是一个基于BusyBox的受限Linux命令行环境。通过它我们可以使用一系列ESXi特有的命令行工具主要是esxcli来深入配置系统修改时区就是其中一项基础但关键的操作。这个操作本身不复杂但涉及ESXi的安全模型默认关闭Shell、命令的具体语法、以及修改后的验证其中有不少细节需要注意。接下来我就结合自己的实操经验把通过Shell修改ESXi时区的完整流程、背后的原理以及可能遇到的坑给你彻底讲清楚。2. 访问ESXi Shell的几种途径与安全考量在动手修改之前我们首先得能进入ESXi Shell。VMware出于安全考虑默认是禁用ESXi Shell和SSH服务的。所以我们的第一步就是启用它。根据你手头的访问条件有几种不同的启用方法。2.1 通过主机控制台直接启用最直接如果你能在服务器现场或者通过IPMI、iDRAC、iLO等带外管理工具连接到服务器的控制台这是最推荐的方式。在ESXi启动后的界面按F2键输入root密码进入“系统自定义”界面。使用键盘上下键选择“故障排除选项”然后按回车。在故障排除选项菜单中选择“启用ESXi Shell”和“启用SSH”。按回车启用后你会看到服务状态从“已禁用”变为“已启用”。按ESC键退出直到返回主界面。此时在控制台界面上你会看到提示告诉你ESXi Shell的快捷键是AltF1返回DCUI直接控制台用户界面的快捷键是AltF2。按AltF1就会看到一个命令行登录提示用root账户和密码登录你就进入了ESXi Shell。注意在控制台直接操作虽然直观但如果你管理的服务器在远程机房频繁跑现场不现实。这时带外管理如iDRAC/iLO的虚拟控制台就至关重要它让你能像坐在服务器前一样操作。2.2 通过vSphere Client/Web Client远程启用如果你能通过网络正常访问ESXi主机的管理IP通常是https:// 那么可以通过图形界面启用。使用浏览器登录ESXi的Web Client。导航到主机点击“管理”-“服务”-“服务”。在服务列表中找到“TSM”ESXi Shell和“SSH”这两个服务。分别点击它们然后选择“启动”和“随主机一起启动和停止”。启用后你就可以使用SSH客户端如PuTTY、SecureCRT、或者macOS/Linux终端连接到ESXi主机的IP地址端口22使用root身份登录。这比在控制台切换界面更方便也是后续脚本化操作的基础。2.3 重要安全原则用完即关这是一个必须养成的习惯。ESXi Shell和SSH是强大的管理工具但也带来了巨大的安全风险。一旦开启就意味着为攻击者留下了一个潜在的入口点。因此在完成所有必要的命令行操作比如修改时区后务必将其禁用。通过命令行禁用推荐在操作完成后立即执行esxcli system settings advanced set -o /UserVars/SuppressShellWarning -i 1 # 可选禁用Shell警告 esxcli network firewall ruleset set -e false -r httpClient # 如果不需要可关闭防火墙规则 # 停止并禁用SSH服务 esxcli system ssh server set --enabledfalse esxcli system ssh server stop # 停止并禁用ESXi Shell服务 esxcli system shell set --enabledfalse esxcli system shell disable通过控制台禁用再次按F2进入系统自定义在“故障排除选项”中禁用。通过Web Client禁用在服务管理界面将TSM和SSH服务停止并设置为“不随主机一起启动和停止”。牢记最小权限原则和即时关闭是生产环境运维的基本素养。3. 深入理解ESXi的时区管理机制在修改时区前我们需要知道ESXi是怎么管理时间的。ESXi的时间体系分为两部分硬件时钟Hardware Clock也叫RTC和系统时钟System Clock。硬件时钟存储在服务器主板的一块特殊芯片CMOS中依靠电池供电即使服务器断电它也会继续走时。这个时钟通常设置为UTC协调世界时。系统时钟ESXi内核启动后读取硬件时钟并根据设定的时区Time Zone进行换算得到我们看到的操作系统时间。所有运行在ESXi上的虚拟机其初始时间基准都来源于此。当我们修改ESXi的“时区”时我们修改的并不是硬件时钟的时间而是系统时钟用于换算的“偏移量规则”。ESXi使用标准的tzdata时区数据库文件这些文件位于/usr/share/zoneinfo/目录下。例如/usr/share/zoneinfo/Asia/Shanghai这个文件就包含了中国标准时间CST的规则包括历史夏令时变化虽然中国已多年未实行和与UTC的固定偏移08:00。esxcli system time命令家族就是用来查询和设置这些时间相关参数的工具。修改时区的本质就是告诉ESXi系统“请使用/usr/share/zoneinfo/目录下的某个特定时区文件来解析当前时间。”4. 分步详解使用esxcli命令修改时区现在进入核心操作环节。我们将全程使用esxcli这个ESXi最重要的命令行管理工具。请确保你已经按照第2部分的方法通过SSH或控制台进入了ESXi Shell。4.1 第一步确认当前时区设置在修改之前先查看一下当前的时区配置做到心中有数。esxcli system time get这条命令会输出类似以下信息NTP Client Enabled: true NTP Servers: ntp1.xxx.com,ntp2.xxx.com NTP Service Started: true Time Zone: UTC这里我们主要关注Time Zone这一行。它显示当前时区是UTC。同时这个命令也显示了NTP客户端的状态时间同步是另一个重要话题我们稍后会谈到它与时区的关系。4.2 第二步获取可用的时区列表ESXi支持哪些时区呢我们可以通过以下命令列出所有可用的时区标识符Time Zone Identifieresxcli system time list这个列表会非常长包含了全球各地的时区例如Africa/Abidjan,America/New_York,Asia/Shanghai,Europe/London,UTC等等。你需要从中找到你目标时区的准确名称。对于中国大陆的服务器我们通常设置为Asia/Shanghai。请注意虽然也存在Asia/Chongqing或Asia/Harbin等但它们都指向同一个时区规则CST, UTC8。使用Asia/Shanghai是通用且推荐的做法。4.3 第三步执行时区修改命令找到正确的时区标识符后使用set命令进行修改。命令格式非常简单esxcli system time set -t 时区标识符例如要设置为中国标准时间就执行esxcli system time set -t Asia/Shanghai执行这条命令后系统不会给出任何成功提示这是很多命令行工具的惯例没有消息就是好消息。它只是安静地完成了配置的更新。4.4 第四步验证修改结果修改是否生效我们需要再次查询系统时间来确认。esxcli system time get现在你应该看到Time Zone这一行已经变成了Asia/Shanghai。 但是这还不够。时区配置的更改并不会立即更新系统时钟的显示。系统时钟仍然保持着原来的“时间数值”只是它现在被解释为“上海时间”了。为了立即看到效果我们还需要一个操作重启chronyd时间服务ESXi 6.7/7.0 使用chrony作为NTP客户端。/etc/init.d/chronyd restart重启服务后再次使用date命令查看当前时间date此时输出的时间应该已经和你手表上的北京时间一致了假设你的NTP服务器是准确的。你也可以对比一下UTC时间date -udate命令显示的是本地时间根据时区换算而date -u显示的是UTC时间。两者应该相差8小时对于Asia/Shanghai时区。5. 时区修改的连带影响与必要调整修改了ESXi主机的时区并不意味着所有问题都解决了。它会产生一系列连锁反应需要我们逐一处理。5.1 对虚拟机的影响及同步设置虚拟机默认会从宿主机ESXi获取时间。时区修改后已经开机运行的虚拟机其操作系统内部的时间显示不会自动改变。因为虚拟机操作系统有自己的时区设置。例如一台运行Windows Server的虚拟机其OS内部时区可能还是UTC。你需要做的是在虚拟机操作系统中修改时区登录到Windows或Linux虚拟机将其系统时区正确设置为所在地时区如中国标准时间。确保VMware Tools时间同步功能正确工作在虚拟机中VMware Tools提供了一个将虚拟机时间与主机时间同步的功能。但这个同步主要同步的是“时间值”而非“时区”。它帮助纠正因虚拟机CPU占用率波动导致的时钟漂移。你需要在虚拟机的设置或VMware Tools配置中确认此功能已启用。实操心得对于大批量虚拟机尤其是模板部署的最好在虚拟机模板层面就配置好正确的时区和NTP。对于已存在的虚拟机可以考虑使用PowerCLI等自动化工具编写脚本远程修改虚拟机OS的时区设置这比一台台登录操作高效得多。5.2 检查并配置NTP服务时区是“显示规则”而NTP是“时间源”。两者必须配合使用。一个常见的错误是修改了时区但NTP服务器指向错误或者NTP服务未启动导致时间本身就不准。查看当前NTP配置我们之前用esxcli system time get已经看到了NTP服务器地址。你可以仔细核对。修改NTP服务器如果需要如果你的内部有可靠的NTP服务器如ntp.company.local或者想使用公共的NTP池可以这样设置esxcli system ntp set -s ntp1.aliyun.com,ntp2.aliyun.com,time.windows.com这里设置了三个服务器用逗号分隔。建议至少配置两个以上以提高可靠性。启动NTP服务并设置开机自启esxcli system ntp set -e true # 启用NTP客户端 esxcli system ntp start # 启动NTP服务强制立即同步一次/sbin/services.sh restart # 或者更精确地重启chronydESXi 6.7/7.0 /etc/init.d/chronyd restart之后使用esxcli system time get确认NTP服务状态为started并使用ntpq -p命令查看NTP对等状态确认正在与服务器成功同步。5.3 检查相关服务和日志时区更改可能会影响那些依赖系统时间戳的服务和日志。SyslogESXi主机的系统日志/var/log/下的文件时间戳会立即采用新的时区。如果你有配置远程syslog服务器需要确保日志接收端能正确解析新的时间格式。vCenter Server如果这台ESXi主机由vCenter管理vCenter会从主机收集性能数据、事件和任务日志。时区更改后vCenter中显示的该主机相关事件的时间会以vCenter Server自身的时区进行显示通常vCenter时区是统一的。这可能会造成主机日志时间与vCenter显示时间有偏差在排查问题时需要留意。备份与监控软件任何通过API或SSH连接到ESXi进行备份、监控的第三方工具其采集到的时间信息也会发生变化。需要评估这是否会影响你的报表、告警或备份计划。6. 高级场景脚本化与批量操作当你需要管理数十甚至上百台ESXi主机时逐台登录修改是不可接受的。这时脚本化批量操作就派上用场了。核心思路是通过SSH远程执行命令。6.1 使用Shell脚本与sshpass简单但不够安全假设你有一台Linux跳板机上面安装了sshpass一个用于非交互式SSH密码认证的工具。你可以编写一个简单的Bash脚本。警告此方法需要在脚本中明文或半明文地存储密码安全性很低仅适用于临时、封闭的测试环境。生产环境强烈建议使用SSH密钥对或通过vCenter API。#!/bin/bash # 批量修改ESXi时区脚本 (示例不安全) ESXI_LIST(192.168.1.10 192.168.1.11 192.168.1.12) ESXI_USERroot ESXI_PASSWORDYourPasswordHere # 强烈不建议 TARGET_TIMEZONEAsia/Shanghai for host in ${ESXI_LIST[]}; do echo Processing $host ... # 启用SSH如果未启用此命令可能失败需要先通过其他方式启用 sshpass -p $ESXI_PASSWORD ssh -o StrictHostKeyCheckingno $ESXI_USER$host \ esxcli system time set -t $TARGET_TIMEZONE /etc/init.d/chronyd restart if [ $? -eq 0 ]; then echo - Timezone updated on $host else echo - Failed to update timezone on $host fi done6.2 使用PowerCLI更专业、更安全对于VMware环境VMware PowerCLI是官方的、功能强大的自动化管理工具。它基于PowerShell可以安全地连接到vCenter或单台ESXi主机进行操作。# 连接到vCenter Server Connect-VIServer -Server your-vcenter.domain.com -User administratorvsphere.local -Password YourVCenterPassword # 获取所有主机并修改时区 Get-VMHost | ForEach-Object { $hostName $_.Name Write-Host Setting timezone for $hostName ... # 获取主机的ESXCli对象 $esxCli Get-EsxCli -VMHost $_ -V2 # 执行时区设置命令 $arguments $esxCli.system.time.set.CreateArgs() $arguments.timezone Asia/Shanghai $esxCli.system.time.set.Invoke($arguments) # 重启时间服务通过SSH或PowerCLI的Invoke-VMScript这里以SSH命令为例需主机已开启SSH # 更优雅的方式是通过Get-VMHostService操作服务但重启chronyd最直接还是SSH。 # 以下假设已配置SSH密钥认证使用Plink工具PuTTY的命令行版本 # C:\Path\To\plink.exe -ssh -batch -i private_key.ppk root$hostName /etc/init.d/chronyd restart Write-Host - Done for $hostName } # 断开连接 Disconnect-VIServer -Confirm:$false使用PowerCLI的优势在于它可以利用现有的vCenter会话权限无需在脚本中存储每台ESXi主机的独立凭证且功能全面可以方便地管理服务、防火墙等。6.3 使用Ansible等配置管理工具在更成熟的运维体系中Ansible、SaltStack等配置管理工具是更好的选择。它们支持无代理模式通过SSH有丰富的模块库。例如使用Ansible的community.vmware.vmware_host_timezone模块--- - name: Configure timezone for ESXi hosts hosts: esxi_servers gather_facts: no tasks: - name: Set timezone to Asia/Shanghai community.vmware.vmware_host_timezone: hostname: {{ inventory_hostname }} username: root password: {{ esxi_root_password }} # 建议使用Ansible Vault加密 timezone_name: Asia/Shanghai delegate_to: localhost这种方式剧本化、可重复、易维护并且能很好地集成到CI/CD流程中。7. 故障排查与常见问题即使按照步骤操作你也可能会遇到一些问题。下面是一些典型故障及排查思路。7.1 命令执行失败或无效症状执行esxcli system time set命令后get查看时区没变或者报错。排查权限问题确保你使用的是root用户登录。ESXi Shell下普通用户权限受限。时区名称错误用esxcli system time list仔细核对时区字符串。大小写敏感且必须完全匹配。Asia/Shanghai不能写成asia/shanghai或Asia/beijing。只读文件系统ESXi的/根文件系统在正常运行时是只读的。但esxcli system time set命令修改的是存储在内存中的配置或特定的可写存储区域如/etc/下的链接或/store通常不会因此失败。如果遇到只读错误检查是否误操作了系统文件。主机配置文件锁定如果主机由vCenter管理且配置文件被锁定例如正在进行其他配置任务修改可能会失败。可以尝试通过vCenter暂时将主机置于维护模式再操作或者重试命令。7.2 修改后时间仍然不对症状时区显示正确Asia/Shanghai但date命令显示的时间与北京时间相差甚远。排查NTP未同步这是最常见的原因。执行esxcli system ntp server list查看配置执行ntpq -p查看同步状态。如果状态为*已同步或候选且offset值很小几毫秒说明同步正常。如果所有服务器都是refid为.INIT.说明同步失败。检查网络连通性、防火墙规则NTP使用UDP 123端口以及NTP服务器地址是否正确。硬件时钟错误如果NTP持续失败ESXi会依赖硬件时钟。如果硬件时钟本身偏差很大时间就不准。你可以手动设置硬件时钟不推荐应优先修复NTP# 将当前正确的系统时间写入硬件时钟硬件时钟通常应设为UTC esxcli system time set -H $(date -u %s)时区文件损坏极少数情况下/usr/share/zoneinfo/Asia/Shanghai文件可能损坏。可以尝试从另一台正常的ESXi主机复制一个过来需进入维护模式启用ESXi Shell的写权限。7.3 SSH连接不上或Shell无法启用症状无法通过SSH连接或者在DCUI中无法启用ESXi Shell。排查防火墙规则ESXi防火墙默认可能阻止SSH。确保在“安全配置文件”中“SSH服务器”服务是允许的。也可以通过命令行检查esxcli network firewall ruleset list | grep ssh确保状态是true。服务未启动即使启用了服务也可能意外停止。尝试手动启动/etc/init.d/SSH start /etc/init.d/shellStart start主机已进入锁定模式如果ESXi主机加入了vCenter并且vCenter启用了“锁定模式”那么所有直接的主机访问包括SSH和DCUI都会被禁止。必须通过vCenter解除锁定模式。7.4 修改后虚拟机时间异常症状ESXi主机时间正确但虚拟机内时间仍然错误或者VMware Tools时间同步报错。排查虚拟机操作系统时区确认虚拟机内部的Windows或Linux时区设置是否正确。VMware Tools状态在vSphere Client中检查虚拟机摘要确保VMware Tools显示为“正在运行”且版本最新。在虚拟机内部检查VMware Tools服务是否运行。虚拟机时间同步设置在虚拟机的“选项”-“VMware Tools”中查看“时间同步”是否勾选“将客户机时间与主机同步”。注意对于某些对时间极其敏感的应用如域控制器可能需要禁用此功能而让虚拟机完全依赖其自身的NTP服务。BIOS时间设置虚拟机的BIOS时间可能仍为UTC。VMware Tools的时间同步功能会处理这个差异。如果问题依旧可以尝试关闭虚拟机电源在设置中强制将虚拟机BIOS时间与主机同步这是一个高级选项然后再开机。8. 生产环境最佳实践与个人经验总结根据多年运维经验单纯修改时区只是时间管理的一环。要在生产环境中确保整个虚拟化平台时间准确、一致需要一套组合拳。第一建立统一的时间源。所有基础设施设备包括物理服务器ESXi、网络设备、存储设备、vCenter Server以及域控制器都应该指向同一个可靠的内部分层NTP服务器。这个内部分层NTP服务器再同步到外部的权威时间源如国家授时中心NTP服务器或公共NTP池。绝对不要让每台设备各自去同步互联网上的服务器这会导致时间源不一致难以排查问题。第二遵循“主机同步硬件虚拟机同步主机”的原则。在ESXi主机层面配置好NTP并确保ntpd/chronyd服务稳定运行将系统时钟同步准确。同时让NTP服务定期将正确的系统时间同步到硬件时钟RTC。在ESXi中通常NTP服务会处理好这一点。在虚拟机层面对于大多数通用负载启用VMware Tools的“时间同步”功能。这能有效纠正虚拟机因CPU调度等原因产生的时钟漂移通常一天能漂移几秒到几十秒。对于域控制器、数据库集群等对时间一致性要求极高的特殊负载需要仔细评估是依赖VMware Tools还是让它们自己作为NTP客户端同步到内部时间源通常微软官方建议域控制器不要与主机进行时间同步而应配置域内的层级时间同步。第三将时区配置标准化。在制作ESXi主机镜像或自动化部署脚本如使用Auto Deploy时就将默认时区设置为Asia/Shanghai。在制作虚拟机模板时也将操作系统的时区正确设置好。这样新部署出来的主机和虚拟机从一开始就是正确的避免了后续批量修改的麻烦。第四监控与告警。将ESXi主机的时间偏移量NTP offset纳入监控范围如通过vCenter性能图表或Zabbix等监控工具。设置告警阈值当某台主机的时间偏移超过一定范围如100毫秒时及时发出告警而不是等到问题影响业务才发现。最后关于通过Shell修改时区这个操作本身我的个人体会是它更像是一把“手术刀”用于修复和调整。在自动化运维的蓝图里这类操作应该被剧本Playbook或配置策略所定义和覆盖。每次手动登录Shell去修改都意味着一次潜在的风险和偏离标准化的操作。因此在完成这次必要的修复后更重要的是去审视和加固你整个环境的时间管理基础架构让时间准确性问题防患于未然。毕竟在分布式系统和日志分析的时代时间不一致带来的问题排查起来往往比修改一个时区要复杂和痛苦得多。
返回列表