ラベル Mac の投稿を表示しています。 すべての投稿を表示
ラベル Mac の投稿を表示しています。 すべての投稿を表示

2017/12/16

esxtop のご乱心とその対処法について

vSphere の管理をしていると、vSphere Client などGUIからではらちがあかず、SSH でログオンして様々なコマンドで状況を確認、解消する事もよく出てきます。

特にパフォーマンス問題で力を発揮するのが esxtop コマンドです。Linux, UNIX の top コマンドのように仮想マシンや関連プロセスの稼働状況、IOの状況を表示、定期的に更新してくれる優れものです。
esxtop : とくにパフォーマンス問題で無くてはならない管理者の友です
ただ、様々な端末を使っていると、ときにこの esxtop の表示が乱れたり、vi や less が下記の画像のような表示をして正しくスクロールしてくれなくなる事があります。
esxtop ご乱心!

terminal is not fully functional のメッセージ
リターンを押すと一応表示されるが、若干挙動がおかしくなる

これはどうしてかを簡単に調べてみました。

● 端末画面制御

esxtop や vi, less といったコマンドの特徴は、ただ出力のテキストを垂れ流すのではなく、画面の任意の位置を書き換え、適切なところに表示を行おうとする、事です。こうした端末画面の制御のためのデータベースとして、termcap と terminfo があります。とか言うと何故画面制御にデータベースが関係する? となりますが、これはUNIXと「端末」の歴史にもつながってきます。

60年代やそれ以前、極めて初期のコンピュータでは出力は「紙」でした。プログラムからの出力は紙に印字されて出力されていました。その後にブラウン管への出力に移っていきましたが、ごく初期のブラウン管の出力とキーボードなどの入力の組み合わせた機械、すなわち「端末」(Terminal)では、やはり出力をそのまま、左から右、上から下へだだっと垂れ流すしかできませんでした。これを「ダム端末」と呼ばれてました。dumb=馬鹿とかのろまとかという意味で、まあシリアルケーブルなどを通じて送られてきたデータをただ垂れ流し表示するだけ、なんの能もないからそういう名前になったようです。

少し時代が経つと、少し賢い端末がでてきました。ダム端末に対してこれらは「インテリジェント端末」とも呼ばれました。インテリジェント端末の定義は時代により様々ですが、出始めの場合、文字に色がつけれる、Tektronixと言う会社の端末のように グラフィックの表示機能を備えたものとかがインテリジェント端末と呼ばれました。
(後にはパソコンベースの端末でローカルでのアプリケーションの実行やそれとホストとの連携ができるもの、などがインテリジェント端末と呼ばれるそうですが、私はこの頃はよく知りません。)

インテリジェント端末の時代になってただ出されたテキストを垂れ流しで表示するのではなく、文字の色を変えたり、画面の任意の位置にカーソルを動かして「左から右、上から下」ではない順序での表示が可能になりました。

このような画面の操作を行うのにつかわれたのが「エスケープシーケンス」などと呼ばれる一連のテキストです。これは出力のテキストに混ぜて送られ、送られた文字をただ表示するのではなく、その文字列が指示する動き、例えば次の文字を赤く表示する、カーソルの位置を上から20左から30に移動させる、を実施しました。ちょうどHTMLのタグみたいなものです。この一連のコードはエスケープ(0x1B)を先頭にする場合が多かったこともありエスケープシーケンスと呼ばれました。

エスケープシーケンスは後にISOの共通規格にもなりましたが、問題は、インテリジェント端末の出始めは必ずしも端末のエスケープシーケンスが同じ、ではありませんでした。ホスト上で動くソフトウェア、例えば vi とか esxtop、が次はカーソルを左上に動かして強調文字で「ABC」と書きたい、とか思っても、端末ごとに送るエスケープシーケンスは異なる、端末ごとにアプリ側で対応が必要となりました。ホストに繋ぐ端末機器を変えるたびにアプリ側の設定変更(あるいはコードの修正)が必要になりました。

これは不便だと登場したのが BSD UNIX の「termcap」というデータベースです。/etc/termcap というファイルに、端末ごとのエスケープシーケンス、カーソルを上に動かす時はこう、色を変える時はこう、っという定義を記載、環境変数 TERM によりどの端末の種類かを定義、esxtop のようなアプリケーションはTERMの端末種別を元に termcap から適切なエスケープシーケンスを読み出し、適切な操作ができるようになりました。
環境変数TERM
SystemV では terminfo というほぼ同じ仕組みが作られました。termcap との違いは「termcap はテキストで人が読める」「terminfo はテキストの定義を元にバイナリに変換、アプリからの読み込みが手っ取り早い」と、まあその程度です。

なお、いまどきの Linux, UNIX では terminfo の方を使うのが一般的となってます。

Windows の TeraTerm Pro や Putty といったソフトウェアは、SSH や TELNET といったプロトコルで通信する機能を提供する一方、エスケープシーケンスを解釈し適切な表示を行う「端末」の役割も果たしてます。このため端末エミュレータとも呼ばれます。分かりやすいのは macOS の「ターミナル」や Ubuntu Linux などのターミナルアプリで、これらは「端末」としての表示のみを担当、SSH での通信は ssh コマンド、TELNET での通信は telnet コマンド、が担当しております。

余談ですが Windows 8 から 10 にかけて、ウィンドウズのコマンドプロンプトウィンドウもかなり機能強化されましたが、その一つとして端末エミュレータとしての機能強化もあります。マイクロソフト自身が OpenSSH を移植、Windows10 への標準搭載化を進めていますので、端末エミュレータとしての機能の受け皿が必要になった、というのもあります。

