7.2 他仮想環境VMをSoftLayerへ移転するには？

（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の仮想環境へ移行する方法をご紹介します。

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

ここではVirutalBoxを例にしますが、ここに紹介する移行方法は、他社パブリッククラウド、VMware、XenServer、Hyper-Vなどにも応用できると思います。
 

SoftLayer上で動作可能な仮想サーバーの条件
SoftLayerにインポートできるOSは、RedHat/CentOS 6.x、Ubuntu 10.04,12.04,14.05、Microsoft Server Standard です。 最新の情報は KnowledgeLayer Import an Image http://knowledgelayer.softlayer.com/procedure/import-image にあります。

しかし、これらのOSであれば、インポートして、何事も無く動作するかと言えば、残念ながらノーです。これらについて KnowledgeLayer から提供される情報も無く、実際にやってみて断念する場合が多いので、実際に検証をおこない条件を確認しました。以下に検証結果によって判った実際を記述します。

ブートローダーは、Grub2 を利用できません、レガシー Grub である必要があります。Ubuntu 12.04 以降では Grub2 が導入されます。このため Ubuntu をSoftLayerへ移転する場合は、Grub2 からレガシー Grub に変更しなければなりません。RedHat/CentOS 6.xは,レガシー Grub が導入されるため問題はありません。

wget コマンドが導入されている必要があります。プロビジョニングのプロセスの中で、wgetコマンドを利用するためです。 RedHat/CentOS 6.x の最小インストールでは、wget が導入されていないので、個別にインストールする必要があります。

ハイパーバイザ・コンソール(hvc0)のデバイスが定義されている必要があります。Grubの定義ファイルとgettyの起動設定が必要です。 gettyの起動設定は、RedHat/CentOS 6.x と Ubuntuで異なるので、それぞれ設定します。 VirtualBox の環境で、Grubの定義ファイルに hvc0 を設定すると、カーネルが起動中に止まってしまう現象が発生するので、後述する方法で対処します。

Xen 対応のディスク・ドライバおよびネットワーク・デバイス・ドライバーは、イメージ・テンプレートとしてインポートする際に、自動的にインストールされ設定されます。

インポートする仮想ディスクは、プライマリ・パーティションとして、「/boot」、「/」が作成されている必要があります。 VirutalBox上でLinuxをインストールする際に、LVM（ロジカル・ボリューム・マネージャー）の論理ボリューム上にファイル・システムを作成するのではなく、プライマリ・パーティション上にext4でファイル・システムを作成しなければなりません。 RedHat/CentOS v6.x のインストーラーは、メモリが1024MB 未満の場合はCUIのインストーラーが起動しますが、このCUIではLVM以外を選択できません。この問題を回避するために、メモリに1024MB以上を割当て、GUIのインストーラーが起動するようにしましょう。
 

仮想環境でのOSイメージの作成
VirutalBoxに、仮想サーバーを設定して、CentOS 6.x,Ubuntu14.04をインストールして、その仮想サーバーをSoftLayer上に移行します。

このVirtualBoxの仮想サーバーの設定例を以下に示します。

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

VirutalBoxは、VDI,VMDK,VHD,QCOWなど複数の仮想ハードディスクのフォーマットを選択することができます。ここではSoftLayerへ移行することを前提にしているので、最初からVHDを選択します。 これら仮想ハードディスクの変換ツールは複数ありますから、インターネットでサーチしてみると良いでしょう。

VHDの作成に際して、可変サイズを選択して、ファイルサイズは25.0GBにします。25.0GB以下のサイズを設定してもインポートはできますが、使えない領域になるので、SoftLayerの仮想サーバーの第一ディスクの最小サイズ 25.0GB に合わせておきます。

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

 

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

Grub2の設定ファイルをバックアップして、空のgrubをディレクトリを作成します。

```
# mv /boot/grub /boot/grub_backup
# mkdir /boot/grub
```

