2011-05-20

P2V 変換した Windows Server 2003 の仮想マシンに統合サービスセットアップディスクをインストールできずに泣かされる

 前々回の記事で、本ブログで物理マシンを仮想マシンに変換して Hyper-V で運用する方法について説明しましたが、disk2vhd で変換された仮想ディスクを使って起動した仮想マシン(Windows Server 2003)に統合サービスセットアップディスクを入れようとすると、「HAL をアップグレードしています」というダイアログが表示され、その後にマシンを再起動すると、このメッセージが再び表示される(つまりループ状態となる)現象が発生しました。


 二日間ほど悩んでネットを探し回った結果、以下の方法にたどり着きました。

disk2vhd で作成されたディスクはデュアルブートになっている

 仮想マシンを起動した直後は、以下のようなデュアルブート選択画面が表示されます。
 待ち時間はデフォルトで 3 秒間なので、素早く Disk2vhd でない方(下)を選択して起動します。



 この手順で起動した方のシステムに統合サービスセットアップディスクをインストールすると成功します。


デュアルブートのブート順を入れ替える

 上記で統合サービスセットアップディスクのインストールに成功したら、今度のためにもブート順を入れ替えておいた方が良いでしょう。

 上記の要領でシステムを起動してから、コンピュータのプロパティを表示させ、「詳細設定」タブの「起動と回復」セクションに表示されている“設定”ボタンをクリックします。



 表示されるダイアログの「起動システム」セクションで、Disk2vhd という表記がない方のシステムを選択し、“OK” をクリックします。 



 これによって、次回の起動時より Disk2vhd でない方のシステムがデフォルトとして選択されるようになります。
 今後も起動するシステムを選択したい場合は、上記の画面で待ち時間を 10 秒くらいにしておくと選択するときに慌てなくてよいでしょう。


参考:Integration services cannot upgrade HAL(英文ページ)

サイズ可変の仮想ディスクを固定にしてサイズを縮小する方法

 サイズ可変の仮想ディスクが異様に膨れ上がったことにより、物理ディスク領域を圧迫したために起動しなくなるというトラブルを以前経験したことがあり(詳細はこちら)、当方では固定ディスクの使用を推奨しておりますが、最初にサイズ可変の仮想ディスクを作成してしまった場合、固定ディスクに変換すると、そのサイズが 5 倍~ 6 倍にも膨れ上がることがあります。

 たとえば、10G だったはずのサイズ可変仮想ディスクを固定ディスクに変換したとたん、サイズが 50G に膨れ上がってしまい、物理ディスク領域を圧迫してしまう可能性があります。

 この場合、以下の手順を踏むことで固定仮想ディスクのサイズを縮小することが可能です。
 (縮小率は使用済み領域によって左右されますのでご注意ください。)

1. サイズ可変ディスクのサイズを縮小する。

 ホストマシン(Windows Server 2008)から「スタート」→「管理ツール」→「コンピュータの管理」の順に選択し、左ペインに表示される項目より「記憶域」→「ディスクの管理」の順に選択して右クリックし、サブメニューより「VHD の接続」を選択します。



 サイズを縮小したい可変仮想ディスクを選択すると、そのディスクが接続されますので、接続後にパーティションを右クリックすることによって、サイズを縮小することができます。
 サイズは可能な限り小さくしてください。
 ディスク領域が縮小されると、残りのパーティションは未使用領域として表示されます。



 処理が終わったらディスク名(上図ではディスク 6)を右クリックし、「VHD の切断」を選択してください。

2. 仮想ディスクを固定にする。

 Hyper-V マネージャを開き、右ペインに表示されるメニュー項目から「ディスクの編集」を選択し、ウィザードに従ってディスクを固定に変換します。


 
 この時点でディスクサイズが数倍に膨れ上がります。

3. 専用のツールを使って固定ディスクのサイズを縮小する。

 vmToolkit で配布されている無償のツール vhdresizer をダウンロードします。

 vhdresizer をインストールしてから起動すると、ディスク指定画面が表示されますので、上記 2. で固定化した仮想ディスクを指定します。



以下を指定してから“Resize” をクリックすると、ディスクサイズが縮小されます。

[Destination Vhd] に変換後のディスクの名前を入力。
[Type]が Fixed (固定)になっていることを確認。
[New Size]に可能な限り小さな値を指定。上図では、指定可能最小サイズが 17gb となっているが、17 では Resize ボタンがアクティブにならないため、18 を指定。

“Resize” ボタンをクリックすると、指定したサイズにが縮小されます。


参考:この操作によって、手順 1. の可変ディスクの縮小時にできた「未使用領域」がなくなるため、ディスクの中は一つのパーティションとなります。