閑話休題、ともあれ termcap ないしは terminfo というデータベースを通じて端末の形式から正しいエスケープシーケンスを調べだし、適切な画面の制御ができるようになっている、というのが Linux, UNIX の端末画面制御になります。

なお、terminfo の情報は通常、/usr/share/terminfo 以下にあります。コンピュータの処理能力が非力だった時代からあるため、負荷軽減と検索の高速化のため、terminfo フォルダの下にサブフォルダを作成、1ファイル1端末種別 でファイルが格納されています。
macOS 10.12.6 Sierra での terminfo の設定ファイル数
1ファイル=1端末種別のため、約2600の端末機器に対応...ほとんどは使われないと思うけど。
macOS の場合、terminfo 以下には 2563ファイル存在、つまり 2563種類の端末に対応しています。

また、「ターミナル」アプリケーションでは、以下画面の10種類の端末形式に対応しております。
Mac の場合、ターミナルアプリのプロファイルにて、
プロファイルごとにどの端末の種別かを設定できる

vt100 はハードウェアだった端末でのデファクトスタンダードで、vt100互換、つまりvt100と同じエスケープシーケンスを受け付ける端末ハードウェアが多かったと伺っております。また、xterm は X Window System に付属のターミナルソフトで、rxvt は xterm を元に軽量化させたもので、一時期 流行ってたのを記憶しております。
( なお、私は NeXT(標準ターミナルアプリケーション) -> UX/OS(kterm) という流れで以降は Mac か Windows を端末に Solaris や Linux にリモートアクセスなので、xterm を少々使った事があるぐらいです。)

大まかに有名どころの端末のエスケープシーケンスに対応していると言えます。
この「ターミナルの宣言方法」を切り替えてから新規ターミナルウィンドウを開くと、環境変数TERMはその値に設定され、そして若干挙動がかわります。例えば、vt100 と xterm でそれぞれ less を実行、終了すると分かりやすいと思います。


● ESXi の端末情報データベース

さて、ようやく本題です。
ESXi Shell の環境も概ね Linux, UNIXの仕組みを継承しています。画面制御については実は terminfo を使っています。ではどれだけの端末の種類に対応してるでしょうか...。

ESXi Shell 環境での端末の種別。5行、すなわち5ファイルで、5端末種別、だけ...。
はい。たった5種類の端末にしか対応していません。内訳を見ると、screen, xterm, ansi, linux, vt102 です。screen は端末切り替えソフトの screen を使用の際に使われるもの、linux は Linux 起動時のコンソールで利用される端末の種別で、実際、コンソールでの ESXi Shell では環境変数TERM は linux に定義されています。
ローカルコンソールでの ESXi Shell
環境変数が linux になってるのが分かる
つまり、ssh接続などで一般的に使われる端末エミュレータとしては、xterm か vt102 しか対応していない、といえます。
Mac のターミナルアプリケーションのデフォルトの端末種別は「xterm-256color」です。ssh コマンドはデフォルトでローカルの環境変数TERMをリモートにも伝えてくれます。つまり ESXi にログインした場合、環境変数 TERM は xterm-256color が設定されますが、これは ESXi 側の terminfo に存在しない端末種別のため、esxtop のように画面制御ができずダム端末のようにテキストを流し込んでくるか、冒頭の less のように「制御できないけど、いい?」って聞いてくるようになります。

● どう対処すべきか

このような問題が生じている場合、簡単なのは送付する環境変数TERM を変えてしまうと言う事です。
例えば、以下のように env コマンドで環境変数TERMを xterm に変更後 ssh コマンドを実行すると、ESXi 側では xterm-256color ではなく xterm として扱ってくれます。

env コマンドで環境変数TERMを再設定してから ssh
結果、再設定したTERMの値が伝えられる
xterm-256color と xterm は、色に関するエスケープシーケンスが違うだけで互換性がありますので、このような無茶も通ります。

あとは、そもそも端末エミュレータ側の端末種別を xterm か  vt102 に設定してしまう、というのもあります。

この手の問題をググると、「だったら terminfo に設定追加すれば良いじゃん」的な答えが散見されますが、残念ながら ESXi Shell の環境には tic コマンド(terminfo でテキストの設定からバイナリの設定にコンパイルするコマンド)が存在しないので、やるとすると少々面倒です。また、ESXi Shell 環境というかあのファイルシステムにあまり独自のファイルを置くのはあまり推奨されません。やるなら tardisk とか ramdisk の仕組みをよく調べて、ESXi の動き、何処のファイルが温存されどれが消えうるかを確認、これらの意味をよく分かった上で実施すると良いでしょう。

ともあれ、vSphere の管理者にとって esxtop が使えない環境は最悪です。環境変数TERMをうまく扱う事でそんな環境はなくしていきましょう。


最後に、個人的な感想ですが、「いや、vt100互換が実際には vt102互換である事ぐらいは知ってるけどさ、何も馬鹿正直に vt102 だけを置いて vt100 を置かないってのもないんじゃねえの?」とか思いましたよ、ええ。


2017/04/06

【余談】Hammerspoon に移行

手元の Mac の OSをアップデートしたら Karabiner が利用できなくなってしまった。
どうも  macOS Sierra に非対応のとのこと。Karabiner はカーネルにモジュール(KEXT)を読み込ませ、カーネル内部のキーイベントを操作することでキーバインドの変更を実現している模様だが、そのためカーネルの変更に弱い面がある。

