2015/05/19

Hyper-V 上の CentOS でコンソールサイズが過大になる

所用にて、Windows 8 で Hyper-V を実行、その上で CentOS 6 をインストールして使っていた。
CentOS は minimal でインストールしたため Xなしなのだが、カーネルがロードされ、 udev がメッセージを出しているあたりで唐突に画面サイズが非常に大きなものになってしまい、少々困っていた。

Hyper-V にて Linux を起動中、出だしはこのサイズなのだが...
起動途中にいきなりここまで大きくなってしまう
どうせ SSH でログインできればいいので、コンソールサイズなんて 800x600 程度でいいのだが、さてどうすれば直るやら...と調べたことのメモ。

結論から言うと、/etc/grub.confkernel= の行に 「video=hyperv_fb:800x600」と記載してリブート、が正解であった。CentOS 6 では統合サービス(IC)がカーネルに組み込み済みのため、適切なフレームバッファドライバとして hyperv_fb が使われる。そのパラメータとして 800x600 と書く、と言うことだ。
(なお、CentOSなど RHEL系では、/etc/grub.conf /boot/grub/menu.lst のシンボリックリンクだ)

検索してると見かけられる vga=771 などではコンソール解像度の拡大を防ぐことはできなかった。そこまで追いかけてはいないが、vga= というオプションを解釈するのはおそらく標準のコンソールドライバなのだろう。

video=hyperv_fb:800x600 を記載後、いったん電源を落として再起動
すると、800x600 サイズまでしか拡大しない
また、どこかで video=800x600 とすればいいような記載もあったが、これも今回は正しく動作しなかった。

5/20: 画像を取り直して追加

2015/05/13

Backdoor!!

ディスクの整理をしていたら、以前、VTCというコミュニティのイベントで話した VMware の VMwareTools と Hyper-V の統合サービスの実装についての話が発掘されたので、SlideShare にアップロードしておいた。

http://www.slideshare.net/tshiroyama/backdoor-vmwaretools

古い話だが、ここら辺の仕組みは現在でもさして変わらないだろう。
なお、PPTXでアップロードするとフォントがおかしくなるのでPDFでアップしたところ、背景の黒が抜けて真っ白になっている。読めなくはないのでそのままにしているが、読みにくい場合はダウンロードしていただければちゃんと背景が黒いPDFが手に入るので、そちらを見て欲しい。(や、フォントずれを探して直すのはさすがに面倒なので...)

対比としては、かなりまじめにハードウェアを再現しており、あまりこうした準仮想化的手法には頼らない VMware と、VMBus という架空のバスすら作ってしまうぐらい割り切ってしまった Hyper-V というのがかなり面白かったのを覚えている。

再現性と性能を両立させているだけあって、VMware の方が技術としては確かに 高いと言えるが、一方で自社のOS(Windows)はもとより、Linux ですらカーネルに仮想化専用の構成を突っ込んでしまって標準化させてしまった Hyper-V はそれはそれで面白いし、何より現実的と言える。

実際、WindowsServer 2008, 2008R2 以降であるならば、どちらで仮想化してもさして変わらないぐらいまではもってこれている。一方がベンチマークを公開する事に対してかなり厳しい姿勢を取っているのでなかなか適切な資料はないが、そうした最近のOSについては、性能についても優位性というのは言えなくなってきている。

聞くところによると、XBox One ではあのカトラーが開発に関わっており、仮想化環境上でゲームが動いているとか。チューニングはされているだろうし描画性能を稼ぐためのそれこそ特別な「バックドア」はあるのだろうが、もはや仮想化が性能に対してそこまでひどいインパクトを与えるものではない、という傍証にはなるかと思われる。

機会があれば最新のソースを引っ張ってどうなってきたかを読み比べてみたいものだ。

2015/05/12

(U)EFI と Mac と Fusion

先日の Windows7 でのシステムパーティションの話の続き。

