我有一台家用服务器(HP Proliant ML310 G4),大约一个月前我从雇主那里买的。这台服务器运行 Debian Linux,我几乎用它做所有事情。我可以这样做,因为我的需求不是那么苛刻,所以服务器在任何时候都很少处于重负载状态。这台服务器有一个 2 TB 的 RAID1 阵列(带有一个热备用),由 mdadm 管理,我使用它通过 Samba 在网络上共享文件。我在不属于阵列的较小硬盘上运行操作系统。
我让服务器通过一个小型 255 瓦 UPS 供电,因为我需要它承受轻微的电源波动而不至于断电。这是非常这很重要,因为突然的非正常关机(由断电或断电引起)可能会破坏 RAID 阵列,这种情况已经发生过一次。
如果发生断电,我估计 UPS 只能维持 10-15 分钟的电力。可能还有更多,但我不想自动假设有。这足以度过几分钟或更短的停电。但是,如果断电几个小时,我需要服务器在 UPS 断电之前自动正确关闭。这有望防止 RAID 完整性在这些情况下受到破坏。
这种事情在笔记本电脑上很容易实现,因为它有内置传感器来确定何时使用电池供电,但这台服务器没有(据我所知)。我的网络设置很不寻常,我的 DSL 调制解调器与路由器是分开的。路由器也在 UPS 上,这样我就可以通过笔记本电脑 SSH 并在断电时关闭服务器。不幸的是,这只有在我当时在场的情况下才有效。我需要一个无论我在场与否都能始终有效的解决方案。
由于我的 DSL 调制解调器不在 UPS 上,如果电源断电,它会和其他所有东西一起断电。我故意这样设置,因为我有一个解决这个问题的想法:我当时想编写一个脚本来 ping google.com 或其他一些高流量/高可用性网站。如果 ping 成功完成,服务器将继续运行。如果 ping 失败(因为调制解调器已关闭),脚本会认为电源已关闭并会告诉服务器关闭。我会将脚本添加到 Cron 并让它每 5 分钟运行一次。这样有望在 UPS 电量耗尽之前给服务器足够的时间关闭。
在我开始编写脚本之前,我想知道是否有更好的方法来实现我需要的功能。在此先感谢您的帮助。
答案1
有一种古老但行之有效的方法:使用旧的模拟调制解调器。方法如下
- 通过串行端口(例如 ttyS0)将调制解调器连接到服务器
- 不要将调制解调器的电源插入 UPS,而是直接插入主电源
- 请勿将任何东西插入调制解调器的电话线
现在每隔几秒轮询一次调制解调器ATZ[Enter]
并进行发送OK[Enter]
,如果调制解调器没有应答,则您可能认为它没有电,这意味着 UPS 使用的是电池供电。
编辑
重点是,如果你的互联网连接由于其他原因断开,服务器将不是关闭,理所应当。
编辑2
来自评论:
- 当然,你应该在检查之间保留一些状态,只有在 N 次检查失败后才关闭。我没有提到这一点,因为它适用于所有可能的检查,而不仅仅是调制解调器
- 使用调制解调器和使用任何事物与网络有关的是,网络连接会暂时中断:如果您重新启动交换机或重新配置 VLAN,您肯定不希望被“登录已禁用,服务器在 USV 上”所困扰。根据我的经验,串行线路非常可靠。
答案2
UPS 通常配有 USB 或 COM1 连接器。将其连接到服务器后,即可开始监控 UPS。
在 Windows 环境中,无需安装软件,消息已注册,它会为您关闭服务器。我不知道这在 Linux 上是如何工作的,但我敢打赌有一些软件包可以与您的 UPS 交互。
答案3
如果您使用的是 Debian,请尝试使用 NUT(网络 UPS 工具)。我使用 NUT 在我的 Synology NAS(运行 busybox)和运行 Ubuntu 12.04 LTS 的家庭网络服务器上执行您描述的操作。我将 NAS 通过 USB 插入 UPS,原因与您相同,可能会丢失我的所有文件。
我相信 nut 守护进程每秒都会查询 UPS 以确定状态。当 UPS 处于电池模式时,可以将其配置为正常关机或先等待 X 分钟等。您还可以设置多个客户端以连接到您在服务器上运行的 nut 守护进程。因此,您的服务器也可以告诉网络上的多台 PC 正常关机。对于关机执行,您可以提供自己的脚本以特定方式关闭服务,或者您可以使用内置脚本,该脚本只调用 shutdown -h,如果我没记错的话。
有更好的网站可以查找信息,但我现在想不起来了。配置可能很麻烦,但如果您说的是可能会丢失 RAID,请查看!根据您的需要,您可能不需要整个 NUT 套件,您可能只需要 UPSMON 部分即可。我认为您可以在 Ubuntu 包“nut-client”中找到它。
Windows 也有一个 NUT 客户端,但在 Windows 上,您最好使用 PowerChute 或类似的东西。