一方の Apple はセキュリティ面やOSの安定稼働の面から、KEXT による拡張を抑制する方向にある。Microsoft も 64bit 移行やOSのアップグレードの機会を通じて電子署名されていないデバイスドライバはロードできないようにしているし、iOS のようなモバイルデバイスのOSでは、もはやカーネルにモジュールを追加することすら不可能になっている。

幸い、Karabiner では Karabiner Elements という新しいキーリマップソフトウェアを開発、そこから従来の Karabiner の機能を追加していく形で刷新するようで、これは期待が持たれる。とはいえ、一からの作り直しなのでしばらくは Karabiner なしの生活に耐えなければならないようだ。

私が Karabiner を使ってる理由は、実のところ「Microsoft Office で Emacs キーバインド(のサブセット)が使いたい」 につきる。Karabiner Elements では現在のところアプリケーションごとのキーマップというのは実装されてないので、これは対応できないことになる。

いい加減 面倒になってきたので色々探して試した結果、Hammerspoon を利用することに落ち着いた。Hammerspoon はキー入力などのイベントを Lua という言語を使ってカスタマイズするもので、単なるキーリマップ以上の操作もできるようだ。
また、Accessibility API を通じてキーイベントを取得、操作を行う。公式のAPI を通しているため、OSのアップデートによる影響も(KEXTを使うのに比べると)低い訳だ。

Hammerspoon は ~/.hammerspoon/init.lua というスクリプトを読み、これに応じて処理をおこなう。私のスクリプトは以下の通りだ。

詳細は、この gist のコメントを見てほしい。

2016/01/31

Fusion でリカバリモードで起動する

VMware Fusion 上の OS X でリカバリモードでの再起動をおこなう場合だが、KBによると実機のOS Xと同じく、起動画面で Command-R を押すといいとある。

しかし、実際に試すとこれがなかなかうまくいかない。VMware の提供する EFIの BootManager が表示されてしまう。もっと確実に起動できる手順はないか、ということで行ったのが次の方法だ。

まず、EFI の BootManager を表示させる。これは、Command-R を押しながら起動して失敗した場合でもいいし、「ファームウェアをパワーオン」を使ってもいい。


ここで、「Enter Setup」を選択する


次の画面で「Configure Boot Option」を選択する


さらに、「Add Boot Option」を選択する

3番目に「Recovery HD」があるはずなので、これを選択する。
なお、OS X をインストールすると三つのパーティションが作られる。一つが EFI システム領域、一つが OS X そのもののインストール領域、そして最後が Recovery HD だ。

選択したパーティション内のファイル一覧が表示される。


ここでは、<com.apple.recovery.boot> フォルダを選択


し、その中の「boot.efi」を選択する。

boot.efi を使った起動の設定画面が表示されるので、「Input the description」を選択、この設定の名前を入力する。ここでは、「Recovery HD」とした。


その後、下の Commit changes and exit を選択し、元のメニューに戻る。


さらに、Exit the Boot Maintenance Manager を選択、元の起動メニューに戻る。


すると、先ほど作った「Recovery HD」がメニューに増えているのでこれを選択する。

後は起動を待つだけだ。
起動に時間がかかるので待つべし

起動してしまえば、実機のリカバリモードと同じように使用できる。


なお、二度目からはメニューに登録されているので、単に「ファームウェアをパワーオン」を選択、Recovery HD を選ぶだけになる。

【余談】メモリ解放とかメモリ最適化という迷信

OS X のメモリ管理は十分に近代化されており、アプリケーションに対して最適な配置をし、IOの性能確保にディスクキャッシュを行い、アクセス頻度の低い部分を圧縮したり、ディスクに書き出して解放したりを自動的に行う。

非常に端的に言って、性能を持つためにユーザが何か操作する必要はない。まったくない。ほっておけば自動的に行われる。

しかし、OS X のリリース以来、メモリの最適化とかメモリ解放などの操作や、それを行うアプリケーションが取りざたされてきた。定量的な性能評価もなくただ印象で「速くなった」って感想と共に、ね。

古典的なソフトのよくある挙動は、ただひたすらメモリを要求し、実際にアクセスして確保するというものだ。Mach はメモリの要求(vm_allocate)を行っても実際の物理メモリを確保しない。アクセスされるときにはじめて確保動作が行われる。なぜって?プログラマは往々にして多めに多めにメモリを要求するものだ。要求道理に渡しても使われないことは多々ある。だったら、使われる段に割り当てた方が遙かに効率的な訳だ。

メモリを要求し、ひたすら物理メモリを確保する、その後、終了すると大量のメモリが一気に空く。対価としてそのアプリを実行が終わるまでの待ち時間と、全てディスク上に追い出され読み込み直しになるバックグラウンドアプリの時間を引き替えに。そんな気休めアプリが有償であったりもしたのだ。

そして、今度は「システム標準のメモリ解放コマンドがある」という噴飯物の記事を見かけた訳だ。

https://book.mynavi.jp/macfan/detail_summary/id=37786 より

...この人、とりあえず man を見てないことだけは理解した。
以下が、purge の man の結果だ。

man purge

見ての通り、「ディスクキャッシュの解放」をするだけで、malloc や vm_allocate で確保されたアプリケーションのメモリには何ら影響がないことが明言されている。

てか、先の記事の解放内容も見ると分かる。この記事の書き手は、使用済みメモリが 14.90GB から 13.12GB に減ったことをわざわざ赤枠で示しているが、その横のアプリケーションメモリを見ると 10.92GB から 11.03GB に「増えて」いる。その代わりファイルキャッシュが 2.21GB から 268.9MB に減ってる。
2GB弱のディスクキャッシュを吹っ飛ばして、その分の空きが増えたことを喜んでるのだ。

