個人では昔から仮想環境と言えば、VMware Workstationという事で2.0時代から活用していますが、有償のプロダクトなのでメインマシン以外ではOracleのVirtualBoxを活用しています。主な活用法は、社内サーバ。Ubuntu Linux + Node.js + MySQLにて業務用APIサーバを構築し、社内サービスを提供するのに利用しています。

今は亡き、Sun Microsystemsの遺産の1つでもあるこの仮想環境、自分も在籍中から無償という事もあって使っていましたが、当時はパフォーマンスでは到底VMwareに及びませんでした。現在は勝るとも劣らないレベルにまで進化して来ています。今回はこれを活用してみたいと思います。

今回の環境構築に必要なもの

  • VirtualBox本体
  • VirtualBox Extension Pack
  • ゲストOS向け Guest Addition

Guest Additionは本体に付属。Extrension Packは別途ダウンロードが必要(拡張子が.gzになってしまうことがあるので、その場合には、vbox-extpackに変更すると良いです。

※VirtualBox 6.x系は64bitのみ。32bitOSを使っている場合には、5.x系を利用する必要があります。

インストールと設定

VirtualBoxはマルチプラットフォームで、Windows, macOS, Linux, Solarisの4つに対してリリースされています。今回は、macOS向けに説明を書いていますが、ほとんどの部分は共通です。

本体のインストール

本体のインストールは難しくありません。ダウンロードしてきた本体インストーラを実行するだけ。macOSだとDMGファイルをマウントすると、VirtualBox.pkgというファイルが入っているでの、ダブルクリック。あとはインストーラの指示に従ってインストールを進めるだけ。アプリケーションフォルダにアイコンが出たら完了です。

但し、macOSの場合、セキュリティによる制限でインストールができない事があります。その場合には以下の手順で許可してあげましょう。

  1. システム環境設定を開く
  2. セキュリティとプライバシーを開く
  3. 左下の鍵をクリックして変更できるようにする
  4. App Storeと確認済みの開発元からのアプリケーションを許可に変更します。
  5. ソフトウェアの読み込みがブロックされましたと出ている場合には、許可をクリック。
  6. Oracle America inc.をチェックしてOKを押します。
  7. これでインストールが可能になるはずです。

図:インストールはとても簡単

Extension Packのインストール

ライセンスの関係上、分けて公開されているもので、別途インストールしておくべきものです。ダウンロードしたファイルをダブルクリックでインストールするだけですが、OS本体と同じバージョンのものでなければ、エラーが出ますので要注意。インストールすることで

  1. USB 2.0にて外付けHDDなどが使えるようになる。
  2. USB 3.0が利用可能になる
  3. リモートデスクトップで接続運用が可能になる
  4. ホスト側のウェブカメラをゲスト側でも利用可能になる。
  5. Linuxホストの場合には、ゲストでホスト側のPCIデバイスにアクセス(パススルー)出来るようになる。
  6. VMwareだとVMware Toolsが役目を果たしてるゲストとホストの境目をなくすシームレスモード
  7. 仮想HDDの暗号化
  8. IntelネットワークカードによるPXEブートに対応

※非商用に限り無償利用可能という規約にはなっています。

図:VirtualBox自体の設定の拡張機能に存在する

ゲストOSのインストール

ゲストOSのインストールは、ISOファイルもしくは実CD-ROMが必要です。OSを起動する前にどちらかをCD-ROMデバイスとして入れておきましょう。以下の手順で操作します。

  1. ゲストOSの設定画面に入ります。
  2. ストレージを開きます。
  3. コントローラIDEに空のCDがあるので(なければ横のアイコンで光学ドライブの追加をする)クリック。
  4. IDEプライマリマスターやセカンダリがありますが、どちらかの状態で横の青いCDのアイコンをクリック
  5. この時、macOSだとシステム環境設定のアクセシビリティでVirtualBoxの要求画面が出ることがあるので、チェックを入れて許可してあげる。
  6. 既存のCD-ROMを選ぶか?ISOファイルを指定してあげる。今回はUbuntu LinuxのISOファイルを指定しました。
  7. システムの項目を開き、起動順序に於いて「光学」がHDDよりも上の位置にあることを確認
  8. あとはこの状態で起動させると、CD-ROMからブートされて、インストール画面が出てきます。

図:アクセシビリティでの許可画面

Guest Additionのインストール

OSをインストールしたら、ゲストOSにドライバ類が含まれた「Guest Addition」をインストールしましょう。これを入れないと、ホストOSとのファイルのやり取りや、SVGAドライバが入らないので、運用に支障を来します。

ゲストOSが稼働中に以下の手順にて。今回はゲストOSにUbuntu Linux 18.04を利用しています。

  1. メニューより「デバイス」⇒「Guest Additions CDイメージの挿入」をクリック
  2. ゲスト側に仮想CDがマウントされて、自動実行されます。
  3. 実行するか聞いてくるので、実行します。
  4. ターミナルが開いてドライバのインストールと、カーネルモジュールのリビルドが始まります。
  5. 終了したら「Press Return to close this Window」のメッセージが出るので、Enterキーを押す
  6. OSを再起動するとAdditionが有効になります。

入れることによって以下のメリットがあります。

  1. シームレスなマウス操作が可能になります。
  2. ホストとゲストの間で共有フォルダの形でファイルのやり取りが可能。Linuxの場合には、sf_Desktopという名前でデスクトップフォルダが出てくるようになる(要設定)
  3. 解像度の変更シームレスなウィンドウサイズの変更が可能に
  4. ホストと時刻の同期
  5. ホストとゲストでクリップボードの共有が可能に(Windowsだけファイルのやり取りも可能に)
  6. 自動ログオンが可能になる

図:Additionのインストール実行画面

図:ターミナル上でインストールとカーネル構築

ゲストOSの各種設定について

ここでの設定がゲストOSの稼働だけでなく、ホストOSにも多大な影響を与えるので、慎重に且つ良い設定を見つけるようにしましょう。ここでは重要な設定項目についてのみ紹介します。

一般設定

高度

スナップショット保存先

VirtualBoxにはVMware Workstation同様に、一時的に今の状態を保存する機能(どこでもセーブみたいなもの)が備わっています。ある実験をする前であったりとか、怪しげなファイルを実行する前であったりとか、いくつかスナップショットを取っておく事で、実行前まで自由に戻る事が可能です。

そのスナップショットの保存場所です。注意したい点は、スナップショットを取っておいた場合には、VM環境を他のマシンに引っ越して実行はできません。スナップショットも合わせて引っ越しが必要です。

クリップボードの共有

Guest Additionがなければ使えませんが、双方向どちらのクリップボードも1つのものとして共有します。例えば、ホストmacOS側でコピーしたコマンドライン文字列を、そのままゲストLinux側のターミナルにコピペして実行といった事が可能です。最新版では、Windowsのみですが、クリップボードを介したファイルのコピーが可能になっています。

ドラッグアンドドロップ

Guest Additionがなければ使えませんが、ホスト側⇔ゲスト側で双方向のファイルを掴んだままコピーが可能になっています。共有ドライブ機能を介さずに直接やり取りが可能です。

ただ、VMwareでもそうなのですが、きちんとAdditionが入っていても、うまくマウスでファイルを掴んだまま枠外に出そうとしても出てくれない事があります。その場合はなんどか掴んで移動で枠外に出られるまでチャレンジです。

また、ゲスト側がLinuxの場合、システムドライブ内のフォルダへ移動させたい場合には、Ubuntu Linuxであればsudo nautilusコマンドにて、管理者権限でファイラーを起動しそのフォルダまで移動してあげておかないと直接移動ができません。

図:一般設定は通常はいじる機会は殆どない

ディスク暗号化

通常のPCでもあるHDDの暗号化(Windowsでいう所のBitlocker)機能がこれ。Extension Packを入れて置かなければ利用する事ができません。暗号方式を選びパスワードを設定する事で、次回以降パスワード入力をしなければ、仮想HDDからブートできません。

この機能を使った場合、暗号化されるわけですから、仮想HDDだけ持ち出してもマウントするにはパスワード入力が必要になるため、他の仮想マシンでそのまま開くことは不可能になります。

また、ゲストOSがWindowsの場合には、Bitlockerがあるので素直にそちらの機能を使ったほうが良いかと。その場合ディスク全体に適用してしまうとVirtualBoxの仮想HDD容量可変が使えなくなってしまうので、使用域のみに適用しましょう。また、そのBitlockerを使う場合には、以下のグループポリシーの変更を必要とします。

  1. [ローカルコンピュータポリシー] ⇒ [コンピュータの構成]⇒[管理用テンプレート]⇒[Bitlockerドライブ暗号化]⇒[スタートアップ時に追加の認証を要求する] を未構成⇒有効に変更
  2. [互換性のあるTPMが装備されていない BitLockerを許可する]にチェックを入れる

システム設定

もっともよく利用する設定であり、なおかつホストOSにも影響が大きい設定です。

マザーボード

メインメモリー

ホストOSからどれだけゲストOS側にメモリを割り当てるかの設定。仮想環境はもう一個OSを立ち上げるわけなので、CPUよりもむしろRAMの量のほうが重要。ゲストに少ししか割り当てないとゲストOS環境がモッサリして使い物にならず、割り当て過ぎればホスト側の挙動が遅くなる。

通常個人レベルならば1個立ち上げるくらいだと思うので、8GBならばゲストには4GBも割り当てておけば、Ubuntu LinuxでもWindows10でもそつなく稼働する事は可能(使い方にもよるけれど)。間違っても100%割当はNG。

起動順序

VirtualBoxにもBIOSがあるので、そちらの設定にもなるのだけれど、GUI上からブートする順番を変更できる。特にLive CDをブートしたい場合には、光学ドライブの順序はHDDよりも上にしてあげないと、先にHDDからブートしてしまいます。同じ事がネットワークブートにも言える。

また、ネットワークブートさせる場合、かつてはIntel Proでのブートはできなかった(PC-Net Fast IIIを選んでました)。現在は、Extension Packのインストールで対応したみたいだけれど・・・もちろん、別途PXEサーバが必要です。

チップセット

古いOSを動かす場合には、PIIX3を選んでおく。そうでない場合には、ICH9を選んでおけば問題ない。

ポインティングデバイス

通常はいじらなくても問題ない項目なのですが、一部OSのインストール時などで、マウスカーソルが見えなくなる現象が報告されています。この場合、ポインティングデバイスを「USBタブレット」に変更する事で表示できます。もちろん、設定は一度OSをシャットダウンして立ち上げ直す必要があります。

ちなみに、マルチタッチにしておかなくても、macOSの場合普通に2点タッチで右クリックになります。タッチディスプレイ用の設定なのでしょう。

拡張機能

I/O APICの設定をオンにしなければ、プロセッサー項目のマルチCPU割当は使えません。また、EFI有効化はゲストOSがBIOSではなくEFIに対応しているものの場合にはONにする必要があります(ゲストにmacOSやWindows10 64bitなど)。

プロセッサー

最近のOSはシングルプロセッサではなく、マルチプロセッサでパフォーマンスが出るように作られています。また、様々な拡張が施されている為、仮想環境で動かす場合にも、一定の考慮が必要な設定です。

プロセッサー数

通常は2コアや4コアのPCが現在の主流なので、仮想環境でも2コア以上を割り当てましょう。古いOS(例えばWindows95など)は、デュアルCPU未対応なので1コアでも良いですが、そうではないOSの場合、1コアだとあまりにも遅くて実用できません。RAMと違い4コアを割り当てても問題はありませんが、Hyper-Threadingで2コアを仮想4コアにしてるような場合には、2CPU割当にしましょう。

使用率制限

この設定は、2CPU以上にしても、1CPUにしてもどちらも警告が出るようになっています。2CPU以上の場合に、使用率制限を加えると警告が出て無効な設定と出ますが、機能はしているようで。仮想環境の負荷が大きく、ホストOSにまで影響が出ている場合にだけ使いましょう。

拡張機能

PAE/NXは、昔のOS(WindowsXPくらい)の頃に生まれたもので、32bit OSの場合、ONにしておかないとインストール自体ができません。

ネステッドVT-x/AMD-Vを有効化とは、仮想環境内でさらに仮想環境をネストして起動する場合に使用するオプション。開発関係以外では通常使わない。

アクセラレーション

準仮想化インターフェースという項目だけがある。通常はなしで問題ない。しかし、ゲストOSがLinuxの場合にはKVMにしておく事で動作が快適になるかもしれない。WindowsであればHyper-Vなど。

図:ベストの設定は色々試してみるしかない

ディスプレイ

この設定も仮想環境の動作に非常に大きな影響を与える。画面解像度やVRAMに関する設定で、システムのメインメモリー設定と合わせて考慮しなければならない。

スクリーン

ビデオメモリー

いわゆるVRAM。大きければ大きいほど画面描写のパフォーマンスが上がるのは知られていますが、VirtualBoxの場合、自由に変更できる幅が小さい。ディスプレイ数と連動していて、1の場合には最大128MBまでしか割り当てができない。この割当は実メモリからの割当になるので、システムのメインメモリーに加えてここで設定した分がメモリとして割り当てられるので、メモリ不足に要注意。

裏技として1画面でも256MBのVRAMを割り当てる方法として以下の手順がある。

  1. ディスプレイ数を最大の8まで上げる
  2. VRAMの設定を256MBに設定できるので、設定し、一度OKボタンを押して閉じる
  3. 再度同じ設定画面を開き、ディスプレイ数を直接1に設定して保存すると、VRAM256を1画面で割当が可能。
ディスプレイ数

マルチディスプレイ環境構築で使う設定。ビデオメモリー設定が連動して動くので注意。この設定をする事で仮想スクリーン設定が使えるようになる。表示⇒仮想スクリーン1・・・などを切り替えると、仮想マルチディスプレイ運用になる。

表示倍率

macOSの場合、Retinaディスプレイは非常に綺麗で高解像度なのは良いのだけれど、仮想環境の表示が非常に小さな文字とアイコンになったりする。これだと実運用上支障を来すので、表示倍率を上げて使っています。しかし、表示倍率を上げると仮想環境のパフォーマンスが低下するので、注意が必要。自分の場合、150%に設定しています。

高解像環境でなければ通常の100%で問題なし。

グラフィックコントローラ

VirtualBox 6.0からは、ここが少し変更されてSVGAが標準になりました。デフォルトはVMSVGAとなります。場合によっては、Guest Additionを再インストールが必要になるケースもあるかも。但しGuest Additionがうまく動かないケースもあるようで、その場合にはVboxSVGAに変更すると良いらしい。

特にゲストOSがLinuxの場合には、VboxSVGAだとインストール時や運用時に動かない、画面がおかしくなるといった現象が過去に報告されています。

準仮想化をONにすることで、ホスト側のGPUをPCIパススルーして活用できるようです。3Dアクセラレータの機能はホストのGPUを3Dレンダリングで活用してるだけで、GPUを直接扱えるようになっているわけではないので注意。

リモートディスプレイ

いわゆるRDPで、Microsoft Remote Desktopなどを使って接続出来るようにする設定。ゲストOS側にVNCなどが入っていなくとも遠隔から、仮想マシンにRDP接続して投射可能になる。サーバ有効化にチェックを入れて、Port番号や認証方式を設定してONにするだけ。Extension Packが入っていないと使えないので、その場合はゲストOSにVNC Serverxrdpでも入れておくと良いでしょう。

ただし、一部の環境でこの設定をONにして何度か接続と切断をした所、ゲストOSがVirtualBox巻き込んでフリーズする現象を数回確認してる。今は治ってるのかもしれないけれど、自分はこの設定は使っていない。

レコーディング

仮想環境での操作の様子を動画ファイル化するキャプチャー機能です。webm形式の動画になるので、動画コンバータなどを使ってMP4形式に変換すると良いのではないかと。なぜwebm形式・・・・

録画するスクリーン(ディスプレイ数設定による)を選び、解像度やフレームレート、bpsの設定などを行うことが出来る。操作方法などの教材動画を作るのに役に立ちます。

ストレージ

IDEやSATAなどのデバイス制御をする設定。今どきのOSの場合、HDDのSATA(タイプはAHCI)で設定しておけばOK。このコントローラにぶら下げる形で仮想HDDファイルや仮想CD-ROMを追加していく。

仮想CD-ROMの場合、IDEをコントローラとしてマスター/スレーブの設定、そこにISOファイルなどをマウントさせる事も可能。主にOSインストール時くらいにしか使わない。

他にもSCSIといったコントローラや、フロッピードライブ、NVMeなどが加わっており、自分が使う環境に合わせてコントローラを増やす事が可能。PCのドライブがSSDの場合にはSSDにチェックを入れることで少しだけパフォーマンスが改善するかもしれません。

図:仮想FDDは仮想FDのファイルが必要になる。

オーディオ

サウンド設定。基本変更する必要はないけれど、ゲストOS側で特に必要なケースだけ、オーディオコントローラを変更する必要がある。主にドライバ関係の問題で。

ICH AC97Realtek AC’97 Audio Codecのドライバが必要となります。ゲストOSがWindows7以前のものの場合などなど。Sound Blaster 16も同様。主にこれらは古いゲームなどで使う場合のものとなります。Windows7ではインストール直後音がでない事が報告されており、その場合、上記の設定を変更してドライバを入れるのがセオリーになっています。

現代のOSならばIntel HDオーディオで良いかと。

図:音関係は仮想環境ではトラブルがつきもの

ネットワーク

VirtualBoxでは仮想ネットワークカードを4つ設定する事が可能になっています。仮想環境でサーバ運用する場合やVPNなどを設定する場合などには必要となります。また、無効化してしまうと、仮想環境内から外に出る事ができなくなります。

NAT

VirtualBoxデフォルトの設定。仮想マシンからインターネット環境に接続が可能です。ただ、ホストOSのネットワークを介して外に出る事になるため、ホストOSはルーターの役目を果たします。結果として、ゲストOS同士での通信ができません。また、WAN側から仮想マシンのサーバにアクセスするには、ポートフォワーディング設定が必要になります。

ホストOSが保持してるIPアドレスの参加してるネットワークに参加するわけではなく、ホストOSを起点とした別個のLANにいる状態なので、ゲストOSの与えられたIPアドレスはホストOSのそれとは違い、ホストOSがDHCPで振ってあげてる状態です。

仮想マシン同士が通信出来るようにするには、NATネットワークを利用する必要があります(こちらは 別個のLANに仮想マシン達が参加してる状態にできます)

図:ネットワーク構築は仮想環境作成時の悩みの1つ

ポートフォワーディング

ホスト側の特定のPort番号にアクセスしてきたパケットをゲスト側の特定のPortに転送する設定です。ホスト側でサーバ環境を立てたくない、けれどゲスト側で立てたサーバにはアクセスさせたいといった場合に利用します。自分もゲストOS環境でNode.jsにてサーバをいくつか運用していますが、ホスト側にサーバを構築したくないため、この設定を利用しています。

ホストOS側がこの場合仮想環境の特定Portを叩いて通信が出来るので、Webサーバならばhttp://localhost:3000といった形でブラウザでアクセスする事も可能です。

設定方法は以下の通り

  1. ネットワークをNATにしておく
  2. 高度をクリックする
  3. ポートフォワーディングをクリックする
  4. 右上の追加ボタンをクリック
  5. プロトコルを選択(通常はTCP)、ホストIPやゲストIPは無くても問題ない
  6. ホスト側ポートは何番で受けるか設定。
  7. ゲスト側ポートは実際にサーバで使用してるポート番号を指定。
  8. ホスト側8080番で受けて、ゲスト側で80番ポートを使うといったような転送が可能。
  9. 同じポート番号を指定しても問題ない。
  10. ただし、ホストOS側で対象のポートに対してファイアウォールが規制していると受けられないので、注意。
  11. 同じくゲスト側でもファイアウォールが指定ポートを塞いでいると、転送を妨害してしまうので注意。

図:仮想環境のサーバ運用はポートフォワーディングがベター

ブリッジアダプター

NATとは異なり、ゲストOSがホストOSと同じネットワークに参加します。よって、ホストOSと同じDHCPサーバからIPアドレスを割り当てられるので、他のコンピュータからは新しいPCがネットワークに参加したかのように見えます。

もちろんインターネット側にも参加できますし、同じブリッジアダプターであればゲストOS間でも通信が可能になります(他のゲストがNATの場合は通信不可だけれど、ポートフォワーディングで特定ポートを転送してる場合には、そのポートとだけは通信が可能)。

但し、この設定にするとゲストOS環境がまるごとネットワークから見えることになるので、ゆるいセキュリティの状態にしてあった場合、他のコンピュータから思わぬ経路で、ゲストOSへの侵入を簡単に許してしまいます。一方でサーバ展開がしやすくもなります。

2枚仮想ネットワークを用意して、Webサーバはブリッジアダプター経由。ソレ以外はNAT経由という形での運用をする事も可能です。

ポート

この設定はシリアルポートおよび USBポートに関する設定です。仮想環境内で昔のシリアルポート経由の通信をしたい!!といったケースや、USB2.0/3.0の区別などなど。ただ、普通の人はあまりシリアルポート経由で他のデバイスと通信なんて、Raspberry PiのGPIO経由でデータ取得みたいなケースでない限り使わないと思う。

USB側はちょっと重要。USB2.0設定の他に3.0設定も使えるのだけれど、USB3.0はExtension Packをインストールしていないと利用する事ができない。また、OS自体がUSB3.0に未対応のケースもある(別途ドライバが必要)。

デバイスフィルターは特に設定は必要ないが、ここに設定したものだけを接続可とする事が出来ます(macOS側でしか使わないので、ゲストOS側でマウントされるのを防げる)

※USB3.0対応のUSBメモリを2.0設定の状態の仮想マシン(Windows)にて、フォーマットをしようとすると失敗する事がある。USBの対応バージョンに合わせてあげる必要がある。

※macOSでは使えないUSB機器であっても、ゲストOS側で使えるならば、マウントしてドライバを割り当てれば運用する事が可能です(例えばプリンターなど)

図:認識しにくい時はデバイスフィルターに追加しよう

共有フォルダ

Guest Additionを入れることでドラッグアンドドロップで便利なのは人間が使った場合の話。アプリケーションからホストOS側のディレクトリなどを指定対象にしたい場合には、やはり共有フォルダが必要。また、ドラッグアンドドロップの場合、例えば xlsxファイルなどでよく起きていたのが、ファイルが破損する現象。ZIPなども壊れたケースがある。

共有フォルダ経由であれば問題なく渡せていたので、現在は必要最低限ホストOSのデスクトップフォルダだけ共有してる。もちろん、ホストOSに接続されてるUSB外付けHDDなどを共有フォルダに加える事で、ネットワークに晒さず直接ゲストOSから読み書きが可能(しかもこの場合、ゲストOSがWindowsでホストOSがmacOS、HDDのフォーマットが HFS++であってもゲストのWindows側から読み書きが可能になる)

図:共有フォルダはネットワークフォルダとして見えるようになる

関連リンク

共有してみる: