SoundHouseのUPS(USB接続)をLinux/Debian/Proxmoxで使う

SOUND HOUSEからなぜか発売されている無停電電源装置(UPS)も、なんやかんや世代を重ね、CLASSIC PRO UPS1500PSとかUPS2000PSなんていうバッテリー動作時の出力が正弦波になっているというモデルまで登場しています。
メーカ公式ページ

そんなわけで、試しに、CLASSIC PRO UPS1500PSを買って、Linuxサーバに接続してみました。
なお、商用電源断後のshutdownに関する設定については、このページでは扱いません。

環境
・OS: Debian 6.0ベースのProxmox 2.1
・UPS管理ソフト NUT ver 2.4.3
・サーバとUPSの接続方法: USB
・UPS: SoundHouse CLASIC PRO UPS1500PS

いろいろ試行錯誤して、ごちゃごちゃがありましたがNUT v2.4.3で使用する場合にups.confに行う最小限の設定は以下であるようです。

[soundhouse]
        driver=megatec_usb
        desc="soundhouse ups"
        port=auto

NUTのChangelogのr2766(2010-12-21)に「megatec_usb drivers, now replaced by blazer_ser and blazer_usb」という記述があるように、新しいNUTにはmegatech_usbがありません。その場合は、以下となります。

[soundhouse]
        driver=blazer_usb
        desc="soundhouse ups"
        port=auto

よく見かける設定例は以下だと思います

[soundhouse]
        driver=blazer_usb
        vendorid=0001
        productid=0000
        subdriver=krauler
        desc="soundhouse ups"
        port=/dev/usb/hiddev0

検証を行ったところNUT v2.4.3では・・・
・「driver=megatec_usb」ではは、バッテリーの充電具合(battery.charge)が取得できた。
・「subdriver=krauler」は、あってもなくても、動作は変わりませんでした。(NUT v2.6では違うかも?)
・「port=/dev/usb/hiddev0」といった感じのポート指定は、USB接続の場合は、無くても大丈夫なようです。
・vendoridとproductidは指定しなくても自動認識しました。

複数のUPSが接続されている、とか、自作のUSB機器が接続されている、とか、そんな環境でない限りは、自動認識にさせてしまってもいいかもしれません。

試行錯誤には設定が正しいのか検証が必要となるわけですが、ちゃんとUPSからデータを拾えているのかを調べている方法がよく分かりませんでしたが、「[Nut-upsuser] blazer_usb for SVEN Power Pro+ 500 USB」にて確認方法を発見。

「driver=blazer_usb」と指定している場合、「/lib/nut/blazer_usb -DDDDD -a <ups.conf上の設定名>」を実行すると、blazer_usbドライバがデバグモードで起動され、取得できているステータスが出力される、というもの。

「driver=blazer_usb」+「subdriver=krauler」+ID指定の場合

[soundhouse]
        driver=blazer_usb
        vendorid=0001
        productid=0000
        subdriver=krauler
        desc="soundhouse ups"
        port=auto
root@pveserver1:/etc/nut# /lib/nut/blazer_usb -DDDDD -a soundhouse
Network UPS Tools - Megatec/Q1 protocol USB driver 0.03 (2.4.3)
   0.000000     send_to_all: SETINFO driver.parameter.vendorid "0001"
   0.000020     send_to_all: SETINFO driver.parameter.productid "0000"
   0.000027     send_to_all: SETINFO driver.parameter.subdriver "krauler"
   0.000034     send_to_all: SETINFO driver.parameter.port "auto"
   0.000050     debug level is '5'
   0.096795     Checking device (0001/0000) (002/006)
   0.099346     - VendorID: 0001
   0.099361     - ProductID: 0000
   0.099369     - Manufacturer: MEC
   0.099377     - Product: MEC0002
   0.099383     - Serial Number: unknown
   0.099389     - Bus: 002
   0.099395     Trying to match device
   0.099450     Device matches
   0.099864     send_to_all: SETINFO ups.vendorid "0001"
   0.099908     send_to_all: SETINFO ups.productid "0000"
   0.099920     send_to_all: SETINFO device.type "ups"
   0.099930     send_to_all: SETINFO driver.version "2.4.3"
   0.099939     send_to_all: SETINFO driver.version.internal "0.03"
   0.099953     send_to_all: SETINFO driver.name "blazer_usb"
   0.099962     Trying megatec protocol...
   0.099969     send: Q1
   0.312042     send_to_all: SETINFO input.voltage "102.0"
   0.312064     send_to_all: SETINFO input.voltage.fault "0.0"
   0.312077     send_to_all: SETINFO output.voltage "102.0"
   0.312102     send_to_all: SETINFO ups.load "23"
   0.312113     send_to_all: SETINFO input.frequency "60.0"
   0.312125     send_to_all: SETINFO battery.voltage "27.00"
   0.312135     send_to_all: SETINFO ups.temperature "29.0"
   0.312144     send_to_all: SETINFO beeper.status "enabled"
   0.312149     send_to_all: SETINFO ups.type "offline / line interactive"
   0.312155     send_to_all: SETINFO ups.status "OL"
   0.312158     Status read in 1 tries
   0.312162     Supported UPS detected with megatec protocol
   0.312166     send: F
   0.414561     send_to_all: SETINFO input.voltage.nominal "100"
   0.414579     send_to_all: SETINFO input.current.nominal "9.0"
   0.414592     send_to_all: SETINFO battery.voltage.nominal "24.0"
   0.414641     send_to_all: SETINFO input.frequency.nominal "60"
   0.414650     Ratings read in 1 tries
   0.414658     send: I
   0.588598     send_to_all: SETINFO ups.mfr ""
   0.588636     send_to_all: SETINFO ups.model "1500VA"
   0.588647     send_to_all: SETINFO ups.firmware "V2.0"
   0.588654     Vendor information read in 1 tries
   0.588662     Battery runtime will not be calculated (runtimecal not set)
   0.588674     send_to_all: SETINFO ups.delay.start "180"
   0.588679     send_to_all: SETINFO ups.delay.shutdown "30"
   0.588683     send_to_all: ADDCMD beeper.toggle
   0.588687     send_to_all: ADDCMD load.off
   0.588691     send_to_all: ADDCMD load.on
   0.588695     send_to_all: ADDCMD shutdown.return
   0.588698     send_to_all: ADDCMD shutdown.stayoff
   0.588702     send_to_all: ADDCMD shutdown.stop
   0.588706     send_to_all: ADDCMD test.battery.start
   0.588710     send_to_all: ADDCMD test.battery.start.deep
   0.588714     send_to_all: ADDCMD test.battery.start.quick
   0.588718     send_to_all: ADDCMD test.battery.stop
   0.588722     send: Q1
   0.800726     send_to_all: DATAOK
   0.800803     dstate_init: sock /var/run/nut/blazer_usb-soundhouse open on fd 5
   0.800811     send_to_all: SETINFO driver.parameter.pollinterval "2"
   0.800821     send_to_all: SETINFO device.mfr ""
   0.800826     send_to_all: SETINFO device.model "1500VA"
   0.800831     send: Q1
   1.012686     send_to_all: SETINFO ups.load "24"
   2.802887     send: Q1
   3.014774     send_to_all: SETINFO ups.load "23"
   4.804803     send: Q1
   5.016824     send_to_all: SETINFO ups.load "24"
   6.806764     send: Q1
   7.018869     send_to_all: SETINFO ups.load "23"
   7.018888     send_to_all: SETINFO input.frequency "59.9"
   8.808739     send: Q1
  10.810712     send: Q1
  12.812707     send: Q1
  13.024835     send_to_all: SETINFO output.voltage "103.0"
  13.024858     send_to_all: SETINFO input.frequency "60.0"
  14.814804     send: Q1
  15.026909     send_to_all: SETINFO input.voltage "103.0"
  15.026931     send_to_all: SETINFO output.voltage "102.0"
  15.026944     send_to_all: SETINFO ups.load "24"
  16.816779     send: Q1
  17.028977     send_to_all: SETINFO input.voltage "102.0"
  17.028998     send_to_all: SETINFO output.voltage "103.0"
  17.029012     send_to_all: SETINFO ups.load "23"
  18.818749     send: Q1
  19.030782     send_to_all: SETINFO output.voltage "102.0"
  19.030799     send_to_all: SETINFO ups.load "24"
