2015年4月8日水曜日

正規表現の動作を手軽に検証する方法

Linuxのシェルスクリプトを作る時などで、正規表現を使えるとロジックが綺麗になる場合があるが、正規表現が頭の中で組み立てたものが、果たして想定通りの動きをしてくれるか不安になることが多い。

はじめはLinuxで検証用のスクリプトでも作ろうかと思ったのだが、よく考えたら正規表現を使えるコマンドがPower Shellにあるので、それを使えばお手軽に端末で正規表現の検証をできることに気がついたので、方法について記載する。

正規表現検証方法

例えば以下の様なテキストファイルを作るとする。ファイル名は適当に「test.txt」とする。

patternAAA01
patternBBB02
patternXXX003
patternYY04
patternZZZ5
ApatternCCC06

この中から「pattern + 英字大文字3文字 + 数字2桁」の条件で抜き出せる正規表現を考えていくことにする。

まず考えた正規表現は以下の通りになったとする(先に言ってしまうと、これでは最適な結果は得られない)。

<正規表現>
pattern[A-Z]{3}\d{2}

これを検証する方法は、別記事で書いた「Windows標準コマンドでgrepする」で記載した"Select-String"コマンドレットを使えば良い。"-Pattern"のオプションを使えば正規表現での検索が使える。

<コマンド>
Select-String .\test.txt -Pattern "pattern[A-Z]{3}\d{2}"

<結果>
test.txt:1:patternAAA01
test.txt:2:patternBBB02
test.txt:3:patternXXX003
test.txt:6:ApatternCCC06

上記の結果の通り、No3とNo6が余計に引っかかってしまった。改良して以下の正規表現にしてみる。

<正規表現>
^pattern[A-Z]{3}\d{2}$

<コマンド>
Select-String .\test.txt -Pattern "^pattern[A-Z]{3}\d{2}$"

<結果>
test.txt:1:patternAAA01
test.txt:2:patternBBB02

想定通りの動作となる正規表現であることが確認できた。

参考URL

.NET Framework の正規表現
https://msdn.microsoft.com/ja-jp/library/hs600312(v=vs.110).aspx

正規表現言語 - クイック リファレンス
https://msdn.microsoft.com/ja-jp/library/az24scfc(v=vs.110).aspx


2015年4月2日木曜日

VMwareの互換性確認方法

VMware製品も多種多様になってきて、各種HW・SWのバージョン互換性を確認する機会がますます増えるようになった。バージョン互換性を確認する方法で最も簡単なものは、VMwareが提供しているCompatibility Guideを確認することだ。

昔はPDFで提供されていたものは、今は最新情報を随時Web上で確認できるようになっている。ガイドも多様化しているので、「何が検索できるか」を簡単に調べたので記載する。

VMware Compatibility Guide

http://www.vmware.com/resources/compatibility/search.php

VMware製品と各種HW(CPU、サーバー製品、ストレージ製品、IOデバイス)の互換性確認や、対応仮想OSの確認などができる。略称VCG。


画面上部にある「Search Compatibility Guide」に検索ワードを指定して検索すること方法が手っ取り早い。

「What are you looking for」から検索ツールが選べるが、以下の様なものがある。

・Systems / Servers : サーバー製品との互換性確認
・IO Devices : IOデバイス(NIC、HBA)製品との互換性確認
・View : VMware Horizon Viewの互換性確認
・Storage/SAN : ストレージ製品との互換性確認
・Guest OS : 各VMware製品と対応仮想OSの確認
・Host OS : 現在はガイドから削除。以下KB参照とのこと
http://kb.vmware.com/selfservice/microsites/search.do?language=en_US&cmd=displayKC&externalId=2100429


VMware Product Interoperability Matrixes

http://www.vmware.com/resources/compatibility/sim/interop_matrix.php

VMware製品の各バージョンと各製品の互換性を確認することができる。


上の画面キャプチャではvCenter Server 5.1と管理対象とできるESX一覧を表示した。緑マークがあれば互換性ありということになるが、場合によっては制約事項があるので、マウスオーバーしてコメントを確認した方が良い。画面キャプチャでは、ESXi 5.1 U1の場合は、vCenter Server 5.1.0aと互換性がある旨記載がある。大抵は何らかのBug対応で制約事項があったりする。

Configuration Maximum

(英語) http://kb.vmware.com/selfservice/microsites/search.do?language=en_US&cmd=displayKC&externalId=1003497
(日本語) http://kb.vmware.com/selfservice/search.do?cmd=displayKC&docType=kc&docTypeID=DT_KB_1_1&externalId=2096917

これは昔からPDFで提供されている。URLで示したKBがリンク集になっており、英語と日本語がある。当たり前だが英語の方が更新が早い。

また、「構成の上限」という名前でPDF自体も日本語化されている場合がある。URLはバージョンによって異なるので、以下にまとめてみた。残念ながら現時点では6.0の日本語PDFは存在しないようだ。