Mac の場合は商用で販売されたすべての Intel Mac が EFIをファームウェアとしているため必ずこの領域が存在する。かつては100MB程度だったが、現在では 200MB程度を確保しているようだ。一部に、「Macで使ったディスクだと先頭に隠しパーティションがある」と言われているが、別に Mac に限らず、上記のように UEFI を使用した Windows でも作成される。

(U)EFIの実装自体にも 32bit, 64bit の二通りがある。たとえば初期の Intel Mac では 32bit EFI が使われている。32bit EFI の Mac は 64bit Kernel をブートできない。このため、サポートされる OS Xのバージョンは最大でも 10.7 Lion までとなる。
(10.8 Mountain Lion, 10.9 Marvericks, 10.10 Yosemite は 64bit kernel のみ。余談だが 10.6 Snow Leopard と 10.7 だけが 32/64bit 両対応の Kernel で 10.5 Leopard は 32bit Kernel しか存在しない。)

Windows の場合、32bit Windows は PC-BIOS で、64bit Windows から UEFI サポートが入るというのが原則となる。マイクロソフトの記事(日本語で情報が古い英語で最新)によると

  • 64bit で UEFIをサポート、ただしCSM必須
    • Windows 7
    • Windows Vista SP1
    • Windows Server 2008
    • Windows Server 2008 R2

  • 32bit/64bit 双方で UEFIをサポート
    • Windows 8
    • Windows 8.1
    • Windows Server 2012
    • Windows Server 2012 R2

となる。なお、セキュアブート UEFI 2.3.1(エラッタC対応)以降が必要になる。

また、64bit UEFI だけをファームウェアとする PC では 64bit Windows しか起動できない。( 当たり前の事だが 32bit CPU の PC では 64bit の Windows は起動できない )

64bit CPUをもつ PC でも、PC-BIOS をファームウェアとする場合は 32bit Windows が利用できる。

また、UEFI には CSM (Compatibility Support Module)という、UEFI でブートした後に PC-BIOS をエミュレーションするモジュールが定義されているが、これをサポートしている場合は、CSM経由で 32bit Windows を起動する事ができる。

ややこしいのは、Windows 7, 2008R2 など上段の4つのOSは「CSMが必須」であることだ。
これは、Windows 7, 2008 R2 などは起動処理中に INT10H を使ったビデオBIOSを使って画面描画を行うためだ。そう、Windows のロゴやらは旧来のPC-BIOSのもってたビデオBIOSで描画されている。
CSMを持たない UEFI をファームウェアとする PC の場合、INT10Hを処理できないので Windows 7 や 2008 R2 をインストールする事はできない。
なお、CSMをもたない UEFI は「Class 3」と呼ばれており、CSM をもつ UEFI を「Class 2」とよんで区別している。


VMware Fusion 7 では、32bit OSをゲストOSとして指定して仮想マシンを作成しても、一般的な 64bitOS を指定して仮想マシンを作成しても、PC-BIOSをファームウェアとした仮想マシンが作成される。
例外としては、OS XをゲストOSとして指定した場合だ。この場合は、32bit でも 64bit でも EFIをファームウェアとして構成される。
DTKの話で話したように、まっとうな OS X は EFIからしかブートできないからだ。


では、EFIで Windows がインストールできないかというと、そういうわけではない。
VMware Workstation と異なり、VMware Fusion にはファームウェアの BIOSかEFIかを設定する UI はない。が、.vmx ファイルに
firmware="efi"
を追記する事で、EFI をファームウェアとした仮想マシンを起動する事はできる。
(あるいは、ゲストOSをわざと OS X としてもいい)

実際に Windows 8.1 64bit をインストールしてみたが、ごく普通に動作した。

EFIを有効にしてインストールした場合
システム情報のBIOSモードがUEFIになる

普通にインストールした場合
PC-BIOSが有効になり、BIOSモードも「レガシ」となる


2015/04/29

DTK のこと。

たまたま別の事を調べていたときに、「Mac on PC(笑)」なるエントリを見かけて、ああ、もう DTK の事は忘却の彼方なのね、と思ったので少々昔話を残しておく。