ディスクのパーティションを削除、移動するためのツール

 ディスクのパーティションを削除して縮小したり、ディスクパーティションの位置を移動するには、専用のツールを使用する必要があります。

 今回使用したのは、MiniTool Partition Wizard です。

 Windows 7、Windows Server 2008 を使ってディスクマネージャから仮想ディスクを繋ぎ、MiniTool Partition Wizard を使うことによって、パーティションの編集ができます。



 パーティションの削除と移動が簡単に行えるので、あると便利なツールです。

 その他のパーティションツールとしては、EASEUS Partition Master も有力候補かと思います。
 EASEUS Partition Master のサイト(日本語) (2017/10/14 更新)



おまけ:
利用を検討したが、断念したツール群

Gnome Partition Editor
ブート CD を使ってパーティションを操作できるツールだが、vhd を USB 経由で参照するのに対応していなかったため使用を断念。

Cute Partition Manager
64 bit 環境で動作しないため、使用を断念。

2011-05-17

物理マシンを Hyper-V 仮想マシンに移行する(P2V)

 本ブログでは、Hyper-V の仮想マシンに OS をインストールしたり、仮想マシンを別のコンピュータの仮想マシンとして移行したりする方法を紹介してまいりましたが、今回は、運用中の物理マシン(タワー型マシン)の環境をごっそり仮想マシンに変換(P2V)して、Hyper-V で運用する方法について紹介します。

 手順は次の 3 ステップとなります。

1. 物理マシンのドライブをそれぞれ仮想ハードディスク(.vhd)に変換する。

MicroSoft 社の Windows SysInternals で提供されている disk2vhd というツールを使うことによって、物理ドライブを仮想ディスクに変換する。



注意:Hyper-V で運用可能な仮想ディスクを作成する場合は、ダイアログボックス右上の [Prepare for use in virtual PC]というチェックボックスに必ずチェックを入れてください。

 私が使っているマシンのディスクドライブは、C、E、F に分かれているため、C、E、F 個別に変換を行い、計 3 つの仮想ディスクを作成しました。

 外付けデバイス、CD/DVD-RW ドライブは変換しないようにしてください。

注意: C、E、F を一度に変換すると、場合によっては作成される仮想ディスクファイルが 1 つになったり、2 つになったりする可能性がありますが、この内部基準に関することは今のところはっきりとわかっておりません(調査不足ですみません)。
ドライブを複数に分けている場合は、個別に変換されることを強くお勧めします。

2. Hyper-V マネージャを開き、新しい仮想マシンを作成し、仮想ディスク接続先を 1. で作成した 3 つのドライブにする。
(参考:今回は仮想環境の C、E、F ドライブにするディスク領域を iSCSI で構築しています。)

 移行先のホストマシンに、1. で作成した 3 つの vhd を格納するディスクドライブを用意します。
 一度に全部の環境を一度にバックアップを取るようにスケジュールするのであれば、3 つの vhd を一つのドライブに入れても良いですが、データドライブのみ、アプリケーションドライブのみ、といったようなバックアップスケジュールを組みたい場合は、vhd を格納するドライブをそれぞれ分けた方が良いでしょう。


 以下の例は、ホストOS から見た H ドライブにゲスト OS の変換済みのドライブ E の vhd ファイルを配置したところです。
 このように、1 ドライブに 1 つの vhd ファイルを配置しても良いですし、一度に仮想マシン全体をバックアップする予定であれば、1 ドライブに 3 つの vhd ファイルを配置してもかまいません。



 ここまで終わったら、Hyper-V マネージャを開き、仮想マシンを新規作成した後で、それぞれの vhd ファイルを関連付けます。

 当方で動作検証したところ、SCSI コントローラで vhd を関連付けたところ E/F ドライブが認識されなかったため、IDE コントローラーで関連付けを行いました。

 IDE コントローラを使って C、E、F ドライブの関連付けを行うと、以下の図のようになります。



3. 仮想マシンを起動して、E、F ドライブを認識させる。

 上記のとおり設定を行ったところで、仮想マシンを起動します。
 disk2vhd でうまく vhd 変換できていれば、OS は正常に起動できると思います。

 起動直後は、以下のようなライセンス認証ダイアログが表示されることがありますので、期間内にライセンス認証を行ってください。



 「スタート」→「管理ツール」→「コンピュータの管理」の順に選択し、左ペインに表示される「ディスクの管理」を開きます。E および F ドライブのディスクがオフライン状態となっていることがありますが、ディスク名を右クリックし、「オンライン」を選択することによってディスクをオンライン状態にできます。

 すべてのディスクをオンライン状態にすると、ディスク構成は次のようになります。



 上記でおかしな点は、ディスク 1 に E と F というドライブ名がついていますが、ディスク 2 のドライブ名は設定されていないことです。
 ディスク 1 に E、ディスク 2 に F というドライブ名が設定されることを想定しているにもかかわらず、ディスク構成が上記のようになってしまうことがあります。

 disk2vhd の変換機能の仕様によるものなのかもしれませんが、ドライブ名を正しく指定するには、ディスク 1 の二番目のパーティションを空欄にし、ディスク 2 の二番目のパーティションに F を指定すると、想定しているディスク構成で元のファイル群を参照できるようになります。


 しかし、この方法ですと、ディスク 1 の二番目のパーティション、ディスク 2 の先頭のパーティションがゴミとして残ってしまいますので、専用のツールを使ってパーティションの削除、移動をする必要があります。

