VirtualBox の Oracle Linux 5.7 イメージを Oracle Compute Cloud で動くようにする方法

# はじめに

Oracle Compute Cloudでは、Oracleが提供しているマシン・イメージや、[マーケットプレース](https://cloud.oracle.com/marketplace/ja_JP/homePage) からダウンロードできるマシン・イメージの他にも、raw形式の仮想マシンイメージであればカスタム・イメージとして登録することができます。なので、理論的には既にオンプレミスで稼働しているサーバーや、他のハイパーバイザーやクラウドサービスで稼働している仮想マシンであっても、raw形式のマシンイメージに変換すれば、Compute Cloud上でインスタンスとして動かすことができるはずです。

とはいえ、ただ単にLinuxサーバーをマシンイメージに変換しただけでは起動しない場合があります。特にOracle Compute Cloudは、ハイパーバイザーにXenベースのOracle VMを利用していますので、Xenのドライバーを正しく組み込んでおかないと、イメージを持ち込めてもインスタンス起動時に、カーネルパニックでブートしてこない、ということになります。

そこで、このドキュメントでは、LinuxをOracle Compute Cloudで動くようにするための手順についてまとめています。作業は Windows PC と Oracle Virtualbox を使用し手動で行いますが、最初にベースとなるVirtualBoxイメージを作成する部分については、新規VDIイメージを作成して Oracle Linux 5.7 をインストールするところから始めています。

もし、既に稼働中のLinuxマシンを変換して Oracle Cloud に持っていく方法を探している、ということであれば、このドキュメントの作業に入る前に、そのLinuxサーバーをVirtualBoxで稼働するVDIイメージに変換してから、ここの手順を実施してみてください。イメージをVirtualboxで動くように変換する方法については、検索すると様々な先人の方がトライしているので、検索すると色々と方法が見つかると思います。

Oracle社のWebページには、[Oracle Linux 6.7 をベースにしたカスタム・イメージを作成するチュートリアル](http://www.oracle.com/webfolder/technetwork/tutorials/obe/cloud/compute-iaas/creating_a_custom_ol_machine_image/creating_a_custom_ol_machine_image.html) が公開されているのですが、Oracle Linux 5 ではいくつか追加作業が必要だったので、それらの手順を追記して作成しています。元のチュートリアルにはもう少し詳しい画面ショットなどが掲載されていますので、そちらも合わせてご覧ください。


# 必要なもの

- Windows PC (ドキュメント作成にはWindows 7を使用)
  - ディスク空き領域が約10GB必要
  - イメージ作成にはできればSSDのドライブがあるといいです

- Oracle Cloud VirtualBox (Extention Packはどちらでも可、今回は使用しない)
  - ドキュメント作成時は4.3.28を使用、v5以降でもOKと思われます
  - https://www.virtualbox.org/wiki/Downloads

- 作成するバージョンの Oracle Linux のインストールメディア
  - 今回の手順作成時は Oracle Linux 5.7 を使用、おそらく Oracle Linux 5.x 全般に利用できると思います
  - https://edelivery.oracle.com


# 手順

## 1. 仮想マシンの作成

#### 1. VirtualBoxを開始

#### 2. 「新規」ボタンを押す

#### 3. ウィザードに従って、以下の内容で仮想マシンを作成する
    - 名前 : OL57_4GB ※任意
    - タイプ : Linux
    - バージョン : Oracle (64 bit)
    - メモリーサイズ : 512GB
    - ハードドライブ : 仮想ハードドライブを作成する
    - ハードドライブのファイルタイプ : VDI(VirtualBox Disk Image)
    - 物理ハードドライブにあるストレージ : 可変サイズ
    - ファイルの場所とサイズ : 名前はそのまま、サイズは4.00GB

#### 4. 作成した仮想マシンを起動する

#### 5. 起動イメージとして、ダウンロード済のOracle Linux 5.xのインストールメディアを選択して起動する
    - Oracle Linux 5.7 の場合は、「OracleLinux-R5-U7-Server-x86_64-dvd.iso」

#### 6. ウィザードに従って Oracle Linux をインストールする
    - 言語       : Japanese
    - キーボード : 日本語
    - ストレージ : 基本ストレージデバイス
    - ストレージデバイスの警告 : 「はい・・・」を選択
    - ホスト名   : そのまま(localhost.localdomain)
    - タイムゾーン : アジア/東京
    - rootパスワード : 任意
    - どのタイプの・・・? : 「すべての領域を使用する」を選択
    - インストールタイプ : Basic Server -> 「今すぐカスタマイズ」を選択

#### 7. 任意のインストールパッケージを選択(今回は最小構成として以下のみにチェックをつけてインストール)
    - ベースシステム -> ベース
    - 言語 -> 日本語のサポート

#### 8. 5分くらい? 待つ、マシンとディスクの性能次第

#### 9. 「おめでとうございます」と表示されたら、再起動ボタンを押す

#### 10. 再起動後の設定は不要、Exitする


## 2. Linuxの各種インストール後作業

###### 1. rootでログイン

###### 2. Oracle Public Yum のレポジトリを登録

```
cd /etc/yum.repos.d
wget http://yum.oracle.com/public-yum-el5.repo
yum repolist
```

###### 3. SE Linux を停止
    - /etc/selinux/config を編集して SELINUX=disabled に設定

###### 4. Yumの自動アップデートを停止
```
chkconfig yum-updatesd off
service yum-updatesd stop
```

###### 5. ファイアウォールの停止を確認
```
chkconfig iptables off
service iptables stop
```

###### 6. ネットワークマネージャーの停止を確認
```
chkconfig NetworkManager off
service NetworkManager stop
```


## 3. カーネルのアップデート

Oracle Compute CloudでLinuxイメージを起動するには、PVHVMドライバの組み込みが必要です。これらのドライバ(xen_blkfront, xen_netfront)は、カーネル・バージョン2.6.36以降に含まれています。
Oracle Linux 5.7のイメージに含まれるカーネルは2.6.32のため、2.6.36以降のものにアップグレードする必要があります。

###### 1. Yumからカーネルアップグレードを実施

```
uname -r
yum check-update kernel*
yum update kernel*
rpm -qa | grep kernel
```

###### 2. 再起動

```
shutdown -r now
```

###### 3. カーネルのアップデートを確認

```
uname -r
```

###### 4. 古いカーネルを削除(オプション)

```
yum remove kernel-uek-2.6.32-200.13.1.el5uek
```

## 4. OPCユーザーの追加

Oracle Cloudで提供しているイメージに合わせて、opcユーザーを初期アクセス用に作成します。
また、sudoersを変更し、opcユーザーにrootになれる権限を与えます。

###### 1. ユーザー作成

```
useradd opc --password We1come#

visudo -f /etc/sudoers
 
## Same thing without a password
# %wheel    ALL=(ALL)       NOPASSWD: ALL
%opc   ALL=(ALL)       NOPASSWD: ALL   <=この行を追加
```

###### 2. sshキーをopcユーザーに登録

opc-init スクリプトをrcに組み込んだ場合には、この手順は不要です。Compute Cloudでインスタンスを作成時に、任意のssh公開鍵をインスタンスに組み込むことができます。
Oracle Linux 5.x ではopc-initスクリプトが動作しないため、Compute Cloudインスタンス起動後の初回アクセス用にopcユーザーに公開鍵を組み込みます。

```
mkdir /home/opc/.ssh
chown opc:opc /home/opc/.ssh
chmod 700 /home/opc/.ssh

cd /home/opc/.ssh
wget <公開鍵の置き場>
chown opc:opc ./authorized_keys
chmod 600 ./authorized_keys
```

## 5. カーネルにCompute Cloudのブートログ閲覧機能のためのターミナル設定を追加(オプション)

この処理を行うと、Compute Cloud サービスコンソールやREST APIで、ブートログを閲覧することができるようになります。
必須ではありませんが、なにかの手順違いなどでインスタンスがブートしてこない場合の問題切り分けに便利なので、実施しておくことをおすすめします。

###### 1. /etc/grub.confを編集

各kernelのエントリー行の最後に console=ttyS0 を追記する


## 6. ネットワーク関連の設定

###### 1. ネットワークインターフェースの情報を設定(eth0~7)

- /etc/sysconfig/network-scripts/ifcfg-eth0 を編集して以下のようににする

```:/etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
TYPE=Ethernet
ONBOOT=yes
BOOTPROTO=dhcp
PERSISTENT_DHCLIENT=1
```

- ifcfg-eth0 をコピーして ifcfg-eth1 ~ ifcfg-eth7 まで作る

- ifcfg-eth1 ~ ifcfg-eth7 までを編集して、DEVICEを eth0 から eth1~7 までそれぞれ変える

- /etc/sysconfig/network を編集して以下のようにする

```:/etc/sysconfig/network-scripts/ifcfg-eth0
NETWORKING=yes
HOSTNAME=localhost.localdomain
IPV6_AUTOCONF=no
NOZEROCONF=yes
```

## 7. カーネルがXenのドライバをロードするように設定する

Oracle Compute CloudはハイパーバイザーにXenベースのOracle VMを使用しています。Xenのドライバーをカーネルが正しくロードすることで、PVHVM

```
cp -p /boot/initrd-$(uname -r).img /boot/initrd-$(uname -r).img.bak
mkinitrd -v -f --with="xen-blkfront" --with="xen-netfront" "initrd-$(uname -r).img" $(uname -r)
```

(参考Doc)
http://docs.oracle.com/cd/E64076_01/E64077/html/vmrns-bugs-3.4.1-virtualbox-export-ol7-does-not-start.html
https://wiki.centos.org/TipsAndTricks/CreateNewInitrd


## 8. VDIのコンパクト化 (オプション)

この処理は必須ではありません。
イメージをアップロードする前に、コンパクトにしてアップロードの際のサイズを縮小します。

```
yum clean all
dd if=/dev/zero of=/zerofile; rm -f /zerofile
```

VMを停止してからホストOS上でコマンドプロンプトから以下を実行します

```bat
"C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" modifyvdi "D:\Virtual Machines\OL57_4GB\OL57_4GB.vdi" compact
```


## 9. 仮想マシンのディスクをイメージに変換する

Oracle Compute Cloud が扱うことができる仮想マシンイメージ形式(raw)に変換します。今回はVirtualBoxに付属するコマンドラインツール(VBoxManage)を使用して変換します。
その他にも、任意のイメージ変換ツールが使用できます。おそらく qemu-img などが一般的に使われると思いますので、好きなものをお使いください。

###### 1. 仮想マシンを停止する

```
shutdown -P now
```

###### 2. VBoxManageコマンドで変換する

ホストOS上でcmdから以下を実行

```bat
"C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" internalcommands converttoraw "D:\Virtual Machines\OL57_4GB\OL57_4GB.vdi" "D:\Virtual Machines\OL57_4GB\OL57_4GB.img"
```


## 10. 仮想マシンのイメージを圧縮する

作成したOL57_4GB.imgを、tar.gz形式にします。
任意のツールをお使いください。今回のドキュメント作成時には、7zipを利用しました。
7zipを利用する場合は、一度に tar.gz 形式に変換することはできないようなので、 1回目->tar、2回目->gzip と処理を分けるとうまくいくようです。


## 11. イメージをアップロード

Compute Cloud のGUIから、作成した OL57_4GB.tar.gz イメージをOracle Storage Cloudにアップロードします。
手順はこちらを参考に実施してください。

Oracle Compute Cloud Service (IaaS)の使用 - Oracle Storage Cloud Serviceへのマシン・イメージ・ファイルのアップロード
https://docs.oracle.com/cd/E60665_01/stcomputecs/STCSG/GUID-799D6F6D-BDED-4DDE-9B3D-BE23BE5F687F.htm


## 12. イメージを関連付け

アップロードしたイメージを関連付けして、 Compute Cloudから扱えるようにします。関連付けされたイメージは、プライベート・マシン・イメージとして登録されます。
手順はこちらを参考に実施してください。

Oracle Compute Cloud Service (IaaS)の使用 - Oracle Compute Cloud Serviceへのマシン・イメージ・ファイルの登録
https://docs.oracle.com/cd/E60665_01/stcomputecs/STCSG/GUID-B41A8B96-7A71-42D6-8C6B-C6DB9D321F77.htm


## 13. イメージを使用してインスタンスを作成

登録したマシン・イメージを利用して、インスタンスを作成します。
手順はこちらを参考に実施してください。

Oracle Compute Cloud Service (IaaS)の使用 - プライベート・マシン・イメージを使用したインスタンスの作成
https://docs.oracle.com/cd/E60665_01/stcomputecs/STCSG/GUID-2EA46F1D-B67B-4264-97C8-C158602A8E55.htm


# Known Issues

## opc-initには非対応

残念ながら、この手順は opc-init の組み込みには対応していません。

### opc-initって? ###

opc-init は、Oracle Technology Network(OTN)からダウンロードできる、インスタンスブート時に実行されるrcスクリプトです。
このスクリプトには、Oracle Cloud に登録してあるSSH公開鍵を組み込んだり、指定したインスタンス・シェイプのメモリサイズに合わせてOS側のスワップ領域を設定してくれたり、ホスト名を任意のものに変えたりといった、Compute Cloudと組み合わせて使う場合に便利な処理が予め組み込まれています。Oracle Compute Cloud のカスタムイメージを作成するときには、こちらを組み込むことが推奨されています。

ただ、このopc-initはpython2.6以上が必要になるため、Oracle Linux 5.x などに組み込まれているpython2.4では動作しないため、今回の手順では組み込んでいません。

opc-initスクリプトを組み込まないことによって予想される影響としては、以下のようなものが考えられます。

- Compute Cloudからインスタンスを作成するときにSSH公開鍵を個別に組み込むことができない、予めイメージに公開鍵を組み込んでおく必要がある
- Compute Cloudでインスタンス作成時にシェイプを大きくした場合は、その後処理(スワップ領域の拡張など)をOS内で手動で行う必要がある
- Compute Cloudでホスト名を指定した場合にも変更が反映されない、手動で変更する必要がある


[参考] Oracle Compute Cloud Service (IaaS)の使用 - opc-initを使用したインスタンスの構成の自動化
https://docs.oracle.com/cd/E60665_01/stcomputecs/STCSG/GUID-C63680F1-1D97-4984-AB02-285B17278CC5.htm

[参考] opc-init のダウンロード
http://www.oracle.com/technetwork/topics/cloud/downloads/opc-init-3096035.html


# 参考ドキュメント

Building a Custom Linux 6.7 Image with the LAMP Stack
http://www.oracle.com/webfolder/technetwork/tutorials/obe/cloud/compute-iaas/creating_a_custom_ol_machine_image/creating_a_custom_ol_machine_image.html

Building Your Own Machine Images
http://docs.oracle.com/cloud/latest/stcomputecs/STCSG/GUID-3438E5A1-D00A-4A01-B6BB-46D871334801.htm#STCSG-GUID-3438E5A1-D00A-4A01-B6BB-46D871334801

(日本語)独自のマシン・イメージの構築
https://docs.oracle.com/cd/E60665_01/stcomputecs/STCSG/GUID-3438E5A1-D00A-4A01-B6BB-46D871334801.htm#GUID-3438E5A1-D00A-4A01-B6BB-46D871334801

Uploading Image Files to Oracle Storage Cloud Service
http://docs.oracle.com/cloud/latest/stcomputecs/STCSG/GUID-799D6F6D-BDED-4DDE-9B3D-BE23BE5F687F.htm#STCSG-GUID-799D6F6D-BDED-4DDE-9B3D-BE23BE5F687F

(日本語) Oracle Storage Cloud Serviceへのマシン・イメージ・ファイルのアップロード
https://docs.oracle.com/cd/E60665_01/stcomputecs/STCSG/GUID-799D6F6D-BDED-4DDE-9B3D-BE23BE5F687F.htm