なぜなら、先の記事には

『残念ながらVirtualBoxで読み込んで動きませんでしたが、
これを作ったハッカーの人々はすごいものです。』

とあるが、そんなものではなく単に DTK から盗みだしたものだから、っていうのが答えだからだ。

当時 Apple は PowerPC をCPUとする Mac を販売しており、OS X というOS もその上で動くアプリケーションも PowerPC 向けにビルドされていた。

WWDC 2005 にて、 Apple は Intel CPU への移行を宣言、CPUアーキテクチャの変更を強行、成功裏に終わらせたのは知っての通りだ。
( NeXT屋としては Intel Transition は2度目で、「またか」って気分になったのだが...さておき )

円滑な移行の支援のため、 Apple は開発者向けに Intel CPU 搭載の Mac を先行配布をおこなった、これが DTK、 Developer Transition Kit だ。
申し込みは先の WWDC2005 で行われており、その場にいたので申し込むかかなり迷ったのだが、有償(たしか$1000ほど)で、かつ「貸与」で返却が必要だった事からあきらめた記憶がある。
後に、DTKは Intel CPU を搭載した初代 iMac 17inch と無償交換となった。このマシンは $1299 で販売されたので、DTKを申し込んだ方が得だったのだが...まあ、それも後から見ての話。

さて、このDTKだが、実は後の Intel Mac とはアーキテクチャが大きく異なっていた。

Intel Mac は初代が Core Duo, 二代目以降が Core2 Duo で、インテルCoreアーキテクチャを採用した、Core世代前提のハードウェアとなっている。
( 厳密に言うなら、初代の Core Duo 、すなわち Yonah は Coreアーキテクチャではなく、Snow Leopard(10.6.x)までしかサポートされないとか、その次もしばらくは 32bit EFI の制約があり 64bit Kernel オンリーになった Mountain Lion (10.7.x)に移行できない、など移行期のごたごたがあり、ハードウェアが固まったのは 2008年頃からではあるが。)

DTK の Mac は、PowerMac G5 の巨大なアルミ筐体の中に Pentium4 をCPUとする普通のPCのマザーボードを突っ込んだという、なんとも強引なものだった。

そう、この DTK は、EFI ではなく、PC-BIOS をファームウェアとしているのだ。

DTK Mac の貴重な写真がこちらにあるので、見ていただければと思う。


正式にリリースされた Intel CPU向け OS X は EFIでしか起動せず、さらに HFS Plus を読み込める必要がある。なぜなら、OS X のブートローダは EFIシステムパーティションだけにあるとは限らず、HFS Plus のファイルシステム中にもあるからだ。(/System/Library/CoreServices/boot.efi 。むしろこちらがデフォルトか。)

Apple は Mac に搭載した EFI には HFS Plus 向けのドライバーを搭載しているが、普通の EFI にはその手のドライバーは搭載されていない。
(なお、EFI に HFS Plus ドライバを加える事自体は悪い事ではない。EFI はその名の通り拡張可能なファームウェアであり、そうしたベンダーごと必要な機能を加えやすいことが特徴だからだ。ただ、boot.efi とを ファームウェアにも EFIシステムパーティションにも配置しなかった事については行儀がよくないなぁとは思うが。)

しかし、DTKは普通のPCであるため、通常のBIOSからのブートローダを保持していた。

これは Darwin の一部としても配布されていた。Darwin 単体での配布はこれまた 2005年頃に終了しているが、Intel PC上で動作させるため、BIOSからのブートローダを持っていたのだ。


ここまででおわかりだろう、普通のPCで動作する OS X 10.4.x がなぜ存在するか、それは 当時の Darwin のソースコードからブートローダを持ってきたか、あるいは DTK のブートローダをコピーしたか、なのだ。


余談。

