Windows Server バックアップでベアメタルリストア

Windows Server バックアップを使用した、Windows Serverのベアメタルリストア方法。

試した環境:Windows Server 2012 R、HP Proliant DL120 Gen9、HP Dynamic Smart Array B140i、NTFSなNAS

都合上画面キャプチャはないのであしからず。ポイントだけ説明。

失敗しても責任は持ちませんので、各自で検証してください。

バックアップ編

■ Windows Server バックアップ

まずはWindows Server バックアップから。

[単発バックアップウィザード]の[バックアップする項目を選択]画面内の[項目追加]ボタンをクリック→[項目の選択]画面で[ベアメタル回復]チェックボックスにチェック。※このとき選択されないドライブがあるので自分でチェックを付ける。ドライブと同列にある[回復]は要らない。

■ ドライバファイル

次にWindows Server バックアップとは別にバックアップする必要のあるドライバファイルについて。

リストア時にドライバが必要になるので、デバイスマネージャを起動し、ディスクコントローラ(記憶域コントローラ)とネットワークアダプターのドライバーファイル名を確認する。ドライバファイルの確認方法はデバイス名のコンテキストメニュー(右クリック)の[プロパティ]をクリックして、プロパティ画面を表示し[ドライバ]タブ内の[ドライバの詳細]ボタンをクリックして表示されるドライバーファイルの名前を記録。

「HP Dynamic Smart Array B140i」なら「HPSA3.sys」

ドライバファイル一式は以下のフォルダ内に保存されている。
C:\Windows\System32\DriverStore\FileRepository
(以下、FileRepositoryフォルダ)

ドライバファイル名が「HPSA3.sys」なら「hpsa3.inf_」で始まるフォルダを探し、見つけたらそのフォルダごとDVDに焼いて保存する。(見つからなければFileRepositoryフォルダを「HPSA3.sys」で検索し見つかったファイルの存在するフォルダを保存)

B140iの場合、「hpsa3.inf_」で始まるフォルダ内にドライバのインストールに使用するセットアップ情報ファイル「hpsa3.inf」が存在するが、この「hpsa3.inf」ファイルの内容を参照すると「include machine.inf」と記載している箇所がある。これは「machine.inf」も必要ということなのでFileRepositoryフォルダの中から「machine.inf_」で始まるフォルダを探し、これもDVDに保存する。

リストア編

[今すぐインストール]ボタンがある画面の左下の[コンピュータを修復する]をクリック→[トラブルシューティング]→[詳細オプション]→[イメージでシステムを回復]→[システムイメージバックアップの選択]画面にて[システムイメージを選択する]を選択して[次へ]

[復元するコンピュータのバックアップの場所を選択してください]画面の[詳細設定]ボタンをクリック。

[ドライバをインストール]をクリック。ドライバを保存したメディアを装填。

ネットワークアダプターのドライバのセットアップ情報ファイル(xxx.inf)を選択。

ドライバのロードに成功し、[復元するコンピュータのバックアップの場所を選択してください]画面に戻ってきたら、Shift + F10 でコマンドプロンプトを呼び出して、IPアドレスを設定する。以下のコマンドを実行。(最初のipconfigでネットワークアダプタ名を取得)
> start /w wpeinit
> ipconfig
> netsh interface ip set address "ネットワークアダプタ名" static <IPアドレス> <ネットマスク> <ゲートウェイ>
> ipconfig

[復元するコンピュータのバックアップの場所を選択してください]画面の[詳細設定]ボタンをクリック。

