開発環境を仮想OS上に保管する実験

最近の開発環境と言えば、Docker で構築しておいてビルド環境を配布、というのが主流なのだが、Visual Studio 絡みで開発環境を用意するとそうもいかない。.NET Core で作っておけば Docker のコマンドラインで済むのだけど、Visual Studio でビルドということになると(*.sln を呼び出して msbuild しても状況は変わらない?Windows の GUI が必要だから)、なんらかの形で OS ごとまるっと開発環境を残すことになる。

クライアントアプリの開発となると、GUI が必須になるので、

  • 顧客の主たる OS(検証機込み)
  • 開発環境としての Visual Studio
  • 動作環境としての SQL Server 諸々

ということになって、OS/Visual Studio/SQL Server はそれぞれ当時のバージョン込みで用意しておくことになる。顧客の主に動作している OS ってのは、Windows 7 だったり、それ以前だったりすることもあるので、場合によっては、検証機/開発機の2つの環境を残すことになる。クライアントアプリの場合、デバッグ実行で動作確認することが多いので、大抵の場合「検証環境のOS」=「開発環境のOS」となることが多い。古い IE とかを動かす場合は別途検証機をいくつか用意することになる。

ちなみに IE の検証環境は、https://developer.microsoft.com/en-us/microsoft-edge/tools/vms/ から、各 IE が入った仮想環境をダウンロードできる。動作チェックをしたい場合は、ここから逐次ダウンロードすればよいだろう。たぶん、将来的にも残っていくものと思われる。

どの仮想環境を使うか?

いくつかの仮想環境があるが、

  • Hyper-V
  • VMWare Player
  • QEMU

を検討してみた。VirtualBox もあるのだけど、これはちょっと慣れていなくて試していない。主に VMWare Workstation で仮想環境を構築してきたので、こっちのほうが慣れているというのもある。

Windows 10 上で構築するので、Hyper-V のほうが良さそうに見えるのだが、実は Hyper-V で開発環境を残してしまうと、

  • Linux をホストにできない
  • Android のエミュレータと競合しがち

という欠点がある。Android エミュレータのほうは、Hyper-V のほうを使えばいいじゃないか?という話もあるのだが、ホストが Windows に固定されてしまうのが微妙に痛い。手元で主に VM 環境を動かしているのが Ubuntu ということもあり(Windows Update のリブートに嫌気がさしてしまったので)、Linux でホストするという点も考慮しておきたい。もっとも、最近では、Hyper-V の vhdx なファイルを VMWare の vmdk にしてくれるツール StarWind V2V Converter もあるので、Hyper-V で作成しておいて、後からコンバートするという方法もある。コンバートツールには、QEMU-img を使う方法もある。

そんな訳で、Windows 上の Hyper-V じゃなくて、VMWare の Workstation Player を使って構築してみたのだが、さて、この VMWare をお客の環境に入れていいものかどうか?(最終的には、開発環境自体をお客自身が管理できる状態にしておきたい)というのが疑問になった。顧客のサーバー環境の片隅にでも、開発環境が VM 上で動いていれば、それはそれで便利なのだ。

建前上ではあるけれど、受託開発の場合は開発が済んだら一切合切を、開発会社のPC から消し去ってしまうのだ。仕様書とか試験のデータとかも、ISO9000的な保管の意味からすると、漏洩リスクを持つよりも「消して」しまうのが一番よい。実際、契約上も仕事が終わったら「消す」ことになっている。だが、実際のところは、瑕疵とか修正とかの問題があって、開発環境諸々を PC に残すことになる。不具合の発生や要求が発生するたびに、お客に開発環境を要求するのも大変だし、再び開発環境を整えるのは大変だ。だから、建前上は「消した」ことになっているのだが、なんらかの形で開発環境は残る。かなり矛盾しているが、仕事の効率上仕方がないところがある。

だが、できることならば「消す」なり、なんらかの形でバックアップで保存という形にしておきたい。大容量の HDD の片隅(場合によっては社内の大量ストレージ用のサーバー)の置くのもいいのだけど、バックアップに時間がかかるし、そもそも HDD が故障したときにそれらの開発環境がごっそり消えてしまうことになる。本来ならば「消した」ものであっても、実際改修などが起これば消してしまうと不便なわけで、じゃあ、何処に残しておけばよいか?という問題が残ってくる。