先のページの結果を上下に並べて表示
purge コマンドの内容通りの結果になってるのが分かる。

そして、横にあるアプリケーションメモリとかファイルキャッシュの変動に気がついてもいない、訳だ。なお、アプリケーションメモリが増えればディスクキャッシュは自然と解放される、つまり必要のないことだ。

これでどのような効果があるか? せいぜい、再び同じIOがあったときにディスクを読み直すのでIO性能が劣化する、ぐらいだろうね。

Mac 系の記事には、このような無知と願望にもとづいたものが非常に多い。

ライターの頭は治しようがないので、せめて読み手がよく気をつけることだ。


2015/08/04

【余談】Karabiner でのカスタムセッティング

Karabiner のおかげで Office アプリでも Emacs Keybinding が使えるようになった。

しかし、Karabiner を入れると、Office アプリ以外でもキーバインドノリマップが発生してしまい、Karabiner があるときとないときで挙動が変わってしまう。

例えば、OmniGraffle でテキストフィールドを選択、テキストを範囲選択した状態で「Ctrl-A」を押したときの挙動が、Karabiner なしだとそのテキストフィールド内での先頭位置になるが、Karabiner を有効にしていると別の(一つ前の)テキストフィールドに移動してしまう。

私がやりたいのは MS-Office (PowerPoint, Excel, Word, Outlook, OneNote) のみで Emacs Keybinding を効かせたいだけなので、他のアプリには影響を及ぼしたくない。

ざっと XML の仕様を読んだが、replacement(要は定数定義)を上書きして、挙動させないアプリを増やすことは簡単にできそうだ。だが、私のやりたい「特定のアプリだけに設定を効かせたい」の場合、定数の書き換えだけではうまくいかない、ちょっとまじめに項目(item)を増やすしかなさそうだ。

少し早く起きてしまったし、ちょっと試してみた。
---
<?xml version="1.0"?>
<root>
  <replacementdef>
    <replacementname>XML_INC</replacementname>
    <replacementvalue>/Applications/Karabiner.app/Contents/Resources/include/checkbox</replacementvalue>
  </replacementdef>

  <appdef>
    <appname>ONENOTE</appname>
    <equal>com.microsoft.onenote.mac</equal>
  </appdef> 
  <item> 
    <name>Private Settings</name>
    <item>
        <name>Emacs Keybinding for MS Office</name>
        <identifier>private.emacs_mode_for_msoffice</identifier>
        <only> EXCEL, POWERPOINT, WORD, EXCEL, ONENOTE </only>
        <include path="{{XML_INC }}/snippets/emacsmode_controlPNBF_ex.xml" />
    </item>
  </item>
</root>
---

root タグでくくられた範囲が設定として使用される。カスタムXMLはどうもデフォルトのXML群より先に読まれるっぽいので、ここで設定したエントリがGUIでは一番上にくるようだ。

replacement は要するに定数定義。後で出てくるが、今回 アプリの中に用意されている XMLの定義を流用したかったので、そこまでのパスを「XML_INC」という定数にしてしまった。
これぐらい組み込みの定義でありそうな気もするのだが、探すの面倒だった次第だ。

appdef はアプリケーションの名称を設定している。Mac のアプリケーションは CFBundleIdentifier と呼ばれるそのアプリ独自の名称を持っているが、CFBundleIdentifier は逆DNS記法で長ったらしいので分かりやすい名前をつけている次第だ。

様々なアプリケーションがKarabiner 内の appdef.xml であらかじめ定義されており、たとえば MS-Office の場合、EXCEL, WORD, POWERPINT, OUTLOOK などはすでに定義済みだ。
しかし、今回から増えた OneNote については定義がなかったので、ここで com.microsoft.onenote.mac という CFBundleIdentifier を持つアプリを ONENOTE と定義している。なお、CFBundleIdentifier については、そのアプリ内の Info.plist に記載されているが、Karabiner 付属の EventViewer でも確認ができる。


さて、item タグからが本来の設定だ。

item タグはGUI城で現れる各設定項目を示す。入れ子にすることも可能で、入れ子にすると親の name でのグループが作成される。Karabiner 標準では「General」などのグループがあるが、これは item タグの入れ子でできている。

別にグループを作る必要性はないが、ただ見た目的に、チェックボックスがいきなり現れているのはちょっとかっこわるかったので Private Settings というグループを作成した。

その中の item タグの Emacs Keybinding for MS Office が今回やりたかった設定項目だ。identifier はこの項目固有の名称、name は表示される項目名になる。
appendix タグでテキストを書いておくと説明書きを追加できるらしいが、今回は省いた。

only タグはその設定を有効にするアプリ名を記載する。このなかでは , を使うことで複数のアプリを指定できる。MS-Office に所属する主立ったアプリをここで指定している訳だ。

autogen タグによってどういったキーをリマップしていくかを記載するが、EmacsKeybinding の、特にカーソル移動の部分だけ場合、アプリの中にそれだけの定義を抜き出した XMLが存在する。

ここでは、include タグでその XMLを読み込むことで個別の定義を回避している。

なお、ここで先ほどの XML_INC の定数を参照している。(別にフルパスを書いてもいいのだが...。)
相対パスにした場合はどうもそのXMLファイルの位置からの相対になるようだ(未確認)。

この定義を private.xml に作成、保存した後にリロードすることで、設定が現れる。


後はチェックを入れるだけだ。軽く試した限りは、これでちゃんと動作しているようだ。