[ネットワーク上のシステムイメージを検索する」をクリック。

[他の復元方法を選択してください]画面にて[ドライバーのインストール]ボタンをクリックして、ディスクコントローラのドライバをロード。

B140iの場合、hpsa3.infインストールは失敗するがコマンドプロンプトからdiskpart.exeを実行してディスクの一覧を表示するとディスクは見えている。
>diskpart.exe
DISKPART> list disk
ディスク 状態 サイズ 空き ダイナ GPT
------------ ------------- ------- ------- --- ---
ディスク 0 オンライン 1863 GB 839 GB
ディスク 1 オンライン 2794 GB 458 GB
ディスク 2 オンライン 2048 MB 2048 MB

[他の復元方法を選択してください]画面にて[次へ]ボタンをクリックして、リストアを続行。

これで、Windowsもベアメタルリストアできるはず。

[windows10]スタートメニューやアクションセンターが表示されないとき

スタートメニューやアクションセンターが表示されないとき(起動しない、開けない、表示されるがすぐ消える)ときの対処方法。

検索結果でよく表示されるpowershellを起動してGet-AppXPackage コマンドを実行してAdd-AppxPackageコマンドを実行する方法でも解決できないときに、この方法を試すと解決するかも。

  1. スタートメニューを表示できないユーザでログオン
  2. スタートメニューボタン(田ボタン)の上で右クリックし、エクスプローラを起動
  3. エクスプローラのリボンメニューの[表示]タブ内の[隠しファイル]にチェック
  4. そのエクスプローラでC:\Users\ユーザー名\AppData\Local\Microsoft\Windowsに移動
  5. UsrClass.datのファイル名をUsrClass.dat.oldに変更
  6. ログオフ
  7. ログオン

※UsrClass.datのファイル名を変更できない場合はAdministratorユーザなど管理者アカウントで実施

副作用としては、該当ユーザのストアアプリが全て消えます。
といってもここまでひどい状態はユーザアカウント作成直後から発生していると思うので、そこまで影響ないと思いますが・・・

ちなみに当方、中国語版Windowsを無理やり日本語にしている環境です(所謂、中華パッド)。

[python3]HTMLテンプレートとしてformatメソッドを使用するコツ

pythonでCGIプログラムを書くと、str型(文字列型)の変数にテンプレートとなるHTMLを代入して可変のところだけ文字列フォーマット化してしまうことが多いが、python3から本格導入されたformatメソッドでは書式指定部分が「%」から「{}」に囲まれてた部分に変更されているので、HTML中のCSSやJavaScirptと非常に相性が悪い。({ }の間で改行してもKeyとして認識されてしまう)

「%」のときと同様に同じ文字を重ねたらエスケープできるが(「{」→「{{」)、これをHTMLテンプレートの中で全部すると非常にめんどくさいし可読性も悪くなる。

なので、人がコードを記載するときのクセの違いを利用して、後から「{」を「{{」に置換してしまおうという作戦。

大抵の人が以下のようなクセになると思う。(完全に私感)

pythonのformatによる書式指定({}の間はスペースを空けない)

 '<html><body>{body}</body></html>'.format(body="今日は晴天なり")

CSS/Javascript(可読性をあげるために{}の間に改行やスペースが入る)

 <html>
  <head>
    <style type="text/css">
        <!--
            dt{ backgroud: #bbb }
            .odd{ backgroud: #ddd }
        -->
    </style>
    <script type="text/javascript">
       function hogehoge() {
          print("本日は晴天なり");
       }
     </script>
</head>

これを踏まえて以下のようにすれば、HTMLテンプレート部分は毎度エスケープしなくてもよくなる。({}を重ねる置換を実施してからformatをしている)

import re
htmltemplate='''
 HTMLのテンプレート
'''
html=re.sub(r'([^a-zA-Z0-9])}',r'\1}}',re.sub(r'{([^a-zA-Z0-9])',r'{{\1',htmltemplate,0,re.M|re.S),0,re.M|re.S).format(書式指定)

 

[python3]デフォルト文字コードの指定(CGI実行時)

前の記事で「python3のデフォルト文字コードがUTF-8だ」なんて書いたが、それはログインプロンプトからログインしたときだけであって、ログインせずに実行してしまうスクリプト(特にCGI)は、そうではない。このカラクリは環境変数「LANG」からpythonで使用するデフォルトの文字コードを取得して自動的に設定しているからである。

$ echo $LANG
ja_JP.UTF-8

CGIの実行ユーザになるであろう「nobody」「apache」「httpd」などはログインシェルは設定されていない(/bin/falseや/sbin/nologinなど)ので環境変数など設定できるわけもなくLANGはデフォルトの「C」(=ascii)であるので、pythonの文字コードもasciiとなる。
なので、CGIで日本語を含む文字列を出力しようとしたら例のごとく

UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-14: ordinal not in range(128)

となってしまう。

解決方法

ソースの先頭のほうに以下を追記する。標準出力とエラー出力のエンコードをUTF-8に設定している

import io,sys
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
sys.stderr = io.TextIOWrapper(sys.stderr.buffer, encoding='utf-8')

※importで呼び出す側およびにimportで呼び出される側両方のソースに上記コードを記載すると、だんまりエラーで異常終了するので注意!(エラーメッセージ出ず。例外処理も効かない。)

追記

ファイルに出力するときもpythonの文字コードがasciiになってしまっているが、上記方法では補正できない。
ファイル出力の文字コードを正しいものに修正するには、ファイルオープン時に文字コードを指定する。

fh=open("hoge.txt","a",encoding='utf-8')

[python3]文字コードの判定

python3になってから文字列型はUTF-8になったため、文字コード不明のファイルを開いたり、ダウンロードしたりするとread()でUnicodeDecodeErrorになってしまう。(例えば、EUCの変数データを無変換でUTF-8を期待する変数に代入することはできない)

>>> fhinput = open("eucsample.txt","r")
>>> fhinput.read()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/python3/lib/python3.4/codecs.py", line 313, in decode
    (result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xa4 in position 0: invalid start byte
>>> fhinput.close()

ファイルを開く際にバイナリモードで開けばread()メソッドの型はバイナリ(bytes)型になるので、python2の頃と同様にファイルの内容を変数に格納できるので総当りでdecode(文字コード変換)に挑戦できる。以下のサンプルコードは文字コードEUCのファイルをバイナリで開いて総当り文字コード変換を試みた例。

>>> fhinput = open("eucsample.txt","rb")
>>> htmlbytes=fhinput.read()
>>> htmlbytes
b'\xa4\xa2\xa4\xa2\xa4\xa2\xa4\xa2\xa4\xa2\xa4\xa2\xa4\xa2\xa4\xa2\xa4\xa2\xa4\xa2\xa4\xa2\xa4\xa2\xa4\xa2\xa4\xa2\xa4\xa2\xa4\xa2\xa4\xa2\xa4\xa2\xa4\xa2\xa4\xa2\xa4\xa2\xa4\xa2\xa4\xa2\xa4\xa2\n\xa4\xa4\xa4\xa4\xa4\xa4\xa4\xa4\xa4\xa4\xa4\xa4\xa4\xa4\xa4\xa4\xa4\xa4\xa4\xa4\xa4\xa4\xa4\xa4\xa4\xa4\xa4\xa4\xa4\xa4\xa4\xa4\xa4\xa4\xa4\xa4\xa4\xa4\xa4\xa4\xa4\xa4\xa4\xa4\xa4\xa4\xa4\xa4\xa4\xa4\xa4\xa4\n\xa4\xa6\xa4\xa6\xa4\xa6\xa4\xa6\xa4\xa6\xa4\xa6\xa4\xa6\xa4\xa6\xa4\xa6\xa4\xa6\xa4\xa6\xa4\xa6\xa4\xa6\xa4\xa6\xa4\xa6\xa4\xa6\xa4\xa6\xa4\xa6\xa4\xa6\xa4\xa6\xa4\xa6\xa4\xa8\n\xa4\xa8\xa4\xa8\xa4\xa8\xa4\xa8\xa4\xa8\xa4\xa8\xa4\xa8\xa4\xa8\xa4\xa8\xa4\xa8\xa4\xa8\xa4\xa8\xa4\xa8\xa4\xa8\n\xc8\xf8\xa4\xaa\xa4\xaa\xa4\xaa\xa4\xaa\xa4\xaa\xa4\xaa\xa4\xaa\xa4\xaa\xa4\xaa\xa4\xaa\xa4\xaa\xa4\xaa\xa4\xaa\xa4\xaa\xa4\xaa'
>>> htmlbytes.decode('shift_jisx0213')
'、「、「、「、「、「、「、「、「、「、「、「、「、「、「、「、「、「、「、「、「、「、「、「、「\n、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、\n、ヲ、ヲ、ヲ、ヲ、ヲ、ヲ、ヲ、ヲ、ヲ、ヲ、ヲ、ヲ、ヲ、ヲ、ヲ、ヲ、ヲ、ヲ、ヲ、ヲ、ヲ、ィ\n、ィ、ィ、ィ、ィ、ィ、ィ、ィ、ィ、ィ、ィ、ィ、ィ、ィ、ィ\nネ?ェ、ェ、ェ、ェ、ェ、ェ、ェ、ェ、ェ、ェ、ェ、ェ、ェ、ェ、ェ'
>>> htmlbytes.decode('iso2022jp')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'iso2022_jp' codec can't decode byte 0xa4 in position 0: illegal multibyte sequence
>>> htmlbytes.decode('euc_jisx0213')
'ああああああああああああああああああああああああ\nいいいいいいいいいいいいいい いいいいいいいいいいいい\nうううううううううううううううううううううえ\nええええええええええええええ\n尾おおおおおおおおおおおおおおお'

EUCのはずなのにshift_jisx0213で成功してしまってますが・・・

総当りで文字コード変換に挑戦するコードの例は以下。

def conv_charset_file(inputfile,outputfile):
    try: 
        fhinput = open(inputfile,"rb")
        htmlbytes = fhinput.read()
        fhinput.close()
    except:
        return None,"文字コード変換できません"
        
    codelst = ('utf_8','euc_jisx0213','shift_jisx0213','iso2022jp','iso2022_jp_ext','iso2022_kr','big5','big5hkscs','johab','euc_kr','utf_16','iso8859_15','latin_1','ascii')
    
    code = ""
    for encoding in codelst:
        try:
            htmlstr = htmlbytes.decode(encoding) # bytes文字列から指定文字コードの文字列に変換
            htmlstr = htmlstr.encode('utf-8') # uft-8文字列に変換
            code=encoding
            break
        except:
            pass
            
    if code == "" :
        return None,"文字コード変換できません"
    
    try:
        fhwrite = open(outputfile,"w")
        fhwrite.write(htmlstr)
        fhwrite.close()
    except:
        return None,"文字コード変換できません"
    
    return code,None

ちなみにHTMLであればファイル内に文字コードが定義されているので、そこから文字コードを拾ってこればよいのでは思ってしまうが、そうはうまくいかない。内容を検索するには変数に格納しないといけないが、バイナリ型ではないと格納できない。またバイナリ型は文字列比較できないので、文字列型に変換しないといけないが、decodeせずに文字列に変換すると16進数表記をさらに「\」をエスケープされているので、全く別物の文字列と化してしまっている

 >>> fhinput = open("eucsample.txt","rb")
>>> htmlbytes=fhinput.read()
>>> htmlbytes
b'\xa4\xa2\xa4\xa2\xa4\xa2\xa4\xa2\xa4\xa2\xa4\xa2\xa4\xa2\xa4\xa2\xa4\xa2\xa4\xa2\xa4\xa2\xa4\xa2\xa4\xa2\xa4\xa2\xa4\xa2\xa4\xa2\xa4\xa2\xa4\xa2\xa4\xa2\xa4\xa2\xa4\xa2\xa4\xa2\xa4\xa2\xa4\xa2\n\xa4\xa4\xa4\xa4\xa4\xa4\xa4\xa4\xa4\xa4\xa4\xa4\xa4\xa4\xa4\xa4\xa4\xa4\xa4\xa4\xa4\xa4\xa4\xa4\xa4\xa4\xa4\xa4\xa4\xa4\xa4\xa4\xa4\xa4\xa4\xa4\xa4\xa4\xa4\xa4\xa4\xa4\xa4\xa4\xa4\xa4\xa4\xa4\xa4\xa4\xa4\xa4\n\xa4\xa6\xa4\xa6\xa4\xa6\xa4\xa6\xa4\xa6\xa4\xa6\xa4\xa6\xa4\xa6\xa4\xa6\xa4\xa6\xa4\xa6\xa4\xa6\xa4\xa6\xa4\xa6\xa4\xa6\xa4\xa6\xa4\xa6\xa4\xa6\xa4\xa6\xa4\xa6\xa4\xa6\xa4\xa8\n\xa4\xa8\xa4\xa8\xa4\xa8\xa4\xa8\xa4\xa8\xa4\xa8\xa4\xa8\xa4\xa8\xa4\xa8\xa4\xa8\xa4\xa8\xa4\xa8\xa4\xa8\xa4\xa8\n\xc8\xf8\xa4\xaa\xa4\xaa\xa4\xaa\xa4\xaa\xa4\xaa\xa4\xaa\xa4\xaa\xa4\xaa\xa4\xaa\xa4\xaa\xa4\xaa\xa4\xaa\xa4\xaa\xa4\xaa\xa4\xaa'
>>> import re
>>> regcheck=re.compile('content="text/html; *?charset="*(.+?)"',re.I|re.S|re.M)
>>> regcheck.search(htmlbytes)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can't use a string pattern on a bytes-like object
>>> regcheck.search(str(htmlbytes))
>>>
>>> str(htmlbytes)
"b'\\xa4\\xa2\\xa4\\xa2\\xa4\\xa2\\xa4\\xa2\\xa4\\xa2\\xa4\\xa2\\xa4\\xa2\\xa4\\xa2\\xa4\\xa2\\xa4\\xa2\\xa4\\xa2\\xa4\\xa2\\xa4\\xa2\\xa4\\xa2\\xa4\\xa2\\xa4\\xa2\\xa4\\xa2\\xa4\\xa2\\xa4\\xa2\\xa4\\xa2\\xa4\\xa2\\xa4\\xa2\\xa4\\xa2\\xa4\\xa2\\n\\xa4\\xa4\\xa4\\xa4\\xa4\\xa4\\xa4\\xa4\\xa4\\xa4\\xa4\\xa4\\xa4\\xa4\\xa4\\xa4\\xa4\\xa4\\xa4\\xa4\\xa4\\xa4\\xa4\\xa4\\xa4\\xa4\\xa4\\xa4\\xa4\\xa4\\xa4\\xa4\\xa4\\xa4\\xa4\\xa4\\xa4\\xa4\\xa4\\xa4\\xa4\\xa4\\xa4\\xa4\\xa4\\xa4\\xa4\\xa4\\xa4\\xa4\\xa4\\xa4\\n\\xa4\\xa6\\xa4\\xa6\\xa4\\xa6\\xa4\\xa6\\xa4\\xa6\\xa4\\xa6\\xa4\\xa6\\xa4\\xa6\\xa4\\xa6\\xa4\\xa6\\xa4\\xa6\\xa4\\xa6\\xa4\\xa6\\xa4\\xa6\\xa4\\xa6\\xa4\\xa6\\xa4\\xa6\\xa4\\xa6\\xa4\\xa6\\xa4\\xa6\\xa4\\xa6\\xa4\\xa8\\n\\xa4\\xa8\\xa4\\xa8\\xa4\\xa8\\xa4\\xa8\\xa4\\xa8\\xa4\\xa8\\xa4\\xa8\\xa4\\xa8\\xa4\\xa8\\xa4\\xa8\\xa4\\xa8\\xa4\\xa8\\xa4\\xa8\\xa4\\xa8\\n\\xc8\\xf8\\xa4\\xaa\\xa4\\xaa\\xa4\\xaa\\xa4\\xaa\\xa4\\xaa\\xa4\\xaa\\xa4\\xaa\\xa4\\xaa\\xa4\\xaa\\xa4\\xaa\\xa4\\xaa\\xa4\\xaa\\xa4\\xaa\\xa4\\xaa\\xa4\\xaa'"

[KVM]仮想GUIコンソールで日本語キーボードにする方法

仮想コンソールマネージャ(virt-manager)で仮想マシンを作成すると、キーボードが英字配列になってしまい、記号等が刻印どおりに入力できない。この不便な状態からキーボード入力を日本語配列に修正する方法。

仮想マシンを定義しているxmlの「graphics type=’vnc’」を定義している行に「 keymap=’ja’」を追記して修正する。

仮想マシンを定義してるxmlファイルの場所は/etc/libvirt/qemu/[仮想マシン名].xml

修正前

<graphics type='vnc' port='-1' autoport='yes' />

修正後

<graphics type='vnc' port='-1' autoport='yes' keymap='ja'/>

[KVM] virshコマンドまとめ(おまけつき)

KVMをCUIで管理するときに使用するvirshコマンドの使い方まとめ。(随時更新予定)

ただまとめるだけだと他の技術ブログと同じような内容になってしまうので、意味もなくOracle VM for SPARC(LDOM)のldmコマンドとも比較してみる。(ニッチ過ぎる・・・)


  • 所謂「仮想マシン」の呼び名は正式に「ゲストドメイン」です
  • 太文字は打ち込んだコマンドです
  • []で囲まれた斜体は可変値を表します

情報表示系

仮想マシンの一覧表示

KVM
# virsh list --all
  Id    名前                         状態
 ----------------------------------------------------
  1     win2000                        実行中
  -     windows8.1                     シャットオフ
 ※--allを付けないと状態が実行中の仮想マシンのみ表示される
OVM for SPARC
# ldm list-domain
 NAME             STATE      FLAGS   CONS    VCPU  MEMORY   UTIL  UPTIME
 primary          active     -n-cv-  UART    16    1984M    0.8%  2h 19m
 testvm           bound      ------  5000    32    4G

OVM for SPARCのほうが割り当てリソースなども表示されるので便利


仮想マシンの詳細表示

KVM
# virsh dominfo [仮想マシン名]
Id:             1
名前:         win2000
UUID:           0983fb9c-1040-ffaf-4e0e-e37f364df13e
OS タイプ:   hvm
状態:         実行中
CPU:            1
CPU 時間:     343.4s
最大メモリー: 1048576 KiB
使用メモリー: 1048576 KiB
永続:         はい (yes)
自動起動:   無効にする
管理済み保存: いいえ (no)
セキュリティモデル: none
セキュリティ DOI: 0

 

ストレージプールの一覧表示

KVM
# virsh  pool-list
 名前               状態     自動起動
 ----------------------------------------->
 default              動作中  はい (yes)

OVM for SPARCにはストレージプールの概念はない。


ストレージプールの情報表示

KVM
# virsh  pool-info [ストレージプール名]
名前:         default
UUID:           fad29cc4-7345-156b-3cf8-f6748d91ab25
状態:         実行中
永続:         はい (yes)
自動起動:   はい (yes)
容量:         426.76 GiB
割り当て:   30.43 GiB
利用可能:   396.34 GiB

こっちでみないとストレージプールのパスがわからない

# virsh  pool-dumpxml [ストレージプール名]
<pool type='dir'>
  <name>default</name>
  <uuid>fad29cc4-7345-156b-3cf8-f6748d91ab25</uuid>
  <capacity unit='bytes'>458231758848</capacity>
  <allocation unit='bytes'>32669159424</allocation>
  <available unit='bytes'>425562599424</available>
  <source>
  </source>
  <target>
    <path>/var/lib/libvirt/images</path>
    <permissions>
      <mode>0755</mode>
      <owner>-1</owner>
      <group>-1</group>
    </permissions>
  </target>
</pool>

 


仮想ネットワークの表示

KVM
# virsh net-list
名前               状態     自動起動  永続
--------------------------------------------------
default              動作中  はい (yes)  はい (yes)

 

 


物理マシンのインタフェース表示

 
KVM
# virsh  iface-list --all
名前               状態     MAC アドレス
--------------------------------------------
br0                  動作中  00:23:54:73:13:30
eth1                 停止状態 00:1b:21:a1:85:0c
eth2                 停止状態 00:40:26:f9:7e:ea
lo                   動作中  00:00:00:00:00:00

 

OVMforSPARC
# dladm show-dev
e1000g0         リンク: up      速度: 100   Mbps        デュプレックス: half
e1000g1         リンク: unknown 速度: 0     Mbps        デュプレックス: half
e1000g2         リンク: unknown 速度: 0     Mbps        デュプレックス: half
e1000g3         リンク: unknown 速度: 0     Mbps        デュプレックス: half
e1000g4         リンク: unknown 速度: 0     Mbps        デュプレックス: half
e1000g5         リンク: unknown 速度: 0     Mbps        デュプレックス: half

 仮想マシンの管理

正直、GUI(仮想マシンマネージャ)から管理したほうが楽ですよ。どうせ仮想マシンのGUIコンソール使うんだし。現場がSSHしかリモート接続許可していないとか、CUI萌え~な人はどうぞ。

仮想マシン用ディスク作成

 KVM
 # qemu-img create -f qcow2 [仮想ディスクファイルのパス] [サイズ]

# qemu-img create -f qcow2 /vmdata/images/test.qcow2 8G
# ls -l /vmdata/images/test.qcow2
-rw-r--r-- 1 root root 262144  8月 13 01:45 2014 /vmdata/images/test.qcow2
 OVM for SPARC
 # mkfile 64g /export/home/LDOM/testvm_vdisk1 # 仮想ディスク作成

# ldm add-vdsdev /export/home/LDOM/testvm_vdisk1 vol1@vds0 # 制御ドメインに仮想ディスクを登録
# ldm list-services
VCC
    NAME             LDOM             PORT-RANGE
    vcc0             primary          5000-5100

VSW
    NAME             LDOM             MAC               NET-DEV   ID   DEVICE     LINKPROP   DEFAULT-VLAN-ID PVID VID                  MTU   MODE   INTER-VNET-LINK
    vsw0             primary          00:14:4f:f9:b6:f6 igb2      0    switch@0              1               1                         1500         on
    vsw1             primary          00:14:4f:f8:d9:6b igb3      1    switch@1              1               1                         1500         on

VDS
    NAME             LDOM             VOLUME         OPTIONS          MPGROUP        DEVICE
    vds0             primary          vol1                                           /export/home/LDOM/testvm_vdisk1

# ldm add-vdisk vdisk1 vol1@vds0 testvm  # 制御ドメインに登録したディスクをゲストドメインに割り当て
# ldm list-domain -o disk testvm
NAME
testvm

DISK
    NAME             VOLUME                      TOUT ID   DEVICE  SERVER         MPGROUP
    vdisk1           vol1@vds0                        0                         

※先にゲストドメインを作ってあげないといけない。

※仮想ディスクを一旦制御ドメインに登録して、制御ドメインからゲストドメインに割り当てるイメージ

 


仮想マシン作成

KVM ※実行前にブート可能なCDROMイメージを用意すること

# virt-install --connect=qemu:///system \
--name=[仮想マシン名] \
--hvm --accelerate \
--disk path=[仮想ディスクのパス],size=[仮想ディスクサイズ(GB)],device=disk,bus=virtio,format=qcow2 \
--ram=[メモリサイズ(MB)] \
--vcpus=[仮想CPU数] \
--cdrom [CDROMイメージのパス] \
--network network=[接続先仮想ネットワーク名],model=virtio \
--graphics vnc \
--vnc --os-type=linux

例 失敗してますが・・・

# virt-install --connect=qemu:///system --name=testvm --hvm --accelerate \
 --disk path=/vmdata/images/test.qcow2,size=8,device=disk,bus=virtio,format=qcow2 \
 --ram=2048 --vcpus=1 --cdrom /vmdata/ISO/CentOS-6.4-x86_64-bin-DVD1.iso --network network=default,model=virtio --vnc --os-type=linux
Starting install...
ドメインを作成中...                              |    0 B     00:00
ディスプレイをオープンできません:
Run 'virt-viewer --help' to see a full list of available command line options
Domain creation completed. You can restart your domain by running:
virsh --connect qemu:///system start testvm

成功すると仮想マシンが起動している

 # virsh list --all
 Id    名前                         状態
----------------------------------------------------
 1     win2000                        実行中
 2     testvm                         実行中
 -     windows8.1                     シャットオフ

/etc/libvirt/qemu以下に仮想マシン定義のxmlファイルができている

# ls /etc/libvirt/qemu
networks  testvm.xml  win2000.xml  windows8.1.xml

# virsh domblklist testvm
ターゲット ソース
------------------------------------------------
vda        /vmdata/images/test.qcow2
hdc        /vmdata/ISO/CentOS-6.4-x86_64-bin-DVD1.iso

# virsh domiflist testvm
インターフェース 種類     ソース  モデル   MAC
-------------------------------------------------------
-          network    default    virtio      52:54:00:8b:41:a4

OVM for SPARC
# ldm add-domain testvm
# ldm list-domain
NAME             STATE      FLAGS   CONS    VCPU  MEMORY   UTIL  UPTIME
primary          active     -n-cv-  UART    16    1984M    0.3%  1h 33m
testvm           inactive   ------

# ldm add-vcpu 32 testvm  # CPU割り当て
# ldm list-domain
NAME             STATE      FLAGS   CONS    VCPU  MEMORY   UTIL  UPTIME
primary          active     -n-cv-  UART    16    1984M    0.2%  1h 34m
testvm           inactive   ------          32

# ldm add-memory 4096M testvm # メモリ割り当て
# ldm list-domain
NAME             STATE      FLAGS   CONS    VCPU  MEMORY   UTIL  UPTIME
primary          active     -n-cv-  UART    16    1984M    0.2%  1h 34m
testvm           inactive   ------          32    4G

# ldm add-vnet id=0 vnet0 vsw0 testvm # NIC割り当て
# ldm add-vnet id=1 vnet1 vsw1 testvm # NIC 割り当て
# ldm list-domain -o network testvm
NAME
testvm

NETWORK
    NAME             SERVICE                     ID   DEVICE     MAC               MODE   PVID VID                  MTU   LINKPROP
    vnet0            vsw0                        0               00:14:4f:fb:7b:c7        1
    vnet1            vsw1                        1               00:14:4f:f8:65:42        1


 仮想マシン CUIコンソール接続

KVM
# virsh console [仮想マシン名]
ドメイン testvm に接続しました
エスケープ文字は ^] です

※「^]」はctrl+]
※他のセッションを奪う場合は–force オプションを付ける

OVM for SPARC ※CONS列の番号がポート番号

# ldm list-domain
NAME             STATE      FLAGS   CONS    VCPU  MEMORY   UTIL  UPTIME
primary          active     -n-cv-  UART    16    1984M    0.8%  2h 19m
testvm           bound      ------  5000    32    4G
# telnet localhost 5000

 仮想マシン停止

KVM
# virsh shutdown [仮想マシン名]
ドメイン [仮想マシン名] をシャットダウンしています

※acpiを有効にしておかないとシャットダウンできない

OVM for SPARC
# ldm stop-domain testvm
LDom testvm stopped

 

仮想マシン 強制停止

KVM
# virsh destroy [仮想マシン名]
ドメイン [仮想マシン名] は強制停止されました

※物理マシンの電源ブチ切りと同じです。良い子のみんなはしてはいけません。
※仮想マシンがフリーズしたときの最終手段

vrishコマンドのヘルプ

KVM
 # virsh help
グループ別コマンド:

 Domain Management (ヘルプのキーワード 'domain'):
    attach-device                  XML ファイルによるデバイスの接続
    attach-disk                    ディスクデバイスの接続
    attach-interface               ネットワークインターフェースの接続
    autostart                      ドメインの自動起動
    blkdeviotune                   ブロックデバイスの I/O チューニングパラメーターの設定または取得
    blkiotune                      ブロック I/O パラメーターの取得または設定
    blockcommit                    ブロックのコミット操作の開始
    blockcopy                      ブロックコピー操作の開始
    blockjob                       アクティブなブロック操作の管理
    blockpull                      既存のイメージからのディスクの配置
    blockresize                    ドメインのブロックデバイスの容量変更
    change-media                   CD またはフロッピードライブのメディアの変更
    console                        ゲストのコンソールへの接続
    cpu-baseline                   ベースライン CPU の計算
    cpu-compare                    XML ファイルに記載された CPU とホスト CPU の 比較
    cpu-stats                      ドメインの CPU 統計情報の表示
    create                         XML ファイルによるドメインの作成
    define                         XML ファイルによるドメインの定義(起動なし)
    desc                           ドメインの説明またはタイトルの表示または設定
    destroy                        ドメインの強制停止
    detach-device                  XML ファイルによるデバイスの切断
    detach-disk                    ディスクデバイスの切断
    detach-interface               ネットワークインターフェースの切断
    domdisplay                     ドメインのディスプレイ接続 URI
    domhostname                    ドメインのホスト名の表示
    domid                          ドメイン名または UUID からドメイン ID への変 換
    domif-setlink                  仮想インターフェースのリンクステートの設定
    domiftune                      仮想インターフェースのパラメーターの取得・設 定
    domjobabort                    ドメインの実行中ジョブの中止
    domjobinfo                     ドメインのジョブ情報
    domname                        ドメイン ID または UUID からドメイン名への変 換
    dompmsuspend                   電源管理機能を使用したドメインの穏やかな一時 停止
    dompmwakeup                    ドメインのサスペンド状態からの再開
    domuuid                        ドメイン名または ID からドメイン UUID への変 換
    domxml-from-native             ネイティブ設定からドメイン XML への変換
    domxml-to-native               ドメイン XML からネイティブ設定への変換
    dump                           解析用ファイルへのドメインのコアダンプ
    dumpxml                        XML 形式のドメイン情報
    edit                           ドメインの XML 設定の編集
    inject-nmi                     ゲストへの NMI の送信
    send-key                       ゲストへのキーコードの送信
    managedsave                    ドメインの状態の管理保存
    managedsave-remove             ドメインの管理保存の削除
    maxvcpus                       コネクションの最大仮想 CPU 数
    memtune                        メモリーのパラメーターの取得または設定
    migrate                        他ホストへのドメインのマイグレーション
    migrate-setmaxdowntime         最大許容停止時間の設定
    migrate-setspeed               マイグレーションの最大帯域の設定
    migrate-getspeed               マイグレーションの最大帯域の取得
    numatune                       NUMA パラメーターの取得または設定
    reboot                         ドメインの再起動
    reset                          ドメインのリセット
    restore                        ファイルの保存状態からドメインの復元
    resume                         ドメインの再開
    save                           ドメインの状態のファイルへの保存
    save-image-define              ドメインの状態保存ファイルの XML の再定義
    save-image-dumpxml             XML 形式の状態保存されたドメイン情報
    save-image-edit                ドメインの状態保存ファイルの XML の編集
    schedinfo                      スケジューラーのパラメーターの表示/設定
    screenshot                     カレントドメインのコンソールについてのスクリ ーンショットの取得およびファイルへの保存
    setmaxmem                      最大メモリー上限の変更
    setmem                         メモリー割り当て量の変更
    setvcpus                       仮想 CPU 数の変更
    shutdown                       ドメインの穏やかな停止
    start                          停止状態の(定義済み)ドメインの起動
    suspend                        ドメインの一時停止
    ttyconsole                     TTY コンソール
    undefine                       ドメインの定義解除
    update-device                  XML ファイルによるデバイスの更新
    vcpucount                      ドメインの仮想 CPU 数
    vcpuinfo                       ドメインの仮想 CPU 情報の表示
    vcpupin                        ドメインの仮想 CPU アフィニティーの制御または表示
    emulatorpin                    ドメインのエミュレーターアフィニティの制御ま たは確認
    vncdisplay                     VNC ディスプレイ

 Domain Monitoring (ヘルプのキーワード 'monitor'):
    domblkerror                    ブロックデバイスにおけるエラーの表示
    domblkinfo                     ドメインのブロックデバイス容量の情報
    domblklist                     ドメインの全ブロックの一覧表示
    domblkstat                     ドメインのデバイスブロックの状態の取得
    domcontrol                     ドメイン制御インターフェース状態
    domif-getlink                  仮想インターフェースのリンクステートの取得
    domiflist                      すべてのドメインの仮想インターフェースの取得
    domifstat                      ドメインのネットワークインターフェースの状態 取得
    dominfo                        ドメインの情報
    dommemstat                     ドメインのメモリー統計情報の取得
    domstate                       ドメインの状態
    list                           ドメインの一覧表示

 Host and Hypervisor (ヘルプのキーワード 'host'):
    capabilities                   ケイパビリティ
    freecell                       NUMA 空きメモリー
    hostname                       ハイパーバイザーのホスト名の表示
    node-memory-tune               ノードメモリーパラメーターの取得または設定
    nodecpustats                   ノードの CPU 統計情報の表示
    nodeinfo                       ノード情報
    nodememstats                   ノードのメモリー統計の表示
    nodesuspend                    指定された間ホストデバイスの一時停止
    qemu-attach                    QEMU 接続
    qemu-monitor-command           QEMU モニターコマンド
    qemu-agent-command             QEMU ゲストエージェントコマンド
    sysinfo                        ハイパーバイザーのシステム情報の表示
    uri                            ハイパーバイザーの正規化 URI の表示
    version                        バージョンの表示

 Interface (ヘルプのキーワード 'interface'):
    iface-begin                    現在のインターフェース設定のスナップショット 作成、後からコミット (iface-commit) または復元 (iface-rollback) 可能
    iface-bridge                   ブリッジデバイスの作成および既存ネットワーク デバイスへの接続
    iface-commit                   iface-begin 後の変更のコミットおよび復元ポイ ントの開放
    iface-define                   XML ファイルによる物理ホストインターフェース の定義(起動なし)
    iface-destroy                  物理ホストインターフェイスの停止("if-down"  による無効化)
    iface-dumpxml                  XML 形式のインターフェース情報
    iface-edit                     XML 設定を物理ホストインターフェイス用に編集
    iface-list                     物理ホストのインターフェイスの一覧表示
    iface-mac                      インターフェース名からインターフェースの MAC アドレスへの変換
    iface-name                     インターフェースの MAC アドレスからインターフェース名への変換
    iface-rollback                 iface-begin により作成された以前の保存された 設定へのロールバック
    iface-start                    物理ホストインターフェイスの開始("ifup" による有効化)
    iface-unbridge                 スレーブデバイスの切断後、ブリッジデバイスの 定義解除
    iface-undefine                 物理ホストインターフェイスの定義解除(設定か ら削除)

 Network Filter (ヘルプのキーワード 'filter'):
    nwfilter-define                XML ファイルによるネットワークフィルターの定 義または更新
    nwfilter-dumpxml               XML 形式のネットワークフィルター情報
    nwfilter-edit                  ネットワークフィルターの XML 設定の編集
    nwfilter-list                  ネットワークフィルターの一覧表示
    nwfilter-undefine              ネットワークフィルターの定義解除

 Networking (ヘルプのキーワード 'network'):
    net-autostart                  ネットワークの自動起動
    net-create                     XML ファイルによるネットワークの作成
    net-define                     XML ファイルによるネットワークの登録(起動な し)
    net-destroy                    ネットワークの強制停止
    net-dumpxml                    XML 形式のネットワーク情報
    net-edit                       ネットワークの XML 設定の編集
    net-info                       ネットワーク情報
    net-list                       ネットワークの一覧表示
    net-name                       ネットワーク UUID からネットワーク名への変換
    net-start                      停止状態の(定義済み)ネットワークの起動
    net-undefine                   停止状態のネットワークの登録削除
    net-update                     update parts of an existing network's configuration
    net-uuid                       ネットワーク名からネットワーク UUID への変換

 Node Device (ヘルプのキーワード 'nodedev'):
    nodedev-create                 ノードに XML ファイルで定義されたデバイスの作成
    nodedev-destroy                ノードのデバイスの削除(停止)
    nodedev-detach                 デバイスドライバーからノードデバイスの切断
    nodedev-dumpxml                XML 形式のノードデバイス詳細
    nodedev-list                   ホストにあるデバイスの一覧表示
    nodedev-reattach               デバイスドライバーへのノードデバイスの再接続
    nodedev-reset                  ノードデバイスのリセット

 Secret (ヘルプのキーワード 'secret'):
    secret-define                  XML ファイルによるシークレットの定義または変 更
    secret-dumpxml                 XML 形式の secret 属性
    secret-get-value               シークレット値の出力
    secret-list                    シークレットの一覧表示
    secret-set-value               シークレット値の設定
    secret-undefine                シークレットの定義解除

 Snapshot (ヘルプのキーワード 'snapshot'):
    snapshot-create                XML によるスナップショットの作成
    snapshot-create-as             一組の引数からのスナップショットの作成
    snapshot-current               カレントスナップショットの取得または設定
    snapshot-delete                ドメインのスナップショットの削除
    snapshot-dumpxml               ドメインのスナップショットの XML 形式ダンプ
    snapshot-edit                  スナップショットの XML の編集
    snapshot-info                  スナップショット情報
    snapshot-list                  ドメインのスナップショットの一覧表示
    snapshot-parent                スナップショットの親の名前の取得
    snapshot-revert                ドメインのスナップショットへの復帰

 Storage Pool (ヘルプのキーワード 'pool'):
    find-storage-pool-sources-as   潜在的なストレージプールソースの検索
    find-storage-pool-sources      潜在的なストレージプールソースの探索
    pool-autostart                 プールの自動起動
    pool-build                     プールの構築
    pool-create-as                 一組の引数からプールの作成
    pool-create                    XML ファイルによるプールの作成
    pool-define-as                 一組の引数からのプールの定義
    pool-define                    XML ファイルによるプールの定義(起動なし)
    pool-delete                    プールの削除
    pool-destroy                   プールの強制停止
    pool-dumpxml                   XML 形式のプール情報
    pool-edit                      ストレージプールの XML 設定の編集
    pool-info                      ストレージプール情報
    pool-list                      プールの一覧表示
    pool-name                      プール UUID からプール名への変換
    pool-refresh                   プールのリフレッシュ
    pool-start                     (以前に定義した)停止状態のプールの起動
    pool-undefine                  停止状態のプールの定義解除
    pool-uuid                      プール名からプール UUID への変換

 Storage Volume (ヘルプのキーワード 'volume'):
    vol-clone                      ボリュームのクローン
    vol-create-as                  一組の引数からボリュームの作成
    vol-create                     XML ファイルによるボリュームの作成
    vol-create-from                別のボリュームを入力として使用したボリューム の作成
    vol-delete                     ボリュームの削除
    vol-download                   ボリュームのファイルへのダウンロード
    vol-dumpxml                    XML 形式のボリューム情報
    vol-info                       ストレージボリューム情報
    vol-key                        任意のボリューム名またはパスのボリュームキー の表示
    vol-list                       ボリューム一覧の表示
    vol-name                       任意のボリュームキーまたはパスのボリューム名 の表示
    vol-path                       任意のボリューム名またはキーのボリュームパス の表示
    vol-pool                       任意のボリュームキーまたはパスのストレージプ ールの表示
    vol-resize                     ボリュームの容量変更
    vol-upload                     ボリュームへのファイルのアップロード
    vol-wipe                       ボリュームの完全消去

 Virsh itself (ヘルプのキーワード 'virsh'):
    cd                             カレントディレクトリーの変更
    connect                        ハイパーバイザーへの(再)接続
    echo                           引数のエコー
    exit                           対話式ターミナルの終了
    help                           ヘルプの表示
    pwd                            カレントディレクトリーの表示
    quit                           対話式ターミナルの終了

ダメだ。ぜんぜんまとまってない・・・

 

 

[NNMi]設定のエクスポート インポート

NNMiの設定をエクスポート、インポートする方法。

設定作業前に設定内容をバックアップしたり、検証機などに設定を移し変えるときに使用できる。

このエクスポートの対象となるのは設定のみで、収集した情報(収集したSNMPトラップ、シードから検出したノードの情報およびSNMPで収集したインターフェースなどの情報、それに付随する管理モード(管理/非管理))はバックアップできないので注意。

以下のコマンドで設定をエクスポートする。
nnmconfigexport.ovpl -c all -f [出力するフォルダパス]
指定したフォルダにxmlファイルが複数出力される。

設定をインポートする場合はこちら。
nnmconfigimport -f [xmlファイルがあるフォルダパス]
インポートした際の設定は上書き。既存の設定とぶつかり矛盾が発生する場合は既存の設定を消去する。(同じインシデント名であるが、作成したタイミングが異なり内部的に持つuidが異なる場合)

[NNMi]よくある概念の間違い

まず・・・・

SNMPトラップとSNMPは全くもって別物。

SNMPトラップは監視される機器が自ら異常などを通知する目的のプロトコル。

SNMPは監視する機器が監視される機器の情報を取得または操作するためのプロトコル。

 

そして、一般的に言うイベントはインシデント。このインシデントの違いにおいて、

SNMPトラップ・・・文字通り。監視対象から送信されたSNMPトラップを起点として検知されたイベント。(大雑把に機器故障通知、リンクダウン/アップなど)

管理イベント・・・NNMiから監視対象にSNMPポーリング(情報取得)して発見した、NNMiが検知したイベント。(大雑把にPing監視など)

[NNMi]監視対象のホスト名を変更する

NNMiにおいて、監視対象のホスト名を変更する方法。

これが厄介!NNMiに表示されるホスト名はノード検出時(検出シードに登録した直後)に決まってしまうので、ホスト名を変更したときは、

ノードの削除→検出シードの削除→検出シードに登録→(ノード作成)→ノードグループ登録

をしてあげないといけない・・・