^C  19.654754   Signal 2: exiting
root@pveserver1:/etc/nut# /etc/init.d/nut start
Starting Network UPS Tools: driver(s) upsd.
root@pveserver1:/etc/nut# upsc soundhouse
battery.voltage: 27.00
battery.voltage.nominal: 24.0
beeper.status: enabled
device.mfr:
device.model: 1500VA
device.type: ups
driver.name: blazer_usb
driver.parameter.pollinterval: 2
driver.parameter.port: auto
driver.parameter.productid: 0000
driver.parameter.subdriver: krauler
driver.parameter.vendorid: 0001
driver.version: 2.4.3
driver.version.internal: 0.03
input.current.nominal: 9.0
input.frequency: 60.0
input.frequency.nominal: 60
input.voltage: 102.0
input.voltage.fault: 0.0
input.voltage.nominal: 100
output.voltage: 102.0
ups.delay.shutdown: 30
ups.delay.start: 180
ups.firmware: V2.0
ups.load: 25
ups.mfr:
ups.model: 1500VA
ups.productid: 0000
ups.status: OL
ups.temperature: 29.0
ups.type: offline / line interactive
ups.vendorid: 0001
root@pveserver1:/etc/nut# 

「driver=blazer_usb」+ID指定の場合

[soundhouse]
        driver=blazer_usb
        vendorid=0001
        productid=0000
        desc="soundhouse ups"
        port=auto
root@pveserver1:/etc/nut# /lib/nut/blazer_usb -DDDDD -a soundhouse
Network UPS Tools - Megatec/Q1 protocol USB driver 0.03 (2.4.3)
   0.000000     send_to_all: SETINFO driver.parameter.vendorid "0001"
   0.000041     send_to_all: SETINFO driver.parameter.productid "0000"
   0.000049     send_to_all: SETINFO driver.parameter.port "auto"
   0.000066     debug level is '5'
   0.096380     Checking device (0001/0000) (002/006)
   0.099024     - VendorID: 0001
   0.099039     - ProductID: 0000
   0.099047     - Manufacturer: MEC
   0.099054     - Product: MEC0002
   0.099061     - Serial Number: unknown
   0.099067     - Bus: 002
   0.099073     Trying to match device
   0.099135     Device matches
   0.099540     send_to_all: SETINFO ups.vendorid "0001"
   0.099556     send_to_all: SETINFO ups.productid "0000"
   0.099571     send_to_all: SETINFO device.type "ups"
   0.099581     send_to_all: SETINFO driver.version "2.4.3"
   0.099590     send_to_all: SETINFO driver.version.internal "0.03"
   0.099599     send_to_all: SETINFO driver.name "blazer_usb"
   0.099607     Trying megatec protocol...
   0.099614     send: Q1
   0.311677     send_to_all: SETINFO input.voltage "102.0"
   0.311701     send_to_all: SETINFO input.voltage.fault "0.0"
   0.311713     send_to_all: SETINFO output.voltage "102.0"
   0.311733     send_to_all: SETINFO ups.load "26"
   0.311739     send_to_all: SETINFO input.frequency "60.0"
   0.311745     send_to_all: SETINFO battery.voltage "27.00"
   0.311750     send_to_all: SETINFO ups.temperature "29.0"
   0.311754     send_to_all: SETINFO beeper.status "enabled"
   0.311759     send_to_all: SETINFO ups.type "offline / line interactive"
   0.311764     send_to_all: SETINFO ups.status "OL"
   0.311768     Status read in 1 tries
   0.311772     Supported UPS detected with megatec protocol
   0.311776     send: F
   0.414048     send_to_all: SETINFO input.voltage.nominal "100"
   0.414061     send_to_all: SETINFO input.current.nominal "9.0"
   0.414069     send_to_all: SETINFO battery.voltage.nominal "24.0"
   0.414077     send_to_all: SETINFO input.frequency.nominal "60"
   0.414081     Ratings read in 1 tries
   0.414085     send: I
   0.587668     send_to_all: SETINFO ups.mfr ""
   0.587689     send_to_all: SETINFO ups.model "1500VA"
   0.587696     send_to_all: SETINFO ups.firmware "V2.0"
   0.587701     Vendor information read in 1 tries
   0.587705     Battery runtime will not be calculated (runtimecal not set)
   0.587711     send_to_all: SETINFO ups.delay.start "180"
   0.587716     send_to_all: SETINFO ups.delay.shutdown "30"
   0.587720     send_to_all: ADDCMD beeper.toggle
   0.587724     send_to_all: ADDCMD load.off
   0.587728     send_to_all: ADDCMD load.on
   0.587732     send_to_all: ADDCMD shutdown.return
   0.587735     send_to_all: ADDCMD shutdown.stayoff
   0.587739     send_to_all: ADDCMD shutdown.stop
   0.587743     send_to_all: ADDCMD test.battery.start
   0.587747     send_to_all: ADDCMD test.battery.start.deep
   0.587751     send_to_all: ADDCMD test.battery.start.quick
   0.587755     send_to_all: ADDCMD test.battery.stop
   0.587759     send: Q1
   0.799800     send_to_all: DATAOK
   0.799900     dstate_init: sock /var/run/nut/blazer_usb-soundhouse open on fd 5
   0.799909     send_to_all: SETINFO driver.parameter.pollinterval "2"
   0.799915     send_to_all: SETINFO device.mfr ""
   0.799924     send_to_all: SETINFO device.model "1500VA"
   0.799929     send: Q1
   2.801005     send: Q1
   3.012778     send_to_all: SETINFO ups.load "24"
   4.802906     send: Q1
   6.804868     send: Q1
   7.016922     send_to_all: SETINFO ups.load "23"
   8.805867     send: Q1
  10.807771     send: Q1
  11.020026     send_to_all: SETINFO ups.load "25"
  12.809671     send: Q1
  13.021676     send_to_all: SETINFO ups.load "24"
  14.811572     send: Q1
  15.023592     send_to_all: SETINFO output.voltage "103.0"
  16.813635     send: Q1
  17.025795     send_to_all: SETINFO output.voltage "102.0"
  17.025815     send_to_all: SETINFO ups.load "23"
  18.815537     send: Q1
  20.816866     send: Q1
  22.818749     send: Q1
  23.030774     send_to_all: SETINFO ups.load "25"
  24.820650     send: Q1
  25.032782     send_to_all: SETINFO ups.load "23"
  26.822550     send: Q1
  27.034681     send_to_all: SETINFO output.voltage "103.0"
  28.824496     send: Q1
  29.036370     send_to_all: SETINFO output.voltage "102.0"
  30.826399     send: Q1
  31.038459     send_to_all: SETINFO input.frequency "59.9"
  32.828300     send: Q1
  33.040394     send_to_all: SETINFO input.frequency "60.0"
  34.830200     send: Q1
