2014/05/08

「セキュリティが強化された Windowsファイアーウォール」が起動不良に陥る

本日ハマったのでメモ。

ふと気がついたら、リモート環境にある WindowsServer 2012 のRDP接続ができなくなっていた。vSphereClient 側から確認するにOSは正しく動いている。が、RDPだけ返答しない。

ファイアーウォールの問題かと思ってMMCを開こうとすると 0x6D9 のエラーを表示してパネルが開かない。そもそも、advfirewall サービスが動いていないようだ。

ググると、同じ問題で困ってる人は居るが、解決したらしい記述がない。

どうも、

a. netsh advfirewall reset
b. net start mpsdrv
c. net start bfe
d. net start mpssvc
e. regsvr32 firewallapi.dll
の手順でコマンドを試せば良いようだが、三つ目の net start bfe でこれまた「エラー 1075: 依存関係サービスが存在しないか、または削除の対象としてマークされています。」を表示する。

このエラー番号から調べて見つけたのが以下のページ


こちらにリンクされている「RestoreBFE.exe」を実行、再起動するとBFEサービスも起動し、ファイアーウォールも正常に稼働、RDP接続もできるようになった。


イベントビューアでログを見ると、SQL Server のアップデートがかかってエラーしている記述がある。どうも、エラーが起こってアンインストールが行われる際に、依存関係か何かから BFEもアンインストールを試み? 削除マークだけ残ってる?? という感じっぽい。

再現方法が分からないので確証はないが、以上、私的なメモまで。




2014/04/19

Fusion 6.0.3

4/17付けで VMware Fusion 6.0.3 がリリースされております。

リリースノートにも以下の記載があります。

Security Issues

VMware Fusion has been updated to resolve the Heartbleed issue described here. The Common Vulnerabilities and Exposures project (cve.mitre.org) has assigned the name CVE-2014-0160 to this issue.
件の OpenSSL heartbleed 問題にどうも抵触しているみたいなので、Fusion 6 を使ってる方はすぐにアップデートした方が良いです。

2014/04/17

ESXi をクローンした場合、互いに通信できなくなる

● 職場で同僚が悩んでた件

ESXi on ESXi で仮想環境上に ESXi を実行しているのだが、どうも vMotion がうまくいかないとの事。vMotion 用の VMkernel Port はもちろん作ってるし、設定を見る限りでは疎通してもおかしくない。

とりあえずと調べているうちに(まあ色々妙な設定は見つかったのでなおしたのだがそれは略して根本だけを見ると)、どうも互いの ESXi 同士の ping / vmkping がいずれも通らないのが原因のようだ。

そして、よくよく見ると気がついたのが、ARPテーブルがうまく作れていない。
ESXi のARPテーブルは「esxcli network ip neighbor list」で確認できるが、相手の項目が作成されないのだ。
で、「esxcfg-vmknic -l」を見てみたら、双方の vmknic が同じMACアドレスを持っている。どうもこれが原因だと判明。

聞いたところ、どうも1台目の ESXi を構成した後、シャットダウンして、クローンを作って2台目を構成したとのこと。どうやら、それが悪かったようだ。

● vmknic のMACアドレス

VMkernel Port のMACアドレスだが、これは以下に見受けられる

・インストール時に指定した管理ポートは、管理用NICのMACアドレスがつく
・後で追加したものは「00:50:56」等から始まるVMwareの仮想用のMACアドレスがつく

ここでうっかりしてしまうのだが、上記の、最初の VMkernel Port (Management Network) のMACアドレスも「仮想」である。つまり、すべての VMkernel Port の MACアドレスは、仮想マシンの仮想NICと同じで仮想MACアドレスである。

VMkernel Port にどの仮想MACアドレスがつくかは、ESXi の管理領域の /etc/vmware/esx.conf に記載されている。つまり、この esx.conf の値を書き換えない限り、同じMACアドレスが割り当てられる。

先の問題は、クローンをしてしまった事から生じる。クローンを実施した折に ESXi を実行する仮想マシンのMACアドレスはもちろん差し替えられる。しかし、さすがに /etc/vmware/esx.conf を書き換えることはないので、起動すると、クローンされた ESXi は、クローン元の ESXi と同じMACアドレスを VMkernel Port に設定してしまう。

