DigiLoog

PC関係の事なら何でもいけるそんな処

KVMゲスト仮想ハードウェア設定のXML備忘録

2018年08月18日(土) - 21:30 | カテゴリ: Linux

ns-lab BBのサーバは内8台(インスタンス)がKVMゲストなのだが、
先日リリースとなった、kernel-4.18.0のビルドしている時にハマったので備忘録。

ちなみに、下記は仮想サーバ(VirtualMachine)管理にlibvirtを使っている事が前提。
細かい仕様はlibvirtの「Domain XML format」を見れば全部書いてあるので、そちらを参照。


  • CPUモデルのパススルー

特に設定していなければ、ゲストインスタンスから見えるCPUモデル(model name)は、
「QEMU Virtual CPU version (cpu64-rhel6)」の様にQEMU仮想CPUとして見えるのだが、
ホストサーバのCPUモデルをそのままゲストにパススルーしたい場合がある。
そんな時は、ゲストインスタンスの定義用xmlファイルに、
下記の様な設定を追加すればパススルー出来る。

<domain type='kvm'>
  <name>TEST</name>
  <uuid>XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX</uuid>
  <cpu mode='host-passthrough'/>
</domain>

重要なのは [host-passthrough] の設定で、この箇所をdomain要素の中に追記する。
要素自体が無い場合は新規追加した後にdefineして反映させる。
この状態でゲストインスタンスを起動させると、
ちゃんとホストサーバのCPUモデルを取得出来るようになる。


結構古いサーバなので、色々出ているが気にしたら負け (´・ω・`)
モデル名も取得出来ていると同時に、ホストサーバのCPUをそのままパススルーしている関係上、
バグ情報もそのまま引き継ぐ事になる点に注意。


  • ランダムエントロピープールのバイパス

以前の記事にも書いた通り、仮想サーバで/dev/rundomを利用するには、
randomの仕様上エントロピー不足となりハングアップする事がある。
コレを解決するには、havegeを導入したりVirtIOでホストエントロピーをバイパスするのが手っ取り早い。
前回使ったhavegeはデーモン経由でエントロピーを蓄える都合上、デーモンが起動するまでは使えない。
なので今回はVirtIO経由でホストサーバのプールをパススルーしてみた。

<domain type='kvm'>
  <name>TEST</name>
  <uuid>XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX</uuid>
  <devices>
    <rng model='virtio'>
      <rate bytes='4096' period='5000'/>
      <backend model='random'>/dev/random</backend>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x0'/>
    </rng>
  </devices>
</domain>

/dev/randomはデバイスとして提供されている事もあり、設定はdevices要素の中に埋め込む。
細かい注意点としてはslotの16進数指定を他のデバイスと衝突しない様にする。
rateはゲストからホストへの参照リミットなので、ホストのエントロピー充填速度によって書き換える。


  • ACPI/APICサポート

似たような名前だが全く別物。
ACPIは電源制御の統一規格で、ホストサーバからゲストインスタンスを
外部コマンドとして安全にシャットダウンする時に使ったりする。
APICはx86アーキテクチャの割り込み処理コントローラで、チップセットレベルでの実装。
細かい所はレジスタ設計・アルゴリズム論などで使うらしい。
自分は入り口辺りしか囓っていないので、詳細はその筋の方に聞いて下さい (´・ω・`)

要はハードウェア制御をlibvirt APIとして提供する設定一式。
libvirt XMLのドキュメントを見ると色々設定出来るのだが、
自宅鯖のKVMホストはバージョンが低いのでサポートしていない機能が多く未テスト。
その中でテスト出来たのがACPI/APICの二つだったので2項目のみ記載。

<domain type='kvm'>
  <name>TEST</name>
  <uuid>XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX</uuid>
  <features>
    <acpi/>
    <apic/>
  </features>
</domain>

他にもlibvirtで設定出来る項目は色々あるのだが、
ホストサーバを安定重視にしている都合上、
libvirtのバージョンも古めなのでテスト出来ない項目がチラホラと…

幾ら自鯖と言い色々とサービス立ち上げてはいるが、テスト自体が出来ないのは困りものなので、
そろそろホストサーバの刷新を本気で検討しなければならないのかもしれない。
出来ればRHEL8が出た後にしたいがまだまだ先な気もするし、情報収集しながら検討せねば。

………

ちなみに、kernel-4.18.0は絶賛ハマり中。
KVMゲストのCentOS6でビルドは通るのだが、
ビルドしたkernelイメージで起動させるとsplashを表示する直前で勝手に再起動がかかり、
GRUBの選択画面に戻った後、ビルドしたkernelで起動して再起動がかかり…の無限ループ
なんとなく、ACPIの電源管理で転けているか、
ASLR/KASLR辺りでメモリ管理が上手く出来ず勝手に電源が落ちている気が…
ただ、CrashDumpが出ないわ、PanicLogも出ないわでお手上げ状態 ヽ(´ー`)ノ

ぶっちゃけ、こっちの方が深刻なので是が非でもクリアしたい所。





  • 応援中

    はじめるセカイの理想論 -goodbye world index-