VirtualBoxの仮想マシンを簡単にOracle Cloud(OCI)へBYOIできた

VirtualBoxの[Changelog](#https://www.virtualbox.org/wiki/Changelog-6.0#v2)で以下の記載を見つけました。
> VirtualBox 6.0.0 (released December 18 2018) 
> ・Implemented **support for exporting a virtual machine to Oracle Cloud Infrastructure**

ということで、どんなもんかやってみました。


# 目次
- [0. やること](#やること)
- [1. 事前準備](#1-事前準備)
    - [Virtual Boxの用意](#virtual-boxの用意)
    - [仮想マシンの作成](#仮想マシンの作成)
    - [oci cliのインストール](#oci-cliのインストール)
- [2. VBox仮想マシンからOCIインスタンス作成](#2-vbox仮想マシンからociインスタンス作成)
    - [APIキーの作成](#apiキーの作成)
    - [OCI Profileの設定](#oci-profileの設定)
    - [イメージのエクスポート](#イメージのエクスポート)
- [3. もろもろ確認](#3-もろもろ確認)
- [4. 参考情報](#4-参考情報)
- [5. その他](#5-その他)

# やること
![VBox2OCI.png](https://qiita-image-store.s3.amazonaws.com/0/109270/2268d24d-5eb9-8c7f-194e-731c8a371cd5.png)

通常、イメージのエクスポートして、オブジェクトストレージアップロードして、それをイメージとしてインポートして、それを使ってインスタンス作成して…とする必要があるところを、**（ほぼ）ワンクリックで仮想マシンからいきなりOCIインスタンス作成してしまおうというお話**。

残課題
・paravirtualizedモードでのBYOIのやり方（今回のワンクリック方式ではまだできない？）
・インスタンスへの接続で失敗（凡ミスなのでやり直せばたぶんすぐできる）
・VBoxコマンドでやるやり方もあるらしいのでやってみたい

※インスタンスへの接続のところで失敗しています。接続の失敗はどちらかというと、用意しておいたOSの設定の問題で、BYOIという観点では完了しているのでとりあえず記事を公開しちゃいます。



# 1 事前準備
- [Virtual Boxの用意](#virtual-boxの用意)
- [仮想マシンの作成](#仮想マシンの作成)
- [oci cliのインストール](#oci-cliのインストール)

## Virtual Boxの用意

### Virtual Boxインストール
v6.0以降で追加された機能なので、6.0以降のバージョンをダウンロード、インストールします。

- ココからダウンロード（実施時点の最新は"6.0.2"でした）
https://www.virtualbox.org/wiki/Downloads

- インストール
（手順省略）

### Extension Packのインストール
件の機能を使うためにExtension Packが必要です（いきなりここではまった）。

- 同じくココからダウンロード（"VirtualBox 6.0.2 Oracle VM VirtualBox Extension Pack"）
https://www.virtualbox.org/wiki/Downloads

- インストール
（手順省略）

## 仮想マシンの作成
適当に仮想マシンを作成します。
今回はこんな感じで。

```
- Name		: VBox
- Tyep		: Linux
- Version	: Oracle(64-bit)
- Memory	: 1024MB
- Disk		: 12.00GB
- Disk Type	: VDI        ★1
- Storage	: 可変サイズ
- Encryption: No
- Network	: Adapter 1 (Host Only Adapter) ★2
```

★1 OCIへのimportではVMDKかQCOW2がサポートされている。VBoxはVMDKで作れますが、いきなりこれで作るとつまらないと思ったので、VDIにしてみました。
> The disk image must be a VMDK or QCOW2 file.

★2 ネットワーク構成は引き継がれないようです。
>  Existing network interfaces will not be recreated. Instead, a single network interface will be created after the import process is complete.

OSはこんな感じ（Oracle Linux 7.6のイメージを使いました）

```
[opc@localhost ~]$ uname -r
3.10.0-957.el7.x86_64 ★3
[opc@localhost ~]$ cat /etc/oracle-release
Oracle Linux Server release 7.6
[opc@localhost ~]$ hostname -A
localhost.localdomain
[opc@localhost ~]$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 08:00:27:d5:b7:81 brd ff:ff:ff:ff:ff:ff
    inet 192.168.56.100/24 brd 192.168.56.255 scope global noprefixroute enp0s3
       valid_lft forever preferred_lft forever
    inet6 fe80::54c2:3013:1eb8:674a/64 scope link noprefixroute
       valid_lft forever preferred_lft forever
[opc@localhost ~]$
[opc@localhost ~]$ lscpu
アーキテクチャ: x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                1
On-line CPU(s) list:   0
コアあたりのスレッド数:1
ソケットあたりのコア数:1
Socket(s):             1
NUMAノード:         1
ベンダーID:        GenuineIntel
CPUファミリー:    6
モデル:             142
Model name:            Intel(R) Core(TM) i5-8350U CPU @ 1.70GHz
ステッピング:    10
CPU MHz:               1896.002
BogoMIPS:              3792.00
ハイパーバイザーベンダー:KVM
仮想化タイプ:    完全仮想化
L1d キャッシュ:   32K
L1i キャッシュ:   32K
L2 キャッシュ:    256K
L3 キャッシュ:    6144K
NUMAノード 0 CPU:   0
Flags:                 fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx rdtscp lm constant_tsc rep_good nopl xtopology nonstop_tsc eagerfpu pni pclmulqdq monitor ssse3 cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt aes xsave avx rdrand hypervisor lahf_lm abm 3dnowprefetch fsgsbase avx2 invpcid rdseed clflushopt flush_l1d
```

★3 Paravirtualized モードでBYOIするには、Linuxカーネル3.4以上でないといけないとのこと
> Linux-based operating systems running the kernel version 3.4 or newer support paravirtualized drivers.

※ちなみにopcユーザーはノリで作ってしまったものです。OCIでインスタンス作る際にも勝手に作られる気もしますが、どうなることやら。念のため、別のユーザーも作っておきました。

```
[root@localhost ~]# id opc
uid=1000(opc) gid=1000(opc) groups=1000(opc)
[root@localhost ~]# id test
uid=1001(test) gid=1001(test) groups=1001(test)
```

## oci cliのインストール
（手順省略）
以下の手順などを参考にしてください。
https://community.oracle.com/docs/DOC-1019624

```
PS C:\Users> oci -v
2.4.41
```

# 2 VBox仮想マシンからOCIインスタンス作成
- [APIキーの作成](#apiキーの作成)
- [OCI Profileの設定](#oci-profileの設定)
- [イメージのエクスポート](#イメージのエクスポート)

ここからの手順は以下のマニュアルに従っています。
https://docs.oracle.com/cd/E97728_01/E97727/html/ovf.html#ovf-export-appliance

## APIキーの作成
（手順省略）
以下のマニュアル通りにやればOKです。
https://docs.cloud.oracle.com/iaas/Content/API/Concepts/apisigningkey.htm#How

## OCI Profileの設定
- Virtual Box > File > Cloud Profile Managerをクリック
- "Add"をクリックして、プロファイルの名前を付ける（ここではOCItest）
    - 既存のoci configを利用する場合は"Import"し、内容に間違いないがないか確認するのみでOK
- "Properties"をクリックして、必要なOCI環境情報を記入し、"Apply"
    - 注意：マニュアルにはリージョンのOCIDと書かれていますが、そんなものはないので、リージョン名で大丈夫です。（eu-frankfurt-1, uk-london-1, us-ashburn-1, us-phoenix-1など）
    - コンパートメントをここで指定させるのは親切ですね。
    - VirtualBoxの"global settings directory"とやらに生成されたoci cliのconfigファイルが生成されます
![20190116_OracleLinux000002.JPG](https://qiita-image-store.s3.amazonaws.com/0/109270/c96433cb-3f30-3e51-4c6d-49fd56e86d9e.jpeg)
- 生成されたoci cliのconfigを、ociのconfigディレクトリにコピー（もしくは既存のconfigファイルに内容を追記）
    - 私の場合"global settings directory"は"C:\Users\\<ユーザー名>\\.VirtualBox"でした。

## イメージのエクスポート
- Virtual Box > File > Export Appliance...をクリック
- エクスポートしたい仮想マシンを選択
- Formatで「Oracle Cloud Infrastructure」を選択
- Accountで先ほど設定したプロファイルを指定し、"Export"
    - 設定した情報が間違えているとここでエラーがでます
    - 「テスト」的なボタンがないので、修正後は一度戻ってExport Applianceの選択からやり直す
    - "Virtual System Settings"からOCIでの設定内容が確認できる
        - シェイプやVCN、サブネット、ADなどはダブルクリックで選択できます
            - ここで選択したサブネットからIPが取得されます。
            - 当たり前ですが、private subnetを選択しつつ、「Assign Public IP」にチェックを入れると失敗します。
        - "test_bucket"、"VCN1"、"pub_subnet2"などは私が事前に作成していたリソースの名前
        - ![20190116_OracleLinux000003.JPG](https://qiita-image-store.s3.amazonaws.com/0/109270/9f621def-4ea3-3c93-d0b8-1f0f69a0db05.jpeg)

        - "Export"を押したら一度"Empty disk image"というエラーが出ましたが、もう一度押したらいけました。
        - このサイズ感でだいたい10分くらいかかりました。（東京->Phoenix インターネット）
 
- 完了すると、対象のインスタンスがOCIで起動しています！
    - "Launch an instance"にチェックを入れた場合
    - ![20190116_OracleLinux000012.JPG](https://qiita-image-store.s3.amazonaws.com/0/109270/3e98f2dd-4279-4c94-4e38-c888f5fc6e99.jpeg)

# 3 もろもろ確認

## オブジェクトストレージのバケット確認
まずいったん経由したはずのオブジェクトストレージをみる
![20190116_OracleLinux000001.JPG](https://qiita-image-store.s3.amazonaws.com/0/109270/1d838886-8c4f-91cd-af04-25a3910a61ea.jpeg)
- サイズは737MBとだいぶ圧縮されてい
- opc-multipart-md5があるので、マルチパートでアップロードされたっぽい

## カスタムイメージの確認
次に、作成されたカスタムイメージを確認
![20190116_OracleLinux000000.JPG](https://qiita-image-store.s3.amazonaws.com/0/109270/87e90aff-7dfc-4554-833d-423250aad66c.jpeg)
- EMULATEDモードになってる
    - paravirutalizedモードにしたかったのだが、どうすればできるのか要調査

## インスタンス確認
![20190116_OracleLinux000002.JPG](https://qiita-image-store.s3.amazonaws.com/0/109270/7775483b-81bc-bd23-5e93-d06e36472976.jpeg)
- 概ね想定通り。（EMULATEDモードになってしまったのは残念）
    - Private IPは自分で指定したサブネットの中から、勝手に割当て
    - Fault Domainは指定できなかった

## インスタンスへ接続
![20190116_OracleLinux000003.JPG](https://qiita-image-store.s3.amazonaws.com/0/109270/dc903147-33b6-b7db-3e86-864ffb47506b.jpeg)
で、出来ない…。
シリアルコンソールでの接続も失敗
よく考えたら、もともとのOSのSSH設定してないな…。
というわけで出直してきます。時間があれば。


# 4 参考情報
- Oracle VirtualBoxのマニュアル
	- https://docs.oracle.com/cd/E97728_01/E97727/html/ovf.html#ovf-export-oci
- OCIのマニュアル
	- https://docs.cloud.oracle.com/iaas/Content/Compute/References/customimagesparavirtualizedmode.htm

# 5 その他
- 従来（というか普通）の手順
    - 1. 仮想マシンのイメージをVMDKかQCOW2の形式でエクスポート
    - 2. Object Storageへアップロード
    - 3. イメージのインポート
    - 4. イメージを利用してインスタンス作成
 
- アイコンはこちらからお借りしました
	- PCのアイコンは「さくらのアイコンセット」より
		- https://knowledge.sakura.ad.jp/4724/
	- Virtual Boxのアイコンは「ICONFINDER」より
		- https://www.iconfinder.com/search/?q=virtualbox
	- OCIのアイコンは「Graphics for Topologies and Diagrams」より
		- https://docs.cloud.oracle.com/iaas/Content/General/Reference/graphicsfordiagrams.htm