クローン元のESXi
vmnic0 (ESXiに繋がってるNIC)のMACアドレスと、
vmk0 のMACアドレスが同じであることが分かる

クローン先の ESXi
vmnic0 は 00:50:56:35:53:52 であるのに対し、
vmk0 は 00:0c:29:2a:a3:cf とクローン元のままだ

冒頭の症状、vMotion 用の VMkernel Port がお互いに通信できなかったのは、同じMACアドレスを持っているため、たとえ異なるIPアドレスを設定しててもL2的には相手が見つけられなかったからだ。

● 修正方法
最も手っ取り早いのは、ESXi はクローンしない、クローンした ESXi 同士をクラスタ挿せるなど連携で使わない、って事だろう。別々のネットワーク、異なる vCenterServer の配下であればまあ問題はないが、同じネットワーク、同じ vCenterServer でクラスタを組むときは個別にインストールする必要がある。ESXi のインストール時間などたかがしてれるので、それぐらいは毎度やってしまえと言うことだ。

クローンしてしまってこの問題に遭遇した場合は、クローン先の ESXi で以下のコマンドを実行するのが手っ取り早い




1. 「esxcfg-vmknic -l」で、VMkernel Port ポートグループと vmknic の対応を確認する
2. 「esxcfg-vmknic -d "<ポートグループ名>"」で、そのポートグループの vmknic を削除

esxcfg-vmknic -d で vmknic を削除
"Management Network" というポートグループが残留しているのがポイント
vSphereClient では分かりにくいが、VMKernel Port も仮想マシン用と同じ
ポートグループがあり、vmknic が一つだけ入っているというだけだ 
3. 「esxcfg-vmknic -a -i <IPアドレス>  -n >>」で、そのポートグループのvmknic を作成
残留している "Management Network" に vmk0 を作成
この時、新しいMACアドレスが裁判されているのが分かる
4. 「esxcfg-vmknic -l」で、設定を確認する(上図)



そもそも、vSphereClient では VMkernel Port が、ポートグループと vmknic でできていることが隠蔽されており、一つのポートのように見えている。このため、VMKernel Port を削除すると、vmknic とポートグループが一気に削除されてしまう。
WebClient ではこの二つが明確に別れて表示されるようになり、どちらを選択して設定ボタンを押したかで設定できる項目に違いが出てくる。
WebClient での表示
Management Network を選択するとこの通りポートグループ全体が選択される

WebClient での表示
ポートグループの仲の vmk0 を選択すると、vmknic だけが選択される

上記のコマンドは、この事を利用して VMKernel Port に設定されたチーミングやセキュリティ設定などを保存しつつ、また管理用の VMKernel Port がなくなって混乱する時間を最低限にしつつ、vmknic を作り直してMACアドレスを再生成させるという手順なわけだ。


※ 2014/5/28 付記

クローンを行う前に仮想環境上の ESXi で以下のコマンドを実行する事でも、回避はできる。

esxcfg-advcfg -s 1 /Net/FollowHardwareMac

察せられるように、NICのMACアドレスが変わったら取りなおすというものだ。
...今思いついたが、クローンした後でも、クローン先のESXiで個別に実行してから再起動しても何とかなりそうだな。


2014/03/16

Hyper-V on Fusion

知己からの相談。Hyper-V 上の Linux (CentOS 6.5)が正しく動かないと。
CentOS 6.5 は Hyper-V のサポートリストにないと返答し逃れようとしたら、いや、統合サービスがカーネルに統合されているし動くはずだとの主張。そして送られてきたスクリーンショットを見たら、ただの Hyper-V ではなく、Fusion 上の WindowsServer 2012 であった。

Hypervisor on Hypervisor はテクがいるんだよと煙に巻いたのだが、しかしやったことがない、できないでは何とも面白くないのでサンフランシスコ出張中、まだ真っ暗闇の3時頃にむくっと起き上がり手元で構築をやってみた時のメモを再構成したのが以下のものだ。