2011-05-09

Hyper-V のゲスト OS を起動しようとすると、「一般のアクセスが拒否されました」というメッセージが表示される (ID: )

今まで稼動させていた Hyper-V の仮想マシンの仮想ハードディスク (.vhd) の可変→固定 変換を行った直後に、変換後の .vhd を起動すると、以下のメッセージが表示されるようになりました。


権限が足りないために起動できなくなったようですが、.vhd に Authenticated Users というユーザをフルアクセスで割り当てることで事なきを得ました。

参考:
SQL Server をメインにしたいと思いつつ Microsoft 製品の勉強内容を日々投稿
SCVMM で共有ディレクトリの ISO イメージがマウントできない場合の対応



しかし、このような現象が発生した場合は、Hyper-V マネージャのゲスト OS 設定から一度当該のディスクを削除し、再度割り当てることによって、起動のために必要な権限が割り当てられるようになる模様ですので、こちらの方がやり方としてはお勧めです。(2011/09/28追記)


1. 起動時に問題を引き起こしている仮想ディスクを削除します(下図参照)。

2. 1. で削除した仮想ディスクを追加するために、ディスクコントローラーを追加しなおします。
下図は、SCSI コントローラを追加しなおしているところですが、元々 IDE コントローラを使用していた場合は、IDE コントローラを追加してください。

3. 1. で削除した仮想ディスクを追加し、適用させます。


4. ゲスト OS の電源を入れ、無事起動すれば成功です。



参考:
仮想マシンの起動時に「IDE/ATAPIアカウントには、アタッチメント(VHDファイル名)を開くのに十分な特権がありません。」のエラーが表示される

2011-04-21

SonicWall Global VPN Client のインストールが失敗したり、クラッシュしてしまうときのちょっとした改善案(Windows Vista, Windows 7 編)

 Sonic Wall Global VPN Client (以降 SWGVC) がインストール先の OS によって正しく動作しないという記事を過去に書きましたが、今回、Vista/Windows 7 環境でも不具合が発生することがあったため、裏技的な対応方法をご紹介します。

【現象】(テスト時の SWGVC のバージョンンは 4.2.6.0305)

 SWGVC を起動すると、「Failed to open the IPSec driver.」 というエラーメッセージが表示され、接続できない。
 もしくは、SWGVC の起動まではできるが、Enable をクリックすると同様のエラーが表示されるか、接続が Enabled にならない。


【対応方法】

1. スタートメニューより、「コンピュータ」を右クリックしてから「プロパティ」の順に選択し、デバイスマネージャーを開きます。

2. デバイスマネージャーの「表示」メニューより、「非表示のデバイスの表示(W)」を選択します。


3. 左ペインに表示されるデバイスの一覧から、「SonicWall IPSec Driver」を右クリックし、「プロパティ」を選択します。




4. プロパティシートの「ドライバ」タブより、スタートアップの種類を「自動」に変更し、“開始”ボタンをクリックしてドライバを開始させ、コンピュータを再起動します。




5. SWGVC を起動し、接続を試みます。


 当方の場合は、最新版の SWGVC ではどうしても接続がうまくいかなかったため、旧版の SWGVC をインストールしなおし、上記の操作をしてみたところ、正常に接続されるようになりました。


 今までいろいろやってみて、どうしてもうまくいかなかった方は、ダメ元でお試しください。

参考:SonicWall Global VPN Client (GVC) Troubleshooting

Hyper-V の仮想マシンのエクスポート時の注意点

 前回の記事に関連した内容となりますが、Hyper-V の仮想マシンをエクスポートする際に注意しておきたい点がいくつかありますので、紹介いたします。

仮想マシン全体をエクスポートするか、スナップショットをエクスポートするか

 Windows Server 2008 R2 では、仮想マシンのエクスポートを行う際に、仮想マシン全体をエクスポートするか、スナップショットをエクスポートするか選択できます。

 Hyper-V マネージャーで仮想マシン名を右クリックしてエクスポートすると、仮想マシン全体をエクスポートできます。



 特定のスナップショットのみをエクスポートする場合は、下ペインでスナップショットツリーを展開してから、当該のスナップショットを右クリックしてエクスポートします。



 この柔軟性が意外と問題で、誤ったスナップショットをエクスポートしてしまうと、移行先が最新版の仮想マシン環境にならない可能性があるため、注意が必要です。

 そのため、仮想マシン全体をエクスポートして、移行先で仮想マシンを復元してから、スナップショットを削除してディスク結合を行う方が操作上無難ではないかと思います。


