Mac VirtualBox上のWindows 10 ProをUbuntu 20.04に移動してヘッドレス起動+RDP

## Mac OSX VirtualBox上のWindows 10がなんだか邪魔になってきた

長年Windowsで開発をしてきたにも関わらず、メインの仕事がWindows EXEからiOSアプリに変わってきたこともあり、最近はもっぱらMacを使っております。
Windowsが必要なシーンもあるにはあるのですが、時間とともに減少の一途を辿っております。
そんなこともあり、すっかり日陰の存在なってしまったWindows 10をMacの外に追い出したい！と思い、今回Ubuntuサーバのほうに移動させ、必要な時にRDPで接続して利用することといたしました。
私の所有しているWindowsのライセンスはWindows XPからWindows 7を経て、バージョンアップで引き継がれてきたもので、今主流となっている64bitではなく32bitです。

#### 移動元・移動先マシン

|移動元||
|:---|:--|
|Mac Book Pro|13-inch, 2018, Four Thunderbolt 3 Ports|
|CPU|Core i7 2.7GHz クアッドコア|
|メモリ|16GB 2133MHz LPDDR3|
|ストレージ|1TB SSD|
|OS|Mac OSX 10.15 Catalina|

|移動先||
|:---|:--|
|BOXNUC6CAYH|[インテル® NUC キット NUC6CAYH](https://www.intel.co.jp/content/www/jp/ja/products/sku/95062/intel-nuc-kit-nuc6cayh/specifications.html)|
|CPU|Celeron® J3455 1.50 GHz クアッドコア|
|メモリ|8GB 1600MHz DDR3L|
|ストレージ|1TB SSD|
|OS|Ubuntu 20.04.2 LTS|

ディスク容量は同じですが、CPUがかなり遅いですね。
元々Linuxサーバ用途で購入したので、まぁ良い方ではないかと思います。
動作速度は大幅に落ちると思いますが、使用頻度がさがっていく一方のWindows 10なのでまぁいいでしょう。

#### UbuntuにVirtualBoxをインストール

UbuntuにVirtualBoxをインストールします。
色々とググってみたところ、以下のサイトに親切な説明がありましたので、参考にさせていただきました。ありがとうございます。
[Ubuntu 20.04にVirtualBox 6.1をインストールする方法 - Tutorial Crawler](https://tutorialcrawler.com/virtualization/ubuntu-20-04%E3%81%ABvirtualbox-6-1%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/)

rootユーザにsuして、コマンドを以下の順番で打ちました。

```shell
$ apt update && apt upgrade
$ wget -q https://www.virtualbox.org/download/oracle_vbox_2016.asc -O- | sudo apt-key add -
$ wget -q https://www.virtualbox.org/download/oracle_vbox.asc -O- | sudo apt-key add -
$ add-apt-repository "deb http://download.virtualbox.org/virtualbox/debian focal contrib" 
$ apt update
$ apt install virtualbox-6.1
```
aptリポジトリの構成でVirtualBoxがインストールできるようにして、インストールするという流れです。

無事にインストールができたら動作状況を確認します。

```shell
$ systemctl status vboxdrv
 ● vboxdrv.service - VirtualBox Linux kernel module
      Loaded: loaded (/usr/lib/virtualbox/vboxdrv.sh; enabled; vendor preset: enabled)
      Active: active (exited) since Thu 2021-04-22 17:38:07 JST; 15min ago
       Tasks: 0 (limit: 9268)
      Memory: 0B
      CGroup: /system.slice/vboxdrv.service
 Apr 22 17:38:07 home systemd[1]: Starting VirtualBox Linux kernel module...
 Apr 22 17:38:07 home vboxdrv.sh[3051450]: vboxdrv.sh: Starting VirtualBox services.
 Apr 22 17:38:07 home vboxdrv.sh[3051483]: VirtualBox services started.
 Apr 22 17:38:07 home systemd[1]: Started VirtualBox Linux kernel module.
```
無事にインストールされ動作しているようです。

VirtualBoxのバージョンを確認します。

```shell
$ VBoxManage --version
6.1.20r143896
```
バージョンは6.1.20でした。
この時点でのMac版VirtualBoxのバージョンが6.1.18だったので、Linux版のほうが進んでいるんですね。
Extension Packをインストールしておきましょう。

```shell
$ wget https://download.virtualbox.org/virtualbox/6.1.20/Oracle_VM_VirtualBox_Extension_Pack-6.1.20.vbox-extpack
$ VBoxManage extpack install Oracle_VM_VirtualBox_Extension_Pack-6.1.20.vbox-extpack
```

ゲストマシンを動作させるユーザをVirtualBoxのグループに追加します。

```shell
$ usermod -aG vboxusers Linuxユーザ名
```
これでUbuntu側のインストール作業は完了です。

#### Mac OSX VirtualMachine上のWindowsでの作業

MacのVirtualBoxでの作業に入ります。
Mac OSX VirtualBox上のWindowsのネットワーク設定はNATになっていることを前提に話を進めます。
最近のMac Book ProはEtherポートが付いていないので、ご家庭でのご使用でもEtherではなくオンボードのwifiをご利用されている方が圧倒的に多いと思いますが、VirtualBoxはいつのまにか、wifiアダプタへのBridge設定がうまく動かなくなってしまっています。そういうこともあるので、NAT前提で話をさせていただきます。
実は私のLinuxサーバもwifiでネットに接続されているので、移行先もNATのままで話を進めます。

まずはWindows 10を起動してRDP接続を有効にします。やり方はググれば出てきます。
ちなみにWindows 10 HomeはデフォルトではRDPを使えません。使うために特別なソフトウェアをインストールするみたいですが、私はやったことがありません。

続いてMacのターミナルで以下のコマンドを打ってください。

```shell
$ VBoxManage controlvm "VM名またはVM-UUID" natpf1 "rdp,tcp,,33389,,3389"
```

これは"Windows 10"というゲストOSの３３８９ポートへのプロキシとして、ホストOSの33389番を利用しますよ、という意味です。

この段階でMac OSX用のMicrosift Remote Desktopでローカルホストの33389番に接続を試してみてください。
[‎「Microsoft Remote Desktop」をMac App Storeで](https://apps.apple.com/jp/app/microsoft-remote-desktop/id1295203466?mt=12)
Windowsのリモートデスクトップが表示されればOKです。
Windowsをシャットダウンしてください。

#### Windows 10をエクスポートする

いよいよWindows 10をエクスポートします。
エクスポートする前に一つだけ確認してください。
それはVirtualBoxの3Dアクセラレーションをオフにすることです。
これをやり忘れると、ウインドウシステムの無いマシンにインポートされ、ヘッドレス起動をされたWindows 10にRDPで接続しても画面が真っ黒になってしまいます。

3DアクセラレーションをオフにしたらWindows 10をエクスポートします。
**仮想アプライアンスのエクスポート** というメニューを選んでエクスポートしてください。
![export.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31696/feb07d46-4467-cb6a-ea97-850644c11b48.png)
最初に出てきた画面はだいたいこうなると思うのですが、そのままのオプション選択でOKです。
そのまま続きボタンを押していけばエクスポートが始まります。
時間がかかるのでのんびり待ちましょう。

#### UbuntuでWindows 10をインポート
UbuntuにWindows 10を移動させます。
まずは先程エクスポートしたovaファイルをUbuntuにコピーしてください。
コピーが完了したら、VirtualBoxでWIndows 10を動作させるユーザとしてSSHやtelnet等でログインしてください。
先程rootの作業でusermodしたあのユーザです。

```shell
$ VBoxManage import エクスポートファイルのパス --dry-run
```
で表示される値を一通りチェックしてください。
よろしければ、

```shell
$ VBoxManage import エクスポートファイルのパス
```
としてインポートしてください。
これも時間がかかりますので、のんびりお待ち下さい。

#### Windows 10を起動してRDP接続
無事にインポートが済んだらWindows 10のVM起動してみましょう。

```shell
$ VBoxManage startvm "VM名またはVM-UUID" --type headless
```

これでMac OSのMicorsoft Remote Desktopから
UbuntuサーバのIPアドレス:33389
で接続ができると思います。
Micorsoft Remote DesktopのDisplayのColor quality設定はHigh(32-bit)からMedium(16-bit)に変更することをお勧めします。

無事に接続ができたら、このままLinuxサーバのターミナルからGuest Additionを当ててやってください。

```shell
$ VBoxManage guestcontrol "VM名またはVM-UUID" updateguestadditions --source /usr/share/virtualbox/VBoxGuestAdditions.iso --verbose
```
Guest Additionが無事に当たったら、RDPの画面からシャットダウンを選んでください。

#### VMパラメータの変更

Mac Book Pro 13-inchとBOXNUC6CAYHのパフォーマンスの差、さらにRDP接続もあって動作がかなり遅いです。
少々遅いのは覚悟していましたが、それでも少しは早くしたいです。

##### CPU数変更
```shell
$ VBoxManage modifyvm "VM名またはVM-UUID" --cpus 2
```
CPU数を2つにしました。Mac Book Pro上では1つで十分に速かったのですが、BOXNUC6CAYHでは遅いので2つにしました。

##### グラフィックスドライバ変更
```shell
$ VBoxManage modifyvm "VM名またはVM-UUID" --graphicscontroller vboxvga
```
Mac上ではVBoxSVGAを使っていたのですが、LinuxではVBoxVGAに変更しました。VBoxVGAのほうが良いということがググって出てきましたので、個人的感想としては変化は感じられませんでした。

##### H/Wアクセラレータoff
```shell
$ VBoxManage modifyvm "VM名またはVM-UUID" --hwvirtex off
$ VBoxManage modifyvm "VM名またはVM-UUID" --vtxvpid off
```
これもネット上での情報でH/Wアクセラレータもオフにしたほうが速くなる、とあったので設定してみました。
若干速くなった気もしますが、気のせいかもしれません。

##### ドラッグ&ドロップとクリップボードの無効化
```shell
$ VBoxManage modifyvm "VM名またはVM-UUID" --clipboard-mode disabled
$ VBoxManage modifyvm "VM名またはVM-UUID" --draganddrop disabled
```
RDP接続なので、VirtualBoxを介したドラッグ&ドロップやクリップボードは使いません。

###### メモリ
32-bit Windowsは実メモリを3.5GBまでしか認識できません。
従いまして、RAMサイズはMacで使用していた時の3584MBままにしています。

#### Windows Updateの問題
Windows Updateの中にはシステム更新を完了させるために、OSのリブートをするものがあります。
VirtualBoxはOSが勝手にシャットダウンをしたものはエラーが発生したとみなして、Windows Updateの更新が失敗してしまいます。
解決策として、そのようなタイプのWindows Updateはユーザが必ず再起動やシャットダウンを行えば良いのですが、こちらはWindows側の設定で自動再起動を止めないとなりません。
Windows 10 Proの場合はローカルグループポリシーエディターで設定を行います。
「ここに入力して検索」入力ボックスに"**gpedit.msc**"と打てば出てきます。

ローカルグループポリシーエディターで「ローカルコンピューターポリシー」→「管理用テンプレート」→「Windowsコンポーネント」→「Windows Update」を開いてください。
その中の以下の２つを編集にしてください。
「自動更新を構成する」
で、有効ラジオボタンをチェックし、自動更新の構成は「自動ダウンロードしインストールを通知」を選択

「スケジュールされた自動更新のインストールで、ログオンしているユーザーがいる場合には自動的に再起動しない」
で、有効ラジオボタンをチェックする

おそらくこれで、ユーザがログインしていない時にWindowsが勝手に再起動するのは防止できると思います。

#### 最後に
そんなに使わなくなったWindows 10ですが、90GB以上の領域をMacのSSDから奪っていました。これが自分がいつも使うマシンのSSDから消えたのが、ほんの僅かですが心地よいです。
Ubuntuサーバに移したWindows 10のVMはVBoxManageのexportコマンドを使って、月に１度のバックアップをとるようにしました。現在のWindowsの使用状況でしたら、それで十分な気がします。
バックアップが取られたら、通知する仕組みをつくって、USB HDDにエクスポートファイルをコピーするようにしています。
月１度の作業なので、そんなに苦痛にはならないと思っております。

分かりづらい点や、間違っている部分などがありましたら、コメントでお寄せくださいませ。