個人的に気になったのは、item にて挙動の定義と画面に表示されるデータが混在されていることにある。

ActiveDirectory のGPOの管理テンプレートでもあった失敗だが、挙動と表示を混ぜた定義を作ってしまうと I18Nのとき、名称や説明を現地の言葉にする場合にハマってしまう。

GPOの管理テンプレートの場合、それ以外の問題(例えば構文が独自だったのをXMLに更新したかったなど)もあり、動作を定義した ADMX ファイルと、言語ごとの表示内容を抜き出した ADML ファイルに分ける羽目になった。

管理テンプレートの例を出さずとも、OS X の Cocoa アプリのローカライズも、.lproj というフォルダを作成し、nib/xib といった表示されるオブジェクトの定義や strings といったメッセージを各言語ごと別に作る事でなされている。


Karabiner の場合も、item には identifier があるので、言語ごとのメッセージファイルを作成、identifier でローカライズされたメッセージと item を紐付ければいい、用に見えるが、ここで先の「item は入れ子にできる」が引っかかってくる。

そう、グループを作る親の item はname タグしかもっておらず、個別の identifier を持たない。つまり、各設定項目ごとは identifier で紐付けして別のファイルからメッセージを持ってこれるが、「General」などのグループ名に対するローカライズされたメッセージを紐付ける手段がない。


まあ、private.xml の説明が英語でしかなかったり、そもそもアプリの GUI も英語UIしかないので、そうした表示面でのローカライズについてはこれを行わない、というのがおそらく作者のポリシーなのだろう。Karabiner のアプリの立ち位置を考えると、別にそれは悪いことでもない。

2015/08/03

【余談】Karabiner でのキーリピート速度

これまで、ちょっとしたテキストやメモの共有には、OS X/iOS標準の「メモ」(Notes)を使っていた。

「メモ」(Notes)はバックエンドがIMAPなどメールサーバになっており、Gmail なりの適当なメールサーバさえ確保できれば簡単にドキュメントが同期できることと、Apple 系のデバイス間だけではなく、限定的にだが ExchangeServer を経由して Windows とも連携が可能なのが便利だったためだ。

そもそも、何故 IMAPをメモに...っていうのも理由があり、ExchangeServer がメールや予定等々を統一的なアクセス方法で扱えるようにしており、その中に「メモ」があったのが理由と思われる。( 古い Macユーザなら、Exchange サポートの入った前後の Mail.app に「メモ」がひっついてたのを覚えているだろうか? 要するにそういうことだ )

ところが、ExchangeServer 側がメモのサポートをやめようとしている。一応機能としては残っているが obsolete 扱いで、現在の Exchange 2013 + Outlook 2013 では、表示フォントの変更ができないなど以前にあった機能が欠落を始めている。


そんなこともあり、ちょっとしたテキストやメモの共有に OneNote を使い始めた。OneNote はフリーで使え、iOS でもアプリがある。仕事でも OneNote を使い始めたこともあって、移行先としては悪くないと思った次第だ。

多少の癖はあるが Mac 版の OneNote もそこそこできがいい。(IMAPやExchangeではなく) OneDrive を通じて同期し、人との共有も可能。賛否は分かれるがページ以外にもタブという概念があり、一次元ではなく二次元にメモを整理できる。また、オンラインアクセスできるのも悪くない。(iPhone でアクセスするときわめて使いにくく、PC/タブレット用と割り切る必要はあるが。)


さて、便利に使い始めた OneNote だが、Emacsキーバインドが使えないのだけが厄介であった。指がそっちに慣れているため、つい Ctrl-P を押してしまう、Ctrl-F, Ctrl-B でカーソルを動かそうとしてしまう、のでどうしてもストレスがたまる訳だ。

同じ事が Excel や PowerPoint でも起こっており、そろそろ年貢の納め時か、とあきらめ Karabiner を導入した。以前は KeyRemap4MacBook と呼ばれていたアプリで、 KEXT (カーネル拡張)を突っ込んでキーボードからの入力をいじってしまうというもの。トラブったときがやっかいなのでこの手合いのデバイスドライバはなるたけ避けていたのだが、背に腹はかえられぬ。実際、導入したら便利であった。

ただ、Karabiner を導入するとキーリピート速度の速度がなにやら遅い。見ると Karabina がリピートまでの認識時間とリピート速度を上書きしている、とある。

直したいのだが Karabiner ではミリ秒単位で値を設定するもので、さて Mac側の設定でどれが何ミリ秒になっているかわからないと設定しようがない。

仕方がないので、少し調べた。
Mac 側の設定は「defaults read -g | grep Repeat」あたりで検出できる。InitialKeyRepeat の値が「リピート認識までの時間」、KeyRepeat の値が「キーのリピート」での値だ。

しかし、この値はミリ秒ではない。出てきた値に 15をかけるとミリ秒になる。

図示すると、こんな感じだ。



値としては、以下の通りだ。

キーのリピート 遅い           早い
1800
1350
900
450
180
90
30

リピート入力認識までの時間 長い         短い
1800 
1470
1020
525
375
225

この値をかき込めば、Mac のときと同じになる。

ただ、微妙に妙な動作がでてしまう。例えば OmniGraffle でテキストフィールドで範囲選択中に Ctrl-A を押したときの挙動が、Karabiner の有無で異なる。

Notifier を使って Office アプリだけを有効にしたいのだが...、これは、XMLでの設定を書くことでできそうなのでまた試すとする。

--
8/4 タイトルのスペル間違えてたので修正。

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 の話をするだけのつもりが、余談が非常に長くなってしまった...。

2014/01/19

