Linux怎么在数据中心机房火灾断电前通过脚本有序批量关停数千虚机

夏婷酱_2476

夏婷酱_2476

2026-10-19

844人浏览

原创

火灾预警后需用virsh安全批量关机:严格限并发(如parallel -j 8)、每台后sleep 0.3、用virsh list --name --all取名、以virsh domstate轮询确认“shut off”、单台超时90秒则降级destroy,脚本分发至各宿主机本地执行。

linux怎么在数据中心机房火灾断电前通过脚本有序批量关停数千虚机

火灾预警触发后,如何用 virsh 安全批量关机而不卡死宿主机

数据中心火灾报警联动系统通常会通过 SNMP、HTTP webhook 或串口信号通知管理节点。一旦收到预警,脚本必须在断电前 2–5 分钟内完成虚机停机——但直接并发调用 virsh shutdown 数千次极易压垮 libvirt 进程或宿主机 CPU,导致部分虚机卡在 “shutting down” 状态。

  • 关机命令必须用 virsh shutdown(非 virsh destroy),避免数据丢失;virsh shutdown 依赖客户机内运行的 acpid 或 systemd-logind,提前确认虚机已启用该服务
  • 严格限制并发数:用 parallel -j 8 或 shell 的 wait + 子 shell 控制同时执行不超过 10 个 virsh shutdown 请求,libvirt 默认只处理约 15 个并发连接,超限会返回 Failed to connect to libvirt
  • 每台虚机关机后加 sleep 0.3,缓解 dbus 和 polkit 压力;实测不 sleep 时,300 台以上虚机集中触发会导致部分宿主机 dbus-daemon 卡住
  • 避免用 virsh list --all | awk '{print $2}' 解析输出——列宽不固定,$2 在虚机名含空格时失效;改用 virsh list --name --all,它输出纯名称,每行一个

怎么判断虚机是否真正关机完成,而不是假死在 shutdown 状态

virsh list 显示 “shut off” 才算安全,而 “running” 或空白状态都不可靠;但有些虚机因内核 hang 或 acpid 未响应,会长期卡在 “running” 状态,virsh shutdown 实际已无作用。

  • 轮询检查必须用 virsh domstate <var>vm_name</var>,它输出精确状态(如 running、shut off、paused),比 virsh list 解析更可靠
  • 设置超时:单台虚机等待上限设为 90 秒,超过则降级执行 virsh destroy;注意 virsh destroy 是强制断电,仅用于兜底
  • 不要依赖 ping 或 SSH 探活:虚机网络栈可能早于用户态进程挂掉,ping 得通但 domstate 仍是 running,说明只是内核还在跑,应用早已不可用

脚本如何适配不同宿主机集群,避免单点故障

不能把所有虚机列表硬编码在一个控制节点上——万一这个节点先断电,整个关停流程就中断。实际部署需分层:

Obsidian (Linux)
Obsidian (Linux)

操作 Obsidian 库(纯 Markdown 笔记),并通过 notesmd-cli 实现自动化。

下载
  • 虚机清单按宿主机分组,存为每个宿主机本地的 /etc/vm-list.txt(内容仅为虚机名,一行一个),避免 NFS 或数据库单点依赖
  • 控制脚本推送到每台宿主机,由本地 cron 或 systemd timer 触发;火灾信号通过广播包(如 logger "FIRE_ALERT" + rsyslog 过滤)或轻量 MQTT 订阅分发,不依赖中心调度器
  • 每台宿主机独立执行关停,完成后向中央日志服务器写入 echo "$(date) $(hostname) done" >> /var/log/shutdown-finish.log,便于事后审计哪台没完成
  • 若某宿主机失联(比如网卡已断),其他宿主机继续执行,不互相等待

为什么不能用 Ansible 或 SaltStack 做这事

