Linux/RHEL6/KVM

KVM環境


  • いつかやること
    • あまりにもメモすぎるので手順書としてちゃんとかきなおす


勉強の方針として(やってみてる上での感想)

  • KVM環境さわるの初めてなのにいきなりCUIで触り始めるのはちょっと厳しいきがする。どこかに書いてあるコマンドを意味のわからないまま実行するだけになるのはよろしくないし、全部CUIだとそうなりがちな気がする
  • 一回GUIでOSのインストールまでやってみるとよいのではないか。そうするとプールの情報も仮想ボリュームの情報もゲストの情報も何もかもXMLとして得られる。そうすれば、得られたXMLから、自分がCUIでつくるときに必要になる情報を得られるはず

KVMって何なの

  • 仮想環境のハイパバイザ
  • 設定ファイルが全部XMLなのですごいわかりやすいっぽい。ちょっとずつわかってきた

KVM環境のネットワーク構成の理解

  • 何も考えずにつくると、kvm仮想マシン群でひとつのネットワークができる(192.168.122.0/24)。ホストOSの物理インタフェイスの外のネットワークとは別のもの。ホストOSのiptablesをNATとして使って外にでる
  • 仮想マシンを外部から直接見えるようにする(ホストの物理インタフェイスと同じネットワークに仮想マシンをつなぐ)には、ホストOSで『仮想ブリッジ』(スイッチみたいなもんね)を用意し、ホストの物理NICや仮想マシンのNICをすべてその仮想ブリッジにぶら下げる必要がある。
    • もうちょっと正確に書くと、ホストに仮想ブリッジ(virbrX)にぶらさがるTAPデバイス(vnetX)っていう謎のものができて、そこに仮想マシンのNIC(ethX)がぶらさがるかんじらしい。ややこいなー

ひとまず仮想ブリッジ環境をつくる

  • 仮想ブリッジ br0 の設定ファイル ifcfg-br0 をつくって、物理NICの ifcfg-eth0 が br0 にぶらさがるように書く
    • /etc/sysconfig/network-scripts/ifcfg-br0
      DEVICE=br0
      TYPE=Bridge
      ONBOOT=yes
      BOOTPROTO=static
      IPADDR=192.168.1.100
      NETMASK=255.255.255.0
    • /etc/sysconfig/network-scripts/ifcfg-eth0
      DEVICE=eth0
      ONBOOT=yes
      NM_CONTROLLED=no
      BRIDGE=br0
    • ネットワーク再起動
      service network restart
    • 確認しておく
      • ifconfig
        br0       Link encap:Ethernet  HWaddr 00:19:99:A4:F3:3E
                 inet addr:192.168.1.100  Bcast:192.168.1.255  Mask:255.255.255.0
                 inet6 addr: fe80::219:99ff:fea4:f33e/64 Scope:Link
                 UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
                 RX packets:39 errors:0 dropped:0 overruns:0 frame:0
                 TX packets:73 errors:0 dropped:0 overruns:0 carrier:0
                 collisions:0 txqueuelen:0
                 RX bytes:3530 (3.4 KiB)  TX bytes:9239 (9.0 KiB)
        
        eth0      Link encap:Ethernet  HWaddr 00:19:99:A4:F3:3E
                 inet6 addr: fe80::219:99ff:fea4:f33e/64 Scope:Link
                 UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
                 RX packets:101 errors:0 dropped:0 overruns:0 frame:0
                 TX packets:31 errors:0 dropped:0 overruns:0 carrier:0
                 collisions:0 txqueuelen:1000
                 RX bytes:23406 (22.8 KiB)  TX bytes:3878 (3.7 KiB)
                 Interrupt:18
      • あと brctl show とか。上段が今回つくったやつ。下段のvirbr0はインストール後に勝手にできてた気がする。192.168.122.0/24のネットワークにつながってる仮想ブリッジ。
        bridge name     bridge id               STP enabled     interfaces
        br0             8000.001999a4f33e       no              eth0
        virbr0          8000.000000000000       yes
      • virvr0は不要だったらたぶんbrctl delbrから消せるんじゃないかな
    • br0はvirsh net-listには出てこないみたい