USBメモリから起動するOSを仮想マシンで利用する(2)

以前、USBメモリから起動するOSを仮想マシンで利用する(1)という記事を書いたが、その時にもう一つ記事を書こうとして(1)をつけたまますっかり忘れてしまっていた。

そのままというのも何なので、2年越しになってしまったが(2)として書くつもりだったことについて記載したい。

先に紹介した Plop Boot Manager だが、そのままだと毎回GUIがでてきて、USBを選択しないと起動しないのでちと面倒だ。省力化できないか?という実はこれができるのだ。

まず、Plop Boot Manager の動作はカスタマイズが可能になっている。その本体の plopbt.bin というファイルを直接編集し、動作が変わるようになっているのだ。

カスタマイズ用のツールは Plop Boot Manager のダウンロードファイルの中に含まれている。Linux 用と Windows 用があるが、ここでは手軽な Windows 用で説明する。

ダウンロードファイルを展開すると、Windowsというフォルダがあるのでこれを開く


そこには、plpcfgbt というCLIのコマンドと、plpcfgbtGUI という GUIツールがある。
より便利な plpcfgbtGUI を実行する。


なお、plpcfgbtGUI は .NET Framework 3.5 を使用している。Windows XP や Windows8 の場合 .NET Framework 3.5 をインストールする必要がある。

Windows8 の場合、.NET Framework が足りないとその場で
ダウンロードを提案してくれるので便利だ
起動すると下の画面になる。まずは、カスタマイズする plpbt.bin を読み込む。
単に「Open」のボタンを押せば plpcfgbtGUI と同じフォルダにある plpbt.bin が読み込まれる。他のフォルダにあるものを編集したい場合は「...」ボタンを押してパスを指定する。


開くと、下のカスタマイズ項目が利用可能になる。
ぱっと見ての通りなので説明の必要はないと思われる。
ここで編集するのは「Countdown」 をチェックし、「Countdown value」を適宜指定すること、それから 「Default boot」をUSBに指定すること、だ。

Default Boot を指定するとそのデバイスから自動起動するようになる。ただし DefaultBoot を指定するには同時に「Countdown」を有効にしなくてはならない。
Countdown value 秒だけ待機後、Default Boot で指定されたデバイスで起動する。
Countdown value に1を指定すればほぼ即座に起動に入るが、USBメモリを差し込んだり、仮想マシン側に割り当てる事を考えると10秒程度の待ち時間はつけておいた方が賢明だ。


設定が終わったら、「Configure」 を押す。すると、以下のパネルが出て設定の書き込みが行われたことがわかる。書き込まれたら、Quitを押して終了する。


この plpboot.bin から Bootable CD の ISOイメージを作成するのだが、これもツールが用意されている。Plop Boot Manager のダウンロードサイトの「Tools」にある plpbt-createiso.zip がそれだ。


zip ファイルを展開すると、mkisofs コマンドと、Linux / Windows用のバッチファイルがある。


先に作成した plpboot.bin をこの plpbt-createiso を展開したフォルダにコピーする


そして、「create-iso」という名称で歯車のアイコンがついたバッチファイルをダブルクリックして実行する。


実行が完了すると、plpbtmycd.iso という ISOイメージファイルができているので、これを適宜 ファイル名を変更し、適切な場所にコピーして、仮想マシンの起動に用いるといい。


起動すると、こんな感じでカウントダウンと、デフォルトブートデバイスが指定された状態になる。

なお、作成した USBで自動起動する ISOイメージだが、先日取得した BOXのアカウントにて公開しておいた。
https://app.box.com/s/a3ywn1pb17hz2o24eukk


2013/12/21

OS X と 仮想SSD

SSD 標準搭載の MacBook Air がでた 10.8 Lion あたりから、OS X ではHFS Plusファイルシステムへの SSD に対するサポートがはいってきている。

具体的には、OS X がSSDに インストールされている場合、遅延再配置(hfs_relocate)と Hot File Adaptive Clustirng が無効になる。
二つの機能の概要については...、まあ、こちらのページを参照して欲しい。
(...まさか、未だに自分の原稿が上位でヒットするとは思わなかったよ。)

いずれの機能も HDDの特性を加味してディスク上のデータ配置を置き換えることで IO性能を上げるものであるが、しかし SSDの場合 再配置してもIO性能が上がらないし、むしろ書き込み回数を増やして不利益になるからだ。

OSXがSSDと認識しているかどうかは 「diskutil info」コマンドで確認できる。
[valkyrie:~] shiro% diskutil info disk0s2
   Device Identifier:        disk0s2
   Device Node:              /dev/disk0s2
   Part of Whole:            disk0
   Device / Media Name:      Macinosh HD

   Volume Name:              Macinosh HD
   Escaped with Unicode:     Macinosh%FF%FE%20HD

   Mounted:                  Yes
   Mount Point:              /
   Escaped with Unicode:     /

   File System Personality:  Journaled HFS+
   Type (Bundle):            hfs
   Name (User Visible):      Mac OS Extended (Journaled)
   Journal:                  Journal size 73728 KB at offset 0x1bf2000
   Owners:                   Enabled

   Partition Type:           Apple_HFS
   OS Can Be Installed:      Yes
   Recovery Disk:            disk0s3
   Media Type:               Generic
   Protocol:                 SATA
   SMART Status:             Verified
   Volume UUID:              A95E84F4-7013-38C7-BB33-BB8DB8E8ED69

   Total Size:               959.3 GB (959337365504 Bytes) (exactly 1873705792 512-Byte-Units)
   Volume Free Space:        478.1 GB (478122086400 Bytes) (exactly 933832200 512-Byte-Units)
   Device Block Size:        512 Bytes

   Read-Only Media:          No
   Read-Only Volume:         No
   Ejectable:                No

   Whole:                    No
   Internal:                 Yes
   Solid State:              Yes
