Ubuntu 18.04(on VirtualBox) ホストOSからの通信

やりたいこと：ローカルにVMでLinux環境を作ってテストサーバとか動かしたい。

最初はDockerで構築しようと思ったけど、Windows10 HomeのPCなのでDocker Toolboxじゃないと構築できないし、じゃあWSL環境でネイティブのDockerが動くと評判なので入れてみたら、WSLはdocker-composeがまだ(2018年10月時点)ネットワーク周りの設定が動かない。

というわけで結局、VirtualBoxにUbuntuを入れた話。

- ホスト: Windows10 Home
	- VirtualBox 5.2.18
- ゲスト: Ubuntu 18.04

ホストOSとの通信やネットワークの設定で少しハマったので手順を残しておきます。

# VirtualBoxのインストール

これは普通に。

# ゲストOSのインストール

これも普通に。
今回はUbuntu 18.04をインストール
イメージはこの辺 http://releases.ubuntu.com/18.04/ubuntu-18.04.1-live-server-amd64.iso

この時点でVMのUbuntuからのインターネット接続はVirtualBoxがよしなにしてくれてるので問題ないはず。
ただ、ホストOSであるWindowsからゲストOSのUbuntuへは接続するネットワークの経路がないため通信できない。

# ホストOSからゲストOSへの通信

VirtualBoxを入れたホストのWindows10から、ゲストのUbuntuへ接続するための(個人的に)一番単純な方法は「ホストオンリーアダプター」を使った構成。

(TODO:接続のイメージ図)

## (ホストOS)ネットワークの作成

インストール時になんか設定が足りなかったのか、いろいろググって出てきた手順がうまくいかなかったので、手動で作成。

まず[グローバルツール]を表示

