仮想マシンソフトとの出会い



ハードとソフトの違いとは?


ハードウェアとソフトウェアの違いについては多くの観点がありますが、ここでは以下の3点に注目して説明します。
 @複製のコスト
 A寿命の問題
 B創意工夫の余地

@ 複製のコスト
ハードウェアは、複製すればするほど物理的なコストがかかります。 量産によって単価は下がるものの、1台ごとに材料費・製造コストが発生する点は避けられません。 一方、ソフトウェアは一度作ってしまえば、複製や配布のコストはほぼゼロです。 この「コピーの容易さ」は、ソフトの大きな強みです。 もちろん、ハードとソフトはそれぞれに役割があり、優劣を競うものではありません。 しかし、ソフトウェア特有の利点を活かすことが、コンピュータを最大限に活用する鍵となります。

私自身は、かつてハードとソフトの間には明確な境界線があると考えていました。 しかし「エミュレータ」の存在を知ったとき、その認識は大きく覆されました。 ソフトウェアがハードウェアの機能を模倣し、場合によっては代替さえ可能にする、 これは非常に画期的な考え方です。ソフトウェアによって、 従来コストがかかっていたハードの機能を、仮想的に再現できるようになったのです。

A寿命の問題
ハードウェアには物理的な寿命があります。 部品の劣化や故障は避けられず、いずれは修理や買い替えが必要になります。 メンテナンスを趣味として楽しむ人もいますが、長期的な使用には限界があります。 一方、ソフトウェアは昨日まで動いていたソフトが、 何もしていないのに突然動かなくなることは基本的にありません。 あるとすれば、ライセンスの有効期限切れや動作環境の変化によるもので、 「自然故障」という概念はないのがハードと大きく異なる点です。

ただし、ソフトウェアが特定のハードウェアに依存している場合、 そのハードが入手不能になると、事実上そのソフトも使えなくなってしまいます。 こうした問題に対処するのが「エミュレータ」です。 たとえば、DOS/Vマシン上でPC-98環境を再現することで、 過去のソフト資産を今の環境で再利用できるようになります。

ここでは、さらに一歩進んで、「DOS/VでDOS/Vをエミュレートする」という、 同一環境を仮想的に再構成するタイプのエミュレータについて触れていきます。

B創意工夫の余地
ハードウェアに対する関わり方は人によって大きく異なります。 簡単なパーツ交換すら苦手な人もいれば、基板レベルの改造を行うマニアもいます。 しかし、いかに熟練した技術者であっても、ハードは物理的制約から完全に逃れることはできません。 ラズパイなどを駆使する人もいますが、一般的に独自の工夫という例は少ないです。

一方、ソフトウェアの世界では、開発者はもちろん、一般ユーザーもさまざまな工夫を凝らすことができます。 以下のような創意工夫の余地があります。
 ・自作プログラムの開発
 ・マクロやバッチ処理による作業の効率化
 ・データの変換・再利用(例:コンバータの利用)
 ・1台のPCで複数台分の作業を代行する仕組みの構築
こうした工夫によって、ハードを補い、あるいは凌駕する形での柔軟な運用が可能になります。


仮想マシンソフト導入までの道のり


1台のPCに複数台の役割を持たせる方法のひとつにマルチブートという方法があります。 複数の領域を確保しそれぞれにOSをインストール、PC起動にどれを使うかを選択する方法です。
私の場合は、ハードディスクの内部事情にある程度精通していましたので、 専用アプリとかない時代からMBRを直接書き換えて、独自のマルチブートを楽しんでいました。 そしてBootitNGというアプリを購入してからは、もっと楽にかつ安全にマルチブートができるようになり、 かなりの数のOSが起動する環境を持っていました。

これはこれでかなり満足していたのですが、敢えて不満を言えば、以下のようなことになります。
 @OSの切り替えにパソコン再起動が必要で、手間と時間がかかる
 A複数のOSを同時に動かせない

この頃、同時に複数のOSが動く仮想マシンソフトの噂も耳にしていました。 でもまだ、この時代(1990年代終盤)に正常に動作するとは思っていなかったので、 何れ実用レベルまで進化すれば、という期待を持ってその後の動向を静観していました。