不要なスナップショットを削除して、仮想ハードディスク結合を行う
 スナップショットの削除の仕方によって、スナップショットディスク (.avhd) そのものが削除される場合と、スナップショットディスクが親仮想ディスク (.vhd) に結合される場合があります。

 スナップショットディスクが親仮想ディスクに結合されるようにスナップショットを削除するには、下図の番号の順番にスナップショットを削除します。



参考:スナップショットの削除とインポート/エクスポート(3.スナップショットの削除とインポート/エクスポート)


【仮想マシンインポート時の注意点】

 仮想マシンをインポートする際に、仮想 NIC 名および CD/DVD デバイス名が元の名前と一致していない場合は、以下のようなエラーがイベントビューアに記録されます。




 これらのエラーは、イベントビューアより「アプリケーションとサービスログ」→「Microsoft Windows」→「Hyper-V-VMMS」→「Admin」で確認できます。

ID: 14140
'仮想マシン名' は、デバイス 'Microsoft Virtual CD/DVD Disk' を追加できませんでした。(仮想マシン ID XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX)

ID: 18130
'仮想マシン名' (仮想マシン ID XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX) にデバイス '{ResourceType=21, OtherResourceType="", ResourceSubType="Microsoft Virtual CD/DVD Disk"}' を正しくインポートできませんでした。エラー: 無効なパラメーターです (0x80041008)。

ID: 18510
インポート タスクで、エラー '指定されたネットワーク リソースまたはデバイスは利用できません。' (0x80070037) により、ファイル 'C:\ProgramData\Microsoft\Windows\Hyper-V\Windows Server 2000\HV Windows Sever 2000 x86 SP4.vhd' の ACL を修復できませんでした。

ID: 18060
インポートできませんでした。場所 'C:\ProgramData\Microsoft\Windows\Hyper-V\Windows Server 2000\' に仮想マシンを保存できません。エラー: 指定されたネットワーク リソースまたはデバイスは利用できません。 (0x80070037)


 当方で仮想マシンのインポート、仮想 NIC 名が元の環境とインポート先の環境と一致していない場合に仮想マシンのインポートを実行すると、ホストの NIC が動作停止し、コンピュータをシャットダウンできなくなるという不具合が発生したため、仮想 NIC 名は旧環境と新環境で統一しておいた方が良いかもしれません。

2011-04-06

Hyper-V の仮想マシンの移行方法(エクスポート&インポート)

 さて、当ブログで以前から Hyper-V の設定方法や仮想ディスクの編集方法について述べてきましたが、今回はあるコンピュータの Hyper-V 環境にインストールされている仮想マシンを別のコンピュータに移行する方法について紹介します。

 ここでは、Hyper-V マネージャに用意されている仮想マシンのエクスポート、および仮想マシンのインポート機能を使います。

【仮想マシンのエクスポート】

1. 移行対象の仮想マシンをシャットダウンして停止させます。
2. Hyper-V マネージャより、1. の仮想マシンをマウスで右クリックしてサブメニューを表示させ、その中から「エクスポート(X)...」を選択します。


3. エクスポート先の指定を促すダイアログが表示されますので、任意の場所を指定します。


注:
 現在割り当てている仮想マシンの環境がそのままエクスポートされますので、エクスポート先のディスク空き容量が十分あることを事前に確認しておいてください。

 また、ユーザが任意に名称変更した仮想ハードディスク (.vhd) をエクスポートしようとすると、以下のようなメッセージが表示され、エクスポートに失敗してしまいますので、ご注意ください。イベント ID:18350

「仮想マシン 'Windows Sever 2000 x86' (E07BACD0-A9A4-4FC2-85F0-D9A9357943AA) をエクスポートできませんでした: エラー '指定されたファイルが見つかりません。' (0x80070002)。


 このエラーメッセージは、管理ツールのイベントビューアより、「アプリケーションとサービス ログ」→「Microsoft」→「Windows」→「Hyper-V-VMMS」→「Admin」で確認できます。


【仮想マシンのインポート】

0. 仮想マシンのインポートは一旦処理が始まってしまうと、後でユーザがインポート先を任意指定できないため、事前にインポート先を決めておく必要があります。
 Hyper-V マネージャを開き、右ペインに表示されるメニュー項目の中から「Hyper-V の設定...」を選択します。



 Hyper-V の基本設定をするためのウィンドウが表示されますので、必要に応じて「サーバー」項目の[仮想ハードディスク] および [仮想マシン]へのパスを変更しておきます。
 仮想マシンのインポート処理が実行されると、これらのパスを使用して仮想マシンが構成されます。



 