Ansible 的 virt 模块底层仍是调 virsh,但它默认串行执行,数千台虚机要数小时;并行开到 -f 100 后,SSH 连接风暴会让控制节点和目标宿主机的 sshd、libvirt 同时过载,出现大量 Connection refused 和 libvirtError: internal error: cannot send data: Broken pipe。

  • SaltStack 的 virt.shutdown 同样受 libvirt 并发瓶颈制约,且 minion 失联时无法自动降级
  • 真实生产中,最稳的是裸 bash + virsh + parallel 组合:无中间件、无状态、无长连接,启动快、失败快、可预测
  • 曾有客户用 Ansible 跑了 47 分钟才关完 1200 台虚机,改用本地 bash 脚本后压缩到 210 秒(含 90 秒最大等待)

真正难的不是“怎么关”,而是“怎么让每台虚机都在断电前彻底释放磁盘缓存、刷完 journal、卸载 NFS 挂载点”。这取决于虚机内部配置,外部脚本只能尽力触发 shutdown 流程,剩下的得靠虚机自己守规矩。

相关专题

更多
磁盘配额是什么
磁盘配额是什么

磁盘配额是计算机中指定磁盘的储存限制,就是管理员可以为用户所能使用的磁盘空间进行配额限制,每一用户只能使用最大配额范围内的磁盘空间。php中文网为大家提供各种磁盘配额相关的内容,教程,供大家免费下载安装。

2023.06.21

4090

4

如何安装LINUX
如何安装LINUX

本站专题提供如何安装LINUX的相关教程文章,还有相关的下载、课程,大家可以免费体验。

2023.06.29

3473

10

linux find
linux find

find是linux命令,它将档案系统内符合 expression 的档案列出来。可以指要档案的名称、类别、时间、大小、权限等不同资讯的组合,只有完全相符的才会被列出来。find根据下列规则判断 path 和 expression,在命令列上第一个 - ( ) , ! 之前的部分为 path,之后的是 expression。还有指DOS 命令 find,Excel 函数 find等。本站专题提供linux find相关教程文章,还有相关

2023.06.30

2673

5

linux修改文件名
linux修改文件名

本专题为大家提供linux修改文件名相关的文章,这些文章可以帮助用户快速轻松地完成文件名的修改工作,大家可以免费体验。

2023.07.05

6530

7

linux系统安装教程
linux系统安装教程

linux系统是一种可以免费使用,自由传播,多用户、多任务、多线程、多CPU的操作系统。本专题提供linux系统安装教程相关的文章,大家可以免费体验。

2023.07.06

6182

7

linux查看文件夹大小
linux查看文件夹大小

Linux是一种自由和开放源码的类Unix操作系统,存在着许多不同的Linux版本,但它们都使用了Linux内核。Linux可安装在各种计算机硬件设备中,比如手机、平板电脑、路由器、视频游戏控制台、台式计算机、大型机和超级计算机。linux怎么查看文件夹大小呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.07.20

3593

8

linux查看ip命令
linux查看ip命令

本专题为大家提供linux查看ip命令相关文章内容,感兴趣的朋友可以免费下载体验试试。

2023.07.20

3085

4

linux查看cpu使用率
linux查看cpu使用率

在linux的系统维护中,可能需要经常查看cpu使用率,分析系统整体的运行情况。本专题为大家带来了linux查看cpu使用率的相关文章,感兴趣的朋友千万不要错过了。

2023.07.25

3299

6

linux查找文件命令
linux查找文件命令

Linux是一种自由和开放源码的类Unix操作系统,存在着许多不同的Linux版本,但它们都使用了Linux内核。Linux可安装在各种计算机硬件设备中,比如手机、平板电脑、路由器、视频游戏控制台、台式计算机、大型机和超级计算机。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.07.31

297

3

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Python uv官方安装与入门文档
Python uv官方安装与入门文档

共0课时 | 0人学习

Buffalo框架快速入门指南
Buffalo框架快速入门指南

共0课时 | 0人学习

Valgrind支持平台说明
Valgrind支持平台说明

共0课时 | 0人学习