なお、この DTK、ハードウェアだけではなく搭載されていた OS X にもいろいろ違いが見られる。
顕著な点としてはメモリマップがあげられる。DTKに搭載されていた OS X 10.4 では仮想メモリのアドレス空間が 1G/3G に分割されていた。32bit の Linux や /3G スイッチを有効にした 32bit の Windows と同じく、プロセスに割り当てられる 4GBの仮想メモリのうち、プロセスが本当に扱う事ができるのは 3G までで、残り1GBはカーネルに固定的に割り当てられていた。

※ 仮想メモリのアドレス空間とは、要するに「アプリから見えるメモリ構成」であり、それに対して物理メモリのアドレス空間は、「実際のメモリとか、PCIバスのデバイスがどこのアドレスに割り当てられているか」を意味する。

別に仮想メモリの 4GB全てをユーザ空間に割り当てる事も不可能ではないのだが、すると、システムコールを発行しカーネルに処理が写る瞬間に、4GBの仮想メモリのレイアウト(実際にどこの物理メモリと対応づけられているか)が全て入れ替わる。システムコールの引数など、ユーザ空間にあるメモリ内容を参照するにはいったんそれをカーネル側の4GBのメモリ空間にコピーする必要があり、システムコールごとの手間がかかるし、何よりメモリマップをごっそり変えてしまうと、CPUのTLBが全て無効化され、メモリのアクセス性能ががたんと落ちてしまう。プロセス切り替えである程度TLBが吹っ飛ぶのは仕方ないとしても、システムコールごとに吹っ飛ばされてはたまったものではないだろう。

※ TLBとは、要するに仮想メモリと物理メモリの対応付けのキャッシュである。歩かそうメモリの内容が、実際に物理のメモリのどこに配置されているかはメモリ上に対応表が存在し、これを参照するが、対応表自体が非常に大きいため、TLBでキャッシュをかけて速度を稼いでいる訳だ。

そこで、32bit のメジャーなOSは、仮想メモリ空間のうち、上位(大きい方から)1GBをカーネル空間に割り当て、残り3GBをユーザ空間に割り当てている。システムコールを発行してカーネル側に処理が切り替わっても、仮想メモリ上の配置は変わらない。TLB が吹っ飛ぶ事もないし、カーネル側からは3GBのユーザ空間を自由にアクセスできるので、システムコールごとの情報の受け渡しも楽になる。

※ もちろんCPUが実行するプロセスが切り替わるとTLBの内容は吹っ飛ぶが、その場合でもカーネルの1GBは共通のため全滅にはならない

その代わり、アプリケーションから見ると上位1GBは「アクセス禁止」となり、3GBまでのメモリしか使えない。

/3G スイッチを入れて起動していない、通常の 32bit Windows の場合は、2G:2Gで分けられており、ユーザプロセスは2GBまでのメモリしか使えず、さらに窮屈な思いになる。
1GBでも貴重なため解放したのが /3G スイッチであり、またアクセスできる 3GBのアドレス空間中の一部を必要に応じて差し替えることで、3GB以上のメモリを使えるようにする、PAE という拡張も用意された。
(要はバンクメモリとかEMSと同じ発想ですよ、PAEって...。 )


ところが、2006年に実際にリリースされた OS Xでは、4G:4G になっている。
そう、ユーザプロセスは4GBの仮想メモリのアドレス空間がほぼ全て使える。最上位 2MBだけはカーネル空間とされ、トラップテーブルなどが用意されている。

こうなったということ自体は Apple の開発者から説明を受けたが、なぜそうしたかの理由はされなかった。おそらく、次に書くように部分的な 64bit 対応がすぐそこに迫っていたため、そちらで解決されるという見込みだったのだろう。

素人考えではその後に出てきた初代 iMac より DTKのアーキテクチャの方がTLBが吹っ飛ばない分性能が良さそうに感じるが、「そんなことよりデバイスドライバのデキの方が性能に影響するだろ」とか、「Pentium4 で動かしても仕方ないだろ」で、さして速度差はなかったかもしれない。