そんなある日、仮想マシンソフトを欲しいと強く思ったきっかけになる出来事がありました。
ある雑誌でブータブルCDの作り方についての記事を読んだ時のことでした。 それは、ISOファイルをバイナリーエディタで編集してブータブルCDを作るというものでした。 もう少し先の時代になれば、ISO作成ツールにそういった機能が追加されましたので、 ブートイメージの作成さえクリアできれば比較的簡単に(しかも確実に)作れるようになります。
しかしこの記事は、まだそれより少し前、こういったアプリがまだない頃のものです。 自前で16進ダンプした画面を操作してバイナリーイメージを作るのですが、 このような作業にはかなり高いスキルが求められ、ミスも発生しやすくなります。 CD-R媒体に書き込んで正しくCD起動するか試して、もし失敗していたら媒体が無駄になってしまいます。 CR-RWなら消去してリトライということができますが、手間と時間がかかることには変わりありません。
そこで、その記事には「媒体に書き込む前に仮想マシンソフトで動作確認してみるといい」と アドバイスが書かれてました。私は半信半疑ながらも、その記事通り仮想マシンでの動作確認を実施してみました。 結果的にはバイナリの値にミスがあり、やはり一発では起動しなかったのですが、 ISOファイルの編集ミスを何度か直し、起動までできるようになりました。 その後でCD-Rに書き込んで実機でも動作することを確認、という手順を踏みました。 もし仮想マシンソフトがなければ、CD-R媒体を2〜3枚ほど無駄にしているところでしたし、 マシンを起動し直す時間なども余分にかかっていたことでしょう。
この時、仮想マシンソフトとして何を使ったかは覚えていませんが、 その場でダウンロードして使ったので、「QEmu」くらいだったような気がします。 この経験を通じて、「そろそろ有償でも構わないから、きちんとした仮想マシンソフトを手に入れたい」 という気持ちが強くなったことを覚えています。

この当時の仮想マシンソフトは、「VirtualPC」と「VMware」の2大アプリがしのぎを削っていました。開発当初の目的は、
 ・「MAC上でWindowsを動かす」ためのソフトがVirtualPC
 ・「Linux上でWindowsを動かす」ためのソフトがVMware
でした。なので、競合することはないはずの関係だったのですが、 互いにWindows上でWindowsを動かすことを目指したため、ライバル関係となり熾烈な争いを繰り広げることになります。 これらのアプリは、恐らくC言語で書かれたのでしょう。 C言語ならどのOSで動かすにしてもソースレベルでは互換を保てるように記述することが比較的容易です。 競合が互いを高めあって、ハイレベルなアプリへと成長したのだろうと想像します。

2001〜2年と記憶していますが、当時の評判は、
 ・日本語化や使い易さでVirtualPC
 ・処理速度やネットワーク関連の機能の充実でVMware
一長一短がありましたので、どちらを購入するか迷っていました。 そんな中、VirtualPCが 4→5 にバージョンアップして、 処理速度が大幅に改善されるという噂を聞き、これにすることに致しました。 発売とほぼ同時に購入、当時20種類くらいのOSをインストールしたでしょうか。 私はベクターなどにフリーソフトを提供していましたので、これで各OSでの動作確認がキチンとできると喜びましたが、 肝心のフリーソフト作成をあまりしなくなったので、環境を作っただけであまり活用できませんでした(泣)。
OSの初期インストール状態、各アプリをインストールした状態、DDKなどを組み込んだ状態など、 バリエーションを充実させて、「何かあった時」に備えて各種環境を用意しましたが、 なかなか「何か」が起きなかったことを覚えています。

その後、仮想マシンソフトの世界にもさまざまな変化が訪れます。
マイクロソフトがコネクティクス社を買収してから、VirtualPCはOS寄りの進化をします。 自社のOSのみ動くように「改悪」して発売し、これが不評だったのでLinix系もサポートするように 変更するなどのドタバタ劇がありましたが、それはともかくとして、 この時買収して手に入れた技術は、Windows標準の仮想マシン機能に活かされていきました。
マイクロソフトのこのような動きに対して、VMwareは無償版を出して対抗しました。 折角無償で手に入るならと、私も導入しましたが、仮想マシンソフト同士であまり機能に差が無く、 「これでなければならない」といった決定的な違いは感じられなくなっていました。