注:
 デフォルトでは、これらのパスは以下のようになっているため、仮想マシンをインポートすると、以下のディレクトリ配下に仮想マシン環境が展開されることになります。

[仮想ハードディスク]
<%systemdrive%>:\Users\Public\Documents\Hyper-V\Virtual Hard Disks

[仮想マシン]
<%systemdrive%>:\ProgramData\Microsoft\Windows\Hyper-V


1. 移行先のコンピュータの Hyper-V マネージャを開き、右ペインに表示されるメニュー項目の中から「仮想マシンのインポート」を選択します。



2. 仮想マシンのインポートダイアログが表示されますので、下図のようにエクスポート済の仮想マシンを指定してから、オプションを設定して“インポート”ボタンを押すと、仮想マシンがインポートされます。




○オプション解説

仮想マシンを移動または復元する(既存の一意な ID を使用する)(M) --- エクスポート元の ID と全く同一の仮想マシンが復元される。
インポート先にすでに同じ ID の仮想マシンが存在する場合は、インポートは失敗する。

仮想マシンをコピーする(新しい一意な ID を作成する)(O) --- エクスポート元のマシンに新しい ID を振り、仮想マシンをコピー。

すべてのファイルを複製し、同じ仮想マシンを再度インポートできるようにする(D) --- エクスポートされた仮想マシンを元に、何回でもインポート操作ができる。

注:このチェックボックスを外してインポートを実行すると、エクスポート済の仮想マシンが使えなくなるため、一度しか操作を実行できなくなります。


3. インポートが完了したら、仮想マシンを起動します。
システムの構成によっては CD/DVD ドライブや NIC が正常に動作しないことがあるため、設定画面で調整を行ってください。


参考リンク:
Hyper-V 関連ドキュメント
http://technet.microsoft.com/ja-jp/virtualization/dd297510
Windows Server 2008 R2 Hyper-V バックアップ/リストアガイド
http://primeserver.fujitsu.com/primergy/technical/construct/pdf/win2008r2-hyperv-backup.pdf

2011-04-01

計画停電対策(2) --- データセンターを利用する

計画停電対策の王道は、やはり予備電源設備を完備したデータセンターの利用となる。
下図は今回、客先へ提出したデータセンター利用提案書の一部(改変)である。 既にインターネットVPNを構築済であるため、今まで本社で運用していたサーバ群をデータセンターに移し、データセンターを中心としたVPNネットワークを再構築する。 今まで支社からアクセスしていた Terminal Server だけでは 本社からのアクセスを捌き切れないので、Terminal Server をもう一台増設する。
これで、データセンター内のサーバは停電の心配がなくなるが、計画停電区域にある本社、支社等は停電時、当然ながら、センターのサーバへのアクセスはできない。 そこで、前回書いたように、本社、支社ではONUやルータといった必要最低限の通信機器はUPSに接続するとともに、必要最低限のノートPCを用意し、停電中もセンターのサーバへアクセスできるようにする。


注:
支社のクライアントPC 上の FileMaker からデータセンターのFileMaker Server にアクセスして処理を行うと、インターネットを介して多量のトラフィックが発生するため処理は遅くなる。 Terminal Server (Terminal Service) を利用すると、処理は Terminal Server 上で実行され、処理の結果たる画面イメージあるいは印刷イメージのみが支店のクライアントPCあるいはプリンタに 送付されるため、高速に処理を実行することが可能。 また、データ書出は支社のPCやストレージに行うこともできる。

2011-03-30

計画停電対策(1) --- ノートPCサーバとHyper-Vで乗り切る

震災発生が3/11。 計画停電(輪番停電)なるものがその後発生し、その間、サーバを停止させなければならないと判明したのが3/13(日)。 当事務所がある調布が第2グループに含まれており、15日に計画停電があると判ったのが14日夜。

当社では客先のデータベースを運用している関係上、至急、以下のような対策を検討した。

1.発電機導入
探してみるとヤマハのEF1600iS(13万円~、1.6kVA、燃料はガソリン)なるものが良いらしい。ルータ、ONU、最小限のサーバなら、停電時も運用できそうだ。 さっそく販売店に問い合わせてみると、「政府・メーカーから在庫分はすべえて被災地に送るようにと指示されていて、当面入荷の見込みはない」とのこと。 あっさり頓挫。


2.客先へのサーバ移動
客先の所在地が計画停電の範囲外にある場合に検討の余地がある。 サーバを新設する場合はすべて一から再構築になり、DNSやSSLも再申請・再設定になる可能性あり。また、夏場は千代田、港、中央以外の東京23区も停電の対象地域となるらしいので、この場合は解決策にはならない。


3.データセンター
データセンターであれば電源は保障される筈なので、上記2前段の問題は残るものの、停電対策には一番良い解決策と思われる。 が、コストが高い。