どちらにせよ、$1000に迷って DTKに手を出さなかったのは未だにちょっとした後悔にはなってます、ええ。


● さらに余談

先の完全32bit の OS X は、実は CoreDuo を搭載した初代 Intel Mac でしか起こりえない。

二世代目の、Core2 Duo を搭載した Intel Mac は Intel64(EM64T)対応で、64bitアーキテクチャだったからだ。

Apple はそこに目をつけ、32bit カーネルだが、一部を 64bit で動作させ、(物理、仮想ともに)4GBのメモリ制限を回避するなどの荒技に出たのだ。

OS X のブートローダは CPU が Intel64(EM64T とか x86_64 か呼ばれる)を検出すると、IA-32e モードに切り替えた後に、32bit のカーネルを起動する。

IA-32e モードでは「互換モード」と「ロングモード」の二つのモードがあり、互換モードでは従来の x86のコードのほとんどを動作させる事ができ、ロングモードでは64bit のコードを実行する事ができる。IA-32eモードにさえ切り替えておけば、この二つのモードは高速に切り替える事ができる。

Apple はこの点に注目し、カーネルのほとんどの部分とデバイスドライバは 32bit で動作させつつ、メモリ管理と先のトランポリン部分は 64bit で動かすようにした。

さて、32bitアプリケーションはユーザ空間で 4GB(-2MB)の仮想メモリを使う事ができる。システムコールを発した瞬間に、カーネルに処理を切り替えると同時にロングモードに切り替えが行われる。すると、64bit の仮想メモリのアドレス空間に切り替わる。これまで先頭4GBしか見えてなかったのが、いきなり広がる訳だ。
膨大なメモリ空間の最上位512GB がトランポリンとなり、ここでロングモードのまま必要な処理を行った後に、互換モードに切り替え 32bit のカーネル空間に飛び込む。

また、OS X では 32bit カーネルでも 64bitアプリケーションを実行する事ができた。
(10.4 では Libc など一部の非GUIライブラリまでが 64bit に対応、10.5 で Cocoa/Carbon などGUIを含むフレームワークが 64bit 対応して、64bit アプリケーションが利用可能となった)

64bitアプリケーションの場合、ユーザ空間上のアプリケーションは64bitの仮想メモリ空間中、128TB(-4GB)までの仮想メモリを扱う事ができる。128TB以上は予約空間とされ、アクセスできない。また、32bit プロセスで使われていた 下位4GBのメモリは「Page0」とされ、すべて0で埋め尽くされ使えないメモリ空間、ということにされている。こちらもアクセスできない、したらSEGVとなる。

※ なぜ128TBとかというと、実際の Intel64 では、64bitモードでも物理アドレスが40〜52bit、仮想アドレスも48bit に制限されている。そしてこの仮想メモリ48bit、つまり 256TBのメモリ空間は連続ではなく、上位128TBと下位128TBが利用可能となっている。将来的に 56bit〜64bit のメモリ空間が利用可能に拡張されたときにも、問題がないようにあえて真ん中に利用禁止区間を作っている訳だ。な訳で、アドレスとしては 64bit で、うち下位128TBがユーザ用、上位128TBがカーネル用と想定されている。

そして、システムコールを呼ぶと、64bit アドレス空間で最上位から 512GBの空間のトランポリンに処理がうつるまでは 32bitアプリと同じ。ただし、このときに互換モードからロングモードへの切り替わりが必要ないのでその点は効率がよくなる。
そこから処理が進むと、互換モードに切り替わり、下位4GBのアドレス空間に存在する 32bitカーネルに処理が飛び込む。

これによって、初代 Intel Mac は物理的な制約もあり 2GB〜3GBしかメモリが搭載できなかったのが、2006年頃の Mac では 16GBまで搭載できるのが現れ、2008年には 64GBまで搭載可能となってきた。
※ Intel64 自体は 52bit までの物理アドレスに対応しているが、初期のCPUでは 40bit で1TBまでのメモリしか対応してなかった。これは少しずつ拡張されてきており、たとえば現在の Xeon E7 v2 2800/4800/8800 では 46bit のアドレッシングに対応、つまり 64TB までは使えるようになっている。

