7.1 仮想サーバーを他仮想環境へ移転するには？

（2016年時点での内容をアーカイブとして掲載しているため、一部の掲載内容が最新情報とは異なる場合がありますので、ご了承ください。最新のIBM Cloudの情報は [IBM Cloud Docs](https://cloud.ibm.com/docs) や [IBM Cloud アップデート情報](https://www.ibm.com/cloud-computing/jp/ja/cloud-update/) 、[柔らか層本](https://ibm.ent.box.com/v/ibmcloud-yawaraka)をご参照ください。）

概要
SoftLayer の仮想サーバーのOSイメージをエクスポートして、自社の仮想環境で利用する方法をご紹介します。

移転先の仮想環境には、フリーで使えてノート・パソコンでも利用できるOracle社 の Virtual Box を利用します。そして仮想サーバーのイメージは CentOS6, Ubuntu14.04 を例にして、SoftLayer の仮想サーバーが移行先の Virtual Box の環境で動作するまでをステップ・バイ・ステップで紹介していきます。
 

エクスポートから移行先仮想環境での稼働までの流れ
移行先の仮想環境で稼働するまでのステップを箇条書きにすると、以下のようになります。
 

仮想サーバーのイメージ・テンプレートを取得する
イメージをオブジェクト・ストレージへ VHD(Virtual Hard Disk) 形式のデータとして、エクスポートする
VHD形式のファイルをPCへダウンロードする
Virtual Boxに同じOSのバージョンで仮想サーバーを作成する
仮想サーバーの2ndディスクとして、ダウンロードしたVHDファイルを設定する
仮想サーバーを起動して、2ndディスクのブートローダを再設定する
2ndディスクを1stディスクに切換え仮想サーバーをブートする
SoftLayer のカスタマーポータルからrootのパスワードを調べてログインする

VHD形式のデータとは、マイクロソフト社が策定したVHD Image Format Specification に準じるデータ形式で、ハードディスク・ドライブと構造的に似せているファイル形式です。この形式は、Xen, Hyper-V, VMwareなどの仮想化製品で利用できる可搬性に優れた形式です。

このリストについてSoftLayer の仮想サーバーは、Xenの上で動作することをご存知の読者は、準仮想化(Para Virtual)のカーネルから、完全仮想化(Hardware Assisted VM)のカーネルに置き換えないと、他の仮想環境で動作しないことに気づくと思います。 もちろん、準仮想化用カーネルを利用していれば、置き換える必要があります。 しかし、SoftLayer の最近の仮想サーバーは、完全仮想化カーネルを利用しているため、置き換えは必要ありません。

サーバーの仮想化のレベルを知りたい場合は、次のコマンドで確認することができます。
完全仮想化の場合

```
# lscpu |grep Virtualization
Virtualization type:   full
```

準仮想化の場合

```
# lscpu |grep Virtualization
Virtualization type:   para
```

一般的に移行先の環境のデバイス・ドライバーを事前に導入してする必要がありますが、仮想環境でよく利用されるドライバーは、最初から仮想サーバーにインストールされています。 今回の例に挙げる Virtual Box の場合は、e1000.koというドライバーが必要なのですが、最初から導入されているので追加する必要はありません。 例えば、NICドライバーとして導入されているファイルを知りたい場合、次のコマンドでドライバーのファイル名を知ることができます。このファイル名を手がかりに、インターネットを検索することで対応するハードウェアを知ることができます。
 
```
# tree /lib/modules/3.13.0-51-generic/kernel/drivers/net/ethernet/
/lib/modules/3.13.0-51-generic/kernel/drivers/net/ethernet/
|-- 8390
|   |-- 8390.ko
|   `-- ne2k-pci.ko
|-- amd
|   `-- pcnet32.ko
|-- dec
|   `-- tulip
|       |-- de2104x.ko
|       |-- de4x5.ko
|       |-- dmfe.ko
|       |-- tulip.ko
|       |-- uli526x.ko
|       |-- winbond-840.ko
|       `-- xircom_cb.ko
|-- intel
|   |-- e1000
|   |   `-- e1000.ko
|   |-- e1000e
|   |   `-- e1000e.ko
|   |-- igbvf
|   |   `-- igbvf.ko
|   `-- ixgbevf
|       `-- ixgbevf.ko
`-- realtek
    |-- 8139cp.ko
    `-- 8139too.ko

10 directories, 16 files
```

仮想サーバーのOSイメージのエクスポート
稼働中の仮想サーバーからイメージ・テンプレートを取得して、エクスポートすることで、オブジェクト・ストレージへブート可能な仮想ディスクのファイルが登録されます。最初のステップのイメージ・テンプレートの作成は、カスタマーポータルのメニューバーから Devices -> Device List -> Device Name -> Actions -> Create Image Template と進みます。

次に取得したイメージをエクスポートするために、Devices -> Manage -> Images -> Template Name -> Actions -> Export Image と進み、オブジェクト・ストレージにVHD形式データとして、ダウンロード可能な形態で書き出します。 この操作の前提条件は、オブジェクト・ストレージのユーザーIDをもっており、ダウンロードに適したデータセンターにコンテナを持っている必要があります。

オブジェクト・ストレージのユーザーを取得するには、Storage -> Object Storage -> Order Object Storage に進んでオーダーできます。
 

豆知識 OSイメージ
イメージという言葉を本章では沢山使っています。イメージ(image)を辞書でひくと「像」や「心に思い浮かべた映像」といった意味で使われることが解ります。しかし、OSイメージが何で有るかを理解するのは難しいですよね。 OSのインストール時に利用するインスールCD-ROMといったものがありますが、これはOSイメージとは呼びません。 OSイメージとは、OSがインストールされた状態のディスクの内容を、ソックリそのまま外部にファイルとして取り出したものです。 これはインストールや基本設定をおこなうことなく、別のディスクにコピーするだけで、すぐにOSが起動できるデータ（ファイル）なのです。
オブジェクト・ストレージからのダウンロード
仮想ディスクのファイルは、カスタマーポータルからもダウンロードできますが、とても時間を要します。例えば、東京データセンターのオブジェクト・ストレージ上のVHD形式データをカスタマーポータルからダウンロードすると、カスタマーポータルがある米国ダラスを経由して、日本の利用者のブラウザに送られることになりますから、どんなに遅いかは容易に想像ができるでしょう。

筆者のお勧めの方法としては、簡単なPtyhonのコードでダウンロードするのがお勧めです。それ以外にもOpenStackのswiftコマンドや CloudBerry Lab 社 の CloudBerry Explorer を利用することもできます。

以下に、オブジェクト・ストレージのAPIを利用してVHDデータをダウンロードする Python のプログラムをご紹介します。このコードの中で、uid,pwd,odcの3つの変数を書き替えて、コンテナ名、オブジェクト名、保存ファイル名を引数に実行するだけで、VHD形式のファイルをローカルの環境に取得できます。 このコンパクトなコードは、GitHub からクローンして利用することができますので、詳しい利用方法は https://github.com/takara9/os_tools を参照してください。
 
```
#!/usr/bin/python
# -*- coding: utf-8 -*-
#
import object_storage
import os
import sys

#####
# ユーザーID、パスワード、データセンター（ラベル）
uid = 'SL123456-1:SL123456'
upw = '71a8c0f9cd9*****************************************************'
odc = 'tok02'
#####

#
# メイン
#
if __name__ == '__main__':
    #
    argvs = sys.argv  # 引数リストの取得
    argc = len(argvs) # 個数

    if (argc != 4):  
        print 'Usage: os_download.py Container Object_name Local_file'
        quit()

    cnt = argvs[1]
    obj = argvs[2]
    lfn = argvs[3]

    # ユーザーID、パスワード認証
    oos = object_storage.get_client(uid, upw, datacenter=odc)

    # ファイルへ保存
    oos[cnt][obj].save_to_filename(lfn)
``` 

Virtual Box に同じバージョンのLinux仮想サーバーを起動する
なんで移行先に、わざわざ手間をかけて、OSをインストールするの？ 移行する意味ないじゃない!?と言われるかもしれませんね。 これは、ダウンロードしてきたVHDをブートできるように、VHDファイルの中身を書き替えるためです。 それならば、同じディストリビューションのCD-ROMイメージから起動して、そのレスキュー・モードを利用することもできます。しかし、レスキューモードで利用できるコマンドには制限が多く不便なためです。

Ubuntu14.04のインストールCD-ROMのISOファイルを入手する場合、理化学研究所のサーバー http://ftp.riken.jp/Linux/ubuntu-releases/14.04.2/ にある ubuntu-14.04.1-server-amd64.iso を利用することができます。 サイズも 600MB 弱なので、比較的短時間にダウンロードできます。

CentOS6のインストールCD-ROMのISOファイルの場合は、同様に理化学研究所のサーバー http://ftp.riken.jp/Linux/centos/6.6/isos/x86_64/ にある CentOS-6.6-x86_64-minimal.iso がサイズも383MBとコンパクトで便利です。

これらのファイルは、CD-ROMに書き込まなくてもISO形式のファイルを使って Virutal Box上の仮想サーバーにインストールできますから、ダウンロードしたらファイルの状態で保存しておきます。

このVirtualBoxのVHDディスク書き換え用の仮想サーバーの設定例を以下に示します。

    CPUコア: 1個
    メモリ: 1024MB
    ストレージ・コントローラ:
        CD-ROMイメージ(ISOファイル)用 IDEコントローラ
        仮想ディスク(VHDファイル)用 SATAコントローラ
    ディスク
        IDEコントローラ配下に、ダウンロードしたインストール用のISOファイル
        SATAコントローラ配下の第1ディスクに新規作成の仮想ディスクファイル
    ネットワーク
        アダプター1 Intel Pro/1000 MT Desktop (NAT)
        アダプター2 Intel Pro/1000 MT Desktop (ブリッジアダプター)

仮想サーバーが起動したら、一旦シャットダウンして、インストール用ISOファイルを外して、SATAコントローラ配下に第二ディスクとして、VHDファイルを設定して、仮想マシンを起動します。

VirtualBoxは、https://www.virtualbox.org/wiki/Downloads のURLから、Windows版、OS X版、Linux版を入手できます。VirutalBox のインストールや詳しい使い方は、このサイトにドキュメントがあります。
 

OSイメージの設定変更
ここから、仮想サーバーの第二ディスクとして接続したVHDファイルを変更していきます。Debian系LinuxのUbuntu と Redhat系LinuxのCentOSで、少し考慮事項が異なりますから、これら二つを例にしてご紹介します。
 

Debian系LinuxのUbuntu
残念ながら、SoftLayer のオブジェクト・ストレージからダウンロードした仮想ディスクでブートすることができません。どういう訳か、この仮想ディスクにはブートローダーとしてGrub2が導入されています。しかし、/boot/grubは、レガシーGrubのためモジュールが存在しないといったメッセージが表示され止まってしまいます。 Ubuntuのデフォルトのブートローダーは、Grub2なので、Grub2を再インストールしてブートローダーの設定ファイルを再構築します。

第二ディスクのパーティションをマウントします。
 
```
# mount -t ext4 /dev/sdb1 /mnt
```

Grub2ブートローダーを第二ディスクに再インストールし、仮想マシンをオフにします。
 
```
# grub-install /dev/sdb --boot-directory /mnt
```

VirutalBox の操作で、第一ディスクを外し、第二ディスクを第一ディスクに付け替え、仮想マシンを起動します。そうすると、ブートローダーのプロンプトが表示されます。
 
```
grub> 
```

ここから、マニュアル操作で、ブートのルートディスク、Linuxカーネルの場所、起動時のRAMディスク・イメージを指定して、ブートを実行していきます。

/dev/sdaのプライマリ・パーティション#1 (/dev/sda1) は、grunの表現では、(hd0,msdos1)となり、これをrootに設定します。
 
```
grub> set root=(hd0,msdos1)
```

次にLinuxカーネルの場所を設定します。そして、次のrootは、ルート・ファイルシステムのパーティションです。
 
```
grub> linux /vmlinuz-3.13.0-51-generic root=/dev/sda2
```

起動時のRAMディスク・イメージのファイルを設定します。
 
```
grub> initrd /initrd.img-3.13.0-51-generic
```

このコマンドで、OSのブートが開始されます。
 
```
grub> boot
```

ブートが成功すると loginプロンプトが現れます。 このrootのパスワードは、SoftLayerのカスタマーポータルから取得して、ログインします。

 


この状態で再起動すると、grub> プロンプトが表示されるだけで、Linuxカーネルはブートしません。自動ブートするように、次のコマンドを投入してブートセクターを更新します。
 
```
# update-grub
```

この後は、IPアドレスの設定変更、rootパスワードの変更などを実施し、新たな実行環境に必要な設定を施します。
 

豆知識 Ubuntu Linux
Ubuntuは、世界で最も利用者の多いLinuxディストリビューションと言われており、多くのパブリック・クラウドで利用することができます。このUbuntuは、Debian GNU/Linuxをベースに開発されており、使い勝手がよく豊富なパッケージが提供されています。
 

Redhat系LinuxのCentOS
CentOS6の場合は、Grubのバージョンと/bootの設定ファイルのバージョンが一致しているので、ブート開始までは動作しますが、ブートが始まるとすぐに、停止して応答が無くなってしまいます。 これは、VirutalBoxにはハイパーバイザ・コンソール(HVC)用のポートが無いために、停止状態に陥ってしまいます。

この対策として、Grubのconsoleの設定を削除するか、または、出力先をシリアルポートへ変更します。Ubuntuの時と同様に、CentOS6を最小インストールしておき、SoftLayerからダウンロードしてきたVHDファイルをセカンド・ディスクとしてアタッチしてブートします。そして、セカンド・ディスクをマウントして、/boot/grub/にある設定ファイルを変更します。

セカンド・ディスクのVHDファイルを/mntにマウントする
 
```
# mount -t ext4 /dev/sdb1 /mnt
```

マウントしたディスクの中の/mnt/boot/grub/menu.lst ファイルの該当部分を抜き出したのが、以下のコードです。この中の下線部を削除、または、変更します。

```
title CentOS (2.6.32-504.16.2.el6.x86_64)
root (hd0,0)
kernel /vmlinuz-2.6.32-504.16.2.el6.x86_64 ro root=UUID=bde61588-9ce9-4324-a70a-5a16bc0e7dc8 console=hvc0 crashkernel=auto SYSFONT=latarcyrheb-sun16 LANG=en_US.UTF-8 KEYTABLE=us
initrd /initramfs-2.6.32-504.16.2.el6.x86_64.img
```

以下の例は、コンソールをシリアル・ポートへアサインする例です。VirutalBox側の設定は、シリアル・ポートを有効化しておく必要がありますが、ポート・モードを「切断」としておいても問題ない様です。
 
```
kernel /vmlinuz-2.6.32-504.16.2.el6.x86_64 ro root=UUID=bde61588-9ce9-4324-a70a-5a16bc0e7dc8 console=ttyS0 crashkernel=auto SYSFONT=latarcyrheb-sun16 LANG=en_US.UTF-8 KEYTABLE=us
```

削除、または、変更後して再起動すると、ブートが実行され、ログインプロンプトが表示されるようになります。 しかし、この状態では、ネットワーク・インタフェースが稼働していません。ifconfigを実行すると、ループバック・インタフェース以外が表示されないことがわかります。

SoftLayer 上で稼働していたプライベート用eth0、パブリック用eth1を起動するためには、udevで定義されたデバイス名固定化の設定をリセットする必要があります。リセットするには、次のようにファイルを削除して再起動します。
 
```
# rm -f /etc/udev/rules.d/70-persistent-net.rules
# reboot
```

この後は、適切なIPアドレスを与えることで、新たな仮想環境で利用することができるようになります。
 

その他変更箇所
SoftLayer 上の仮想サーバーを他の仮想環境へ移転して、利用していくためには、更なる設定の変更が必要になります。OSレベルで最小必要な変更項目について以下に列挙しておきます。
 

IPアドレス、ネットマスク、デフォルト・ゲートウェイ
DNSサーバーのアドレス
NTPサーバーのアドレス
yum や apt コマンドが利用するLinuxディストリビューションのリポジトリのアドレス
 

参考資料
KnowledgeLayer Export an Image http://knowledgelayer.softlayer.com/procedure/export-image
ubuntu forums HowTo: Revert from grub2 to Legacy Grub http://ubuntuforums.org/showthread.php?t=1298932
ubuntu documentation Xen https://help.ubuntu.com/community/Xen
RHEL6 and Ubuntu 12.04 Xen guest console set up http://wiki.bioinformatics.ucdavis.edu/index.php/RHEL6_and_Ubuntu_12.04_Xen_guest_console_set_up
udev — Linux dynamic device managemen https://www.kernel.org/pub/linux/utils/kernel/hotplug/udev/udev.html
 SOFTLAYER Object Storage のupload / download サンプルツール https://github.com/takara9/os_tools