ユーザ用ツール

サイト用ツール


linux:kvm

差分

この文書の現在のバージョンと選択したバージョンの差分を表示します。

この比較画面にリンクする

両方とも前のリビジョン 前のリビジョン
linux:kvm [2020/06/01 12:29]
admin [ゲストOSの起動]
linux:kvm [2020/08/04 12:27] (現在)
Wiki Editor
ライン 1: ライン 1:
 ====== Linux KVM関係 ====== ====== Linux KVM関係 ======
 ===== 参考資料 ===== ===== 参考資料 =====
-  * [[http://en.gentoo-wiki.com/wiki/KVM|Gentoo Linux Wiki KVM]] +  * [[https://wiki.gentoo.org/wiki/QEMU|Gentoo Linux QEMU]] 
-  * [[http://opensuse-man-ja.berlios.de/opensuse-html/book.kvm.html|OpenSUSE ​KVMキュメント]]+  * [[https://www.qemu.org/​docs/​master/​system/​index.html|QEMU User's Guide]] 
 +  * [[https://​www.belbel.or.jp/opensuse-manuals_ja/book-virt.html|OpenSUSE ​仮想化ガイ]] 
 +  * [[https://​wiki.archlinux.jp/​index.php/​QEMU#​QEMU_.E3.83.A2.E3.83.8B.E3.82.BF|Arch Linux QEMU]]
  
 ===== ホスト側設定 ===== ===== ホスト側設定 =====
 ==== カーネル ==== ==== カーネル ====
 +GentooのWikiに従って設定
 +
 KVMサポート KVMサポート
   Virtualization ​ --->   Virtualization ​ --->
ライン 24: ライン 28:
        <​*>​ 802.1d Ethernet Bridging        <​*>​ 802.1d Ethernet Bridging
         [*]IGMP/MLD snooping         [*]IGMP/MLD snooping
-       <​*>​ 802.1Q VLAN Support 
-        [*]GVRP (GARP VLAN Registration Protocol) support 
  
 KSM (複数のVM間でメモリを共有する) KSM (複数のVM間でメモリを共有する)
   Processor type and features ​ --->   Processor type and features ​ --->
     [*] Enable KSM for page merging     [*] Enable KSM for page merging
- 
-プリエンプションの設定(Serverでも普通に動いたが、、、) 
-  Processor type and features ​ ---> 
-   ​Preemption Model 
-     (X) Preemptible Kernel (Low-Latency Desktop) 
  
 ==== 関連パッケージ ==== ==== 関連パッケージ ====
ライン 44: ライン 41:
  
 ==== ネットワーク設定 ==== ==== ネットワーク設定 ====
-物理インタフェイス(eth0)介して、物理マシンも仮想マシンもブリ接続するようにする。+Guest用に使う物理NICを増設したので、Host側のNICはHost専用で利用する。HostとGuestが別のネットワクに接続されることを前提に、両者の通信用に内部でローカルネットワークを構成する。QEMUでuserモードのネットワークデバイスを使うこともできるがGuest側からもHostの物理NICが接続しているネトワークに接続する可能性を考えて、Bridgeを用意する(nftablesなどでフォワード、マスカレードすることもできるが、設定が面倒なので使わないことにする 
  
 /​etc/​conf.d/​net /​etc/​conf.d/​net
-  #物理インタフェイスIPアレス設定を空にする + 
-  config_eth0="​null"+  * Hostの物理NIC最近の命名規則は違っているが、とりあえずeth+Nとする。 
 +  * eth0はHost用のNIC(マザーボー) 
 +  * eth1はGuest用に増設したNIC 
 + 
 +  ## Hostのネットワーク設定(通常通り) 
 +  config_eth0="​192.168.0.1/​24"​ 
 +  routes_eth0="​default via 192.168.0.254"
   ​   ​
-  ​bridge_br0="​eth0 tap0"​ +  ​## Guestのネットワーク設定 
-  brctl_br0="​setfd 0 sethello 0 stp off" +  ## Bridgeを作成しGuest用物理NICとGuestのtapを接続する
-  #rc_need_br0="​net.tap0"​ 古い書式 +
-  rc_net_br0_need="​net.tap0"​+
   ​   ​
-  # Host +  # 物理NICにはIPを割り当てない 
-  ​config_br0="192.168.0.15/​24" +  ​config_eth1="null
-  routes_br0="​default via 192.168.0.254"​ +  # tapデバイスをtap0として構成しIPを空に(IPはGuest OSが設定)
-  dns_domain_br0="​example.com"​ +
-  dns_servers_br0="​192.168.0.1"​ +
-  dns_search_br0="​example.com"​ +
-  ​ +
-  # Guest +
-  config_tap0="​null"​+
   tuntap_tap0="​tap"​   tuntap_tap0="​tap"​
-  ​tunctl_tap0="-u [user] -g [group]" #tap利用できユーザ/​グループ。 -g kvmでkvmグループ属するユーザがクセできるようにする+  ​config_tap0="null" 
 +  ​bridgeデバイスbr0として構成しeth1とtap0を参加させ 
 +  bridge_br0="​eth1 tap0"​ 
 +  # bridgeデバイスそのものはIPドレを設定しない 
 +  # HostからGuest用NICがわのネットワーク出ていく場合は適当なIPを設定 
 +  config_br0="​null"​ 
 +  # bridgeのオプション設定 
 +  bridge_forward_delay_br0=0 
 +  bridge_hello_time_br0=1000 
 +   
 +  # bridgeを起動する際の依存関係を記述 
 +  # 起動スクリプトが実行される際の依存関係 
 +  depend_br0() { 
 +             # /​etc/​init.dのスクリプト名 
 +             need net.eth1 
 +             need net.tap0 
 +  }
  
-===== ゲストOS起動 ===== +以上設定したうえで、/​etc/​init.dのnet.loからnet.br0、net.tap0など必要なデバイスへのボリックリクを作成しdefaultrunlevelに追加する。
-qemu-kvmコマンド用いてゲトOSを起動する。qemu-kvmへのコマドライオプションでcpu種類やエミュレートするデバイスなどを指定していく+
  
-仮想ディスク準備 +GuestとHostが内部的に通信するためBridgeも構成
-  qemu-img create -f qcow2 -o preallocation=metadata [仮想ディスクイメージ名] [サイズ] +
-  qemu-img create -f qcow2 -o preallocation=metadata gentoo-i386.img 10G+
  
-Gentoo Live CDなど使っ起動OSインール +  # tap_local0というtapデバイス作成しIPは空にしおく 
-  ​qemu-kvm -hda gentoo-i386.img \ +  tuntap_tap_local0="​tap"​ 
-                    -cdrom livecd-i686-installer-2007.0.iso \ +  config_tap_local0="​null"​ 
-                    -boot d +  # br_local0というbridgeデバイスを作成tap_local0参加 
-                    ​-curses +  bridge_br_local0="​tap_local0"​ 
-                    -net nic +  # bridge自体にIPアドレを設定 
-                    -net tap,​ifname=tap0,​script=no,​downscript=no+  # Hostが利用するIPアドレス。適当なロアドレスにする 
 +  ​config_br_local0="​192.168.1.1/24" 
 +  ​bridge_forward_delay_br_local0=0 
 +  ​bridge_hello_time_br_local0=1000 
 +   
 +  ​depend_br_local0() { 
 +             ​need ​net.tap_local0 
 +  }
  
-オプションについて +br_local0というブリッジデバイスGuestの2NICtap経由接続しておくことで、HostとGuestしか接続されいネッワークをつくる。ルーティングやIPフォワードの設定をしなけば、HostとGuestだけが参加する内部的なネットワークになる。GuestへSSHなどは、基本的にHostにログインしからこカルネットワクからクセスするようにする
-  * -cpu core2duo +
-    * 仮想CPU種類指定。qemu-vkm -cpu ?利用可能CPUリスが得られる。 +
-  * -smp 2 +
-    * CPUコア数 +
-  * -m 1024 +
-    * 割り当メモリ(MB) +
-  * -k ja +
-    * ホスト側ドレイウトの指定+
  
-  * -hda [イメージファイル名] +===== ゲストOS ===== 
-    * 仮想ディスクイメージファイル指定。IntelのSATAがエミュレートされる。 +ディスクイメージの作成 
-  ​*  -drive file=[イメージファイル名],​if=virtio +  ​# rawイメージで30GBのディスクイメージを作成 
-    * 仮想ディスクのアクセスにvirtio経由を用いる。 +  ​# preallocationでディスク容量分領域を確保 
-  * -cdrom +  > qemu-img create -f raw -o preallocation=full Disk01_raw.img 30G                   
-    * CD-ROMイメージファイルの指定 +
-  ​* -boot +
-    * 起動ディスクの指定 「d」はCD-ROMから、「c」はHDDから+
  
-  * -net nic 
-    * 新しくネットワークインタフェースを作成しvlan(デフォルト)に接続する 
-  * -net nic,​model=virtio 
-    * ネットワークデバイスとしてvirtioを利用する。指定しなければRealTek8139がエミュレートされる。 
-  * -net tap,​ifname=tap0,​script=no,​downscript=no 
-    * ホストのtap0をvlan(デフォルト)に接続する 
-  * -net tap,​ifname=tap0,​script=no,​downscript=no,​vhost=on 
-    * 上記設定に加えて、vhost=onでvhost-netを利用する。ゲストのカーネルでMessage Signaled Interrupts (MSI and MSI-X)、ホストのカーネルでVirtio network driverが必要。 
  
-  * -curses +Guest起動するシェルスクリ適当作成 
-    * ncurses利用してコマンドライン上にコンソールをリダイレクトする。ゲストが高解像度の出力をする場合は利用不可。 +  ​/​usr/​bin/​qemu-system-x86_64 \ 
-    * ターミナソフトのRLoginでSSHしたホト上でcursesオション指定して起動した場合、「ESC」キーと「2」を同時押しでQEMUのコンソール切り替えられる。場合によっては「ESC」を長押しする必要がある。 +    -name "​exam_vm"​ \ 
-  ​-monitor telnet::​4444,server,​nowait qemu +    -machine type=q35,accel=kvm \ 
-    ​* モニタに4444番ポートにtelnetでアクセスできるようにする +    ​-object rng-random,​id=rng0,​filename=/​dev/​urandom -device virtio-rng-pci,​rng=rng0 \ 
-  ​* ​-vnc [host]:[ディスプレイno] +    -cpu host 
-    ​*  hostからvncでコンソールにアクセスできるようにする。ポートは5900+ディスプレイ番号になる。[host]を省略するとどこからでも接続可能になる。 +    -smp 8 \ 
-  ​* ​-nographic +    -m 4G \ 
-    ​* グラフィック出力をしない。ビデオカードをエミュレートしない。+    -drive file=exam_vm_raw.img,​driver=raw,​if=virtio,​index=0,​media=disk,​cache=writeback \ 
 +    -boot c \ 
 +    -netdev tap,​id=net0,​ifname=tap0,​vhost=on,​script=no,​downscript=no -device virtio-net,​netdev=net0,​mac=52:54:​00:​87:​92:​31 \ 
 +    -netdev tap,​id=net1,​ifname=tap_local0,​vhost=on,​script=no,​downscript=no -device virtio-net,​netdev=net1,​mac=52:​54:​00:​87:​92:​32 \ 
 +    ​-monitor unix:/​home/​kvm-admin/​monitor_socket/​exam_vm.sock,​server,​nowait \ 
 +    -display none \ 
 +    ​-daemonize \ 
 +    -fsdev local,​id=share,​path=/​home/​kvm-admin/​share_dir,​security_model=mapped-xattr -device virtio-9p-pci,​fsdev=share,​mount_tag=host_share
  
-  ​* -rtc clock=host,base=localtime +オプション 
-    * リアルタイックの設定。UTC扱いになる場合に適切に設定する。+  ​* -name "​VM01"​ 
 +    * 仮想マシンの名称 
 +  * -machine type=q35,accel=kvm 
 +    * 仮想マシンのタイプ:マザーボードの基本構成のようなもの 
 +    * KVMを有効にする。QEMUは汎用的な仮想マシンエミュレータでKVMでカーネの支援が有効になる 
 +  * -object rng-random,​id=rng0,​filename=/​dev/​urandom -device virtio-rng-pci,​rng=rng0 
 +    * 乱数生成器などを仮想マシンから見えるようにする 
 +  * -cpu host 
 +    * cpuのタイプ。他の種類のCPUもエミュレートできるがHostをそのまま使うのが一番効率がよい 
 +  * -smp 8 
 +    * 割り当てるCPUの数。NUMA構成などもできるようだが単純にコア数だけ指定 
 +  * -m 4G 
 +    * 割り当てるメモリ 
 +  * -drive file=exam_vm_raw.img,​driver=raw,​if=virtio,​index=0,​media=disk,​cache=writeback 
 +    * 仮想ハードディスの設定。作成した仮想ディスクのイメージとフォーマトを指定。インターフェイスはvirtio 
 +    * cacheやaioなどの設定によってディスクのパフォーマンスをが変わる。HostがSSDかHDDか、メモリの量などで調整が必要 
 +  * boot c 
 +    * 起動デバイスの指定。cはハードディスク。dはCD-ROM。インストール時は起動ディスクのisoをCD-ROMとして設定してdから起動 
 +   * CD-ROMを接続する場合は「-cdrom install-amd64-minimal-20200531T214503Z.iso」 
 +  * -netdev tap,​id=net0,​ifname=tap0,​vhost=on,​script=no,​downscript=no 
 +    * ネットワークのバックエンドの設定。tapで先ほど作成したtap0接続する。idは仮想マシン側に見せるデバイスの設定に利用。 
 +    * scriptは仮想マシン起動時にtapデバイスを作成する場合に利用できる。ここでは静的に設定しているのでスクリプトは利用し。 
 +  * -device virtio-net,​netdev=net0,​mac=52:​54:​00:​87:​92:​31 
 +    * Guest側に見えNICの設定。virtio-net経由でidで指定したバックエンド(net0)に接続。 
 +  * -netdev tap,​id=net1,​ifname=tap_local0,​vhost=on,​script=no,​downscript=no 
 +  * -device virtio-net,​netdev=net1,​mac=52:​54:​00:​87:​92:​32 
 +    * 同様に、Hostと通信するためだけに作成したBridgeに接続しているNICもGuestに作成 
 +  * -monitor unix:/​foo/​var/​vm01.sock,​server,​nowait 
 +    * QEMUモニタに接続するためのソケット。telnetでモニタにアクセスできるようにもできるが、telnetの場合、複数の仮想マシンを運用すると、各仮想マシンのモニタの区別はポート番号のみなり、管理しくい。ソケットであれば、ソケット名をわかりやすく設定できるので便利。 
 +    * ソケットへのアクセスはsocatコマンドで可能。 
 +    * socat - UNIX-CONNECT:/​foo/​bar/​vm01.sock 
 +    * 上記コマンドにパイプでモニタコマンドを与えてやると直接モニタを操作できる。例えば「echo "​system_powerdown"​ |socat - UNIX-CONNECT:/​foo/​bar/​vm01.sock」とれば、仮想マシンに電源ボタンを押下したことを伝達でき。仮想マシン上のカーネルで電源ボタンの押下を検知できるようにし、acpidなどを設定しておくとHostから手軽にシャットダウンできる。 
 +    * telnetの場合は「-monitor telnet:​127.0.0.1:​10100,​server,​nowait」。10100番ポートにtelnetするとモニタにアクセスできる。 
 +  * -display none 
 +    * 本番でサーバ運用の場合はディスプレイは不要なのでnone。 
 +    * インストール時はcursesとすれば、sshなどのコマンドラインに直接Guestのコンソールを接続できる。ただし、テキストモードの場合のみ。グラフィックモードの場合はvncなどが必要
   * -daemonize   * -daemonize
-    * コンソールから切り離す。バックグラウンドで起動する。 +    * 本番時はタミナルから切り離して起動。 
-    * 端末がおしくなる場合があるでresetコマンドどでリセットする。+  * -fsdev local,​id=share,​path=/​foo/​bar/​share_dir,​security_model=mapped-xattr 
 +  * -device virtio-9p-pci,​fsdev=share,​mount_tag=v_share 
 +    * HostのディレクトリをGuestと共有。Guest側カーネルで9pのオプションを有効にる必要がある 
 +    * [[https://​wiki.qemu.org/​Documentation/​9psetup]] 
 +    * fsdevで共有するディレクトリのバックンドを設定し、deviceGuestから見えるデバイスを生成する。mount_tagはGuestらmountする場合のデバイス名となる。
   ​   ​
 ==== ゲストOSのカーネル設定 ==== ==== ゲストOSのカーネル設定 ====
ライン 196: ライン 239:
   CONFIG_VIRTIO_BALLOON   CONFIG_VIRTIO_BALLOON
  
-===== 設定後の起動 ===== 
-virtioを利用する場合の通常運用時の起動オプション例。SSH等でネットワークからアクセスできる状態になっていれば、グラフィックは無効にしてバックグラウンドで起動する。qemuモニタにはtelnetでアクセスできるようにしておく。 
- 
-  /​usr/​bin/​qemu-kvm -name "​com2.ps.ritsumei.ac.jp"​ \ 
-      -cpu core2duo \ 
-      -smp 2 \ 
-      -m 768 \ 
-      -k ja \ 
-      -drive file=/​home/​nishide/​kvm/​KVM-2012_com2.img,​if=virtio \ 
-      -boot c \ 
-      -net nic,​model=virtio \ 
-      -net tap,​ifname=tap0,​script=no,​downscript=no \ 
-      -rtc clock=host,​base=localtime \ 
-      -monitor telnet::​4444,​server,​nowait \ 
-      -nographic \ 
-      -daemonize 
- 
-===== ゲストのkernelオプション ===== 
-クロックソースとしてkvmを指定するためブートローダでkernelに起動オプションを指定する。 
- 
-grubの場合 
- 
-  * /​boot/​grub/​grub.conf 
- 
-  kernel /​vmlinuz-3.7.10-gentoo ro root=/​dev/​vda2 clocksource=kvm-clock rootfstype=ext4 
  
linux/kvm.1590982155.txt.bz2 · 最終更新: 2020/06/01 12:29 by admin