http://www.vmware.com/files/jp/pdf/vsphere-55-configuration-maximums.pdf
http://www.vmware.com/files/jp/pdf/vsphere-51-configuration-maximums.pdf
http://www.vmware.com/files/jp/pdf/vsp_50_config_max_ja.pdf
http://www.vmware.com/files/jp/pdf/support/VMware-vsp_41_config_max-PG-JP.pdf




2015年4月1日水曜日

vmware.logが"can't open 'vmware.log': Device or resource busy"でコピーや閲覧ができない

ESXi Shellにログインして仮想マシンがパワーオンの状態のvmware.logをcatで見ようとしても、以下エラーが出力され閲覧でいないことがある。

   can't open 'vmware.log': Device or resource busy

仮想マシンパワーオフであれば当たり前のように見ることができる。パワーオンの仮想マシンであっても、vmware.logを閲覧する回避策(という程のものでも無い)を記載する。

vSphere Clientのデータストアブラウザからダウロードする

最も手っ取り早い方法はvSphere Clientにログインし、データストアブラウザ使って端末にvmware.logをダウンロードする方法。ダウンロードはパワーオンの仮想マシンでも実施可能だし、ログは端末のエディタ等で見れる。通常はこの方法で実施すれば問題ない。

仮想マシンが稼働するESXiのShellにログインして閲覧する

VMware環境の場合、1つのデータストアを複数のESXサーバーにてマウントして利用することが普通なので、どのESXサーバーからも仮想マシンのファイルにアクセスができてしまう。しかし、現在出力中のvmware.logは、その仮想マシンが稼働しているESXにてロックされているため、他ESXサーバーからアクセスするとエラーが出る。

なので、対象の仮想マシンが稼働しているESXiにログインすれば、vmware.logを閲覧することはできる。

2015年3月29日日曜日

仮想マシンのスナップショットのオプション

VMwareの仮想マシンスナップショットだが、オプションが2つある。これらの違いを調べてみた。というかほとんど参考URLのKBに記載されているので、それの補足的な情報になる。



パワーオフ仮想マシンのスナップショット

後述するが、上記2つのオプションは、パワーオン状態でなければ実施できない。逆にパワーオフ状態の仮想マシンの場合は、ディスクのスナップショットが取得されるだけであり、ファイル名としては以下が作成される。

◆vSphere Clientのデータストアブラウザで確認した場合
<VM名>.vmdk   ←元の仮想ディスク
<VM名>-000001.vmdk   ←差分ファイル
<VM名>.vmsd   ←スナップショットのメタデータ
<VM名>-Snapshot<番号>.vmsn   ←メモリのスナップショット情報(28KB程度と非常に小さい)

データストアブラウザで見えるファイル名と実体はのファイル名は実は異なる。実体のファイル名は以下の通りになる。以降は実体のファイル名で記載する。

◆ESXで直接確認した場合
<VM名>-flat.vmdk   ←元の仮想ディスク
<VM名>-000001-delta.vmdk   ←差分ファイル
<VM名>.vmsd   ←スナップショットのメタデータ
<VM名>-Snapshot<番号>.vmsn   ←メモリのスナップショット(28KB程度と非常に小さい)

仮想マシンのメモリのスナップショット

その名の通り、仮想マシンのディスクだけではなく、メモリ情報もスナップショットを取る機能。メモリ情報なので、パワーオフの仮想マシンでは取得不可(オプションを選択できない)。

メモリ情報も含めて保存されているので、この機能を用いたスナップショットを復元した場合は、仮想マシンはパワーオンの状態で戻る(逆に言えばこのオプションを有効にしない場合のスナップショットの復元後はパワーオフで戻る)。

この処理はメモリのスナップショットを取得するため、割り当てメモリが大きい程時間を要し、ストレージのパフォーマンスにもよると思うが、メモリ6Gの仮想マシンで5分程度掛かった。

ファイルとしては以下ファイルが大きくなるのが違い。

<VM名>-Snapshot<番号>.vmsn   ←メモリのスナップショット(メモリと同程度(6GB))


静止ゲストファイルシステム(VMware Toolsのインストールが必要)

VMware Toolsが仮想マシンのOSのディスク静止点を確保してスナップショットを取得する機能。VMware Toolsの起動が条件となるため、パワーオフの仮想マシンでは取得不可(オプションを選択できない)。

この機能は、VMware ToolsがWindowsのVSS(ボリュームシャドウコピーサービス)やSyncドライバなる機能と連携して、ファイルシステムレベルでのデータの静止点を確保してからバックアップを取得するという機能となる。実際にWindowsの仮想マシンで本オプションを有効にしてスナップショットを取得すると、仮想マシンのアプリケーションイベントログに以下のようなVSS関連のログが出力されていた。

 ソース:ESENT
 説明:lsass (672) シャドウ コピー インスタンス 2 を開始しています。
    これは、完全シャドウ コピーとなります。

メモリのスナップショットに比べれば時間は短く、20秒程度でスナップショット取得は完了した。