なので、残しておくは、お客さんの運用環境のどこかに置いておくのがベターだ。保守契約を結んでいれば、なんらかの社内ストレージに残しておけばよいのだが、とびとびの改修案件ということになると、継続的なバックアップ環境は顧客自身が持っておくほうがよい。かつては、実機 PC で保存しておくのがよいのだが、じゃあ、仮想環境においておくのがよいのでは?と思っている。

このとき、運用環境をできるだけ弄らないで、開発環境を仮想化しておきたい。となると、運用環境に VMWare のソフトウェアを入れるのはどうなのか?って話になる。固いこと言わなければまあいいじゃん、ってことになるけど、ちょっと考えてみる。

なので、QEMU ではどうか?ってのを思いついた。ストレージも顧客サーバーの HDD/SSD 上に置くのではなくて、USB メモリに置けばいいのではないか?QEMU だったらソフトウェアのエミュレートなので、ソフトウェアを Windows に入れなくて済む。必要なときは、USB メモリを差して使えばいいのでは?と考えてみた。

SD カードのアクセススピード

実は、いきなり USB メモリ(SD カード)上に VMWare の仮想ファイルを作ってアクセスしたのだが、条件によっては実用に耐えない。どうも、やたらに遅いので CrystalDiskMark を使ってアクセススピードを確認してみる。

上から、SSD, HDD, USB2.0+SDカード, USB3.0+SDカードの順になる。実際に利用したいのは「USB3.0+SDカード」のパターンで、高速な USB3.0 ならば安価なSDカード(USBメモリ)でも HDD の変わりになるのではないか?と思ったからだ。SD カードは東芝の128GBを購入して確認している。値段が3,000円弱なので、高価なSSDを買うより断然安く済む。

SSD TS480G
image

HDD WD20EZRX
image

Toshiba UHS-I microSDXC 128GB + ELECOM USB 2.0 MR-K011
image

Toshiba UHS-I microSDXC 128GB + iBUFFALO USB 3.0 BSCR27U3BK
image

結果を見るとわかるのだが、

  • HDD WD20EZRX
  • Toshiba UHS-I microSDXC 128GB + iBUFFALO USB 3.0 BSCR27U3BK

が、ほぼ同じになる。ということは、通常の物理HDD に仮想ストレージを用意したときと同じぐらいのスピードが SDカード+USB3.0 の組み合わせでは出るのではないか?という想定である。ただし、SDカードのほうが、シーケンシャルの書き込み(Seq Q32T1の Writeのほう)が5倍位遅いので、なんらかの大量書き込みをしたときは遅い、という予想が立つ。

実際、SDカードに仮想領域を作って VMWare Player で動かしてみると、それなりに Windows 10 が立ち上がってくる。SSD に仮想領域を作ったときよりは遅いが、まあ、なんとかなるという程度だ。しかし、Visual Studio 2017 を起動したときが非常に遅い。起動しきれば、なんとかなるのだが、起動が相当遅い。これは、仮想に割り当てるメモリを4GB程度にしても変わらない(メモリを2GBにすると、仮想上の Windows 10 の起動自体がかなり危うくて遅い)。あと、VMWare をサスペンドするときにもかなり遅い。これは、シーケンシャルな書き込みが HDD よりも SDカードのほうがずっと遅いことが原因である。Visual Studio の起動が遅いのは、おそらくスワップファイルの書き込みが大量発生しているからだろう。ビルド自体は問題ない(小さなファイルの書き込みなので)ので、スワップファイルのような大きなファイルの書き込みに遅さが際立つと思われる。

VMWare Player で作るファイルは一括ファイルと分割ファイルがあるのだが、SD カード上では「一括ファイル」じゃないと重くて動かない。どうやら、分割ファイルだと読み込みを遅い領域に入ってしまうらしく使い物にならない。

そんな訳で、SD カード時に仮想な Windows 10 を入れるのはちょっと大変、っぽいことが分かる。ちなみに、Windows 10 + Visual Studio + SQL Server + Excel の組み合わせだと、使用済みの容量が32GB 程度で収まる。先行きの Windows Update 等を考えても 64 GB あれば十分だろう。これが、小さめのノートPC(Surface も含む)に Visual Studio 入れられない理由でもある。Visual Studio Code ならばなんとかなるけど。