最下行の Solid State のフラグが Yes ならばSSD上であるとOS Xが判断していると言うことだ。
(余談だが、SSD だからといってルートフォルダに  .hotfiles.btree ファイルがないとは限らない。初期状態からSSDで出荷された Mac ならその通りだが、HDD搭載の Macから換装したりなどすると、以前の  .hotfiles.btree ファイルが残る。使われてはいないが、どうもアクセスはされるみたいで更新日付は適宜アップデートされてしまう。消しても問題ないとは思うのだが、さすがに失敗したときのリスクが怖いので試していない。)

さて、仮想環境上の OS X はどうであろうか?

とりあえず手元の Fusion 6 で仮想マシンを作ってみたところ、仮想ディスクはすべて SATA接続のディスクとして作成される。

SATA接続のディスクから OS Xを起動すると、SSD上の仮想マシンはちゃんと「SSD」が接続されたように振る舞う。図は、Mountain Lion を搭載した仮想マシンだが、Solid State が YES になってるのがわかる。

Fusion 6 で動作する Mountain Lion の仮想マシン

ただし、以前の Fusion で作成した仮想マシンは 仮想SATA接続ではなく仮想SCSI(lsilogic)接続になっており、こちらはSSDと認識されていない。仮想SATA接続は仮想ハードウェアバージョン10からのサポートで、Fusion 6からしか使えないからだ。

以前作った仮想マシンについては、以下の手順で仮想SATA接続に変更できる。

まず、仮想マシンをちゃんとシャットダウンして、スナップショットをすべて削除する。

次に、設定パネルの互換性タブから仮想ハードウェアバージョンを10にあげる。

仮想ハードウェアバージョンを10にする

これにより仮想SATA接続の仮想ディスクが利用可能になる。

最後に、仮想ディスクを選択してバスタイプをSATA接続に変更する。

バスタイプをSATAに変更

スナップショットを削除していないとバスタイプの変更ができないので注意だ。

不用意にバスタイプを変更すると起動しなくなるOSもあるが、OS X のブートローダは結構柔軟性があり、SCSIからSATAへの変更程度なら問題なく起動してくれる。
ゲストOSの上の動作とはいえ、無用な書き換えを防ぐことでSSDを長持ちさせることができるのでやっておいたほうがいいし、そのために Fusion 6 にアップグレードするのも悪い話ではないだろう。


しかし、OS X の場合はこの方法を使っても、OS側がSSDを検出しない、SCSI/IDE接続のディスクをSSDかHDDか検出していない模様のため、あまり意味がない。


2013/11/06

Fusion での起動メニュー

さて、先の Fusion 6.0.2 で起動メニュー周りのことが書かれていたので一つ試してみた。

Fusion 6.0.2 にアップデート後、OS X をインストールした仮想マシンを起動、即座に Option を押しておいた。

Macの実機の場合、Optionを押して起動すると例の起動メニューが出てくる。

Fusion の場合、以下のブートメニューが出てきた。

Option を押しながら起動するとこのメニューが表示される 
先のメニューで BootManager を選ぶとこの画面になる

Fusion の仮想マシンにおける EFIの実装は VMwareオリジナルのため、Appleがおこなったようなグラフィカルな起動メニューという拡張ははいっていない。ただそれだと便利が悪いので実装したようだ。
(追記)なお、これは Fusion 6.0.1 でも動作する。別に 6.0.2 で新規という訳ではないようだ。


MountainLion や Mavericks のリカバリパーティションを起動する場合にはこれは便利だろう。

Fusion 6.0.2 release

11/5 (米国時間)に Fusion 6.0.2 がリリースされた。
メンテナンスリリースで、新機能は含まれないが様々な改善がなされている。

リリースノートはこちらにあるが、変更点は以下の模様。
  • メモリが不足している際に仮想マシンの起動に失敗する問題に対処
  • Windows 8.1 および WindowsServer 2012R2 の最終版の簡易インストールをサポート
  • Fusion の起動パフォーマンスの改善
  • いくつかの Linux で HGFS(ホストOSとゲストOSでのファイル共有)モジュールのビルドに失敗する問題に対処
  • OS X Mavericks サポートの強化
    • Finder タグに対応
    • OS X をゲストOSにした場合のドラッグ&ドロップの改善
    • メニューバーの取り扱いの改善
    • Unity モードでのマルチディスプレイの取り扱いの改善
    • OS X Mavericks をゲストOSにした場合のリカバリパーティションの取り扱いの改善
    • OS X をゲストOSに指定した場合の起動パーティションの選択の改善
    • リスタート後の仮想マシンのウィンドウ位置の復元の取り扱いの改善
    • "既存のPCをインポート"機能での、Mavericks のファイル共有機能との互換性の向上
  • 仮想マシンのインポートでの、Parallels Desktop 8 仮想マシンの検出の強化
  • 起動ボリュームが見つからない場合のメッセージの改善
  • 自動起動に指定していた仮想マシンの電源オンを止めた場合に生じる問題の修正
  • OS X をゲストOSとしてSATA仮想ディスクにインストールした場合に FileVault が有効にできるようになった
  • 特にゲストOSがBSOD(ブルースクリーン)やカーネルパニックの最中などに、仮想マシンの電源オフ中にハングする問題に対処
  • Ubuntu 13.10 で共有フォルダのカーネルモジュールがビルドできるように改善

