ConoHa VPSで稼働していたサーバーをV2Vでローカル仮想化基盤に引っ越し

10年ほどConoHa VPS 2.0 を利用していて、CPU 2 core / メモリ 1GB / SSD 50GB のプランに 毎月1000円ほどを払い続けてきたのですが、必要性が薄くなってきたことと金銭的な事情からConoHaから撤退することにしました。

撤退するといってもVPSで動かしていたサービスを完全に移行するまではしばらく稼働させる必要があり、かつConoHa上の サーバーは早めに止めて課金を停止したいという事情から、 ConoHaのVPSで動かしていたサーバーをそっくりそのままローカルの FreeBSD bhyveの仮想化基盤上で動かすというV2V移行でConoHaから撤退します。

やることはConoHaのVPSの仮想ディスクをそのまま引っこ抜いて、ローカル仮想化基盤で起動するだけです。 しかし、ConoHaでは仮想ディスクのエクスポート機能が提供されていないため、別の方法で仮想ディスクをまるまる 引っこ抜く必要があります。

今回はVPSのブロックデバイスを直接読み込み、それをインターネット経由で転送するという多少強引な方法で仮想ディスクの エクスポートを行いました。 VPS上のサーバーのOSはFreeBSDです。

ディスクイメージの転送

VPS側 (送信側)

VPS側の操作はSSH経由ではなくコンソールから行います。稼働中のOS自身のディスクを読み込むので、読み込み中に極力書き込み が発生しないよう いちどサーバーを起動してから、シングルユーザーモードに落ちます。最初からシングルユーザーモードで起動 するのではなく、起動してからシングルユーザーモードに落ちるのはディスクイメージの転送のためネットワーク接続のある状態で シングルユーザーモードを利用するためです。

# shutdown now

シングルユーザーモードに落ちたら以下のコマンドで、吸い出し、圧縮、暗号化、転送を行います。

インターネット越しにディスクイメージを転送するので、暗号化して転送して転送します。PASSWORDの部分は適当に16文字程度のパスワードを設定します。ディスクには空き領域もあるので高速に転送するため、圧縮して高速に転送できるようにします。暗号化されたデータは圧縮が効きにくいので、暗号化前に圧縮するのがポイント。

最後にncコマンドで受信側サーバーの9821番ポートにデータを送りつけます。

# dd if=/dev/vtbd0 bs=1M status=progress | \
    zstd -T0 | \
    openssl enc -aes-256-cbc -pbkdf2 -salt -pass pass:PASSWORD | \
    nc -6 -N receiver.example.jp 9821

受信側

受信側は、送信と逆順で9821番ポートに送られたデータを受信、復号、伸長という順に処理してファイルに保存します。 pvコマンドは、転送の進捗(圧縮データを伸長した実転送速度)を表示するために挟んでいるだけで必須ではありません。

なお、当然ですが受信側で以下のコマンドを先に実行しておいて、待ち受けている状態でVPS側でコマンドを実行して送信する必要があります。

$ nc -6 -l 9821 | \
    openssl enc -d -aes-256-cbc -pbkdf2 -salt -pass pass:PASSWORD |\
    zstd -dc | \
    pv > conoha_vtbd0.raw

受信したファイルを確認

50GBの仮想ディスクイメージが無事に手元に転送されてきたことがわかります。

$ ls -lha conoha_vtbd0.raw
-rw-r--r--  1 meta meta   50G Aug  6 23:55 conoha_vtbd0.raw
$ file conoha_vtbd0.raw
conoha_vtbd0.raw: DOS/MBR boot sector; partition 1 : ID=0xee, start-CHS (0x0,0,2), end-CHS (0x3ff,255,63), startsector 1, 104857599 sectors

ローカル仮想化基盤上でVMを起動

ローカル仮想化基盤はFreeBSD bhyveベースで、vm-bhyveを使用しています。 このあたりは人によって環境が様々ですし、持ってきた仮想ディスクでVMを起動するだけなので説明は適当に。

以下のようなVMテンプレートが存在する前提で、VMを作成します。

loader="bhyveload"
cpu=1
memory=256M
network0_type="virtio-net"
network0_switch="public"
disk0_type="virtio-blk"
disk0_name="disk0.img"

CPU 1コア、メモリ1GBのconohaという名前のVMを作成し、転送してきた仮想ディスクを割り当てます。

# vm create -t freebsd -c 1 -m 1G conoha
# cp conoha_vtbd0.raw /bhyve/conoha/disk0.img

VMを起動し、コンソールをアタッチします。

# vm start conoha; sleep 1; vm console conoha

無事に起動して、プロンプトが出ました。

FreeBSD/amd64 (conoha.example.jp) (ttyu0)

login:

ネットワーク設定の変更

ローカル仮想化基盤上で無事起動したら、ネットワーク設定を変更して手元のネットワークに沿ったIPアドレスに変更して再起動、無事にサーバー上で稼働していたサービスが正常に動いてることを確認して引っ越しは完了です。

まとめ

ConoHaのVPSで稼働していたサーバーを、仮想ディスクをそのまま吸い出してローカルに持ってくるという方法で、ローカルの仮想化基盤に引っ越しました。

ConoHaのVPSはインターネット回線の速度が共有100Mbpsなので、50GBの仮想ディスクを転送するにはそれなりに時間がかかりました。以下のグラフはConoHaの管理画面で見ることができるネットワーク転送量です。