なお、WindowsSever 2012では面白みがないので、今回は Windows 8.1 Enterprise の Client Hyper-V を使ってみた。

● Fusion 上で Hyper-V を実行させ、その上でLinuxを動かす条件

条件は以下の通りだ。
  1. Windows8 は 64bit 版がインストールされていること
  2. 仮想マシンの設定の「プロセッサとメモリ」にある「この仮想マシンでハイパーバイザーアプリケーションを有効にする」にチェックが入っていること
  3. 以下2行を VMX ファイルに書き足してあること
    • mce.enable = "TRUE"
    • hypervisor.cpuid.v0 = "FALSE"
  4. Hyper-V 上の仮想マシンのMACアドレスを"固定"させること
64bit 版でないと Hyper-V は利用できないのでこれは当然と言える。2. の設定により、vmx ファイルに 
vhv.enable = "TRUE"
が書き込まれる。ESXi など VMware製品ではこの設定だけで動くが、Hyper-V の場合、「Hyper-V をインストールできません。: ハイパーバイザーが既に実行されています」と出る(下図)

これを回避するために、3. のオプションを指定し、MCE(Machine Check Exception)拡張を有効にし、CPUID命令でハイパーバイザを検出されないようにする必要がある訳だ。

ここまでで Hyper-V は動作するが、このままだと知己の言うとおりでHyper-V 上の仮想マシンでの Linux がインストール後の起動時に panic してしまう。

この事象の回避には、「Hyper-V 上の仮想マシンのMACアドレスを静的にする」ことが必要なわけだ。この点は少々厄介なので、以下の手順を見て欲しい。

● インストールの実際

では、実際のインストールを追ってみよう。

まず、Fusion で仮想マシンを作成する。Windows8.1 のメディアかイメージがあるなら話は早い。
Fusion のメニューから「ファイル」-> 「新規...」を選び、「ディスクまたはイメージからインストール」を選んだまま「続く」ボタンを押せばいい。
簡易インストールパネルでアカウント名やプロダクトキーを入力、仮想マシンを作成すればOSのインストールから初期設定、ライセンス投入、VMware Tools のインストールまで一気にやってくれる。

インストールが終わったら一旦仮想マシンを停止して、先の条件2と3のセットをしておこう。(もちろん、仮想マシンの作成の折に「設定のカスタマイズ」を押して、作成後すぐに仮想マシンを起動させず、設定を編集するタイミングを作っても良い。なお、このときフロッピードライブを削除しないように。)

また、メモリサイズもデフォルトの 2GB から Hyper-V上の仮想マシンの実行分増やしておいた方がいいだろう。


Windows8.1 のデスクトップの左下端には復活したスタートボタンがある。ここを右クリックするとコントロールパネルに素早くアクセスできる。

今回は「プログラムと機能」を選択、Hyper-V をインストールする。
インストール後に再起動がかかるので、またログインし直し、デスクトップの右側から「Hyper-V マネージャ」を検索、でてきたら右クリックして「管理者で実行」をする
(普通の実行でも問題ないかもしれない)


Hyper-Vマネージャが起動したら、まず仮想スイッチマネージャから仮想スイッチを一つ作っておく。インターネットに接続する必要がある場合は「外部」で作っておく。また、「外部」の仮想スイッチを作ると以後 Windows8側のNICがプロミスキャスモードで動こうとして、その結果認証のパネルが表示される。都度パスワードを入れて許可しておこう。

さて、次はHyper-Vでの仮想マシンの作成だ。
Hyper-Vマネージャの「編集」メニューから「新規」「仮想マシン...」を選択、ウィザードに従って仮想マシンを作成する。
「仮想マシンの世代」をきかれたら第一世代にしておく。第二世代は Windows 8,WindowsServer 2012 でないと意味がないからだ。

ネットワークの構成では、先に作った仮想スイッチを指定しておく。

メモリサイズとストレージ容量は適当でいいが、今回は 512MBと10GBを指定した。それぞれ動作チェックのため節約をしただけだ。