^C  35.974000   Signal 2: exiting
root@pveserver1:/etc/nut# /etc/init.d/nut start
Starting Network UPS Tools: driver(s) upsd.
root@pveserver1:/etc/nut# upsc soundhouse
battery.voltage: 27.00
battery.voltage.nominal: 24.0
beeper.status: enabled
device.mfr:
device.model: 1500VA
device.type: ups
driver.name: blazer_usb
driver.parameter.pollinterval: 2
driver.parameter.port: auto
driver.parameter.productid: 0000
driver.parameter.vendorid: 0001
driver.version: 2.4.3
driver.version.internal: 0.03
input.current.nominal: 9.0
input.frequency: 60.0
input.frequency.nominal: 60
input.voltage: 102.0
input.voltage.fault: 0.0
input.voltage.nominal: 100
output.voltage: 102.0
ups.delay.shutdown: 30
ups.delay.start: 180
ups.firmware: V2.0
ups.load: 25
ups.mfr:
ups.model: 1500VA
ups.productid: 0000
ups.status: OL
ups.temperature: 29.0
ups.type: offline / line interactive
ups.vendorid: 0001
root@pveserver1:/etc/nut#

vendoeridとproductidを指定しない場合

[soundhouse]
        driver=blazer_usb
        desc="soundhouse ups"
        port=auto
root@pveserver1:/etc/nut# /lib/nut/blazer_usb -DDDDD -a soundhouse
Network UPS Tools - Megatec/Q1 protocol USB driver 0.03 (2.4.3)
   0.000000     send_to_all: SETINFO driver.parameter.port "auto"
   0.000029     debug level is '5'
   0.096966     Checking device (0001/0000) (002/006)
   0.099681     - VendorID: 0001
   0.099698     - ProductID: 0000
   0.099705     - Manufacturer: MEC
   0.099711     - Product: MEC0002
   0.099717     - Serial Number: unknown
   0.099724     - Bus: 002
   0.099730     Trying to match device
   0.099738     Device matches
   0.100088     send_to_all: SETINFO ups.vendorid "0001"
   0.100104     send_to_all: SETINFO ups.productid "0000"
   0.100118     send_to_all: SETINFO device.type "ups"
   0.100128     send_to_all: SETINFO driver.version "2.4.3"
   0.100138     send_to_all: SETINFO driver.version.internal "0.03"
   0.100147     send_to_all: SETINFO driver.name "blazer_usb"
   0.100155     Trying megatec protocol...
   0.100162     send: Q1
   0.312065     send_to_all: SETINFO input.voltage "103.0"
   0.312084     send_to_all: SETINFO input.voltage.fault "0.0"
   0.312097     send_to_all: SETINFO output.voltage "102.0"
   0.312124     send_to_all: SETINFO ups.load "23"
   0.312130     send_to_all: SETINFO input.frequency "60.0"
   0.312136     send_to_all: SETINFO battery.voltage "27.00"
   0.312141     send_to_all: SETINFO ups.temperature "29.0"
   0.312146     send_to_all: SETINFO beeper.status "enabled"
   0.312151     send_to_all: SETINFO ups.type "offline / line interactive"
   0.312156     send_to_all: SETINFO ups.status "OL"
   0.312160     Status read in 1 tries
   0.312163     Supported UPS detected with megatec protocol
   0.312167     send: F
   0.414407     send_to_all: SETINFO input.voltage.nominal "100"
   0.414435     send_to_all: SETINFO input.current.nominal "9.0"
   0.414449     send_to_all: SETINFO battery.voltage.nominal "24.0"
   0.414460     send_to_all: SETINFO input.frequency.nominal "60"
   0.414468     Ratings read in 1 tries
   0.414476     send: I
   0.588424     send_to_all: SETINFO ups.mfr ""
   0.588444     send_to_all: SETINFO ups.model "1500VA"
   0.588454     send_to_all: SETINFO ups.firmware "V2.0"
   0.588461     Vendor information read in 1 tries
   0.588469     Battery runtime will not be calculated (runtimecal not set)
   0.588478     send_to_all: SETINFO ups.delay.start "180"
   0.588487     send_to_all: SETINFO ups.delay.shutdown "30"
   0.588496     send_to_all: ADDCMD beeper.toggle
   0.588504     send_to_all: ADDCMD load.off
   0.588508     send_to_all: ADDCMD load.on
   0.588512     send_to_all: ADDCMD shutdown.return
   0.588516     send_to_all: ADDCMD shutdown.stayoff
   0.588520     send_to_all: ADDCMD shutdown.stop
   0.588523     send_to_all: ADDCMD test.battery.start
   0.588527     send_to_all: ADDCMD test.battery.start.deep
   0.588531     send_to_all: ADDCMD test.battery.start.quick
   0.588535     send_to_all: ADDCMD test.battery.stop
   0.588539     send: Q1
   1.125704     send_to_all: SETINFO input.voltage "102.0"
   1.125733     send_to_all: SETINFO ups.load "25"
   1.125753     send_to_all: DATAOK
   1.125817     dstate_init: sock /var/run/nut/blazer_usb-soundhouse open on fd 5
   1.125824     send_to_all: SETINFO driver.parameter.pollinterval "2"
   1.125830     send_to_all: SETINFO device.mfr ""
   1.125835     send_to_all: SETINFO device.model "1500VA"
   1.125840     send: Q1
   3.127753     send: Q1
   3.339759     send_to_all: SETINFO output.voltage "103.0"
   3.339779     send_to_all: SETINFO ups.load "23"
   5.129650     send: Q1
   5.341674     send_to_all: SETINFO output.voltage "102.0"