朝一で適当に訳したので、少々間違いがあるかも知れないので原文も良く確認のこと。

2013/09/14

通常版 Fusion 6 と Fusion Professional 6 の違いをみる

VMware Fusion 6 の通常版と Fusion Professional 6 の違いは VMware 社のページに記載されているが、これだけだと分かりにくいこともあるだろうから、評価ライセンスを使って2つの主だった違いを確認してみた


● ネットワーク エディタ

Professional には、通常版の環境設定では存在しない「ネットワーク」の項目が存在する。これがネットワークエディタと呼ばれる部分だ。

通常版 Fusion 6 の設定パネル
Fusion Professioanl 6 の設定パネル
ネットワークエディタを選択するとネットワークの接続先に選択可能な一覧が表示される。この一番下「カスタム」のところにネットワークの追加が可能になっている。

ネットワークの設定(ネットワークエディタ) 
VMware Workstation のネットワークエディタと同じく、NATをかけて外部ネットワークへの接続を行うか、ネットワーク内で DHCPによるIPアドレスの配布を行うかが、配布するIPアドレスのレンジが指定可能となっている。


● 暗号化

通常版も Professional も仮想マシンの暗号化機能を持っている。有効にすると設定されたパスワードを知らないとその仮想マシンが起動できなくなる。
なお、パスワードは Keychain に登録可能で、二回目以降の入力を省くことができる。


暗号化された仮想マシンの設定変更にはパスワードの入力が必要 

Professional では、暗号化された仮想マシンに対して、さらなる操作の制限を加えることができる。
通常版 Fusion 6 での暗号化と制限
暗号化を行う以外の機能はない

Fusion Professional 6 での暗号化と制限
暗号化を有効にすると、制限機能が表示される

・制限
「制限」を有効にすると、仮想マシンの構成の編集ができなくなる。
これはメニューから設定項目が消えることで実現されている。
なお、制限された仮想マシンは暗号化されているため、.vmx ファイルを編集して直接設定を書き換えることもできない。
なお、Fusion 6 からは「分離」メニューによりホストOSとゲストOS間の ドラッグ&ドロップやコピー&ペーストの利用可否を設定することができる。

「分離」メニュー

あらかじめドラッグ&ドロップやコピー&ペーストを無効化しておけば、制限との合わせ技でホストとゲストのやりとりを禁じて安全性を高めることができる訳だ。

・パスワードの変更
「制限」を有効にした場合の仮想マシンの設定パネル
設定項目が極めて少なくなってるのが分かる

「暗号化パスワードを変更することをユーザに求める」を指定すると、仮想マシンの初回起動時にユーザにパスワードの変更を指示する。暗号化した仮想マシンを配布した場合、配布先の利用者ごとにパスワードを変えてもらうことができる訳だ。

・USBデバイス制限

「USBデバイスをこの仮想マシンに接続することを許可する」をチェックすると、ホストのMacに接続したUSBデバイスを、仮想マシンに接続させることができる。逆に言えば、このチェックをつけない限り、USBデバイスのリダイレクションは無効になる。

Fusion のレベルでは全部通すか全部禁止するかしかないが、ゲストOSが Windows ならば、グループポリシーを使ってUSBデバイスを制限することができるのでこれも併用するといい。

・利用期限
「仮想マシンの期限切れ後」にチェックを入れ、右側の日時を入れるとその期限までしか利用できない仮想マシンを作ることができる。
また、「詳細...」ボタンを押すと以下のシートが現れ、期限切れ直前や期限切れ後のメッセージを用意したり、時間確認のサーバを用意できる。

Fusion Professional 6 では仮想マシンの利用期限を設定することもできる
利用期限のついた仮想マシンを実行する場合、ホストOSのユーザが時間を変えてしまう事は想定される事態だろう。そこで、ローカルの時間を信用せず、指定のウェブサーバに定期的に接続し、現在時間を確認することで期限の確認を行うわけだ。

なお、上記の各種制限のかかった仮想マシンを、通常版の Fusion6 で利用、「暗号化と制限」設定パネルを開くと、以下に見える。

Fusion Professioanl 6 で制限や有効期限を設定した仮想マシンは、
通常版の Fusion6 や Player, Workstation でも制限されたままになる
通常版の Fusion 6 や Player では制限を解除できない

単に暗号化だけなら通常版でも解除できるが、その他の制限がかかった場合、通常版の Fusion では制限も暗号化も解除できなくなる。

企業などで業務データやアプリケーションの入った仮想マシンを配信する場合、暗号化と適宜制限を加えることで、改竄を防止したり利用期限を制限することができるわけだ。ここらへんは、VMware ACEで培った技術が組み込まれている。
Windows を展開する場合はさらに Horizon Mirage でゲストOSの Windowsの管理を行えば利便性と制限を向上させることができる。


● フルクローンとリンククローン

Professional では、フルクローンとリンククローンのメニューが追加されており、仮想マシンのコピーを作成することができる。

通常版 Fusion 6 の仮想マシンメニュー
Fusion Professional 6  の仮想マシンメニュー
クローン項目が増えているのが分かる

フルクローンは完全なコピーで、まったく同じ内容の独立した仮想マシンを作成する。

これに対してリンククローンは、元となる仮想マシンからの差分だけを保有している。
元の仮想マシンがなくなると起動できなくなるが、差分だけのためフルクローンに比べ容量をとらない。

テストや開発時に、一時的に同じゲストOSの複数の仮想マシンが必要な場合、リンククローンは便利であろう。