インストールは CentOSの ISOイメージから行うが、「Fusion 側でWindows8仮想マシンに ISOメディアをマウントして、Hyper-V側仮想マシンはDドライブを参照」と、「Windows8仮想マシンにISOメディアをコピーしておき、Hyper-V側仮想マシンでISOメディアをして」の二つのやり方が考えられるが、どうも前者はあまり安定しないようだ。面倒でも ISOイメージをコピーして、後者のやり方にした方がいい。

さて、ISOイメージを仮想CD-ROMにマウントさせたら、Hyper-V側で仮想マシンを起動する。
そして、CentOSのインストーラが起動したら、"Hyper-Vマネージャで仮想マシンの電源を落とす"。ここが重要なポイントだ。

Hyper-V側で仮想マシンを停止させた後、Hyper-Vマネージャで仮想マシンを右クリック、「設定...」を選択し設定パネルを開き、「ネットワークアダプター」の「+」ボタンを押し項目を展開、「高度な設定」から「MACアドレス」の「動的」のラジオボタンを「静的」に変更する。


動的に変更後、その下の6つの入力項目に00ではない、十六進の数値が入っていることをちゃんと確認した後、OKを押し設定を閉じる。

その後、Hyper-Vマネージャにて仮想マシンを起動、通常の手順で Linuxをインストールすればちゃんとインストールでき、その後もエラーなく利用が可能だ。

● Hyper-VのMACアドレスの仕様

Hyper-Vのデフォルトでは、MACアドレスの設定が「動的」になっており、仮想マシンの起動の際にMACアドレスが自動生成される。
ここまではまあ構わないのだが、困ったことに、このままだとMACアドレスは起動のたびに変わりうる。どうもそこで齟齬が起こり、パニックしているようだ。この件についてはマイクロソフト社のフォーラムにも記載がある。

手っ取り早く直すのに、MACアドレスを「静的」にして一意に固定してしまえばいいのだが、しかし一度も起動していないHyper-Vの仮想マシンは、MACアドレスが00-00-00-00-00-00 になっている。

これはこれで問題の元のため、「動的のまま一度起動することで適当なMACアドレスを割り当てさせ、その後停止、割り当てたアドレスのままで静的に設定を変更し、MACアドレスを固定する」という手順になる。

なお、クロックのところでパニックしているのでLinux側のクロックソースを直す、という解法もあるようだ。
ただ、CentOSを含むRHEL6系のOSでは、インストール時にMACアドレスを記憶してそのMACアドレスを持つNICに指定したIPアドレスを割り当てるようにする。MACアドレスがころころ変わると、その都度IPアドレスの設定をやり直す必要が出てくる。どのみち、MACアドレスは固定する必要がある。

そもそも Fusion 上で CentOSを動かせばこんな面倒はないのだし、やる人はそうそういないと思うが、引っかかると言えば引っかかるところなので、メモとして残しておく。


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


2014/01/08

[余談] CentOS 6.x で Oracle のインストーラで文字化けをさせず日本語でインストールする

新年早々ではあるが、昔の書きかけをずっとほったらかしていたのを世に出しておく。
仮想化と何の関係があるか?と言われると意外とある Oracle DBのインストールについてだが...。以下本文。


vCenterServer や View と付き合ってるとどうしてもリレーショナルデータベース(RDBMS)とのつきあいが深くなる。

ここ1年以上、5 Host / 50VM を越える場合は Oracle を使っている。特に vCenterServer での利用ではコスト面で10倍近くの差がある。意外に思われるかも知れないが、CPUライセンスでなければならない MS SQL Server Standard より、Named User が通る Oracle Standard One の方が大幅に安すくなるのだ。

さて、あらたに環境を作るに当たって、久方ぶりに Oracle を新規インストールしようとしたところで大きくハマってしまった。

事の元凶は CentOS 6 を使ってしまったこと。これまでは Oracle Linux か CentOS 5.x を利用していたが、後者は普通にインストールするとあまりに余計なもの、例えば X Window Server 、をインストールしてしまうので少々閉口していたのだ。

CentOS 6 はそうした余計なものをインストールしない、なんせ Perl すらデフォルトでは入らない、という事に好感を持っていた。