このような阿漕な事をしない、言い換えれば素直な設計とも言える Windows や Linux では、(PAE を使わない限り) 4GBまでの物理アドレス空間しか扱えず、そこからPCIバスのマップなどハードウェア側の予約分(512MB)をさっ引いた、3.6GB 程度しかRAMを搭載できない。
※ PAEでのメモリ管理の方法と、Intel64 での管理の方法は互換性があり、互換モードでPAE対応のアプリケーションを使って 4GB以上のメモリを使う、と言う事もできる。

より多くのメモリを利用するためにも、64bit対応の Windows が必要になった訳だ。
64bit の Windows は IA-32eモードで起動、通常はロングモードで実行しつつ、アプリケーションの実行に関しては互換モードを利用する。その間 Win32APIの呼び出しなどについては、Wow64という仕組みで対応している。


...単に、DTKと PC-BIOS, EFi の話をするだけのつもりが、余談が非常に長くなってしまった...。

2015/04/10

Windows7 でシステムパーティションを削除する

32bit のWindows7 を通常の手順でインストールすると、100MBのパーティションが起動ディスクの先頭に用意される。

このパーティションはシステムパーティションと呼ばれており、マイクロソフトのページにその概要が記載されている。
UNIX的な感覚からするとちょっと違和感を感じるかも知れないが、起動時にのみ参照されるこのパーティションが「システムパーティション」であり、いわゆる C:ドライブは「ブートパーティション」と呼ばれている。

このパーティションにはブートローダやその設定などが格納されており、システム保護の観点からドライブ名もつけられず、GUIからは削除できないようになっている。また、BitLocker を使う際にはそのためのモジュールもここに格納される。BitLocker を使う場合、このシステムパーティションの存在は必須と言える。

さて、仮想環境上ではTPMが使えない兼ね合いから BitLocker を使うのは現実的ではない。
(使えなくはない。たとえばこのページを参照。)
Fusion や Workstation で1台2台をセットアップするなら別にどうでもいいが、Horizon View などで何十台何百台と Windows が実行される場合、100MBとはいえ決して馬鹿にできない浪費になるだろう。

では、このシステムパーティションなしのインストールができるのか?というと、これは可能だ。これもまた、マイクロソフトのページに記載されている。
手順としては以下の通り

  1. Windows7 のメディアで起動􏰀
  2. 最初の画面で SHIFT-F10 を押し、コマンドプロンプトを表示􏰀
  3. diskpart コマンドを起動、1パーティションでパーティションテーブルを作成
  4. コマンドラインを終了􏰀
  5. インストール時に作成したパーティションを指定􏰀


Windows7 のインストーラの画面で SHIFT-F10 を押すと、下図のようにコマンドプロンプトが表示される。

ここで、diskpart コマンドを実行し、先にパーティションを作ってしまうのだ。


その後、exit コマンドを実行し、インストーラに戻り、インストールを継続する。
通常の新規ディスクの場合、インストール先の選択が「ディスク0 未割り当て領域」となっているのだが、すでにパーティションが作成されているのでその代わりに「ディスク0 パーティション1」が選択しに現れる。

あとはインストールを続行する。
結果、下図のように全体で1ドライブとなる。

ここで作成されたシステムパーティションなしの 32bit Windows7 をHorizon View の ViewComposer でリンククローンで展開したが、全く問題なく利用できている。

シンディスクの場合、システムパーティションのほとんどは未使用のため実ディスク領域は割り当てられない、このため、別にあってもなくてもディスク消費に大差はない。しかしシックディスクでフルクローンの場合は、これで1仮想マシンごと100MBが回収できる。決して馬鹿にできない差異になるだろう。

● 64bit Windows7 ではどうなるか?

なお、64bit Windows7 の場合、以下のようになる。