そのような状況の中、第三の仮想マシンソフトとして登場したのが「VirtualBox」です。 Innotek社をOracleが買収したため、現在ではOracleの製品となっています。 2015年に Ver.5 を試してみたところ、こちらの方が機能が上回っていたことがわかりました。 特に決定打となったのは、スナップショット機能の充実でした。 この機能な仮になくても、ユーザの工夫次第でバックアップを自分で取るなどして対応できるのですが、 ツリー状にスナップショットが表示され簡単に復元できる手軽さは、他のアプリを凌駕した感がありました。 結果として、私は「VirtualBox」をメインで使うようになり、現在に至ります。


PC上のアプリが「実態のないPCを作る」ということ


「仮想」という言葉は、何か掴み所のない曖昧な印象を与えます。 「実態のないPC」って何だろう、という疑問は多くの人が感じていると思います。
私の場合、何となくイメージできるのは、かつてC言語でプログラミングした時に intdos()という関数を使った経験があるからです。 あまり詳しい説明は省きますが、レジスタ構造体をインプット用・アウトプット用と用意してintdos()を呼び出すと DOSファンクションコールを実行したことになります。この「レジスタ構造体」というのが、 実態はメモリ上に取られますが、intdos()を呼び出す際には「CPU」の働きを実現しており、 あたかもメモリ上にCPUがあるかのようなイメージとなります。 これと同様なものとして、CPU以外にもBIOS-ROMやメモリ、ディスクイメージなど パソコンを動かすのに必要なものを一通り揃えればそれが仮想マシンになるのであろうと、 少なくとも想像はできます。
ただ、作れと言われるとかなりハードルは高いだろうと思います(※なので作りません)。

余談になりますが、intdos()以外にもint86()がありますが、割り込み番号が21h以外の場合に使うもので、 intdos()と大差ありません。 それ以外にも、outport()やimport()など、ボーランドのCコンパイラが使い始めたのだと思いますが、 これらの関数が充実することで、アセンブラに頼らなくてもC言語だけでも ハードウェアを扱えるようになって行きました。 インライン・アセンブラなどの利用も含めれば、表向きにはC言語のソースだけで ハードウェアが制御が可能になって行く過程の中で、朧気ながら仮想のイメージを学びました。 そのような経緯があって、ハードウェアの直接制御が簡単に行えるようになったのですが、 その後OSがそれを許さなくなり、また新たな苦労を強いられます。 それが「仮想デバイスドライバの作成」ということになりますが、この話題についてはまた別の機会と致します。

話しを仮想マシンに戻します。パソコン1台丸ごとでなくても、仮想ドライブなど、パーツ単位でも仮想化が行われています。 仮想ドライブということで言いますと、現在ではフロッピーディスク・CD/DVDなど、様々なラインナップがありますが、 私の経験から言うと、初めての仮想ドライブはRAMドライブだったように記憶してます。 まだPC-98を使っている頃でした。

フロッピーディスクというのは、パソコン同士でデータのやり取りをする時など、とても便利な存在でした。 ただ、使った経験のある方なら皆ご存じですが、ハードディスク普及後は、 とにかく「処理速度が遅い」という致命的な欠点がありました。 そこで工夫されたのがRAMドライブでした。 フロッピーディスクと互換性のあるもの・ないもの、両方存在しました。 パラメータ次第で両方可能なものもあったと記憶してます。
互換性のあるものは、FDの中身をRAMにコピーして、RAMドライブにファイルアクセスを実施、 最後にイメージごとFDの中身に戻すという、若干面倒な作業ではありますが、FD内のファイルアクセス回数が多い場合、 これでも実機オンリーで作業するより遙かに高速でした。
互換性のないものは、用途が限られることが多いですが、一時ファイル置き場として利用することで、 フロッピーディスクはおろかハードディスクより高速な処理を実現できました。
この頃の「FD互換のあるRAMディスク」は、DISKCOPYコマンドも使えましたので、 ハードはなくても仮想のフロッピードライブが確かに存在していたのです。

