给你的NAS(GEN8之esxi+dsm)找个靠谱保姆:一种实用UPS方案
追加修改(2017-05-22 21:05:19):
文中ups型号“APC BK500-CH ”有误,应该为“APC BK650-CH”,目前在售型号为apc BX650CI-CN
目前各大公网云盘纷纷嗝(关)屁(门),仅存的几家不是坐地涨价就是种种限制,同时个人数据体量暴涨,这对存储对速度和安全性有了越来越高的要求,公网云盘至少在传输速率上已out,家用NAS(Network Attached Storage:网络附属存储)绝壁是一种有效的解决方案。
NAS可分两大类:一类是成品NAS,如群晖、威联通、西部数据my cloud系列等;另一类是DIY产品,可通过普通电脑安装nas操作系统实现,近年HP的迷你服务器gen8 microserver凭着优良的做工灵活多样的玩法在DIY NAS圈内火了一把,本文主要针对gen8方案的ups配置进行讨论,至于gen8实现nas功能的具体玩法zdm有高质量的介绍(见下图),本文不表。无论是哪类NAS,突然断电对数据安全有可能带来十分严重的不良影响,轻则个别大姐姐失踪(丢失部分数据),重则别墅坍塌(硬盘损坏)大姐姐团灭
。所以给NAS配个保姆UPS很有必要。
一、UPS的选择
UPS当然是越贵越好,有米选贵的,用起来6!(废话)
下面简单说下如何选择
UPS从原理上分两类:在线式和后备式,各自原理大概是这样的:
在线式:
正常供电情况时:220V交流电---->整流成直流(同时给内部电池充电)---->逆变成220V交流(接NAS、电脑等用电器)
失去交流电时:内部电池提供直流电源(无切换延时)---->逆变成220V交流(接NAS、电脑等用电器)
后备式:
正常供电情况时:
220V交流电---->直接接NAS、电脑等用电器
(与此同时)220V交流电---->整流成直流(给内部电池充电)
失去交流电时:切换成内部电池提供直流电源(有切换延时,通常10毫秒以下)---->逆变成220V交流(接NAS、电脑等用电器)
显然,在线式UPS没有电池切换供电延时,用电设备几乎感受不到停电影响;后备式有几个毫秒的切换时间,正常情况下对用电设备无影响,若NAS或电脑电源质量不过关,有可能掉电重启和死机,不过几率非常小。
所以在线式UPS优于后备式UPS,有预算尽量上在线式UPS。要求不高(穷)买APC BK500-CH(后备式)够用了
。
二、保姆方案思路
对于成品NAS尤其是群晖,对市面上的UPS支持都很好,usb插上就能用,gen8直接裸装dsm或win系统也类似,没啥好讲的。主要说说gen8安装esxi后如何与UPS配合实现停电自动关机,确保数据安全。
以APC BK500-CH UPS为例,文章《基于APCUPSD实现断电时ESXi自动关机》(链接:https://blog.ltns.info/linux/esxi_auto_shutdown_with_apcupsd/)对gen8与UPS配合实现断电自动关机作了详细介绍,但使用下来至少有2个方面的不足:1、必须单独建立虚拟winxp运行APCUPSD客户端,占用gen8系统资源;2、最大的不足是断电触发gen8自动关机后,UPS不能自行关闭自身电源,直至电池耗尽,严重影响UPS使用寿命,下次再停电可能直接挂掉失去保姆作用。
基于APCUPSD实现断电时ESXi自动关机
于是对现有方案进行改进,经多次实验,最终方案如下:
仍然用APCUPSD实现对UPS供电情况进行监视和控制,不同的是需要另备能刷lede(openwrt)并且带usb接口的路由器,将APCUPSD客户端运行于路由器上,结合监控脚本,实现停电后能依次关闭esxi客户机(dsm等)--->esxi系统--->gen8物理机--->UPS自身电源(路由此时也断电,但对路由无不良影响),并且来电后能自动开启UPS,自动启动gen8及相关系统。
三、方案具体实践
1、路由器准备
带有usb口能刷lede(openwrt)的都可以,目的是安装apcupsd并通过usb连接线实现ups监控。本人路由器为wrt1900acs。配置步骤如下:
(1)刷入lede(openwrt)系统
(2)用putty ssh进入路由器,opkg update
(3)安装软件包:
opkg install kmod-hid
opkg install kmod-hid-generic
opkg install kmod-usb-hid
opkg install apcupsd
期间有其他依赖包,安装程序会自动下载。安装完毕后用winscp进入路由器,首先进入目录/etc/apcupsd,有如下文件(见下图)
编辑配置文件/etc/apcupsd/apcupsd.conf
找到UPSCABLE 一行,填上usb(见下图)
找到UPSTYPE 一行,按下图改
找到NETSERVER一行,确认与下图一致,保存文件。
按下图修改/etc/init.d/apcupsd(选中部分)
putty ssh 登陆路由,运行命令:
/etc/init.d/apcupsd enable
将APC BK500-CH通信线usb口插入路由器,重启路由器。路由重启成功后,用putty ssh进入路由器,输入命令检测ups状态:
/usr/sbin/apcaccess
如果出现如下图信息,说明ups已被路由正确识别,否则请检查之前步骤是否遗漏或错误。如果出现诸如端口无权限访问等提示信息,请安装软件包haveged再试。
至此,路由器配置完毕。
2、esxi关机脚本
该脚本参考自文章《基于APCUPSD实现断电时ESXi自动关机》(链接:https://blog.ltns.info/linux/esxi_auto_shutdown_with_apcupsd/),可直接到文章主页按提示下载。
本人对脚本进行了优化(加入了esxi客户机关机状态判断,若当前esxi客户机已关闭,立即关闭下一客户机,缩短esxi关机时间等待,具体自己体会),下载地址:https://pan.baidu.com/s/1skUtrRn 提取码:e8n7
注意将脚本ups.sh中的日志存储路径改为你自己的esxi数据存储路径,如本例为/vmfs/volumes/OS/ups.log
开启esxi的ssh功能,利用winscp将下载好的关机脚本放入esxi 数据存储(datastore)中,如/vmfs/volumes/OS/ups.sh,并给ups.sh增加执行权限(如何开启esxi的ssh,如何增加脚本执行权限,度娘有)。
3、实现停电时路由apcupsd客户端自动调用esxi关机脚本
(1)打通路由远程调用gen8 esxi 关机脚本的通道
apcupsd运行于路由,ups关机脚本放在gen8的esxi数据存储中,为实现停电自动执行ups关机脚本,必须在路由端用pubkey方式ssh登陆进esxi后远程调用/vmfs/volumes/OS/ups.sh。该过程实现方法如下:
首先在路由端生成生成密钥和公钥,用putty ssh 进路由,输入如下命令:
mkdir /root/.ssh/
dropbearkey -t rsa -f ~/.ssh/id_rsa.db
生成完毕后有类似下图输出:
在输出的内容中选择”ssh-rsa AAAAB…...y9KdM= root@LEDE“这一段拷贝至gen8 esxi 的/etc/ssh/keys-root/authorized_keys文件中(如无此文件,新建一个),保存,重启esxi。
下面进行远程调用验证(这一步必须做,目的是让路由保存ssh登陆gen8 esxi的指纹信息),ssh登入路由,输入如下命令:
ssh -i /root/.ssh/id_rsa.db root@你的gen8 esxi的管理ip
第一次执行会有安全提示,输入"y"并回车,若ssh显示的登陆账号已变为root@你的esxi名称,则路由与gen8 esxi之间的联系已建立,下一步可测试远程调用关机脚本,输入如下命令:
ssh -i /root/.ssh/id_rsa.db root@你的gen8 esxi的管理ip /vmfs/volumes/OS/ups.sh
若esxi开启关机流程(可在vmware client里看到),说明路由远程调用gen8 esxi关机脚本成功,bingo,你离成功不远了
,可进行下一步设置。
(2)路由端apcupsd脚本设置
通过研究apcupsd的wiki文档,发现当apcupsd检测到ups交流电源停电后,首先调用/etc/apcupsd/apccontrol中的powerout代码段,经过一定延时(对应配置文件/etc/apcupsd/apcupsd.conf中的ONBATTERYDELAY 参数),会触发onbattery事件,并执行/etc/apcupsd/onbattery脚本,当ups交流电源恢复后,apcupsd会调用/etc/apcupsd/offbattery脚本,于是考虑在这里做点文章
。
经多次实验,如果直接把远程关机代码“ssh -i /root/.ssh/id_rsa.db root@你的gen8 esxi的管理ip /vmfs/volumes/OS/ups.sh”放入etc/apcupsd/onbattery脚本或etc/apcupsd/apccontrol 脚本的powerout代码段中,apcupsd检测到ups交流电源停电后,该远程关机代码都不会被执行,估计是apcupsd的bug,于是采用“cron计划任务+onbattery事件”结合的方式实现实时监视ups状态并在停电时及时自动调用关机脚本的功能,简单说就是cron计划任务调用ups监视脚本“upscheck”并进而调用esxi远程关机脚本,onbattery事件触发后运行etc/apcupsd/onbattery脚本,检测gen8是否已关机,若已完成关机则立即执行ups关机命令。具体过程如下:
按下图修改/etc/apcupsd/onbattery(图看不清请右键点新窗口打开放大,没办法,zdm贴不了代码,图片也被强制压缩
)
按下图修改/etc/apcupsd/offbattery
按下列图打开/etc/apcupsd/apccontrol增加或修改对应位置代码并保存
按下图修改/etc/init.d/apcupsd
putty ssh 登陆路由,运行命令:
/etc/init.d/apcupsd enable
(3)路由端ups监控脚本设置
在/root/目录下新建文件upscheck,按下图增加代码(图看不清请右键点新窗口打开):
保存后,为upscheck文件增加执行权限。
(4)crontab计划任务设置
将下列内容填入路由器的计划任务中,本例每10秒调用一次/root/upscheck 脚本进行检测。保存后最好重启一次路由。
* * * * * /root/upscheck > /dev/null 2>&1
* * * * * sleep 10 && /root/upscheck > /dev/null 2>&1
* * * * * sleep 20 && /root/upscheck > /dev/null 2>&1
* * * * * sleep 30 && /root/upscheck > /dev/null 2>&1
* * * * * sleep 40 && /root/upscheck > /dev/null 2>&1
* * * * * sleep 48 && /root/upscheck > /dev/null 2>&1
(5)关机流程测试
putty ssh 登入路由器,输入如下命令(无需拔掉UPS电源插头):
touch /etc/powerfail
10秒后刷新并观察日志/var/log/upscheck.log是否变化、/root/shutdown.log是否生成,同时在vmware client里是否看到esxi启动关机流程,若上述现象都存在,说明你成功了
。
在gen8完全关闭后1分钟内,ups将自动关闭自身电源,因UPS电源插头未拔掉,ups立刻恢复自身电源并正常供电。
(6)断电测试
请在“关机流程测试”正确完成的前提下进行断电测试。“关机流程测试”完成后,确认路由正常运转,手动打开gen8电源,启动esxi,esxi启动完毕后(无需启动虚拟客户机),拔掉ups电源插头
完成你的终极测试。
正确结果为:ups电源插头拔掉后esxi启动关机流程,gen8关闭后1分钟内ups自动切断自身电源(电源指示灯灭)。插上ups电源插头后ups自动打开自身电源并给路由器、gen8正常供电。
至于来电后自动启动gen8,应该很简单,gen8 bios里有。






















slowfish_t
校验提示文案
拉斯基
校验提示文案
静若瘫痪
校验提示文案
深蓝DE海洋
校验提示文案
蕭木
校验提示文案
Wintel
校验提示文案
[已注销]
校验提示文案
hyk0083
校验提示文案
lileiluck
校验提示文案
金太阳
校验提示文案
买啊买啊买买买
校验提示文案
初恋璀璨如夏花
校验提示文案
值友1544558405
校验提示文案
枫晓天
校验提示文案
枫晓天
校验提示文案
opteronx
校验提示文案
枫晓天
校验提示文案
枫晓天
校验提示文案
枫晓天
校验提示文案
值友1567989885
校验提示文案
NeoHe
校验提示文案
枫晓天
echo -e `date "+%Y-%m-%d %H:%M:%S"` "\t\tVM with ID: ${VM_LINE} is: $STATE, trying guest shutdown..." >> $LOG_FILE
校验提示文案
枫晓天
把第79行代码改为
echo -e `date "+%Y-%m-%d %H:%M:%S"` '\t\tVM with ID: ${VM_LINE:} is: $STATE, trying guest shutdown...' >> $LOG_FILE
校验提示文案
枫晓天
提示错误,是什么问题?
/vmfs/volumes/DataStore/UPS/ups.sh: line 140: syntax error: unterminated quoted string
校验提示文案
枫晓天
校验提示文案
唐长老下江南
BusyBox v1.23.2 (2019-02-03 01:44:29 CST) built-in shell (ash)
CHAOS CALMER (Chaos Calmer, 15.05_ltq_B11)
root@K3C:~# opkg update
Downloading 去看看
Updated list of available packages in /var/opkg-lists/chaos_calmer_base.
root@K3C:~# opkg install kmod-hid
Unknown package 'kmod-hid'.
Collected errors:
* opkg_install_cmd: Cannot install package kmod-hid.
root@K3C:~# opkg install apcupsd
Unknown package 'apcupsd'.
Collected errors:
* opkg_install_cmd: Cannot install package apcupsd.
校验提示文案
唐长老下江南
校验提示文案
chowen
校验提示文案
天涯何处不天涯
校验提示文案
Xyinkl
跟之前几个人一样的报错。。。自己看了半天也没发现这个脚本有啥问题。
楼主援引的那个脚本的文章也看不到了。算了,放弃好了,研究一下APCUPSD的主从模式好了
校验提示文案
值友5035207583
校验提示文案
值友8607676095
/vmfs/volumes/database/ups.sh: line 140: syntax error: unterminated quoted string
校验提示文案
vileer
校验提示文案
howard_h
报错提示。。。
校验提示文案
pwcpp
校验提示文案
mlyxkj
校验提示文案
mlyxkj
校验提示文案
lhm7080
校验提示文案
Kenzie
校验提示文案
不哭死神77
校验提示文案