4.ノートPCサーバへの移行とUPS増設
現サーバ環境をノートPC(Windows Server 2008 R2 + Hyper-V)に移行し、停電時は増設したUPS で乗り切る。 結局、これを採用した。 開発用のノートPC(CORE I5/8GB)に Windows 2008 と Hyper-V をインストールしてあったので、ここに必要最低限の現サーバ(複数)の環境を移行。Hyper-Vのお陰で1台の物理マシンに複数のサーバOSをインストールして運用できる。 このノートPCの内蔵バッテリは最大6時間持つ仕様だが、テストしてみると3時間弱で切れてしまう。そこで、UPS(APC Smart-UPS 1500)も2台増設した。
1台はノートPC専用、もう1台はONUとルータに接続。この構成で3時間程度の停電であればUPSバッテリも余裕をもって乗り切ることができる。 また、停電後2時間程度でバッテリは満タン状態に戻るので、1日6時間停電がある場合でも、停電と停電の間に3時間の余裕があればどうにかなりそうである。


かくして、上記4の方法で行くことを14日午前に決定、14日午後一でUPSを発注、サーバ環境をノートPCサーバに移行作業開始、17日午後より運用を開始した。 Smart 1500が発注から中2日で到着したのは幸運だった。(その後、Webのショップを覗いてみたが、軒並み売り切れになっていた。3/30現在、在庫があるショップも僅かにあるが、14日時点に比べると、割高になっている。)

以上 


2011-01-25

『売上猫くん on MySQL』開発日記 - 番外22 -SQL SECURITY の DEFINER/INVOKER指定

ようやく再リリース!、と思ったのもつかの間。 MySQLデータベース neko のインストール後、テーブル(実際はビュー)にアクセスできない現象が発生。 CREATE VIEW するときの SQL SECURITY [DEFINER | INVOKER]に問題があることがわかったので、以下、そのメモ。
(ということで、1/25現在、ダウンロード停止中 )
(1/25 18:00~、ダウンロード再開)

DEFINER/INVOKER

DEFINER指定:
Stored/Viewに対して実行アカウントがExecute/Selectできる権限さえあれば、Stored/Viewの内容はDEFINERの権限で実行される→Stored/Viewが実行できない可能性は少ない(DEFINERがroot@localhost なら、ほぼ確実に実行できる筈。)

INVOKER指定:
Stored/Viewに対してExecute/Selectできる権限があっても、Stored/Viewの内容は実行アカウントの権限に基づき実行される→Stored/Viewが実行できない可能性は、DEFINER指定に比し大きい。

例:
CREATE DEFINER = 'admin'@'localhost' PROCEDURE p1()
SQL SECURITY DEFINER (or INVOKER)
BEGIN
UPDATE t1 SET counter = counter + 1;
END;


DEFINER指定:実行アカウントに Execute権限さえあれば、t1テーブルのUPDATE権限は不要( 'admin'@'localhost'の権限で実行される)
INVOKER指定:INVOKER(実行者) は Execute権限とUPDATE権限の両方必要。 

尚、下記サイトでは、セキュリティ上、INVOKER の使用を推奨している。


参考サイト
http://dev.mysql.com/doc/refman/5.0/en/stored-programs-security.html
(対応の日本語頁は無く、DEFINER | INVOKERに関する日本語サイトも少なし)

以上

2011-01-20

Hyper-V ゲスト OS 用仮想ハードディスクが膨れ上がって大慌て (イベントID 16060)

Hyper-V のゲスト OS が一斉に一時停止になってさあ大変

 Hyper-V のゲスト OS から共有しているフォルダにアクセスしようとすると、ネットワークリソースにアクセスできないという旨のメッセージが出ました。



 そこで、Hyper-V マネージャーを見てみると、すべてのゲスト OS が一時停止状態となっていたため、イベントビューアを調べてみると、以下のエラーが記録されていました。
 このエラーは、イベントビューアより、「アプリケーションとサービスログ」→「Microsoft」→「Windows」→「Hyper-V-VMMS」から参照することができます(イベントID 16060)。




 どうやら、ゲスト OS 用に割り当てた仮想ハードディスク (.vhd) が膨れ上がってしまい、ハードディスクの空き容量が少なくなってしまったたために、登録されているすべてのゲスト OS が Hyper-V の 仮想マシン管理サービスプロセス(VMMS)によって一時停止状態となったようです。

 仮想ハードディスクが膨れ上がった原因を調べてみると、次のことがわかりました。

  1. 仮想ハードディスクの形式が可変になっていた。

  2. スナップショットが複数存在していた


 上記のために、いつの間にか膨れ上がった仮想ハードディスクが実際のハードディスク領域を圧迫していた模様です。

