给你的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
校验提示文案
枫晓天
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
校验提示文案
诞生时间的地方
校验提示文案