で、どうするの

  • 今後は仮想マシンのネットワークデバイスにbr0を指定すればよいわけです
    • ドメイン定義のXMLがこうなる(既存のを追加するならこうする)
      <interface type='bridge'>
        <source bridge='br0'/>

GUIによる管理

  • Virtual Machine Manager(以下virt-manager) によって管理可能。
  • 当たり前だけど要デスクトップ環境。
  • virt-managerによってつくった仮想マシンは、そのままではvirsh管理下にはおけない。別途登録作業が必要。とおもってたけど大丈夫っぽいな。RHEL6で仕様かわったのかな

virt-manager のインストール

  • それっぽいパッケージをyumでいれる

仮想マシンの生成

  • マネージャの[新規の仮想マシンを作成]から対話形式でサクサクできる。特に解説なんて要らないレベル

ゲストOSのインストール

  • これはもうゲストOSに依存。マネージャ側からはインストールイメージをどこからもってくるか指定するくらい
    • 黒井はひとまず Ubuntu 11.04 Server を入れた。キーバインドが意味不明なことになったのでssh環境だけつくってあとはsshに移行

CUIによる管理

  • virsh(何の略だろう。Virtual Machine Shell とかかな)で行う。今回はハイパバイザがKVMだけど、virshではXen環境も管理できるらしい。要するに仮想環境さわる用のシェルですね。

基本的な使い方

  • virsh環境に入る
    virsh
    • virshに入るのでそこで直接コマンドを実行する
      <command>
  • virshコマンドを直接実行する
    virsh <command>

よく使いそうなコマンド

  • 仮想マシンの一覧を表示
    list
    list --all
    list --inactive
  • 仮想マシンの起動
    start <domain-name> [--console]
    • [--console]つけると起動後にコンソールに接続
  • 仮想マシンの停止
    shutdown <domain-name>
    • <domain-name>はドメイン名かidかuuid

virsh のインストール

  • 何したら入ったっけ? yum groupinstall Virtualization したら勝手に入った気が

仮想マシンの生成(1)

  • わかりやすそうなのでrhel5.4を入れることにする。ちなみにホストはrhel6です
  • 仮想マシンをつくるのは virt-install コマンド
  • でもその前にまずは仮想ハードドライブをつくる
    • すでに仮想ハードドライブがあるなら、vol-dumpxmlでダンプしたxmlをもとに編集してvol-createするとか、vol-cloneするとか、vol-create-from するとかでもいいのかな
    • 今回はゼロからつくる。引数でサイズとか渡す形式。つくる先のプールはデフォルトで用意されてたやつ。用意されてたのは先にGUIでつくったからかな。最初からあるのかは未調査。なかったらpool-createすればいいとおもう
      vol-create-as --pool default --name rhel54 --capacity 8G
      • formatも指定できるけど、デフォルトでrawになるので今回はそのまま。なぜrawかって、guiでつくったらrawになったからだよ!
      • できたかな
        vol-list default
        vol-info --pool default rhel54
      • ついでなのでxmlも見てみよう
        vol-dumpxml --pool default rhel54

