Proxmox 2.xでは、共有ディスク無しでのホストサーバ移行(Live Motion/vMotion)みたいなことができる。
Web GUIでの方法はわかったが、CLIでのやり方についてのドキュメントが見つけにくく難航した。
使用するコマンド「pvectl」
ただし、このコマンドは、自サーバ上のみのコントロールを担当する。
「pvectl list」で、サーバ上にある仮想マシンリストを表示
root@pve1:~# pvectl list Use of uninitialized value in printf at /usr/bin/pvectl line 46. VMID NAME STATUS MEM(MB) DISK(GB) 101 server1.osakana.net running 1024 8.00 102 server2.osakana.net running 1280 30.00 #
他にもサーバがある場合は以下の様な形で他サーバに対してssh経由でコマンドを発行して状態を取得する。
root@pve1:~# ssh root@pve2 pvectl list Use of uninitialized value in printf at /usr/bin/pvectl line 46. VMID NAME STATUS MEM(MB) DISK(GB) 103 server3.osakana.net stopped 1024 10.00 104 server4.osakana.net stopped 1024 8.00 #
移動させる時は「pvectl migrate VMID サーバ名 -online」
root@ns5:~# pvectl migrate 101 pve2 -online Jan 31 15:56:51 starting migration of CT 101 to node 'pve2' (192.168.1.102) Jan 31 15:56:51 container is running - using online migration Jan 31 15:56:51 starting rsync phase 1 Jan 31 15:56:51 # /usr/bin/rsync -aHAX --delete --numeric-ids --sparse /var/lib/vz/private/101 root@192.168.1.102:/var/lib/vz/private Jan 31 15:57:31 start live migration - suspending container Jan 31 15:57:31 dump container state Jan 31 15:57:32 copy dump file to target node Jan 31 15:57:32 starting rsync (2nd pass) Jan 31 15:57:32 # /usr/bin/rsync -aHAX --delete --numeric-ids /var/lib/vz/private/101 root@192.168.1.102:/var/lib/vz/private Jan 31 15:57:35 dump 2nd level quota Jan 31 15:57:35 copy 2nd level quota to target node Jan 31 15:57:36 initialize container on remote node 'pve2' Jan 31 15:57:36 initializing remote quota Jan 31 15:57:37 turn on remote quota Jan 31 15:57:38 load 2nd level quota Jan 31 15:57:38 starting container on remote node 'pve2' Jan 31 15:57:38 restore container state Jan 31 15:57:39 removing container files on local node Jan 31 15:57:40 start final cleanup Jan 31 15:57:40 migration finished successfuly (duration 00:00:49) root@pve1:~ #
で、うちの環境だと、CPUがpve1はIntel, pve2がAMDなので、移行後の起動に失敗する。
なので、別途、起動させる必要がある。
root@pve1:~# ssh root@pve2 pvectl start 101 Starting container ... Container is mounted Adding IP address(es): 192.168.1.201 Setting CPU units: 1000 Setting CPUs: 1 Container start in progress... root@pve1:~#
これで、以下のような感じで移行が完了する。
root@pve1:~# pvectl list Use of uninitialized value in printf at /usr/bin/pvectl line 46. VMID NAME STATUS MEM(MB) DISK(GB) 102 server2.osakana.net running 1280 30.00 root@pve1:~# ssh root@pve2 pvectl list Use of uninitialized value in printf at /usr/bin/pvectl line 46. VMID NAME STATUS MEM(MB) DISK(GB) 101 server1.osakana.net running 1024 8.00 103 server3.osakana.net stopped 1024 10.00 104 server4.osakana.net stopped 1024 8.00 #
さて、この処理を自動化すると・・・
#!/usr/bin/bash SERVER=pve2 for vid in `pvectl list 2>&1 |grep running | awk '{ print $1 }'` do echo === $vid === echo pvectl migrate $vid $SERVER -online pvectl migrate $vid $SERVER -online ssh root@$SERVER pvectl list 2>&1 |grep stop | grep $vid echo ssh root@$SERVER pvectl start $vid ssh root@$SERVER pvectl start $vid done
ほんとは、移行後に起動しているか確認した上で、pvectl startを実行させるべきなんだろうけど、起動状態でpvectl startを実行しても影響がないので、無視している。