タグ・アーカイブ: メモ

以前、こちらでゲストOSのメモリサイズ変更方法を書いたが、たまにうまく動かないことがある。理由はわからんけど、コマンドそのものは正常終了しているのに反映されなかったり、ゲストOSを起動している間でないと反映されなかったり(ありえねー)・・・。

というわけで、どうにかならんものかとググったら枯山水のメーリングリストが引っかかったが、
調査したところ、libvirt(0.8.2-0.8.3)のqemuドライバでは、domainSetMaxMemory APIは
未サポートのようでした。(xenドライバではサポートされています。)
とのこと。うちのは libvirt-0.8.2-15.el5.3 だったんだけど、この辺とか見てると未だ対応中?ということで手動でゲストOSのメモリサイズを変更してみた。流れは以下のとおり。
1) メモリサイズを変更したいマシンをシャットダウンする

$ ssh hogehoge.example.com
$ sudo /sbin/shutdown -h now
または
$ su -
# shutdown -h now

2) エディタでxmlファイルを編集しメモリの上限サイズを変更する

$ sudo cp -p /etc/libvirt/qemu/hogehoge.example.com.xml /etc/libvirt/qemu/hogehoge.example.com.xml.orig

$ sudo vi /etc/libvirt/qemu/hogehoge.example.com.xml
変えるところは以下の2行。
  262144
  262144
ここの数値はキロバイト単位なので、1024で割ったら256MBになるって寸法。xmlファイルの先頭4~5行目にあるので、すぐに見つけられるはず。
 
 
3) 母艦マシンのvirshコマンドで反映させる
対象ゲストOSのxmlファイルを編集し終わったら、以下のコマンドで反映させる。
$ sudo virsh define /etc/libvirt/qemu/hogehoge.example.com.xml
4) 母艦マシンのvirshコマンドでマシンを起動する
$  sudo /usr/bin/virsh start hogehoge.example.com

作業前後で仮想マシンにログインしてfreeコマンドやtopコマンドで確認して、期待通りであればOKです。
ね、簡単でしょ?

スペースとTABが混在しているテキストにおいて、普通にawkで区切ると、両方とも区切り文字として認識されます。しかし、「スペースかTABのどちらか」を区切り文字にしたい場合は、次のようにします。
【サンプルのテキスト】
sh-3.2$ cat hoge
1 2 3 4 5 6
ちょっとわかりにくいので、スペースをアンダーバーに置換してみます。
sh-3.2$ cat hoge | sed -e s/ /_/g
1_2 3_4_5 6
つまり、テキストファイル「hoge」は、2列目と3列目、5列目と6列目の間がTABで区切られている状態です。
【TABを区切り文字にする】
sh-3.2$ cat hoge | awk 'BEGIN {FS="t"}{print $2}'
3 4 5
【スペースを区切り文字にする】
sh-3.2$ cat hoge | tr " " _ | awk 'BEGIN {FS="_"}{print $1,$2}'
1 2 3
sh-3.2$ cat hoge | tr " " _ | awk 'BEGIN {FS="_"}{print $1"t"$2}'
1 2 3
sh-3.2$ cat hoge | tr " " _ | awk 'BEGIN {FS="_"}{print $2}'
2 3
かなり力ワザですがw
一旦スペースをアンダーバーに置換してから、アンダーバーを区切り文字にすることで解決。
もっとスマートなやり方があったら教えてください!><

実サーバでも仮想マシンでも、需要予測は難しいのには変わりありませんが、ハードウェアの追加や交換を行う事なくリソースの上限を変更できるのが仮想マシンを使うメリットの1つです。(勿論ハードウェアの上限以上のパフォーマンスは出せませんが)

KVMでメモリサイズの変更を行うには、次の順序で作業を行います。

1) メモリサイズを変更したいマシンをシャットダウンする

$ ssh hogehoge.example.com
$ sudo /sbin/shutdown -h now
または
$ su -
# shutdown -h now

2) 母艦マシンのvirshコマンドでメモリの上限サイズを変更する

$ sudo /usr/bin/virsh setmaxmem hogehoge.example.com 131072
(131072 はキロバイトです)

3) 母艦マシンのvirshコマンドでマシンを起動する

$ sudo /usr/bin/virsh start hogehoge.example.com

作業前後で仮想マシンにログインしてfreeコマンドやtopコマンドで確認して、期待通りであればOKです。
ね、簡単でしょ?

CentOS 5.4 x86_64で運用している自宅サーバですが、yum check-updateすると

kmod-kvm.x86_64                       83-105.el5_4.22                    updates
kvm.x86_64                            83-105.el5_4.22                    updates
kvm-qemu-img.x86_64                   83-105.el5_4.22                    updates

とのこと。アップデート自体は

# yum update

でOKですが、これらパッケージはホストOSのカーネルモジュールをアップデートするので、以下の手順を実行して修正を有効にする必要があります。

1. KVMゲストの仮想マシン(VM)をすべて停止します。

2. ハイパーバイザマシンをリブートするか、またはスーパーユーザとして、(「lsmod」を使用して確認した)kvm、ksm、kvm-intel、 kvm-amdの各モジュールのうち現在実行されているものすべてを(「modprobe -r [module]」を使用して)削除し、(「modprobe [module]」を使用して)リロードします。

3. KVMゲストのVMを再起動します。

※ 参考サイト
http://jp.redhat.com/support/errata/RHBA/RHBA-2009-1488J.html
http://www.jp.redhat.com/support/errata/RHBA/RHBA-2009-1423J.html
https://rhn.redhat.com/errata/RHSA-2010-0088.html