- Орех, это который NUT.
- Пришлось мне на днях конфигурить бережное выключение станции, снабженной ИБП. На компе, понятное дело :) установлен Debian Squeeze, UPS я взял от Powercom, модель Smart King Pro 700 (сразу скажу — неудачно закупился, дефектный упс оказался, что-то с егойным контроллером. Если посмотреть на цену девайса и сравнить с ценой приличных моделей аналогичной функциональности, удивляться не приходится).
-
- Проблема была сформулирована так: если пропадает питание, станция должна аккуратно гасить виртмашины, крутящиеся на ней с помощью VirtualBox.
-
- Итого, при исчезновении питания, задача упс-ного софта — заслать команду выключения станции и подождать, пока все процессы аккуратно завершатся. Задача скриптов выключения — сделать виртмашинам savestate (аналог гибернации) в нужное время. Получается куча скриптов и конфигов.
-
- Что самое сложное в процессе отладки скриптов выключения компа? Самое сложное, это пережить задротство с выключением-включением системы каждый раз, как вызывается проверка. Я это пережил, систему вроде отладил, сохраняю результат (как советовал добрый человек — лучший бекап, это выложить файл в Интернет, пусть его люди сами раскопируют :). Чуть не забыл, в моем конфиге используется концепция «пропало питание и не поднялось через 2 секунды — гаси машину». Обычно используется концепция «пропало питание — тяни на батареях пока они не высохнут, потом быстренько гаси машину».
-
- Поехали.
-
- Конспект выданных с консоли команд (все от рута, ясен пончик) при настройке системы:
# создание и включение скрипта гашения виртмашин: nano /etc/default/virtualbox nano /etc/init.d/rc.vbox chmod 755 /etc/init.d/rc.vbox update-rc.d rc.vbox remove update-rc.d rc.vbox defaults # установка софта для UPS: aptitude install nut aptitude install sysv-rc-conf # редактирование конфигов UPS: nano /etc/default/nut nano /etc/nut/nut.conf nano /etc/nut/ups.conf nano /etc/nut/upsd.conf nano /etc/nut/upsd.users nano /etc/nut/upsmon.conf nano /etc/nut/upssched.conf nano /root/upssched-cmd # размещение скрипта, вызываемого при переходе на батареи: chmod +x /root/upssched-cmd chown nut:nut /root/upssched-cmd mv /root/upssched-cmd /sbin/ # доп.телодвижения, необходимые для работы конфига: mkdir /var/run/nut/upssched chown -R nut:nut /var/run/nut touch /var/log/test.log # запуск, проверка и прочее: /etc/init.d/nut start sysv-rc-conf upsdrvctl start upsc pcmskp upsd upsd -c reload upscmd -l upscmd -l pcmskp |
- После (вернее, в процессе) конфигурирования мне понадобилось пару раз перезапустить машину, чтобы софт правильно прихватил порт USB с упсом.
-
- Теперь содержимое вышеуказанных скриптов и конфигов. Из текста выброшены почти все каменты (копирайты оставил):
-
cat /etc/default/virtualbox # юзер, под которым работают виртмашины (он их запускает) SHUTDOWN_USERS="valik" # что делать с виртмашинами SHUTDOWN=savestate |
cat /etc/init.d/rc.vbox
#!/bin/sh
### BEGIN INIT INFO
# Provides: vboxcontrol
# Required-Start: vboxdrv $network $local_fs
# Required-Stop: ssh $network $local_fs
# Should-Start: samba
# Should-Stop: samba
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Description: VirtualBox VM Control
### END INIT INFO
# ко мне скрипт пришел чере «испорченный телефон», да и я его местами подкрутил,
# alas.
# This version is Vbox4, v1.0 by David Fuchs Based on:
# Version 20090301 by Kevin Swanson based on:
# Version 2008051100 by Jochem Kossen
# http://farfewertoes.com
#
# Released in the public domain
#
# This file came with a README file containing the instructions on how
# to use this script.
#
PATH=/sbin:/bin:/usr/sbin:/usr/bin:$PATH
DEVICE=/dev/vboxdrv
LOG="/var/log/vbox-install.log"
NOLSB=
DEBIAN=yes
MODPROBE=/sbin/modprobe
if $MODPROBE -c | grep -q '^allow_unsupported_modules *0'; then
MODPROBE="$MODPROBE --allow-unsupported-modules"
fi
[ -f /lib/lsb/init-functions ] || NOLSB=yes
[ -f /etc/vbox/vbox.cfg ] && . /etc/vbox/vbox.cfg
if [ -n "$INSTALL_DIR" ]; then
VBOXMANAGE="$INSTALL_DIR/VBoxManage"
DODKMS="$INSTALL_DIR/src/vboxhost/do_dkms"
BUILDVBOXDRV="$INSTALL_DIR/src/vboxhost/vboxdrv/build_in_tmp"
BUILDVBOXNETFLT="$INSTALL_DIR/src/vboxhost/vboxnetflt/build_in_tmp"
BUILDVBOXNETADP="$INSTALL_DIR/src/vboxhost/vboxnetadp/build_in_tmp"
else
VBOXMANAGE="/usr/lib/virtualbox/VBoxManage"
DODKMS="/usr/share/virtualbox/src/vboxhost/do_dkms"
BUILDVBOXDRV="/usr/share/virtualbox/src/vboxhost/vboxdrv/build_in_tmp"
BUILDVBOXNETFLT="/usr/share/virtualbox/src/vboxhost/vboxnetflt/build_in_tmp"
BUILDVBOXNETADP="/usr/share/virtualbox/src/vboxhost/vboxnetadp/build_in_tmp"
fi
[ -z "$DEBIAN" -o -x $VBOXMANAGE -a -x $BUILDVBOXDRV ] || exit 0
if [ -n "$NOLSB" ]; then
if [ -f /etc/redhat-release ]; then
system=redhat
elif [ -f /etc/SuSE-release ]; then
system=suse
elif [ -f /etc/gentoo-release ]; then
system=gentoo
fi
fi
[ -r /etc/default/virtualbox ] && . /etc/default/virtualbox
if [ -z "$NOLSB" ]; then
. /lib/lsb/init-functions
fail_msg() {
echo ""
log_failure_msg "$1"
}
succ_msg() {
log_end_msg 0
}
begin_msg() {
log_daemon_msg "$@"
}
else
if [ "$system" = "redhat" ]; then
. /etc/init.d/functions
fail_msg() {
echo -n " "
echo_failure
echo
echo " ($1)"
}
succ_msg() {
echo -n " "
echo_success
echo
}
elif [ "$system" = "suse" ]; then
. /etc/rc.status
fail_msg() {
rc_failed 1
rc_status -v
echo " ($1)"
}
succ_msg() {
rc_reset
rc_status -v
}
elif [ "$system" = "gentoo" ]; then
if [ -f /sbin/functions.sh ]; then
. /sbin/functions.sh
elif [ -f /etc/init.d/functions.sh ]; then
. /etc/init.d/functions.sh
fi
fail_msg() {
eerror "$1"
}
succ_msg() {
eend "$?"
}
begin_msg() {
ebegin "$1"
}
if [ "`which $0`" = "/sbin/rc" ]; then
shift
fi
else
fail_msg() {
echo " ...failed!"
echo " ($1)"
}
succ_msg() {
echo " ...done."
}
fi
if [ "$system" != "gentoo" ]; then
begin_msg() {
[ -z "${1:-}" ] && return 1
if [ -z "${2:-}" ]; then
echo -n "$1"
else
echo -n "$1: $2"
fi
}
fi
fi
case "$1" in
start)
;;
stop)
echo "Run rc.vbox stop" >> /var/log/test.log
wait=0
log_daemon_msg "Stopping vms..."
for i in $SHUTDOWN_USERS; do
# don't create the ipcd directory with wrong permissions!
if [ -d /tmp/.vbox-$i-ipc ]; then
export VBOX_IPC_SOCKETID="$i"
VMS=`$VBOXMANAGE --nologo list runningvms | sed -e 's/^".*".*{\(.*\)}/\1/' 2>/dev/null`
if [ -n "$VMS" ]; then
if [ "$SHUTDOWN" = "poweroff" ]; then
begin_msg "Powering off remaining VMs"
for v in $VMS; do
$VBOXMANAGE --nologo controlvm $v poweroff
done
succ_msg
elif [ "$SHUTDOWN" = "acpibutton" ]; then
begin_msg "Sending ACPI power button event to remaining VMs"
for v in $VMS; do
$VBOXMANAGE --nologo controlvm $v acpipowerbutton
wait=30
done
succ_msg
elif [ "$SHUTDOWN" = "savestate" ]; then
begin_msg "Saving state of remaining VMs"
for v in $VMS; do
$VBOXMANAGE --nologo controlvm $v savestate
done
succ_msg
fi
fi
fi
done
# wait for some seconds when doing ACPI shutdown
if [ "$wait" -ne 0 ]; then
begin_msg "Waiting for $wait seconds for VM shutdown"
sleep $wait
succ_msg
fi
;;
*)
echo "Usage: $0 {stop}"
exit 1
;;
esac
exit 0
|
cat /etc/default/nut START_UPSD=yes START_UPSMON=yes |
cat /etc/nut/nut.conf MODE=standalone |
cat /etc/nut/ups.conf
[pcmskp]
driver = usbhid-ups
port = auto
desc = "sqz on powercom smart king pro 700"
|
cat /etc/nut/upsd.conf LISTEN 127.0.0.1 LISTEN ::1 |
cat /etc/nut/upsd.users
[local_mon]
password = 12345678
actions = SET
instcmds = ALL
upsmon master
|
cat /etc/nut/upsmon.conf MONITOR pcmskp@localhost 1 local_mon 12345678 master # RUN_AS_USER nutmon # говорят, это ужасная дыра в безопасности RUN_AS_USER root MINSUPPLIES 1 SHUTDOWNCMD "/sbin/shutdown -h +0" NOTIFYCMD /sbin/upssched POLLFREQ 5 POLLFREQALERT 5 HOSTSYNC 15 DEADTIME 15 POWERDOWNFLAG /etc/killpower NOTIFYMSG ONLINE "UPS %s on line power" NOTIFYMSG ONBATT "UPS %s on battery" NOTIFYFLAG ONLINE SYSLOG+WALL+EXEC NOTIFYFLAG ONBATT SYSLOG+WALL+EXEC RBWARNTIME 43200 NOCOMMWARNTIME 300 FINALDELAY 5 |
cat /etc/nut/upssched.conf CMDSCRIPT /sbin/upssched-cmd PIPEFN /var/run/nut/upssched/upssched.pipe LOCKFN /var/run/nut/upssched/upssched.lock AT ONBATT * START-TIMER nopower 2 AT ONLINE * CANCEL-TIMER nopower |
cat /sbin/upssched-cmd
#!/bin/bash
# nopower timer from /etc/nut/upssched.conf
# я почикал оригинальный скрипт, надеюсь, Paul не в претензии.
##
# upssched-cmd: Notification script for use with Network UPS tools (NUT)
# 1.0
#
# Copyright (C) 2005 Paul J. Lucas
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
##
MAIL=/usr/bin/mail
EMAIL=root
[ -z "$PAGER" ] && PAGER=$EMAIL
notify() {
echo $2 | $MAIL -s "$3" $1
echo $2 >> /var/log/test.log
echo $2 | wall
}
case $1 in
nopower)
notify $PAGER $1 "UPS on battery now, timer nopower done"
shutdown -h +0 powerevent
/sbin/upsmon -c fsd ;;
COMMBAD) notify $PAGER $1 "UPS communications lost" ;;
COMMOK) notify $PAGER $1 "UPS communications established" ;;
FSD) notify $EMAIL $1 "UPS being shut down by master" ;;
LOWBATT) notify $EMAIL $1 "UPS has a low battery" ;;
NOCOMM) notify $PAGER $1 "UPS unavailable" ;;
ONBATT) notify $PAGER $1 "UPS on battery power" ;;
ONLINE) notify $PAGER $1 "UPS on line power" ;;
REPLBATT) notify $EMAIL $1 "UPS battery needs replacement" ;;
SHUTDOWN) notify $EMAIL $1 "NUT shutting system down" ;;
esac
|
- Вот так. У меня работает.
-
- Некоторые использованные источники:
- networkupstools.org/documentation
- networkupstools.org/stable-hcl — проверьте перед покупкой ИБП!
- blasterspike.it/2011/03/28/how-to-install-nut-on-ubuntu-10-10-maverick-meerkat
- blog.shadypixel.com/monitoring-a-ups-with-nut-on-debian-or-ubuntu-linux/#comment-1549
- smilecouple.org/2011/05/27/install-virtual-box-4-on-ubuntu-with-phpvirtualbox4
- code.google.com/p/phpvirtualbox/wiki/vboxwebServiceConfigLinux
- rogerprice.org/NUT.html#UPSSCHED-CMD
- homepage.mac.com/pauljlucas/personal/macmini/ups
-
- Напоследок посоветую посвятить выбору производителя и модели UPS не менее пары часов времени. Сэкономите время же и деньги. Понравившуюся модель проверяйте на совместимость с софтом и количество параметров под управлением софта. Как я заметил, народ рекомендует MGE. А я денег пожалел на упс. oops :(
-
В Debian Wheezy столкнулся с проблемой - не выключается хост и syslog содержит сообщение типа
ОтветитьУдалить"upssched Failed to connect to parent and failed to create parent: No such file or directory"
Как выяснилось, папка
/var/run/nut/upssched, указанная в конфиге
/etc/nut/upssched.conf
все время куда-то пропадает.
Решение проблемы: в конфиге указать папку
/var/run/nut
вместо
/var/run/nut/upssched
Тогда все работает как надо.
Хозяйке на заметку.
ОтветитьУдалитьЕсть в ГитХабе проект
https://github.com/bkidwell/vbox-service-template
в котором приведен шаблон rc скрипта для Виртуалбокса "vbox-service-template is an init.d script template for running a VirtualBox machine as a service".