仮想マシンの生成(2)

  • おもむろにvirt-installする
    virt-install --name rhel54 --ram 512 --disk path=/var/lib/libvirt/images/rhel54.img --os-variant=rhel5.4 --network=bridge:br0 --location http://192.168.1.100/iso --nographics --extra-args='console=tty0 console=ttyS0,115200n8'
    • 最初は --cdrom でisoイメージを直接指定したんだけど、そしたらうまくいかなかった(原因不明)
    • httpdの管理下にisoイメージをマウントするという暴挙にでたらどうにかなった(それが上のコマンド)
      mkdir /var/www/htdocs/iso
      mount -t iso9660 -o loop /root/isos/RHEL-5.4_i386_DVD.ISO /var/www/htdocs/iso/
      • 本当は /mnt/iso あたりにマウントして、/etc/httpd/conf.d/ 配下に iso.conf でもつくって Alias /iso "/mnt/iso" したほうがいいんだとおもう
    • 与えてる引数の説明
      オプション意味
      --nameドメイン(仮想マシン)の名前
      --ramメモリ
      --disk path=<path>使う仮想ボリュームのパス
      --os-variant=<os>仮想マシンに入れるOSの種類。ちゃんと指定するとそのOSに合わせて細かい設定を最適化してくれるとかなんとか。指定できるOSは決まってる。詳細はvirt-installに記載あり
      --network=<type>:<name>仮想マシンが接続するネットワーク。今回はあらかじめつくっておいた仮想ブリッジに接続させてホストと同じネットワークに放り込むので上のような指定
      --locationインストールソースの指定。--cdromでisoイメージへのパスを指定しても良いらしいんだけどうまくいかなかったのでホストでisoの中身をhttpで公開してそこから引っ張らせた
      --nographicsテキストモードでインストールさせるオプション。これを入れないとvncが立ち上がってくる(らしい)
      --extra-args='console=tty0 console=ttyS0,115200n8'インストール後にゲストのシリアルコンソールにつなげられるようにする拡張オプション。ゲストの /boot/grub/grub.conf にシリアルコンソール接続関係の設定が放り込まれる。これがないと以後 virsh console hoge できなくて、vncかsshかでしか管理できなくなる(と思ってたらそもそもインストール画面にそもそも行けなかったので必須っぽいな。ssh環境独自かも)
      • ゲストのgrub.confにはこんなのが追加されてた
        serial --unit=0 --speed=115200
        terminal --timeout=5 serial console
        title Red Hat Enterprise Linux Server (2.6.18-164.el5)
                root (hd0,0)
                kernel /vmlinuz-2.6.18-164.el5 ro root=/dev/VolGroup00/LogVol00 console==ttyS0,115200n8 rhgb quiet
                initrd /initrd-2.6.18-164.el5.img
      • serialとかconsoleとかそこらへんの文字がちらほら
      • 指定しなかったら
      • serial行にはパリティビットの有無とかストップビットがどうのこうのとか書けるらしい。とりあえずなくても困らない
    • 使えそうなオプションの説明
      オプション説明
      --file=<diskfile>使う仮想ボリュームファイルの指定。diskオプションと何が違うのかはちょっと不明
      --file-size=<filesize>仮想ボリュームのファイルサイズ。上のfileオプションと組み合わせると存在しないときに自動でこのサイズでつくってくれる
      --vcpus=<number>ゲストに割り当てる仮想コア数
  • 対話形式でvirt-installも可。ただし指定できるオプションは圧倒的に少ない
    virt-install --prompt
    • 必要なオプションをあらかじめ与えた状態での対話形式での実行もできる。ここまでするなら全部最初から与えておけばいいじゃんって感じだけど
      virt-install --prompt --nographics --extra-args='console=tty0 console=ttyS0,115200n8'

仮想マシンを動かしたり止めたり

  • うごかす
    virsh start <domain>
  • とめる
    virsh shutdown <domain>
  • 強制終了する(電源長押しみたいなの)
    virsh destroy <domain>
  • コンソールにつなぐ
    virsh console <domain>
  • 仮想マシンを削除する(定義ファイルごと消える)
    virsh undefine <domain>

todo

  • ホストの起動時にゲストを自動実行させるにはどうするの
  • isoの中をhttpで公開するにはIndexesが必須だからそのへんも。AllowOverRideとか

virt-manager で作成した仮想マシンの管理

  • 設定ファイルは /etc/libvirt/qemu/<domain-name>.xml
  • コンソール接続は設定しないと不可
    • ssh環境ができていればそっちでログインすればコンソール接続なしでも管理は可能
      • ただし何らかの原因でsshが死んだら死ぬ
  • コンソール環境の構築はゲストOS側なので、画面を出すなりsshするなりして設定する
  • Ubuntu 11.04 Server の場合
    • inittabに書くらしいんだけどubuntuに/etc/inittabないじゃん(・∀・)
    • 最近はinitつかわないでupstartっていう新しい方式で起動してるらしいので設定ファイルがいろいろ違うみたい
    • KVM側でシリアルポート有効にしないとだめかな
    • ゲストOS側でシリアルポート有効にするのどうやるのかな
      • /etc/securetty とか /etc/init/tty*.conf あたりさわってみよう
    • 今日はここまで

その他メモ