こうなったら仮想ハードディスクを固定にするしかない

 限りあるコンピュータ資源であるハードディスクの空きがあまりないということで、今回のような現象が発生すると、これ以上仮想ハードディスクが膨らまないように対応するしかありません。

 仮想ハードディスクの形式を可変から固定に変換すれば、ディスク容量はそれ以上は大きくなりません。
 仮想ハードディスクの形式を可変から固定に変換する作業自体はそれほど難しくはないのですが、スナップショットが存在する場合は、先にスナップショットを親仮想ディスクに結合しなければなりません。

 以下のような仮想ハードディスク構成になっているとします。

Windows Server 2000 x86.vhd <--- 親仮想ディスク
  Windows Server 2000 x86[ユニークID].avhd <--- 差分仮想ディスク1
  Windows Server 2000 x86[ユニークID].avhd <--- 差分仮想ディスク2
  Windows Server 2000 x86[ユニークID].avhd <--- 差分仮想ディスク3(最新)

 上記で.avhd がスナップショットで作成される差分仮想ハードディスクとなります。
 このように、一つでも差分仮想ハードディスクが存在する場合は、ディスク形式を変換する前に親ディスクにディスクを結合しなければならなくなりますので、注意が必要です。

 上記の例では 3 の差分仮想ハードディスクが最新となっていますので、3、2、1 の順に計 3 回の結合作業が必要となります(3 回結合が完了すると、Windows Server 2000 x86.vhd だけになる)。


差分仮想ハードディスクの結合方法

 差分仮想ハードディスクを親仮想ディスクに結合するには、ゲスト OS をシャットダウンしてから、ディスクを解除します。

1. Hyper-V マネージャより、当該のゲスト OS を選択して設定画面を開き、下図のように IDE コントローラーから仮想ディスクを削除し、“適用”ボタンをクリックします。



 「削除」という表現が紛らわしいですが、Hyper-V の管理下から解除されるという意味ですので、仮想ハードディスク自体はそのまま残ります。

2. 下図のように、Hyper-V のマシン名をマウスで右クリックするとサブメニューが開きますので、その中から「ディスクの編集(E)...」というメニュー項目を選択します。



 仮想ハードディスクの編集ウィザードが開きますので、以下のように最新の差分仮想ディスク(.avhd)を指定します。



3. 仮想ハードディスクに対するアクションを選択するための画面に移りますので、下図のように「結合(M)」を選択し、“次へ”をクリックします。



4. 差分ディスク変更の結合をするための画面に映りますので、下図のように「親仮想ハードディスクに結合する(P)」を選択し、“次へ”をクリックします。



5. 以下のような確認画面が表示されますので、この内容でよければ“完了(F)”をクリックします。
差分仮想ハードディスクが親仮想ハードディスクに結合されます。



注意)この手順を繰り返し、すべての差分仮想ハードディスクを親仮想ハードディスクに結合する必要がありますので、ディスク領域に余裕のあるハードディスク上でこの操作を行ってください。


仮想ハードディスクを最適化する

 上記で差分仮想ハードディスクがすべて結合されると、ディスクの中は下図のように仮想ハードディスクのみになります。



 仮想ハードディスクのサイズ形式を可変から固定に変換する前に、以下の手順で仮想ハードディスクを最適化することによって、不使用の領域を取り除いておくことをお勧めします。


1. 下図のように、Hyper-V のマシン名をマウスで右クリックするとサブメニューが開きますので、その中から「ディスクの編集(E)...」というメニュー項目を選択します。



2. 仮想ハードディスクの編集ウィザードが開きますので、先ほど結合した仮想ハードディスクを指定し、“次へ”をクリックします。



3. 仮想ハードディスクに対する操作のメニュー項目が表示されますので、その中から一番上の「最適化(C)」を選択し、“次へ”をクリックします。



4. 確認画面が表示されますので、操作内容が最適化になっていることと、指定した仮想ハードディスクが正しいことを確認してから、“完了”をクリックすると、仮想ハードディスクが最適化されます。



仮想ハードディスクのサイズ形式を可変から固定に変換する

 仮想ハードディスクを最適化した後は、サイズ形式を可変から固定に変換します。

1. 下図のように、Hyper-V のマシン名をマウスで右クリックするとサブメニューが開きますので、その中から「ディスクの編集(E)...」というメニュー項目を選択します。



2. 仮想ハードディスクの編集ウィザードが開きますので、先ほど結合した仮想ハードディスクを指定し、“次へ”をクリックします。



3. 仮想ハードディスクに対する操作のメニュー項目が表示されますので、その中から真ん中の「変換(V)」を選択し、“次へ”をクリックします。



4. 変換対象の仮想ハードディスクを選択するための画面に移りますので、先ほど最適化した仮想ハードディスクを選択してから、“次へ”をクリックします。



