はじめに
たいてい VirtualBox の VM は自分のデスクトップパソコンとかにセットアップして使っていると思うのですが、出張とかで普段のデスクトップパソコン以外のノートパソコンで VirtualBox の VM を使いたくなると「ああ、このノートパソコンにあの VM 入ってないんだった...」と残念な気持ちになりませんか。
私は、たまに、なります。
なので、ずっと VirtualBox をクラウドに持っておきたい、と思っていて、面倒だから延び延びになっていて、やっとできたので手順をまとめておきます。
前提
- 私は Windows ユーザーなので Windows 環境を前提に書いています。
この記事でできるようになること
以下のようにして Azure 仮想マシンにある VirtualBox VM にアクセスできるようになります。
このとき、Azure 仮想マシンはポート 22 のみ自分だけに公開し、それ以外のポートは閉じたまま使います。
-
作業をはじめるときは、Azure cli で、セットアップ済みの Azure 仮想マシンを起動します(するとその中の VirtualBox VM も自動起動します)
PS> Start-AzVM -ResourceGroupName "testvmGroup" -Name "testVm"
-
少し待ってから Azure 内の VirtualBox VM に接続します
- VirtualBox VM でコンソール作業だけしたい場合は、たとえば WSL や PowerShell の ssh でアクセスします
wsl$ ssh azure-testvm-vm1
- ブラウザも使う場合は以下のようにして ssh 接続し、Chrome の ProxySwithySharp を使ってブラウザのアドレスに 192.168.56.101 を入力します
wsl$ ssh -D 10000 azure-testvm azureuser@testVm:~ $ ssh vmuser@192.168.56.101
- VirtualBox 自体を GUI で起動したい場合、MobaXTerm というターミナルから以下のように実行することで、お使いの Windows 上に Azure 仮想マシンにインストールされている VirtualBox が GUI で起動します。
mobaxterm$ sshd -X azure-testvm azureuser@testVm:~ $ /usr/bin/VirtualBox
- VirtualBox VM でコンソール作業だけしたい場合は、たとえば WSL や PowerShell の ssh でアクセスします
-
作業を終えるときは、Azure cli で deallocate コマンドを実行します。
PS> Stop-AzVM -ResourceGroupName "testGroup" -Name "testVm" -Force
凡例
本記事の中での呼称は以下のようにしています。
- azure に作成する仮想マシンを「azure 仮想マシン」「仮想マシン」と呼びます。
- azure 仮想マシン内の VirtualBox VM を「VirtualBox VM」「VM」と呼びます。
コマンド例も、3環境(PC、仮想マシン、VM)があるため、以下のようにしています。
- PC の PowerShell は PS>、wsl で実行するときは wsl$
- 仮想マシンの cli では azureuser@testVm:~$
- VM の cil では vmuser@192.168.56.101:~$
ローカルPC に Azure CLI をインストールする
詳しくは省略します。以下を参照してセットアップしてください。
Azure に Ubuntu18 をインストールして、VirtualBox を動かす
azure 仮想マシンを作成する
- この手順では、azure 仮想マシンのサイズは Standard D2s v3 で行っています。すべてのサイズで VirtualBox を実行できるわけではなく、またこのサイズでないとできない、というわけでもありません。
- この例では ipv6 は使っていません。
- Azure Portal にログインし、リソースの作成>仮想マシン>作成で「仮想マシンの作成」画面を開きます
- 基本タブ
- サブスクリプション : たとえば testSubscription とか
- リソースグループ : たとえば testvmGroup とか
- 仮想マシン名 : たとえば testVm とか
- 地域 : とりあえず Japan East
- 可用性オプション : 「インフラストラクチャ冗長は必要ありません」
- セキュリティの種類 : Standard
- イメージ : Ubuntu Server 18.04 TLS - Gen2
- Azure スポットインスタンス : チェックオフ
- サイズ : Standard_D2s_v3 - 2 vcpu数、8 GiBのメモリ
- 認証の種類 : SSH 公開キー
- ユーザー名 : デフォルトでは azureuser、この例ではそのまま使うことにします
- SSH 公開キーのソース : 新しいキーの組の生成
- キーの組名 : 仮想マシンのそれとわかる命名にしておくとよいのかも。testVm_key とか
- パブリック受信ポート : 22 を公開したいところですが、いったんここでは「なし」としておきます
- ディスク
- OS ディスクの種類 : Standard SSD
- VM とともに削除 : チェックON
- ホストでの暗号化 : チェック OFF
- 暗号化の種類 : 「プラットフォームマネージドキーを使用した保存時の暗号化」
- Ultra Disk の互換性を有効にする : チェックOFF
- データディスク : VirtualBox の VDI ファイルのサイズにもよりますが、なるべく安く使いたいなら「なし」。16GB くらいまでの VDI ファイルなら、ブート用ディスクだけで使えそうです。
- ネットワーク
- 仮想ネットワーク : たとえば testVmGroup-vnet とか
- サブネット : default(10.1.0.0/24)
- パブリックIP : testVm-ip
- NIC ネットワークセキュリティグループ : 詳細
- NIC ネットワークセキュリティグループの構成 : testVmGroup-nsg とか
- VM が削除されたときにパブリックIPとNIC を削除する : チェックON
- 高速ネットワーク : チェックOFF
- この仮想マシンを仮想の負荷分散ソリューションの後ろに配置しますか? : チェックOFF
- 管理タブは変更なし
- 詳細タブは変更なし
- タグタブは変更なし
- 確認および作成 で「作成」を押します
- 「新しいキーの組の生成」ダイアログボックスが表示されますので、「秘密キーのダウンロードとリソースの生成」を押し、.pem ファイルをダウンロードします。
- 仮想マシンのデプロイがはじまります。おわったら「リソースに移動」ボタンを押して、該当仮想マシンの詳細画面を開きます。
- 「概要」で以下のようにします
- DNS 名 : この仮想マシンがわかる名前をつけるとドメインが割り当てられます。たとえば testvm-iruka4 とすると、testvm-iruka4.japaneast.cloudapp.azure.com というドメインがこのホストにわりあてられます。
- 「ネットワーク」を開き、default-allow-ssh をクリックし、以下のように設定します
- ソース : IP Addresses
- ソースIPアドレス/CIDR範囲 : 自分の現在のグローバルIPアドレス。(IPはv4です)
- 「保存」を押します
- もし default-allow-ssh がなければ、以下のようにして作成します。
- ポート 22
- ソース : IP Addresses
- ソースIPアドレス/CIDR範囲 : 自分の現在のグローバルIPアドレス。(IPはv4です)
- 「保存」を押します
- 「概要」で以下のようにします
- この状態で仮想マシンは起動(課金状態)しています。「停止」ボタンを押し「割り当て解除済み」という状態になると課金はとまります。
azure 仮想マシンに SSH する
以下では WSL から SSH する方法を書いています。
以下のコマンドラインで azure 仮想マシンに接続できることを確認します。
なお、ここで使っている testVm_key.pem は、上述の「秘密キーのダウンロードとリソースの生成」でダウンロードしたファイルです。
wsl$ mkdir ~/.ssh/pem
wsl$ mv testVm_key.pem ~/.ssh/pem
wsl$ chmod 400 ~/.ssh/pem/testVm_key.pem
wsl$ ssh -i ~/.ssh/pem/testVm_key.pem azureuser@testvm-iruka4.japaneast.cloudapp.azure.com
これで接続できたら、 ~/.ssh/config に以下のように設定しておきます。
Host azure-testvm
HostName testvm-iruka4.japaneast.cloudapp.azure.com
User azureuser
Port 22
ForwardX11 yes
ForwardX11Trusted yes
DynamicForward 10000
IdentityFile ~/.ssh/pem/testVm_key.pem
そして以下でも SSH 接続できることを確認します。
wsl$ ssh azure-testvm
azure 仮想マシンをセットアップする
Xserver をインストールする
上記で作成した azure 仮想マシンに SSH でアクセスし、以下のようにして Xserver をインストールします。
wsl$ ssh azure-testvm
azureuser@testVm:~$ sudo apt update
azureuser@testVm:~$ sudo apt-get install xserver-xorg
以下のようにして Xserver が使えるようにしておきます。
azureuser@testVm:~$ sudo vi /etc/ssh/ssh_config
ForwardX11 yes
ForwardX11Trusted yes
azureuser@testVm:~$ sudo systemctl restart sshd
VirtualBox をインストールする
以下のようにしてインストールします。
azureuser@testVm:~$ sudo apt update
azureuser@testVm:~$ sudo apt-get install virtualbox virtualbox-dkms virtualbox-ext-pack
「Configureing virtualbox-ext-pack」という画面が表示されますので「OK」を選択(TABキーで選択できます)してEnterキーを押します。
次に確認ダイアログが表示されますので、これもTABキーで「Yes」としてEnterキーを押します。
azure 仮想マシンで、既存の vdi ファイルをもとに VirtualBox VM を作成する
VM のイメージファイル (.vdi) をローカルPC から仮想マシンに転送する
以下のようにして、ローカルPCにあるvdiファイルを、Azure仮想マシンのホームディレクトリあたりに scp します。
ローカルPC の vdi ファイルはみなさんの環境によって異なると思いますので、以下のコマンドはあくまでサンプルです。
wsl$ scp -p /mnt/c/oracle-vm-direcotry/vm-name-etc/disk.vdi azure-testvm:/home/azureuser/vm1.vdi
VirtualBox で、vdi を使って VM を作成する
以下のコマンドで、上記で転送した vdi を使った VM ができます。
azureuser@testVm:~$ vmname=vm1
azureuser@testVm:~$ vboxmanage createvm -name $vmname -register
azureuser@testVm:~$ mv ~/vm1.vdi "/home/azureuser/VirtualBox VMs/$vmname/vm1.vdi"
azureuser@testVm:~$ vboxmanage modifyvm $vmname --memory 4086
azureuser@testVm:~$ vboxmanage modifyvm $vmname --ostype RedHat_64
azureuser@testVm:~$ vboxmanage modifyvm $vmname --acpi on --ioapic on --cpus 2
azureuser@testVm:~$ vboxmanage modifyvm $vmname --vrde on
azureuser@testVm:~$ vboxmanage storagectl $vmname --name "IDE Controller" --add ide
azureuser@testVm:~$ vboxmanage storageattach $vmname --storagectl "IDE Controller" --port 0 --device 0 --type hdd --medium "/home/azureuser/VirtualBox VMs/$vmname/vm1.vdi"
vm1 という名前の VM が VirtualBox に登録されていることを確認します。
azureuser@testVm:~$ vboxmanage list vms
"vm1" {XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}
作成した VirtualBox VM のネットワーク設定を行う
ネットワークは以下の2つのインターフェースを作成します。
- NAT ネットワーク。VM が外部にアクセスするのに使うネットワークです。IP は 10.0.2.?? あたりになると思いますが、この IP を明示的に使うことはありません。
- ホストオンリーネットワーク。VM へアクセスするためのネットワークです。IP は 192.168.56.101 あたりになります。この IP に対して ssh することで VM にリモートログインできます。
azureuser@testVm:~$ vboxmanage hostonlyif create
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
Interface 'vboxnet0' was successfully created
azureuser@testVm:~$ vboxmanage natnetwork add --netname natnet0 --network natnetwork0 --enable
azureuser@testVm:~$ vboxmanage modifyvm $vmname --nic1 nat --nat-network1 natnetwork0 --nictype1 virtio --cableconnected1 on
azureuser@testVm:~$ vboxmanage modifyvm $vmname --nic2 hostonly --nictype2 virtio --hostonlyadapter2 vboxnet0
これで上述の2つのネットワークが VM に対して作成されました。
ホストオンリーネットワークはこの段階で DHCP になっており、デフォルトで 192.168.56.101 から自動割り当てされるようになっているため、VM が一つだけなら、たいてい 192.168.56.101 が割り当てられています。(本記事では、以下すべて 192.168.56.101 に割り当てられたことを前提に記述していきます)
VM を起動し、ネットワークにアクセスできることを確認する
以下のようにすることで VM が起動します。
azureuser@testVm:~$ vboxmanage startvm $vmname --type headless
Waiting for VM "vm1" to power on...
VM "vm1" has been successfully started.
このようにして azure 仮想マシン内の VirtualBox VM を起動した上で、まずは azure 仮想マシンから VirtualBox VM に SSH 接続できることを確認します。
VirtualBox VM の ssh がもともと port 22 であれば以下のコマンドで接続できると思いますが、そうではなく、証明書が必要だったりポートを変えていたりする場合は、適宜それにあわせて接続コマンドを変更してください。
azureuser@testVm:~$ ssh vmuser@192.168.56.101
The authenticity of host '192.168.56.101 (192.168.56.101)' can't be established.
ECDSA key fingerprint is SHA256:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.56.101' (ECDSA) to the list of known hosts.
vmuser@192.168.56.101's password:
この段階で ssh できない場合、ここではこれ以上どうしようもないので、下のセクション「VirtualBox VM がうまく起動しないなどの場合は ...」を参照して VirtualBox GUI 画面で調査することができます。
どちらのネットワークも、いったん dhcp で IP アドレスを取得するように、ゲスト側OS を設定してみてください。
azure 仮想マシン内の VirtualBox VM に ssh 接続できたら、今度はその VM が外部ネットワークにアクセスできることを確認します。
vmuser@192.168.56.101:~$ ping www.google.co.jp
PING www.google.co.jp (172.217.161.35) 56(84) bytes of data.
64 bytes from nrt12s23-in-f3.1e100.net (172.217.161.35): icmp_seq=1 ttl=63 time=2.70 ms
64 bytes from nrt12s23-in-f3.1e100.net (172.217.161.35): icmp_seq=2 ttl=63 time=7.73 ms
64 bytes from nrt12s23-in-f3.1e100.net (172.217.161.35): icmp_seq=3 ttl=63 time=3.89 ms
64 bytes from nrt12s23-in-f3.1e100.net (172.217.161.35): icmp_seq=4 ttl=63 time=7.24 ms
^C
--- www.google.co.jp ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3014ms
rtt min/avg/max/mdev = 2.700/5.394/7.735/2.146 ms
上記のように google.co.jp への ping がとおるようことをもって、 VirtualBox VM が外部ネットワークにアクセスできることの確認とします。
これで azure 仮想マシンおよびその中の VirtualBox の VM の設定はおしまいです。
いったん VM を停止します。
azureuser@testVm:~$ vboxmanage controlvm $vmname acpipowerbutton
VirtualBox VM がうまく起動しないなどの場合は ...
VirtualBox VM を起動させようとするとエラーになるとか、ssh で接続できないとか、よくわからないがうまくいかない場合は、やっぱり VirtualBox の GUI が使いたくなると思います。
そのような場合、Xserver を使うことになるのですが、いろいろ設定するのが面倒なので、ここでは MobaXTerm というターミナルソフトを使います。
私は普段は Windowsターミナルを使っていますが、この MobaXTerm のよいところは Xserver との接続もサポートされているところです。
いったん MobaXTerm をインストールした上で、MobaXTerm から以下のようにしてみてください。
mobaxterm$ ssh -X -i ~/.ssh/pem/testVm_key.pem testvm-iruka4.japaneast.cloudapp.azure.com
これでいつもどおり azure 仮想マシンに接続できますが、ここで VirtualBox を起動してみます。
azureuser@testVm:~$ /usr/bin/VirtualBox
すると、azure 仮想マシンの VirtualBox GUI が、お使いのパソコンに表示されます。
あとはいつもの画面なので、仮想マシンのリストに先ほど作成した VM が存在することや、その他の設定を確認してみてください。
なお、ssh -X ですが、これを毎回指定するのがいやな場合、~/.ssh/config の該当ホストの部分に
ForwardX11 yes
ForwardX11Trusted yes
の2つを指定しておくことで、毎回 -X しているのと同じことになります。
azure 仮想マシンの起動時に VirtualBox VM を自動的に起動する
ubuntu18 では、vboxautostart-service がインストールされないので、今回作成した vm を自分でサービスとして作成します。
とりあえず、azureuser を vboxusers に追加します。
azureuser@testVm:~$ sudo gpasswd -a azureuser vboxusers
Adding user azureuser to group vboxusers
シャットダウン時に poweroff ではなく acpibutton を押したことにするようにします。
poweroff は電源ボタンで強制終了するようなものですが、acpibutton の場合は終了処理も行われます。
azureuser@testVm:~$ sudo vi /etc/default/virtualbox
#SHUTDOWN=poweroff
SHUTDOWN=acpibutton
vm のサービスファイルを作成します。
azureuser@testVm:~$ sudo vim /etc/systemd/system/vm1.service
[Unit]
Description=vm1
After=network.target virtualbox.service vboxdrv.service
Before=runlevel2.target shutdown.target
[Service]
User=azureuser
Group=vboxusers
Type=forking
Restart=no
TimeoutSec=5min
IgnoreSIGPIPE=no
KillMode=process
GuessMainPID=no
RemainAfterExit=yes
ExecStart=/usr/bin/vboxmanage startvm vm1 --type headless
ExecStop=/usr/bin/vboxmanage controlvm vm1 acpipowerbutton
[Install]
WantedBy=multi-user.target
サービスファイルを再読み込みします。
azureuser@testVm:~$ sudo systemctl daemon-reload
サービスの状態を確認して、はじめは当然起動していないので、起動させます。
azureuser@testVm:~$ sudo systemctl status vm1
● vm1.service - vm1
Loaded: loaded (/etc/systemd/system/vm1.service; disabled; vendor preset: enabled)
Active: inactive (dead)
azureuser@testVm:~$ sudo systemctl start vm1
azureuser@testVm:~$ sudo systemctl status vm1
● vm1.service - vm1
Loaded: loaded (/etc/systemd/system/vm1.service; enabled; vendor preset: enabled)
Active: active (exited) since Tue 2022-05-24 08:03:09 UTC; 1min 32s ago
Tasks: 0 (limit: 4915)
CGroup: /system.slice/vm1.service
May 24 08:03:09 testVm systemd[1]: Starting vm1...
May 24 08:03:09 testVm vboxmanage[17232]: Waiting for VM "vm1" to power on...
May 24 08:03:09 testVm vboxmanage[17232]: VM "vm1" has been successfully started.
May 24 08:03:09 testVm systemd[1]: Started vm1.
azureuser@testVm:~$ ssh user@192.168.56.101
接続できる
最後に、vm1 サービスを自動起動するようにします。
azureuser@testVm:~$ sudo systemctl enable vm1
PC から azure 仮想マシン内の VirtualBox のVM に接続する
PC から VirtualBox VM に ssh 接続する
通常は、
- PC から azure 仮想マシンに ssh 接続
- azure 仮想マシンから VirtualBox VM に ssh 接続
という2段階を行う必要がありますが、毎回これをやるのは面倒なので、.ssh/config に以下のように設定しておきます。
(前半の azure-testvm は本記事の最初に設定したものなので、後半の azure-testvm-vm1 を追記します)
Host azure-testvm
HostName testvm-iruka4.japaneast.cloudapp.azure.com
User azureuser
Port 22
ForwardX11 yes
ForwardX11Trusted yes
DynamicForward 10000
IdentityFile ~/.ssh/pem/testVm_key.pem
Host azure-testvm-vm1
HostName 192.168.56.101
User vmuser
Port 22
ProxyCommand ssh -W %h:%p azure-testvm
これを保存した上で以下のようにすることで、PC から直接 azure 仮想マシン内の VirtualBox VM に ssh 接続できます。
wsl$ ssh azure-testvm-vm1
PC から VirtualBox VM に HTTP リクエストする
azure 仮想マシン内の VM というところが面倒で、Port Foward を使ったりすることもできると思いますが、ここでは DynamicForward を使ってみたいと思います。
ProxySwithySharp を Chrome にセットアップする
まずはお使いのパソコンの Chrome に ProxySwithySharp をインストールしておきます。
インストールされたら Chrome 右上に表示される地球のアイコンをクリックし、「Options」メニューをクリックします。
その上で新しいプロファイルを以下のようにして作成します。
- Profile Name : 任意、たとえば「azure-testvm-10000」とか
- Manual Configuration > SOCKS Host : localhost
- Manual Configuration > SOCKS Host の横の Port : 10000
これで保存しておきます。
DynamicForward で ssh 接続する
azure 仮想マシンの sshd_config が以下のようになっていることを確認します。(デフォルトでこのようになっています)
azureuser@testVm:~$ sudo vi /etc/ssh/sshd_config
AllowTcpForwarding yes
そして、以下のようにしてターミナルから azure 仮想マシンにアクセスします。
wsl$ ssh -D 10000 azure-testvm
なお、毎回 -D 10000 といれるのが難しい、忘れちゃいそうな人は、~/.ssh/config の azure-testvm のセクションにに以下を追記してください。
DynamicForward 10000
Chrome で VM にアクセスする
これで準備が完了したので、Chrome 右上の地球アイコン(ProxySwitchySharp のアイコン)をクリックして、先ほど作成した "azure-testvm-10000" を選択します。
少しして地球アイコンが青くなったら接続完了です。
この状態で、アドレス欄に https://192.168.56.101 を入力してみてください。
今回インポートした vdi でもともと設定されていた web のサイトが表示されるはずです。
まとめ
以下のようにして Azure 仮想マシンにある VirtualBox VM にアクセスできるようになりました。
Azure 仮想マシンはポート 22 のみ自分だけに公開し、それ以外のポートは閉じたまま使います。
-
Azure Portal の開始ボタンを押して開始します。面倒な場合は Azure cli で、セットアップ済みの Azure 仮想マシンを起動します(するとその中の VirtualBox VM も自動起動します)。
PS> Start-AzVM -ResourceGroupName "testvmGroup" -Name "testVm"
-
少し待ってから Azure 内の VirtualBox VM に接続します
- VirtualBox VM でコンソール作業だけしたい場合は、たとえば WSL や PowerShell の ssh でアクセスします(詳細は「PC から VirtualBox VM に ssh 接続する」を参照してください)
wsl$ ssh azure-testvm-vm1
- ブラウザも使う場合は以下のようにして ssh 接続し、Chrome の ProxySwithySharp を使ってブラウザのアドレスに 192.168.56.101 を入力します(詳細は「PC から VirtualBox VM に HTTP リクエストする」を参照してください)
wsl$ ssh -D 10000 azure-testvm azureuser@testVm:~ $ ssh vmuser@192.168.56.101
- VirtualBox 自体を GUI で起動したい場合、MobaXTerm というターミナルから以下のように実行することで、お使いの Windows 上に Azure 仮想マシンにインストールされている VirtualBox が GUI で起動します。(詳細は「VirtualBox VM がうまく起動しないなどの場合は ...」を参照してください)
mobaxterm$ sshd -X azure-testvm azureuser@testVm:~ $ /usr/bin/VirtualBox
- VirtualBox VM でコンソール作業だけしたい場合は、たとえば WSL や PowerShell の ssh でアクセスします(詳細は「PC から VirtualBox VM に ssh 接続する」を参照してください)
-
Azure Portal の停止ボタンを押して仮想マシンを停止します。面倒な場合は、Azure cli で deallocate コマンドを実行します。
PS> Stop-AzVM -ResourceGroupName "testGroup" -Name "testVm" -Force