![2018-11-03_20h06_42.png](https://qiita-image-store.s3.amazonaws.com/0/256859/01b63bff-5f93-5ee7-68da-dd2870adc7c8.png)

[作成]する

![2018-11-03_20h10_19.png](https://qiita-image-store.s3.amazonaws.com/0/256859/0a1eeb8b-10b1-8eb5-4409-963fec17574f.png)

ホストオンリーアダプタが作成される

![2018-11-03_20h42_38.png](https://qiita-image-store.s3.amazonaws.com/0/256859/66eed609-9fd7-455b-e0a5-c1e04cf55f32.png)

この時点で、Windowsのネットワークにも新しく作成されたネットワークアダプタが確認できる

![2018-11-03_20h54_02.png](https://qiita-image-store.s3.amazonaws.com/0/256859/b8124694-fd8c-c8b1-83e8-d80904c25f03.png)

ゲストOSのネットワーク設定を開き、アダプター2にホストオンリーアダプタを追加設定

## (ホストOS)ネットワークのプロパティ

[プロパティ]ボタン押下でネットワークアドレスの設定ができる

![image.png](https://qiita-image-store.s3.amazonaws.com/0/256859/bb0fda8b-24cb-02ee-17f8-6812b2b61d35.png)


「アダプターを手動で設定」で、VirtualBoxで動かすVMの追加ネットワークのネットワークを設定できる。(自動にするとどうなるかは未確認)
把握しやすいアドレス帯を入力しておく。
DHCPは任意。VMをサーバとして動かして静的IPを設定するのであればたぶん不要。クライアント用途で動かす予定があるならonにしておいても良い。

## (VM)NICの追加

VMのネットワーク設定の、「アダプター2」のタブを開く。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/256859/0924e03a-5125-cb05-286f-c7da7472b08d.png)

「ネットワークアダプターを有効化」し、「ホストオンリーアダプター」を割り当てる

![image.png](https://qiita-image-store.s3.amazonaws.com/0/256859/6f51c1c0-cd7e-769d-268e-3550b6d515d8.png)


これでゲストOSにNICが追加される。
そして、ネットワークのプロパティに設定したIPアドレスに合わせてゲストOSのIPアドレスを設定する。

## (ゲストOS)追加したネットワークインタフェースに固定IPを設定

Ubuntu 17.10からネットワークの設定は「Netplan」に変更されている。

- [Ubuntu 17.10 その29 - Netplanの紹介とNetplanの基本 - kledgeb](https://kledgeb.blogspot.com/2017/07/ubuntu-1710-29-netplannetplan.html)
- [【Ubuntu18.04のネットワーク設定方法】Netplanの解説 - komeの備忘録](https://www.komee.org/entry/2018/06/13/170000)
- [networking - How to setup a static IP on Ubuntu 18.04 - server - Ask Ubuntu](https://askubuntu.com/questions/1029531/how-to-setup-a-static-ip-on-ubuntu-18-04-server)
- [Configure Static IP Addresses on Ubuntu 18.04 LTS Server | Website for Students](https://websiteforstudents.com/configure-static-ip-addresses-on-ubuntu-18-04-beta/)
- [Ubuntu Server 18.04 LTSで複数のNIC(ネットワークカード)を使える様にする: 一日一事未満](http://sheepdogjam.cocolog-nifty.com/blog/2018/05/ubuntu-server-1.html)
- [Ubuntu 18.04 LTSで固定IPアドレスを設定する方法【サーバー編】 | Linux Fan](https://linuxfan.info/ubuntu-1804-server-static-ip-address)
- [Ubuntu 18.04 LTSで固定IPアドレスの設定 - Qiita](https://qiita.com/zen3/items/757f96cbe522a9ad397d)

`ip a`または`ifconfig -a`で見える追加されたNIC(`enp0s8`のはず)に対する設定を`/etc/netplan/50-cloud-init.yaml`に追記する。  
静的IPアドレスであればこれだけでOK(`optional`も無くてよい)

```diff
--- /etc/netplan/50-cloud-init.yaml.org 2018-10-24 22:16:36.024000000 +0900
+++ /etc/netplan/50-cloud-init.yaml     2018-10-27 10:54:32.612000000 +0900
@@ -8,4 +8,7 @@
         enp0s3:
             addresses: []
             dhcp4: true
+        enp0s8:
+            addresses: [192.168.244.89/24]
+            optional: true
     version: 2
```

変更後`netplan apply`を実行すれば設定が反映され、ホストOSからこのアドレスに対して通信ができるようになる。


# ホストOS起動時にバックグラウンドで指定VMを起動させる

使いたいときにVirtualBoxのマネージャーを起動してVMを起動するのも面倒なので、タスクスケジューラを使ってWindowsが起動したときにVMもバックグラウンドで動作するようにする。

## タスクスケジューラを起動
![image.png](https://qiita-image-store.s3.amazonaws.com/0/256859/6c3ca534-d390-e20a-62c0-0dc526e5bb0f.png)

実行するコマンドは以下の通り

|プログラム|引数|
|--------|---|
|`"C:\Program Files\Oracle\VirtualBox\VBoxManage.exe"`|`startvm "ubuntu1804_x64" --type headless`|

`ubuntu1804_x64`は起動したいVMの名前

## タスクの作成

「基本タスクの作成」から

![image.png](https://qiita-image-store.s3.amazonaws.com/0/256859/032d4aa4-5f3e-616e-4933-abb686c155b9.png)

タスク名を入力

![image.png](https://qiita-image-store.s3.amazonaws.com/0/256859/c58e009f-0970-17ae-319c-15e5260a06b0.png)

トリガーに「コンピューターの起動時」を選択

![image.png](https://qiita-image-store.s3.amazonaws.com/0/256859/befaf39f-cbc6-32c9-81b5-114c72d4665a.png)


操作

![image.png](https://qiita-image-store.s3.amazonaws.com/0/256859/913af2c9-6fec-84e2-9d78-4c0b3d21c366.png)

プログラムと引数を入力

![image.png](https://qiita-image-store.s3.amazonaws.com/0/256859/d0c91292-b47a-9383-0318-c1feffa71697.png)

これでタスクが作成されるが、起動時に設定するために権限の設定を追加する。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/256859/c6e12f1d-a0a3-6cea-5af7-25c3277c5adc.png)

「ユーザーがログオンしているかどうかにかかわらず実行する」を選択し、「最上位の特権で実行する」はチェック…しなくてもよい

![image.png](https://qiita-image-store.s3.amazonaws.com/0/256859/f6fa503b-fa5f-c2f2-5810-2fb361c0c5ac.png)

これでPC起動時に指定のVMもバックグラウンドで起動する