仮想COMポートというものも存在します。 代表的なのは「com0com」です。これも、知ってるようで知らない人が多いので、簡単に説明致します。
パソコン同士でRS-232C通信を行う場合、基本的には、パソコンのCOMポート同士をクロスケーブルで繋ぎます。 遠隔地の場合、途中に電話回線を挟みモデムを介しての通信となりますが、 形としてはクロスケーブルで繋いだものと同じになります。 インターネットが普及するまでのパソコン通信は全てこの方式だったと思って下さい。

そこで問題となるのは、通信アプリを開発する場合に、パソコンが2台ないとダメなのかどうか、ということです。 実は、COMポートが2つあれば1台のパソコンでクロスケーブル同士を繋いで通信することができます。 MS-DOSのようにシングルタスクOSでは、送信・受信のうちの一方をTSR型にするなど、 特殊な工夫が必要となる場合が多いですが、パソコンが高価だった時代、2台用意するコストを思えば、 そのくらいの苦労は安いものというのが普通の感覚でした。 その後Windowsが主流となり、マルチタスクOSが当たり前になると、もっと楽に環境が用意できるようになりますが、 困ったことにCOMポートそのものが付いていないパソコンが大多数になってしまいます。

そこで物を言うのが仮想COMポートです。 仮想のCOMポートを作った時、実態のないものにどうやってクロスケーブルを繋ぐのか、 という疑問を持たれるかと思いますが、問題ありません、クロスケーブルも仮想のものを使用するのです。 マルチタスクOSがインストールされているマシンでは、実装のCOMポートがなくても 仮想でCOMポートを2つ作ってそれらをクロスケーブルで繋ぐことが可能です。 外部マシンと接続したい場合は仮想だけではどうにもなりませんが、 同一実マシン内で送信・受信の両方の機能を持つなら、仮想COMポートだけで事足ります。

あと、仮想キーボードと呼ばれるものもあります。画面上にキーボードのレイアウトが表示され、 キーに該当するボタンをマウスでクリックしたり、指でタップしたりします。これは説明不要でしょう。



結局、仮想とは何なのか?


パソコンに限らず、最近の世の中の動向をみれば、仮想通貨・仮想空間(メタバース)・仮想現実(VR) ・仮想敵国など、「仮想」という言葉で溢れています。私はこれらについて説明する立場にありませんので、 詳しくはそれぞれの専門サイトをご参照下さい(とここでは逃げておきます)。

最後に少しだけ、「エミュレータ」と「シミュレータ」の違いについても触れておきたいと思います。 このあたりは人によって見解の分かれる分野ではありますが、一般的な理解としてまとめると、次のようになります。

「シミュレータ」とは、現実の動向や現象などを、原理・法則・推測などによって模擬的に実行するもののことです。 物価の予想や明日の天気など、これらを計算するものは全て「シミュレータ」です。
それに対し「エミュレータ」は、特定のマシンなどの動作を真似るものです。 つまり、「エミュレータ」には必ずターゲットマシンが存在するというのが 「シミュレータ」との最大の違いということになります。
昔のパソコンやゲーム専用機などの実際に存在する(または存在した)マシンをターゲットとすれば、 確実に「エミュレータ」ということになります。

ここで新たに疑問が浮かびました。
もし、「こんなパソコンがあったら面白いな」という発想で、完全に架空のマシンを仮想的に作り上げた場合、 それは「エミュレータ」になるのでしょうか?それとも「シミュレータ」になるのでしょうか?
※別に答えを求めてませんので、適当に聞き流して下さい(笑)。

ここまで、仮想についてあること・ないこといろいろ話しましたが(別にないことは言ってません!)、 仮想とは何かと聞かれても、私程度の知識ではなかなかうまく説明できません。

仮想への旅は、もしかしたらまだ始まったばかりなのかもしれません。
これからも、その面白さを追い続けていきたいと思っています。



戻る