データストア上のファイルとしては以下ファイルが生成される。VSSのマニフェストファイルということで、VSSのメタデータが内容に含まれるらしい。

<VM名>-vss_manifests<番号>.zip

PowerCLIでスナップショットを取得する

スナップショット取得はNew-Snapshotコマンドレットを使う。メモリのスナップショット取得は"-Memory"、静止ゲストファイルシステムの取得は"-Quiesce"(※静止という意味)で指定する。両方取りたければ以下の通り実行する。$vmsnapに結果を代入している理由は、後で消したりする操作を簡単にするため。

$vmsnap = New-Snapshot -VM "VM_Name" -Name "Temporary Snapshot" -Memory:$true -Quiesce:$true

蛇足だが、スナップショットを削除する場合は以下を実行。削除処理は確認プロンプトが表示されるので、"-Confirm:$false"で表示させないようにする。

Remove-Snapshot -Snapshot $vmsnap -Confirm:$false

参考URL

VMware ESX の仮想マシンのスナップショットについて (1033239)
http://kb.vmware.com/selfservice/microsites/search.do?language=en_US&cmd=displayKC&externalId=1033239

vSphere PowerCLI Reference : New-Snapshot
https://www.vmware.com/support/developer/PowerCLI/PowerCLI51/html/New-Snapshot.html
2015年3月25日水曜日

OSのネットワーク(TCP)のタイムアウト値とディスクのタイムアウト値

OSのタイムアウト値を覚えておくと、障害設計や障害発生時に役立つ。例えば、ストレージのコントローラー障害でI/Oが1秒止まった場合の影響有無を考えた場合、ディスクタイムアウト値が1秒以上であれば、I/Oが再開されるので「影響無し」と判断することができたりする。

これはネットワークも同様に考えることができる。ということで、OSのネットワークとディスクのタイムアウト値を調べてみた。

ネットワーク(TCP)のタイムアウト値

Windowsの場合

再送回数に関しては、デフォルト5回との情報がMicorosoftのKBにあるが、5回ではなく3回との情報も多く存在し正しい情報がよくわからない状況。そこで、実際にWiresharkでパケットキャプチャしつつ、Telnetクライアント使ってSYNパケットの再送回数とタイムアウト時間(接続を諦める時間)を確認してみた。


タイムアウト時間の初期値は3秒、再送回数は2回のようだ。

つまりWindowsの場合、タイムアウトしてしまう最大の時間は、

 0秒(最初のSYN)
 +  3秒(1回)
 +  6秒(2回)
 + 12秒(タイムアウト)
 = 21秒

となる。

Linuxの場合

仕組みはWindowsと同じで初期値3秒でリトライ毎に時間が倍々になっていく。リトライ回数は以下で設定されている。

   /proc/sys/net/ipv4/tcp_syn_retries

このファイルをcatで見ると、デフォルトでは"5"になっているようだ。

つまりLinuxの場合、タイムアウトしてしまう最大の時間は、

 0秒(最初のSYN)
 +  3秒(1回)
 +  6秒(2回)
 + 12秒(3回)
 + 24秒(4回)
 + 48秒(5回)
 + 96秒(タイムアウト)
 = 189秒

となる。

ディスクのタイムアウト値

Windowsの場合

以下レジストリキーで設定されている。
HKEY_LOCAL_MACHINE¥System¥ CurrentControlSet¥Services¥Disk¥TimeOutValue
デフォルト:60秒 (Windows Server 2008 R2、Windows7、Windows 8.1環境で確認)
※レジストリキーの場所だが、"Disk"が"disk"の場合も有り



Linuxの場合

若干乱暴だが以下コマンドで調べることができるようだ。

   # cat /sys/block/sd*/device/timeout
   180

ディスクタイムアウトは180秒であることがわかる。これは後述するが、仮想マシンのVMware Toolsをインストールした際に変更されている。バージョン毎にデフォルト値は違うようだが、手元にあったCentOS 5.9 64bit (kernel:2.6.18-348)で確認した場合は、60秒であった。

仮想環境の場合

仮想環境では、1つのストレージに対し複数の仮想マシンのI/Oが発生するという特異な環境であることから、ストレージのパフォーマンスが安定しないことがある。そのため、VMware Toolsをインストールする際に、タイムアウト値が高めになるよう設定変更されるようだ。

変更される値は以下の通り。

   Windows:60秒 (デフォルトと変化無し)
   Linux:180秒


参考URL

TCP/IP の再送タイムアウトの最大値を変更する方法
https://support.microsoft.com/en-us/kb/170359/ja

ディスクが SAN データストアに配置されていると、Windows 仮想マシンのパフォーマンスが不安定になる (2080692)
http://kb.vmware.com/selfservice/microsites/search.do?language=en_US&cmd=displayKC&externalId=2080692

Linux 2.6 仮想マシンのディスク タイムアウト値を増やす (2076978)
http://kb.vmware.com/selfservice/microsites/search.do?language=en_US&cmd=displayKC&externalId=2076978




人気の投稿