プールってなに?

  • libvirtが管理する仮想ストレージのまとまりの単位?
    • pool-list、pool-infoなどコマンドあり
    • ストレージの情報はvol-listとかvol-infoとかで見える
  • マネージャでつくったイメージをダンプしたらこうなった
    virsh # vol-dumpxml --pool default Ubuntu_11.04_Server.img
    <volume>
      <name>Ubuntu_11.04_Server.img</name> 
      <key>/var/lib/libvirt/images/Ubuntu_11.04_Server.img</key>
      <source>
      </source>
      <capacity>8589934592</capacity>
      <allocation>8590544896</allocation>
      <target>
        <path>/var/lib/libvirt/images/Ubuntu_11.04_Server.img</path>
        <format type='raw'/>
        <permissions>
          <mode>0600</mode>
          <owner>0</owner>
          <group>0</group>
          <label>system_u:object_r:virt_image_t:s0</label>
        </permissions>
      </target>
    </volume>

virt-installの --extra-args='console=tty0 console=ttyS0,115200n8' ってなに?

  • consoleを二個指定してるのはなんで?
    • 二個目はまあゲストにシリアルポートつくってるんだろうけど、じゃあ一個目はなに?
      • 二個目はゲストのインストール時にも画面にでてくるし、インストール後のgrub.confに影響するね。シリアルコンソール関係の設定が放り込まれてる
    • 一個目はホスト側? とか考えたけどなんだろう
  • 両方指定してインストールしたら定義ファイルにはこう出てきた
      <serial type='pty'>
        <target port='0'/>
      </serial>
      <console type='pty'>
        <target port='0'/>
      </console>
  • すごいひとの情報によると、一個目のはvncとかvirt-viewerでつなぐとき用の接続先の指定かもとのこと
  • どっちも指定してインストールした端末にssh環境でvirt-viewerでつなげてみる
    • ディスプレイがないよって、そりゃ当然sshの文字だけの環境じゃ無理だわね
  • ホストOSのデスクトップ環境にVNCした中で、ゲストに対してvirt-viewerでつなげてみる
    • なんかえらー
    • 定義を書き足す
      <graphics type='vnc' port='-1' autoport='yes'/> # 追加
       <address type=........> # この行全部削除
      • autoportにするとlibvirt(でいいのかな)からポートが動的にふられる様子。起動順らしい。
      • virt-viewerはこのポートに対して接続するvncクライアントを立ち上げてるだけっぽい。
      • ポートさえわかれば以下のコマンドでもvirt-viewerなしで接続できた
        vncviewer localhost:<port>
    • 変更を反映
      virsh define <domain>
    • qemu.confを書きなおす
      vnc_listen = "0.0.0.0" #コメントをはずすだけ
    • 変更反映
      service libvirtd restart
    • 繋がったけど画面がなんだか違うかんじに。gettyさん立ち上がってない……?
    • というわけで/etc/inittabを見る。調べたらnographicsでインストールするとこうなるらしい。コメントアウトとかひどい……!
      co:2345:respawn:/sbin/agetty ttyS0 115200 vt100-nav
      #1:2345:respawn:/sbin/mingetty tty1
      #2:2345:respawn:/sbin/mingetty tty2
      #3:2345:respawn:/sbin/mingetty tty3
      #4:2345:respawn:/sbin/mingetty tty4
      #5:2345:respawn:/sbin/mingetty tty5
      #6:2345:respawn:/sbin/mingetty tty6
    • まああれね、シリアルコンソールさえ繋がればいいわよね。しかしVNCでつなぐにはgettyがないとアレなのでコメントをはずしてやりなおす
      init q
  • ここまででvirt-viewerで無事にvncが立ち上がる環境ができた
  • じゃあ二個目のconsoleだけでインストールしたらどうなる?
    • インストールはふつうに終了
    • 上にかいたこれは変化なし(ていうかdiffとればよかった……)
        <serial type='pty'>
          <target port='0'/>
        </serial>
        <console type='pty'>
          <target port='0'/>
        </console>
    • graphics行かいてdefineしたらふつうにvncつながっちゃったよ? あるぇー
  • (この間にいろいろ読んだりログとって2パタン比べたり遊んだりしてた)
  • で、結局いるのいらないの
    • 個人的な結論は、 --extra-args='console=ttyS0,115200n8' だけでいい、というもの。
    • ttyS0は必要。ないとインストール画面に進ま(め)ない
    • tty0は不要じゃないかなあ……
      • そもそも console=tty0 っていう文がインストール後のシステムでとくに見当たらないよね
      • コンソール関係でシステム全体にかかわりそうなのはgrub.confの中かなっておもったけど、tty0の記述はゲストのgrub.confには残らない
      • インストール中のgrubの設定画面に出てくるのはttyS0だけ(http://gyazo.com/fe61adb51c46bee487b833b87379f5c7)だし
      • tty0って仮想コンソールだよね。で、ttyS0がシリアルコンソール。単に『(インストール中の画面はtty0とttyS0の)両方に出せ』って一時的に指定してるだけなんじゃないの?
      • grub.confのkernel行にtty0とttyS0ふたつを併記すると、モニタ(tty0)とシリアルポート(ttyS0)の両方に画面が出力されるようになるらしい
      • extra-argsの値はインストール時のカーネルに渡されてるのが見える (http://gyazo.com/66eec1419140b7ad9688161531f19db4
      • じゃ、virt-installからインストールするっていう今回の環境で、画面を二か所に出力する意味ってないじゃんね
      • virt-installのときにつないでるのはシリアルコンソール(ttyS0)。そうすると、ゲストの tty0 の出力って、ホストのどこかで見られるの?見られないなら無意味ではないの?
      • インストール後なら tty0 ってたぶんqemuのvncだよね。でもそもそもvncなしでインストールできるようにnographicsにしたわけだし
      • だからtty0はインストール中に(少なくとも人間が)見ることはできない(と思う)ので、わざわざ指定する必要はないような気がする
      • でもインストールプロセスの中のtty0はぼくの知らない特別な意味があるのかもしれない
      • ssh環境下とか、ホストのX越しじゃない直接のtty*環境下とか、そういうのでも変わるのかなあ

virt-installのデフォルト設定

  • ソースは man virt-install
  • デフォルトでxenかkvmか
    • 前提: xenは準仮想化がメイン、完全仮想化にも対応、kvmは完全仮想化のみ
    • virt-installやvirshはkvm専用というわけではなくて、xenも扱えるので、意識しないと知らないうちにxenで走らせてたとかありそう
    • 判定順序はxen->kvm。どちらも使える環境では、無指定だとxenの準仮想化環境でインストールされる
      • connectオプション、hvm、paravirtで明示可能
        # 明示しない場合は以下を上から順に評価
        --connect=xen
         ハイパバイザにxenを使用。
         libvirtdがXenカーネルで動いているとこれ(/proc/xenがチェックされる)
        --connect=qemu:///system
         ハイパバイザにkvmを使用。
         libvirtdがrootでベアメタルカーネル(要するにXenじゃないやつ)上で動いてるとこれ
        --connect=qemu:///session
         libvirtdがrootでなくベアメタルカーネル上で動いてるとこれ。
         いろいろ制約があるらしいので普段は使わないでよさそう
        http://wiki.libvirt.org/page/FAQ#What_is_the_difference_between_qemu:.2F.2F.2Fsystem_and_qemu:.2F.2F.2Fsession.3F_Which_one_should_I_use.3F
      • 完全仮想化と準仮想化
        --hvm #完全仮想化。完全と準の両方が使える環境では明示しないと準仮想化になる。完全仮想化が可能なのはKVM使用時とXenでハードウェア仮想化が有効な場合。
        --paravirt #準仮想化。完全と準の両方が使える環境では明示しないとこっち。
  • locationとcdrom
    • locationはインストール時に読まれるkernelとinitrdのありかを示す。locationにisoを指定するとisoから起動はするけど、インストールメディアとしてはisoは使われなくなる
    • cdromはインストールメディアの指定なだけで、ここからブートするわけではない
    • locationとcdromは同時に指定できない。要するにisoから直接はインストールできないんじゃないかな
  • diskとfile
    • fileは古いオプションで、今はdiskを使う。fileは廃止の方針
    • すでにある仮想ボリュームを使う場合は上段、新しく作成する場合は下段(新規作成時はサイズ指定が必須)
      --disk path=/path/to/vol.img
      --disk path=/path/to/vol.img,size=8 #サイズはギガバイト単位

Last-modified: 2011-10-06 (木) 16:02:58