そのせいでついうっかりと CentOS 6 のテンプレートをデプロイしてそこに Oracle を突っ込もうとしたのだが...、甘かった。
いくつかあるのだが、一つ目はパッケージ名の問題。Oracle Linux や CentOS 5 で必要としてたRPMと名前が異なるため、一々確認と yum  install のし直しが起こってしまった。

Oracle Linux 6 ではどうしているのか気になってみてみたら、どうも "専用のRPM"を用意して対処してしまった模様。この専用RPM、RHEL互換なら Oracle Linux でなくても突っ込めそうな感じだが、さすがに CentOS6 にこのRPMを入れるのは気が引けたので、地道に調べることとなった。(しかし、pdksh をいまさら ksh に変更するのは勘弁して欲しかった...。)


パッケージは地道に調べれば何とかなる。しかし、それだけではうまくいかい。
そう、CentOS 6 の日本語フォントを入れてもインストーラが文字化けする(下図)

Oracle のインストーラは Java を使っているが、Linux の場合、X Window System を必要とする。Mac の XQuartz とか、Xming など Windows でのディスプレイサーバを使うことはできるが、XLib など Xの基本システム一式は Oracle をインストールする Linux にインストールしておく必要がある。

RHEL5互換のOSの場合、それだけで日本語インストーラががちゃんと立ち上がったのだが、RHEL6互換の CentOSでは、Xの日本語フォントをちゃんと入れても文字が豆腐になるのだ。

これは、JRE で定義されているフォントと実際のフォントがあってないとこういうことが起こっているためだ。一般的な対処は、JRE の持つ定義ファイルを書き換えることなのだが、Oracle のインストーラはJREを自前で抱えており、インストーラ起動時に JRE (正確にはJDK)を展開し起動前に差し替える手が存在しない。

色々あまり言えない手を使って調べたところ、Oracle のインストーラの抱えるJREは RHEL互換環境ではさざなみフォント(kochi-*-subst)があることを仮定している。RHEL6 系統は VLフォントとIPAフォントはあるが、さざなみフォントが入っていない。

そこで、IPAフォントをさざなみフォントに誤認させることで対処を行った。
ざっくり言うと、手順は以下の通り。


  1. ipa-gothic, ipa-mincho の RPM をインストールしておく
  2. cd /usr/share/fonts ;  mkdir -p ja/TrueType を実行し「/usr/share/fonts/ja/TrueType/」ディレクトリを作っておく
  3. cd /usr/share/fonts/ja/TrueType ; ln -s ../../ipa-gothic/ipag.ttf ./kochi-gothic-subst.ttf を実行
  4. cd /usr/share/fonts/ja/TrueType ; ln -s ../../ipa-mincho/ipam.ttf ./kochi-mincho-subst.ttf を実行
  5. runInstaller を実行して Oracle のインストールを始める
さざなみフォントは「/usr/share/fonts/ja/TrueType/kochi-{gothic, mincho}-subst.ttf」にあることになっている。なのでシンボリックリンクで IPAフォントを配置してしまう訳だ。


これによりインストーラが日本語で起動した。


なお、日本語が化けた状態のままインストールをしてもインストールは可能で、Oracle のデータベース自体は問題なく動作する。ただし、Enterprise Manager の一部のボタンが文字化けしてしまう。これは、インストール時にボタンのGIFファイルなどを動的生成しているのだが、フォントがないためボタンに書き込むべき文字がレンダリングできないためだ。

Oracle のインストールぐらいは日本語がなくても困らないが、後で人にメンテナンスさせることを考えると Enterprise Manager がちゃんと表示されないのは少々困る。

上記対処を行ってからインストールすればこの問題は発生しないが、化けたままインストールしてしまった場合は、まず上記対処で強制的にフォントを割り当ててからEnterpriseManager を停止し、キャッシュとして作成されているGIFファイルを削除してしまうといい。Enterprise Manager  を起動し直すと、その時にGIFファイルを再生成してくれる。
インストール直後にフォントが割り当てられてなかったので文字が豆腐になってしまってるが、今回の再生成時にはフォントが強制割り当てされているので文字が書き込まれ、正しいボタンができてくれる。

...なお全くの余談だが、私は Java が大嫌いだ。