Grub2 をアンインストールします。
 
```
# apt-get --purge remove grub-pc grub-common
```

レガシー Grub をインストールします。
 
```
# apt-get install grub
```

Grub の menu.lst を再作成します

```
# update-grub
```

ブートセクターに、ブートローダー grub を書込みます。
 
```
# grub-install /dev/sda
```

次に/boot/grub/menu.lstに、ハイパーバイザ・コンソールの設定としてconsole=hvc0を 下線部分に追加します。 この設定を実施すると、VirutalBoxで起動できなくなるので、次の例のように、recovery mode 側には設定しないでおき、SoftLayer上に移行した後に追加します。
 
```
titleUbuntu 14.04.2 LTS, kernel 3.16.0-30-generic
    uuid8f4369ed-9694-473d-9a5c-e2efc124ea39
    kernel/boot/vmlinuz-3.16.0-30-generic root=UUID=8f4369ed-9694-473d-9a5c-e2efc124ea39 ro console=hvc0 quiet splash
    initrd/boot/initrd.img-3.16.0-30-generic

titleUbuntu 14.04.2 LTS, kernel 3.16.0-30-generic (recovery mode)
    uuid8f4369ed-9694-473d-9a5c-e2efc124ea39
    kernel/boot/vmlinuz-3.16.0-30-generic root=UUID=8f4369ed-9694-473d-9a5c-e2efc124ea39 ro  single
    initrd/boot/initrd.img-3.16.0-30-generic
```

ハイパーバイザ・コンソールのデバイスに、Loginプロンプトが出力されるように、以下の/etc/init/hwc0.conf のファイルを作成します。
 
```
# hvc0 - getty
#
# This service maintains a getty on hvc0 from the point the system is
# started until it is shut down again.

 start on stopped rc RUNLEVEL=[2345] and (
            not-container or
            container CONTAINER=lxc or
            container CONTAINER=lxc-libvirt)

 stop on runlevel [!2345]

 respawn
exec /sbin/getty -8 38400 hvc0
```

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

CentOS 6.xの場合は、レガシーGrubが利用されているので、Ubuntuの場合のようなGrubの置き換えは必要ありません。

ディスクに「/boot」と「/」のプライマリ・パーティションを作成して、インストールするためには、GUIのインストーラーを起動する必要があります。メモリサイズ 1024MB 以上を割当てれば、GUIのインストーラーが自動的に起動します。

SoftLayerのプロビジョニング・プロセスでwgetコマンドが必要なので、インストールしておきます。
 
```
# yum install wget
```

/boot/grub/menu.lstにhvc0を追加します。こちらもUbuntu同様にリカバリーモード側は移行後に登録します。
 
```
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=d6fe11ce-d08c-4dea-8e90-06ab1690f4c5 console=hvc0 LANG=en_US.UTF-8 SYSFONT=latarcyrheb-sun16 crashkernel=auto KEYTABLE=us 
        initrd /initramfs-2.6.32-504.16.2.el6.x86_64.img
title CentOS 6 (2.6.32-504.el6.x86_64)
        root (hd0,0)
        kernel /vmlinuz-2.6.32-504.el6.x86_64 ro root=UUID=d6fe11ce-d08c-4dea-8e90-06ab1690f4c5 rd_NO_LUKS LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_LVM rd_NO_DM rhgb quiet
        initrd /initramfs-2.6.32-504.el6.x86_64.img
```

ハイパーバイザ・コンソールのポートにgettyを待機する設定は必要ありません。 CentOS 6.xでは、/etc/init/serial.confが最初から設定されているため、menu.lstへの追加だけで、hvc0にgettyが起動します。
 

オブジェクト・ストレージへのアップロード
SoftLayerで、ブート可能なOSイメージが完成したら、オブジェクト・ストレージにアップロードしていきます。このアップロードに先立って、オブジェクト・ストレージのユーザーIDとパスワードが必要なので、事前に取得しておく必要があります。オブジェクト・ストレージのユーザーを取得するには、Storage -> Object Storage -> Order Object Storage に進んでオーダーできます。