NTFSのシステムパーティションではなく、FAT32の「UEFIシステムパーティション(ESP: EFI System Pertition)」になる。
これは UEFI で定義された領域で、(U)EFI を使用するコンピュータでは必ず作成される。
その代わりに Windowsによるシステムパーティションは作成されない。UEFI システムパーティションがその代わりとなり、BitLocker のモジュールなどが導入されるためだ。


UEFI 周りについては、また別途説明する。


2015/04/05

pvSCSI で性能が上がるか?

どこぞの話で突っ込みを入れたときに調べた事を書いておく。

pvSCSI とは vSphere のディスクIOに対する準仮想化ドライバの事で、vSphere がサポートする一部のOSにて利用できる。どのOSで利用できるかは KB 1010398 を参照してほしい。

さて、そこの話、端的に言えば「pvSCSI も LSI Logic もIOPS変わんない」と、暗に pvSCSI を使えないと示唆するようなことだった。

そう、よく勘違いされるが pvSCSI は (vmxnet3 も) ただ「IO性能を上げるもの」ではない。これは pvSCSI の出始めに発表された、このホワイトペーパーを見ればわかる。

英文を読まずとも表だけ見れば LSI Logic と pvSCSI で性能差がほとんどない事に気がつく。
一方、差が出ているのは「CPIO」と呼ばれる項目だ。ドキュメント中に説明があるがこれは「a unit of cycles per I/O」、すなわちそのIOの間にどれだけ CPUが消費されたか、になる。

考えてみれば当たり前の話だ。pvSCSI でも LSI Logic でも、仮想環境上のメモリに存在するデータを、VMkernel に渡して実際のストレージIOにする部分に大きな差はない。異なるのはそのためにLSI Logic という実際のハードウェアの手順をエミュレートするのか、そういう細かいところを省くか、だけになる。LSI Logic のデバイスドライバをそのまま使えるようにするという手間が省ける分、CPUサイクルが削減され、CPU負荷が下がる、というのが pvSCSI の本質だ。

結果として IOしている間のCPU負荷が下がる。

これは IOPS をはかるベンチマークではあまり意味をなさないが、CPUがそれだけあいているという事はアプリケーションがさらに演算を行ったり、pvSCSI以外のデバイスに対するIOを行うだけの余地が増える。ワークロードのスループット全体を見れば、向上が行われる、という次第だ。

ベンチマークの結果値だけを見ているとこうした事はわからない。
数字の多寡を気にするのではなく、システム全体を俯瞰し、それがどういう位置づけになるかを忘れない事だ。








2015/03/12

アップグレードしたOSはカスタマイズできない

所用があり WindowsServer 2012 R2 をいくつかテンプレートから展開していたのだが、カスタマイズ仕様で指定した設定がなされていないことに気がついた。

該当のマシンにログオンし、 sysprep のログを見たところ、以下のメッセージが表示されていた。なお、sysprep のログについてはこちらのKBに記載がある。
[0x0f0036] SYSPRP spopk.dll:: Sysprep will not run on an upgraded OS. You can only run Sysprep on a custom (clean) install version of Windows.
...ああ、なるほど。このテンプレート、そもそもは WindowsServer 2012 で、R2 を後から適用したため「アップグレード」となってしまったわけだ。2012 を展開する用がなかったのでそのことをすっかり失念していた。

対処としては二つある。一つは、素直にOSを新規インストールし直すことだ。
今回はこちらを採用した。理由は簡単で、Windows.old が残っており、削除がやっかいで、そのうえ肥大した VMDK の領域回収を考えると、時間はかかるがほったらかしておけば終わる入れ直しの方が楽だったからだ。

もう一つは、アップグレードであるというフラグをつぶしてしまうことだ。
詳細はこちらのページなどを参照してほしい。

レジストリを操作するだけなので時間は短くて済む。
しかし、そもそもなぜアップグレードしたOSだと sysprep を拒否するようになってるかがわからないので、後々で面倒を抱えたくないというのもあり、この手を取らなかった。