5. 確認画面が表示されますので、操作内容が「容量固定に変換」になっていることと、指定した仮想ハードディスクが正しいことを確認してから、“完了”をクリックすると、仮想ハードディスクのサイズ形式が固定に変換されます。




変換済みの仮想ハードディスクを Hyper-V のIDE コントローラに繋ぎ直す

 これで仮想ハードディスクのサイズ形式が固定になりましたので、Hyper-V の IDE コントローラに繋ぎ直して起動できれば操作は完了です。


1. Hyper-V マネージャより、当該のゲスト OS を選択して設定画面を開き、下図のように IDE コントローラーを左ペインで選択し、右ペインで「ハードドライブ」を選択してから“追加(D)”ボタンをクリックします。




2. 仮想ハードディスクファイルを選択する画面に移りますので、“参照(B)...”をクリックして先ほどサイズ形式を固定に変換した仮想ハードディスクを選択してから、“適用(A)”をクリックします。




3. IDE コントローラに仮想ハードディスクが適用されると、“適用(A)”ボタンが灰色反転しますので、“OK”をクリックします。



4. 今回適用したハードディスクを使ったゲスト OS を起動し、問題なく操作できれば完了です。


 今回の障害で得られた教訓は次のとおりです。

1) 最初に仮想ハードディスクを割り当てる際は、予想されるディスク容量の形式を固定にする。
2) スナップショットはある時点のシステム状態を再現するには便利な機能だが、仮想ハードディスク絡みのトラブルが発生して最適化や変換が必要になった場合に、すべてのスナップショットを一旦親ディスクに結合しなければならなくなるので、スナップショットを多用するのは得策とは言えない。

2011-01-17

『売上猫くん on MySQL』開発日記 - 番外21 - βリリースしまつた

ダウンロード再開しまつた。 MySQL 5.5 に対応させようとしましたが、簡単には修正できなさそう。当面は諦めモード。 ということで、本製品は、現段階では、MySQL 5.5 には非対応!ですので、ご注意ください。 (11/01/21 土屋追記)



最新版のMySQL 5.5で動作しないことが判明したため、一時ダウンロード停止! トホホ…(11/01/20 土屋追記)



ようやく「売上猫くん on MySQL 5.0」のβ版(フリーウェア)をリリースすることになりました。
売上明細のテーブルに200万程度のレコードを入れてテストを行っています。
現時点でできるかぎりの巨大テーブル対応と、ストアドプロシジャやトリガを使用した高速化を行っています。 200万行のテーブルがあっても、起動が若干遅いこと、起動後最初に売上明細テーブルにアクセスにいくと10秒位コーヒーマークがでる位で、使用できるレベルではないか、と思ってます。 1000万件クラスのテーブルになると、今以上の対策がいるかも知れないです。

ご興味のある方は下記からダウンロードしてくださいね。 

売上猫くん on MySQL 5.0βのサイト
http://www.tpc.jp/product/neko/50/index.htm

ダウンロードページ


尚、バージョンを 5.0 としているのは、FileMaker Pro 5/6 で作成した旧製品「売上猫くん 4.5」の機能のほとんどを継承しているからです。データベース(バックエンド)に MySQL を使用した猫くん製品は、これが最初となります。


2010-11-16

『売上猫くん on MySQL』開発日記 - 番外20 - ウィンドウ内容の再表示ステップ実行時のクエリ

SQLデータベースを使用時、あるユーザが行った更新は他のユーザの画面に即時反映されることは無い。他のユーザが更新を行ったか否かを確認するには、[ウィンドウ内容の再表示]ステップを使用するが、このステップには、「キャッシュ結合結果を書き込む」「キャッシュされたSQLデータ」という2つのオプションがある。 オプションによって、SQLデータベースに送られるクエリにはどういう違いがあるのか?

1.キャッシュ結合結果を書き込む/キャッシュされたSQLデータの両オプション選択時
SELECT ID,`〒`,`住所` FROM vw_zips WHERE ID IN(121013,121014,~) 等のクエリを発行、画面は更新される

2.キャッシュ結合結果を書き込のみ
クエリ実行されず、画面未更新

3.キャッシュされたSQLデータのみ
上記1と同様

4.オプション無
クエリ実行されず、画面未更新

FileMakerの[レコード]-[ウィンドウ内容の再表示]を実行すると、1と同じ結果となり、画面は更新される。


注:
  • Selectクエリの対象となるフィールドは、レイアウトテーブルの全フィールドと、そのレイアウト上の関連フィールドに限られる。 よって、関連フィールドの値を最新に更新したい場合は、そのフィールドをレイアウト上に明示的に配置しなければなならい点に要注意。
  • 他ユーザが追加したレコードについては、[ウィンドウ内容の再表示]ステップでは表示できない。追加されたレコードをSelcectするような検索を実行すること。
参考URL
http://www.filemaker.co.jp/help/html/scripts_ref2.37.9.html