オブジェクト・ストレージからイメージ・テンプレートにインポートできるファイル名の規則がありますので、登録先のオブジェクト名は、「ファイル名.vhd-0.vhd」に準じるようにお願いします。 もしこの規則に従っていない場合、イメージ・テンプレートのインポート画面で、オブジェクトの選択リストに表示されません。

オブジェクト・ストレージの一つのオブジェクトの最大サイズ 5Gバイト までという制限があります。 今回はVirtualBox上で、この検証用に新規インストールしたOSイメージを移行するので、サイズは 5Gバイト以下ですから、sftp や CloudBerry を利用しても問題ありませんが、実用システムのOSイメージの場合には、ミドルウェアや一部のデータが含まれる場合があり、5Gバイトを超えるラージ・ファイルへの対策が必要です。 この対策には、OpenStack Swift の swift コマンドを利用することができます。 しかし、swift コマンドは、インストールが少々面倒なので、判り易い簡単な Python のコードをご紹介します。 このアップロード用Python のスクリプトは、GitHubのhttps://github.com/takara9/os_tools/blob/master/os_upload.pyにあります。

この os_upload.py は、オブジェクト・ストレージのラージ・ファイル対応機能を利用するものです。最初に動的ラージ・ファイル用のマニフェスト・オブジェクトを登録します。 ここではマニフェスト・オブジェクトの名前が「ファイル名.vhd-0.vhd」となります。 そして、この実態のチャンクされたオブジェクトの最初のパートの名前は、「ファイル名.vhd-0.vhd/chunk-0001」となり、最後の4桁の数字はチャンクの通し番号になります。

インポートの場合は、マニフェスト・オブジェクトの名前の「ファイル名.vhd-0.vhd」だけが、選択リストに表示され、オブジェクトの実態が分割されていることを意識させません。 また確認の理由でダウンロードする場合も、マニフェスト・オブジェクトを指定してダウンロードすれば、チャンクが統合された一本のファイルとして送られてきます。

このツールを使った実行例を以下に挙げます。このプログラムの引数は、送信元ローカルファイル名 、宛先コンテナ名、宛先オブジェクト名の順に並んでいます。
 
```
$ ./os_upload.py test17-2.vhd VHD test17.vhd-0.vhd
input file size = 4354803712
sending...  0.0 %
sending...  4.8 %
sending...  9.6 %
<-- 中略 -->
sending...  91.5 %
sending...  96.3 %
```

ここまでで、オブジェクト・ストレージにVHD形式の仮想ディスク・ファイルをアップロードするまでが、完了しました。

インポートと仮想サーバーに起動
アップロードした仮想ディスクのファイルをインポートするには、Devices -> Manage -> Images -> Import Image と進み、オブジェクト・ストレージ上のVHD形式データをイメージ・テンプレートに変換します。

イメージ・テンプレートができ上がれば、Devices -> Manage -> Images -> Template Name -> Actions -> Create Hourly Virtual Server として、仮想サーバーを起動するだけです。

これまでご紹介してきた仮想ディスク内の設定内容に不備がある場合、Device List の Device Name の時計マークが表示された状態で止まってしまいます。 このような状態になると Action ボタンも表示されないので、キャンセルすることもできません。 このまま放置しておくと、Ticketに「ブートできないので開発チームへキャンセルするように伝えました。」といった主旨メッセージが入ります。その後、開発チームのいる北米中部時間のビジネス時間帯になると、起動中で止まったインスタンスが削除されます。

イメージ・テンプレートからのOSの起動プロセスが成功すると、rootのパスワードが再設定され、Xenのディスク・ドライバとネットワーク・デバイス・ドライバーがインストールされ、パブリックとプライベートのIPアドレスが設定された状態で起動します。
 

参考資料
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