^C   7.022719   Signal 2: exiting
root@pveserver1:/etc/nut# /etc/init.d/nut start
Starting Network UPS Tools: driver(s) upsd.
root@pveserver1:/etc/nut# upsc soundhouse
battery.voltage: 27.00
battery.voltage.nominal: 24.0
beeper.status: enabled
device.mfr:
device.model: 1500VA
device.type: ups
driver.name: blazer_usb
driver.parameter.pollinterval: 2
driver.parameter.port: auto
driver.version: 2.4.3
driver.version.internal: 0.03
input.current.nominal: 9.0
input.frequency: 60.0
input.frequency.nominal: 60
input.voltage: 102.0
input.voltage.fault: 0.0
input.voltage.nominal: 100
output.voltage: 103.0
ups.delay.shutdown: 30
ups.delay.start: 180
ups.firmware: V2.0
ups.load: 23
ups.mfr:
ups.model: 1500VA
ups.productid: 0000
ups.status: OL
ups.temperature: 29.0
ups.type: offline / line interactive
ups.vendorid: 0001
root@pveserver1:/etc/nut#

「driver=megatec_usb」の場合

[soundhouse]
        driver=megatec_usb
        desc="soundhouse ups"
        port=auto
root@pveserver1:/etc/nut# /lib/nut/megatec_usb -DDDDD -a soundhouse
Network UPS Tools - Megatec protocol driver 1.6 (2.4.3)
Serial-over-USB transport layer 0.10
   0.000000     send_to_all: SETINFO driver.parameter.port "auto"
   0.000033     debug level is '5'
   0.097682     Checking device (0001/0000) (002/006)
   0.100333     - VendorID: 0001
   0.100348     - ProductID: 0000
   0.100356     - Manufacturer: MEC
   0.100364     - Product: MEC0002
   0.100372     - Serial Number: unknown
   0.100378     - Bus: 002
   0.100385     Trying to match device
   0.100395     Device matches
   0.100744     DTR=1, RTS=0
   0.100762     send_to_all: SETINFO device.type "ups"
   0.100772     send_to_all: SETINFO driver.version "2.4.3"
   0.100782     send_to_all: SETINFO driver.version.internal "1.6"
   0.100792     send_to_all: SETINFO driver.name "megatec_usb"
   0.100805     Starting UPS detection process...
   0.100813     Asking for UPS information [I]...
   0.100822     set_data_krauler: index [0c]
   0.574860     I => OK [#                1500VA     V2.0      ]
   0.574883     I VALUES => [ 1500VA V2.0]
   0.574892     Asking for UPS status [Q1]...
   0.574902     set_data_krauler: index [03]
   1.087059     Q1 => OK [(102.0 000.0 102.0 024 60.0 27.0 29.0 00001001]
   1.087112     Q1 VALUES => [102.0 0.0 102.0 24.0 60.0 27.0 29.0 00001001]
   1.087132     send_to_all: SETINFO ups.type "standby"
   1.087140     Cancelling any pending shutdown or battery test.
   1.087149     set_data_krauler: index [0b]
   1.101903     set_data_krauler: retry [UPS No Ack]
   1.101922     Asking for UPS information [I]...
   1.101932     set_data_krauler: index [0c]
   1.575899     I => OK [#                1500VA     V2.0      ]
   1.575920     I VALUES => [ 1500VA V2.0]
   1.575937     send_to_all: SETINFO ups.mfr ""
   1.575949     send_to_all: SETINFO ups.model "1500VA V2.0"
   1.575957     Megatec protocol UPS detected [ 1500VA V2.0].
   1.575967     send_to_all: SETINFO ups.serial "unknown"
   1.575976     Parameter [ignoreoff]: [false]
   1.575983     Asking for UPS power ratings [F]...
   1.575991     set_data_krauler: index [0d]
   1.978545     F => OK [#100.0 9.0 24.00 60.0]
   1.978575     F VALUES => [100.0 9.0 24.0 60.0]
   1.978591     send_to_all: SETINFO battery.voltage.nominal "24.0"
   1.978603     send_to_all: SETINFO input.voltage.nominal "100.0"
   1.978614     send_to_all: SETINFO input.frequency.nominal "60.0"
   1.978625     24.0V battery, interval [19.4V, 27.4V].
   1.978637     send_to_all: SETINFO ups.delay.start "2"
   1.978647     send_to_all: SETINFO ups.delay.shutdown "0"
   1.978656     send_to_all: ADDCMD test.battery.start.deep
   1.978682     send_to_all: ADDCMD test.battery.start
   1.978688     send_to_all: ADDCMD test.battery.stop
   1.978692     send_to_all: ADDCMD shutdown.return
   1.978702     send_to_all: ADDCMD shutdown.stayoff
   1.978707     send_to_all: ADDCMD shutdown.stop
   1.978711     send_to_all: ADDCMD load.on
   1.978715     send_to_all: ADDCMD load.off
   1.978720     send_to_all: ADDCMD reset.input.minmax
   1.978724     send_to_all: ADDCMD reset.watchdog
   1.978728     send_to_all: ADDCMD beeper.toggle
   1.978732     Done setting up the UPS.
   1.978736     Asking for UPS status [Q1]...
   1.978741     set_data_krauler: index [03]
   2.490829     Q1 => OK [(102.0 000.0 102.0 024 60.0 27.0 29.0 00001001]
   2.490862     Q1 VALUES => [102.0 0.0 102.0 24.0 60.0 27.0 29.0 00001001]
   2.490878     send_to_all: SETINFO input.voltage "102.0"
   2.490890     send_to_all: SETINFO input.voltage.fault "0.0"
   2.490901     send_to_all: SETINFO output.voltage "102.0"
   2.490912     send_to_all: SETINFO ups.load "24.0"
   2.490922     send_to_all: SETINFO input.frequency "60.0"
   2.490933     send_to_all: SETINFO battery.voltage "27.00"
   2.490943     send_to_all: SETINFO ups.temperature "29.0"
   2.490954     send_to_all: SETINFO battery.charge "95.0"
   2.490958     Calculated battery charge: 95.0%
   2.490963     send_to_all: SETINFO ups.beeper.status "enabled"
   2.490969     send_to_all: SETINFO input.voltage.minimum "102.0"
   2.490974     send_to_all: SETINFO input.voltage.maximum "102.0"
   2.490979     send_to_all: SETINFO ups.status "OL"
   2.490984     send_to_all: DATAOK
   2.491042     dstate_init: sock /var/run/nut/megatec_usb-soundhouse open on fd 5
   2.491050     send_to_all: SETINFO driver.parameter.pollinterval "2"
   2.491056     send_to_all: SETINFO device.mfr ""
   2.491061     send_to_all: SETINFO device.model "1500VA V2.0"
   2.491066     send_to_all: SETINFO device.serial "unknown"
   2.491070     Asking for UPS status [Q1]...
   2.491075     set_data_krauler: index [03]
   3.003223     Q1 => OK [(102.0 000.0 102.0 023 60.0 27.0 29.0 00001001]
   3.003260     Q1 VALUES => [102.0 0.0 102.0 23.0 60.0 27.0 29.0 00001001]
   3.003281     send_to_all: SETINFO ups.load "23.0"
   3.003297     Calculated battery charge: 95.0%
   4.492690     Asking for UPS status [Q1]...
   4.492720     set_data_krauler: index [03]
   4.818058     set_data_krauler: retry [UPS No Ack]
   5.330364     Q1 => OK [(102.0 000.0 102.0 023 60.0 27.0 29.0 00001001]
   5.330396     Q1 VALUES => [102.0 0.0 102.0 23.0 60.0 27.0 29.0 00001001]
   5.330420     Calculated battery charge: 95.0%
   6.493948     Asking for UPS status [Q1]...
   6.493974     set_data_krauler: index [03]
   7.006249     Q1 => OK [(102.0 000.0 102.0 023 60.0 27.0 29.0 00001001]
   7.006283     Q1 VALUES => [102.0 0.0 102.0 23.0 60.0 27.0 29.0 00001001]
   7.006309     Calculated battery charge: 95.0%
   8.495528     Asking for UPS status [Q1]...
   8.495556     set_data_krauler: index [03]
   9.007946     Q1 => OK [(102.0 000.0 102.0 023 60.0 27.0 29.0 00001001]
   9.007983     Q1 VALUES => [102.0 0.0 102.0 23.0 60.0 27.0 29.0 00001001]
   9.008009     Calculated battery charge: 95.0%
  10.497125     Asking for UPS status [Q1]...
  10.497157     set_data_krauler: index [03]
  11.009336     Q1 => OK [(102.0 000.0 102.0 024 60.0 27.0 29.0 00001001]
  11.009370     Q1 VALUES => [102.0 0.0 102.0 24.0 60.0 27.0 29.0 00001001]
  11.009393     send_to_all: SETINFO ups.load "24.0"
  11.009409     Calculated battery charge: 95.0%
  12.498740     Asking for UPS status [Q1]...
  12.498769     set_data_krauler: index [03]
  13.011033     Q1 => OK [(102.0 000.0 102.0 023 60.0 27.0 29.0 00001001]
  13.011067     Q1 VALUES => [102.0 0.0 102.0 23.0 60.0 27.0 29.0 00001001]
  13.011090     send_to_all: SETINFO ups.load "23.0"
  13.011107     Calculated battery charge: 95.0%
^C  13.582820   Signal 2: exiting
root@pveserver1:/etc/nut# /etc/init.d/nut start
Starting Network UPS Tools:ups driver(s) upsd.
root@pveserver1:/etc/nut# upsc soundhouse
battery.charge: 95.0
battery.voltage: 27.00
battery.voltage.nominal: 24.0
device.mfr:
device.model: 1500VA V2.0
device.serial: unknown
device.type: ups
driver.name: megatec_usb
driver.parameter.pollinterval: 2
driver.parameter.port: auto
driver.version: 2.4.3
driver.version.internal: 1.6
input.frequency: 60.0
input.frequency.nominal: 60.0
input.voltage: 102.0
input.voltage.fault: 0.0
input.voltage.maximum: 102.0
input.voltage.minimum: 102.0
input.voltage.nominal: 100.0
output.voltage: 102.0
ups.beeper.status: enabled
ups.delay.shutdown: 0
ups.delay.start: 2
ups.load: 23.0
ups.mfr:
ups.model: 1500VA V2.0
ups.serial: unknown
ups.status: OL
ups.temperature: 29.0
ups.type: standby
root@pveserver1:/etc/nut#

あえて「driver=usbhid-ups」を指定した場合
なお、下記の例ではvendorid=0001とproductid=0000を指定していますが、無くても結果は同じでした。

[soundhouse]
        driver=usbhid-ups
        vendorid=0001
        productid=0000
        desc="soundhouse ups"
        port=auto
root@pveserver1:/etc/nut# /lib/nut/usbhid-ups -DDDDD -a soundhouse
Network UPS Tools - Generic HID driver 0.34 (2.4.3)
USB communication driver 0.31
   0.000000     send_to_all: SETINFO driver.parameter.vendorid "0001"
   0.000020     send_to_all: SETINFO driver.parameter.productid "0000"
   0.000028     send_to_all: SETINFO driver.parameter.port "auto"
   0.000044     debug level is '5'
   0.000385     upsdrv_initups...
   0.097071     Checking device (0001/0000) (002/006)
   0.099852     - VendorID: 0001
   0.099867     - ProductID: 0000
   0.099875     - Manufacturer: MEC
   0.099882     - Product: MEC0002
   0.099888     - Serial Number: unknown
   0.099895     - Bus: 002
   0.099901     Trying to match device
   0.099926     Device does not match - skipping
   0.099942     Checking device (0424/2514) (002/004)
   0.099961     - VendorID: 0424
   0.099965     - ProductID: 2514
   0.099969     - Manufacturer: unknown
   0.099972     - Product: unknown
   0.099975     - Serial Number: unknown
   0.099978     - Bus: 002
   0.099981     Trying to match device
   0.099985     Device does not match - skipping
   0.099990     Checking device (8087/0020) (002/002)
   0.099999     - VendorID: 8087
   0.100002     - ProductID: 0020
   0.100005     - Manufacturer: unknown
   0.100009     - Product: unknown
   0.100012     - Serial Number: unknown
   0.100015     - Bus: 002
   0.100018     Trying to match device
   0.100021     Device does not match - skipping
   0.100026     Checking device (1D6B/0002) (002/001)
   0.100045     - VendorID: 1d6b
   0.100049     - ProductID: 0002
   0.100052     - Manufacturer: unknown
   0.100055     - Product: unknown
   0.100058     - Serial Number: unknown
   0.100062     - Bus: 002
   0.100065     Trying to match device
   0.100068     Device does not match - skipping
   0.100073     Checking device (8087/0020) (001/002)
   0.100082     - VendorID: 8087
   0.100086     - ProductID: 0020
   0.100089     - Manufacturer: unknown
   0.100092     - Product: unknown
   0.100095     - Serial Number: unknown
   0.100098     - Bus: 001
   0.100101     Trying to match device
   0.100104     Device does not match - skipping
   0.100109     Checking device (1D6B/0002) (001/001)
   0.100119     - VendorID: 1d6b
   0.100123     - ProductID: 0002
   0.100126     - Manufacturer: unknown
   0.100129     - Product: unknown
   0.100133     - Serial Number: unknown
   0.100136     - Bus: 001
   0.100139     Trying to match device
   0.100142     Device does not match - skipping
   0.100148     No appropriate HID device found
   0.100153     No matching HID UPS found
root@pveserver1:/etc/nut#

ようやくProxmox 2.1へバージョンアップ

仮想マシンを何台か立てるのに、Debian OSをベースとし、その上に、OpenVZコンテナとKVM仮想マシンを実行できるよう整えられたProxmox VEというのを使っています。

元々は、2010年9月にProxmox 1.5で導入したものの、それ以後はネットワーク越しの操作になっているため、積極的にアップデートがしにくい、というものでした。
Proxmox 1.6→1.7は、ちょっと悩みましたが、特に問題なくアップデート完了。
その後は、Proxmox 1.9まではネットワーク越しで、オンラインアップデートをしました。

が、さすがに1.9から2.0へのアップデートは不安が・・・
先日、久々にサーバ設置場所に行く機会があったので、アップデートしてきました。

公式の1.9→2.0アップデート手順通りに作業開始・・・

「./pve-upgrade-1.9-to-2.0」がエラーで終了。
曰く、mpt-statusパッケージがアップデートできない。

まぁ、これは、mpt-statusによるLSI Logic SASカードのRAID1機能監視を行う際に、標準設定のままだとRAIDの同期パーセンテージを表示してくれないので、変更したことによるものでした。
てっとりばやく、mpt-statusパッケージを削除して、再実行・・・エラー・・・

解決方法を探してもいいんでしょうが、時間が無いし、中の仮想マシンは他のサーバに移動済なので、消えても問題ない。

ということで、再起動・・・起動してこず

そんなわけで、Proxmox 2.1を新規でインストールしました。

良くなった点
・Web GUIが大幅進化
 クラスタを組んでいる場合でも、問題なく操作可能

・OpenVZコンテナ(CT)を使う場合、ネットワークインタフェースの追加がGUIで可能に

・パフォーマンスモニタ的なもの追加
 GUIに各VMのCPU/メモリ/ネットワークIO/Disk IO使用率のグラフが表示される

・GUIにバックアップ機能追加
 GUIにスケジュールバックアップ機能が追加された。
 NFS/iSCSIストレージをバックアップ先として指定できる。

・Proxmox管理用のユーザ/グループを作成できる
 いろいろ権限を設定できる

悪くなった点
・各VMにつけていた日本語コメントが文字化け
 「&~」形式になっているだけなので、コンバートすればいいんですけどね

・OpenVZコンテナのオンラインマイングレートが微妙
 いままではOpenVZコンテナが稼働状態のままProxmoxサーバ間を移動できました。
 しかし、新しいProxmoxクラスタでは、マイグレート処理は正常に完了、と出るものの
 移行後のサーバでOpenVZコンテナが停止したままになる事象が発生。
 いまのところ再現性100%。

オンラインマイグレートがちゃんと完了しない、という件が特に困りものですが、
手動で起動させればいいので、まぁ、なんとかなってる、というところです。


オンラインマイグレートをしてみたけど、起動していない、という事象例

root@pveserver2:~# pvecm nodes
Node  Sts   Inc   Joined               Name
   1   M     52   2012-07-16 08:04:01  pveserver1
   2   M     12   2012-07-16 08:03:28  pveserver2
root@pveserver2:~#

root@pveserver2:~# pvectl list
Use of uninitialized value in printf at /usr/bin/pvectl line 158.
      VMID NAME                 STATUS     MEM(MB)    DISK(GB)
       122 test.osakana.net     running    1024       8.00
root@pveserver2:~# pvectl migrate 122 pveserver1 -online
Jul 17 13:31:07 starting migration of CT 122 to node 'pveserver1' (192.168.35.123)
Jul 17 13:31:07 container is running - using online migration
Jul 17 13:31:07 starting rsync phase 1
Jul 17 13:31:07 # /usr/bin/rsync -aH --delete --numeric-ids --sparse /var/lib/vz/private/122 root@192.168.35.123:/var/lib/vz/private
Jul 17 13:31:22 start live migration - suspending container
Jul 17 13:31:22 dump container state
Jul 17 13:31:23 copy dump file to target node
Jul 17 13:31:23 starting rsync (2nd pass)
Jul 17 13:31:23 # /usr/bin/rsync -aH --delete --numeric-ids /var/lib/vz/private/122 root@192.168.35.123:/var/lib/vz/private
Jul 17 13:31:23 dump 2nd level quota
Jul 17 13:31:23 copy 2nd level quota to target node
Jul 17 13:31:25 initialize container on remote node 'pveserver1'
Jul 17 13:31:25 initializing remote quota
Jul 17 13:31:25 turn on remote quota
Jul 17 13:31:25 load 2nd level quota
Jul 17 13:31:25 starting container on remote node 'pveserver1'
Jul 17 13:31:25 restore container state
Jul 17 13:31:25 removing container files on local node
Jul 17 13:31:26 start final cleanup
Jul 17 13:31:27 migration finished successfuly (duration 00:00:20)
root@pveserver2:~#

root@pveserver1:~# pvectl list
Use of uninitialized value in printf at /usr/bin/pvectl line 158.
      VMID NAME                 STATUS     MEM(MB)    DISK(GB)
       <省略>
       122 test.osakana.net     stopped    1024       8.00
root@pveserver1:~# pvectl start 122
Starting container ...
Container is mounted
Adding IP address(es): 192.168.35.106
Setting CPU units: 1000
Setting CPUs: 1
Configure veth devices: veth122.0
Adding interface veth122.0 to bridge vmbr1 on CT0 for CT122
Container start in progress...
root@pveserver1:~#

RHEL5/CentOS5向けのサーバ管理向けWebGUI KloxoとHyperVM

いろいろアクセスしていたら、とある人の個人サーバの下に「Kloxo」というロゴを発見。
なんだろう?と調べてみたら、RHEL5/CentOS5向けのサーバ管理向けのWebGUIだった。

HyperVM
OpenVZ/Xenを使う仮想マシン管理のソフト(VPS管理ソフト)
WebGUIで管理を行う。
課金システムのWHMCSAWBSに対応
Proxmoxの管理WebGUIより格段に上を行ったできばえ。

Kloxo
Linuxサーバの設定をWebGUIで行うもの(Hosting Control Panel)
以前はLxadminという名称だった。
Webホスティング向けのもので、PleskとかcPanelみたいなもの。
課金システムのWHMCSAWBSHostBillに対応

ただ、どの課金プラットフォームも日本語に対応していない。

ただ、Hostbillは、GMO Cloud のUS版があったり
検索すると、「Powered by Hostbill」だけど、日本語の注文画面とかが確認できるので、
ある程度日本語に対応しているのかもしれない。


2023/04/11追記

kloxoのlxcenter.orgは解散したのか関係無い会社がVPNサービスをやっている模様。

kloxoのコード自体は https://github.com/lxcenter/kloxo に残っているが、最終更新は2019年

hypervmのコードも https://github.com/lxcenter/hypervm にある。こちらの最終更新は2012年

既存のOpenVZテンプレートのファイルをアップデートする

OpenVZで作成されたテンプレートを更新する。

参考: OpenVZ wiki: Updating Debian template

1. OpenVZの仮想ホストを作成

# vzctl create VID番号 --ostemplate テンプレート名

上記のテンプレート名は/var/lib/vz/template/cache/ にあるtar.gzファイルの名前を使用する。

実行例

# vzctl create 555 --ostemplate scientific-6-standard_6.0_i386
Creating container private area (scientific-6-standard_6.0_i386)
Performing postcreate actions
Saved parameters for CT 555
Container private area was created
#

2014/11/27 追記

/etc/vz/vz.confの設定によっては下記の様に、パラメータが足らないというエラーがでます。

# vzctl create 555 --ostemplate centos-6-standard_6.0-20121116_i386
Creating container private area (centos-6-standard_6.0-20121116_i386)
Initializing quota ...
Error: Not enough parameters, diskspace quota not set
Creation of container private area failed
#

/etc/vz/vz.confに下記のようにDISKSPACE設定とDISKINODES設定を追加することで、回避できます。

DISKSPACE="20G:22G"
DISKINODES="4000000:4400000"

(バージョンによってはvzctl createオプションでdiskspaceは指定できても、diskinodesが指定できない

2014/11/27 追記終


2. 仮想ホストにIPアドレスとDNSサーバを指定する

# vzctl set VID番号 --ipadd IPアドレス --nameserver DNSサーバIP --save

実行例

# vzctl set 555 --ipadd 192.168.x.x --nameserver 192.168.x.x --save
Saved parameters for CT 555
#

3. 仮想マシンを稼働させる

# vzctl start 555
Starting container ...
Container is mounted
Adding IP address(es): 192.168.35.240
Setting CPU units: 1000
File resolv.conf was modified
Container start in progress...
#

2014/11/27 追記

バージョンによっては、以下のようなエラーとなる場合がある。

# vzctl start 555
Error: required UB parameter kmemsize not set
Error: required UB parameter lockedpages not set
Error: required UB parameter privvmpages not set
Error: required UB parameter shmpages not set
Error: required UB parameter numproc not set
Error: required UB parameter physpages not set
Error: required UB parameter vmguarpages not set
Error: required UB parameter oomguarpages not set
Error: required UB parameter numtcpsock not set
Error: required UB parameter numflock not set
Error: required UB parameter numpty not set
Error: required UB parameter numsiginfo not set
Error: required UB parameter tcpsndbuf not set
Error: required UB parameter tcprcvbuf not set
Error: required UB parameter othersockbuf not set
Error: required UB parameter dgramrcvbuf not set
Error: required UB parameter numothersock not set
Error: required UB parameter numfile not set
Error: required UB parameter dcachesize not set
Error: required UB parameter numiptent not set
#

この場合は、/etc/vz/conf/に作成されている該当CIDの.confファイルに下記のエントリーを追記しておくといい。

PHYSPAGES="0:1024M"
SWAPPAGES="0:512M"
KMEMSIZE="465M:512M"
DCACHESIZE="232M:256M"
LOCKEDPAGES="512M"
PRIVVMPAGES="unlimited"
SHMPAGES="unlimited"
NUMPROC="unlimited"
VMGUARPAGES="0:unlimited"
OOMGUARPAGES="0:unlimited"
NUMTCPSOCK="unlimited"
NUMFLOCK="unlimited"
NUMPTY="unlimited"
NUMSIGINFO="unlimited"
TCPSNDBUF="unlimited"
TCPRCVBUF="unlimited"
OTHERSOCKBUF="unlimited"
DGRAMRCVBUF="unlimited"
NUMOTHERSOCK="unlimited"
NUMFILE="unlimited"
NUMIPTENT="unlimited"

2014/11/27 追記終


4. 仮想マシンにログインする

# vzctl enter 555
entered into CT 555
[root@ホスト名 /]#

5. yum updateを実施

# yum update
sl                                                       | 3.2 kB     00:00
sl/primary_db                                            | 3.1 MB     00:12
sl-security                                              | 1.9 kB     00:00
sl-security/primary_db                                   | 5.8 MB     00:12
Setting up Update Process
Resolving Dependencies
<略>
Transaction Summary
================================================================================
Install       0 Package(s)
Upgrade      32 Package(s)

Total download size: 46 M
Is this ok [y/N]: y
Downloading Packages:
<略>
  tzdata.noarch 0:2011h-3.el6

Complete!
[root@ns5 /]#

6. 追加したい設定があったらやっとく
・phpをインストール
・/etc/php.iniに「date.timezone = Asia/Tokyo」の設定を追加
・「ln -s /usr/share/zoneinfo/Asia/Tokyo /etc/localtime」
・/etc/sysconfig/i18nに「LANG=”ja_JP.UTF-8″」を追加

7. 掃除

# yum clean all
Cleaning up Everything
# echo > /etc/resolv.conf
#

8. 仮想ホストの停止

# vzctl stop 555
Stopping container ...
Container was stopped
Container is unmounted
#

9. 仮想ホストからIPアドレス設定を削除

# vzctl set 555 --ipdel all --save
Saved parameters for CT 555
#

10. 仮想ホストのファイルが展開されている場所に移動

# cd /var/lib/vz/private/555
#

11. テンプレートとしてtar.gzファイルを作成

#  tar --numeric-owner -czf /var/lib/vz/template/cache/scientific-6-standard_6.0-20111026_i386.tar.gz .
#

なお、ファイル名は重要。

「ディストリビューション名」-「ディストリビューションのバージョン」-「カスタマイズ説明」_「カスタマイズのバージョン」_「アーキテクチャ」.tar.gz

という書式で指定する。
そうしないと、Proxmoxでは、テンプレートとして指定できない。

12. 使用した仮想マシンの削除

# vzctl destroy 555
Destroying container private area: /var/lib/vz/private/555
Container private area was destroyed
#

13. /etc/vz/conf/に残る仮想マシンの設定ファイルを削除

# rm /etc/vz/conf/555.conf.destroyed
#

Proxmox上のOpenVZ仮想マシンのバックアップ

2025/04/17 追記

最近この記事へのアクセスが微妙にあるので、注釈を入れておきます。

この記事で紹介しているものは、2025年現在のProxmox環境ではサポートされていないOpenVZ仮想マシンをバックアップする際の手法について書いたものです。

vzdumpコマンドは残っていますが、仮想マシン一覧を取得するvzlistはなくなっています。

一覧を qm listなどに置き換える、また、バックアップ保存先へのアップロード手法を lftp ではなくほかの手法にする、などを行うことで2025年で使える内容になるかと思います。

参考資料: PVE 8.3.5環境で実行したvzdumpコマンドのログ例

root@pve3:~# qm list
      VMID NAME                 STATUS     MEM(MB)    BOOTDISK(GB) PID       
       101 windows-zfs          stopped    8092              60.00 0         
       103 linux2-ceph          stopped    2048              40.00 0         
       105 wintest3-nfs         stopped    2048              40.00 0         
root@pve3:~# vzdump --dumpdir /mnt/pve/ontap 103
INFO: starting new backup job: vzdump 103 --dumpdir /mnt/pve/ontap
INFO: Starting Backup of VM 103 (qemu)
INFO: Backup started at 2025-04-17 15:06:25
INFO: status = stopped
INFO: backup mode: stop
INFO: ionice priority: 7
INFO: VM Name: linux2-ceph
INFO: include disk 'scsi0' 'cephpool:vm-103-disk-0' 40G
INFO: creating vzdump archive '/mnt/pve/ontap/vzdump-qemu-103-2025_04_17-15_06_25.vma'
INFO: starting kvm to execute backup task
INFO: started backup task '930f41bc-3a8d-4ec6-b998-a1ec012a9c0a'
INFO:   6% (2.7 GiB of 40.0 GiB) in 3s, read: 912.7 MiB/s, write: 99.1 MiB/s
INFO:   8% (3.3 GiB of 40.0 GiB) in 6s, read: 201.6 MiB/s, write: 73.6 MiB/s
INFO:  30% (12.3 GiB of 40.0 GiB) in 9s, read: 3.0 GiB/s, write: 64.6 MiB/s
INFO:  31% (12.6 GiB of 40.0 GiB) in 12s, read: 116.0 MiB/s, write: 116.0 MiB/s
INFO:  54% (21.6 GiB of 40.0 GiB) in 15s, read: 3.0 GiB/s, write: 53.8 MiB/s
INFO:  55% (22.1 GiB of 40.0 GiB) in 19s, read: 115.2 MiB/s, write: 114.9 MiB/s
INFO:  56% (22.4 GiB of 40.0 GiB) in 22s, read: 111.8 MiB/s, write: 111.8 MiB/s
INFO:  71% (28.5 GiB of 40.0 GiB) in 26s, read: 1.5 GiB/s, write: 89.6 MiB/s
INFO:  77% (31.0 GiB of 40.0 GiB) in 29s, read: 877.2 MiB/s, write: 95.0 MiB/s
INFO:  78% (31.4 GiB of 40.0 GiB) in 32s, read: 120.8 MiB/s, write: 120.3 MiB/s
INFO: 100% (40.0 GiB of 40.0 GiB) in 2m 54s, read: 62.1 MiB/s, write: 537.0 KiB/s
INFO: backup is sparse: 36.98 GiB (92%) total zero data
INFO: transferred 40.00 GiB in 174 seconds (235.4 MiB/s)
INFO: stopping kvm after backup task
INFO: archive file size: 3.03GB
INFO: Finished Backup of VM 103 (00:02:56)
INFO: Backup finished at 2025-04-17 15:09:21
INFO: Backup job finished successfully
INFO: notified via target `mail-to-root`
root@pve3:~# ls -l /mnt/pve/ontap/
total 3187656
-rw-r--r-- 1 root root       1978 Apr 17 15:06 vzdump-qemu-103-2025_04_17-15_06_25.log
-rw-r--r-- 1 root root 3251337728 Apr 17 15:06 vzdump-qemu-103-2025_04_17-15_06_25.vma
root@pve3:~# 

Proxmox VEにはOpenVZ仮想マシンのバックアップを容易に取れるように、専用ツールvzdumpが用意されている。
このvzdumpは、OpenVZのwikiにも掲載されているぐらいの便利ツールのようです。

vzdumpでバックアップを行うと、各仮想マシンごとにtarファイルができあがります。

さて、このバックアップファイルを、Proxmoxサーバ内部に残しておくとバックアップの意味がないので、外部サーバに転送しましょう。
NFSでマウントした先にコピーというのが一番簡単なやりかたですが、安いNASだとNFSに対応していない場合があります。

まぁ、具体的にはLinkStationをバックアップ先にしたいです。
この場合、CIFS、ftp、そして、rsync(LinkStationは「バックアップ」と呼ばれている)で転送することができますが、無難なあたりでftpで転送する、とします。

そんなスクリプトを作りました

仕様
・ftpサーバに指定ユーザ・パスワードでログインする
・バックアップは10世代保存とする。
・起動中の仮想マシンのみバックアップする
・Proxmoxサーバ内にバックアップイメージを作成するが、容量が少なく済むように1個ずつ実施する
・lftpを使ってアップロードするので、「aptitude install lftp」でインストールしておく

#!/bin/bash
# vzdump and ftp upload script
#
DUMPDIR="/work"
UPLOADDIR="/disk1/backup/dump"

FTPHOST="IPアドレス"
FTPUSER="ユーザ名"
FTPPASSWORD="パスワード"

cd $DUMPDIR
vzlist > vzlist.log

# create upload directory
lftp -c "open -u $FTPUSER,$FTPPASSWORD $FTPHOST
mkdir $UPLOADDIR/transfer"

# dump and upload virtual machine
# "vzlist -1" : dump active VM only
# "vzlist -a -1": dump all VM
# "vzlist -S -1": dump standby VM only
for hostid in `vzlist -1`
do
	echo $hostid;
	cd $DUMPDIR
	vzdump --dumpdir $DUMPDIR $hostid
	lftp -c "open -u $FTPUSER,$FTPPASSWORD $FTPHOST
cd $UPLOADDIR/transfer
mput -E *.tar *.log"
done

# lotate
lftp -c "open -u $FTPUSER,$FTPPASSWORD $FTPHOST
cd $UPLOADDIR
rm -r daily.9
mv daily.8 daily.9
mv daily.7 daily.8
mv daily.6 daily.7
mv daily.5 daily.6
mv daily.4 daily.5
mv daily.3 daily.4
mv daily.2 daily.3
mv daily.1 daily.2
mv daily.0 daily.1
mv transfer daily.0"

上記スクリプトは毎日夜間に実行するつもりのものなので、NetAppライクに「daily.数字」という感じでディレクトリを作成しています。