ラズパイの場合、Raspbian が SD カードに入るわけだが、Linux から大量書き込みが発生すると OS が重たくなるのはこの現象だろう。Linux の場合は、アクセス方法がちょっと違うかもしれないが。

あと、試しに Windows 7 で開発環境を SD カード上に作ってみたが、比較的 Winodws 10 よりも軽くなる。これは、Windows 10 が高速な SSD に最適化されているのだが、Windows 7 は低速な HDD に最適化されていた、からだろうと思う。HDD が遅めの場合は、あえて Windows 7 上に開発環境を構築するのも良いかもしれない。

QEMU で Windows の開発環境を動かせるか?

VMWare Player だと顧客PCに対して「インストール」が必要になるので、どの PC でも良い、という訳にはいかなくなる。そうなると、インストール不要な QEMU を使ったらいいんじゃないか?と思って考えてみた。

無料のWindows仮想マシンをQEMUで動かす – Qiita https://qiita.com/Hiroki_Kawakami/items/b18f6c50df4ce215e40d

ここの記事を参考にすると、qemu 上でも Winodws 10 を動かせそうな感じではあるんだが、どうなのか?と思って、VMWare で作成した vmdk を変換して使ってみたのだが…結論から言えば使い物にならなかった。

  • ゲスト OS の Windows 10 から、外部のサーバー等が見えない。
  • 何故か、ゲスト OS 内で何か操作(ビルドとか)をした後に、2回目の起動をすると無反応になってしまう。

外部サーバー見えない問題は、ネットワークがホストのPCしか参照できない仕組みになっているので、QEMU で Raspberry Pi をエミュレートする でやったように、-net nic –net tapi,ifname=TAP32 のようにブリッジ接続を設定すればよいはずなのだが、どうもこれを指定した時点で起動できなくなってしまう。また、なんか操作をしたあとに、もう一度立ち上げると、ハングアップしてしまうのは致命的だ。そのほかにもマウスポインタの位置がずれたままで操作できなくなってしまう。たぶん、ゲスト OS の相性の問題になるのだと思うけど、開発環境を残す意味として「途中でなんかの原因で立ち上がらなくなってしまう」のは非常に困るので、この件に関しては QEMU は却下する。

VMWare 上から CrystalDiskMark してみる

Windows 10 の場合
image

Windows 7の場合
image

USB 3.0のSDカード上にあるVMファイルを使って起動して、Windows 10/7 でベンチマークを取ってみる。驚いたことに、SSD へのアクセス並みにアクセススピードが出ている。これが本当にスピードが上がったのか、計算上だけの問題なのかはわからないが、ゲスト OS 内から見たら HDD アクセススピードは結構なスピードでアクセスできる(というように見えるだけ?)ということになる。

ただし、VMWare 外から見たアクセススピードは下記のように断然遅いので、サスペンドのときとかは十分注意する必要がある。

Toshiba UHS-I microSDXC 128GB + iBUFFALO USB 3.0 BSCR27U3BK
image

結論

そんな訳で、現在の私の開発環境からいくと、

  • 顧客サーバーに VMWare Player をインストールする
  • 顧客サーバーの HDD に仮想ファイル64GBを置いて使う

のが開発環境を顧客の環境で動かすときの最適値らしい。USB 3.0 にメモリを差しこんで、開発環境を別に作ることもできるが、必要な仮想HDDの容量が、64GB 程度で済むならばそれでいいだろう。逆に言えば、安価なノートPCに開発環境を作るとき、ストレージが64GB程度あれば、Visual Studio+SQL Serverなどを入れた .NETの開発環境が作れるというわけだ。32GB 程度しかストレージがないときは、食いつぶしてしまうので駄目。なんらかの形で、SD カードに追い出さないといけない。

安価なノートPCで、DockerとかをSDカードに追い出した場合はどうなるのだろう。他にも、QEMU な環境でも Linux の場合だったら比較的動くのかもしれない。これは後で試してみよう。

カテゴリー: 開発 パーマリンク