linux:kvm
差分
このページの2つのバージョン間の差分を表示します。
| 両方とも前のリビジョン前のリビジョン次のリビジョン | 前のリビジョン | ||
| linux:kvm [2020/06/01 12:29] – [ゲストOSの起動] admin | linux:kvm [2022/01/06 10:40] (現在) – [ゲストOSの設定] 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 | + | * [[https://www.qemu.org/ |
| + | * [[https:// | ||
| + | * [[https:// | ||
| ===== ホスト側設定 ===== | ===== ホスト側設定 ===== | ||
| ==== カーネル ==== | ==== カーネル ==== | ||
| + | GentooのWikiに従って設定 | ||
| + | |||
| KVMサポート | KVMサポート | ||
| Virtualization | Virtualization | ||
| 行 24: | 行 28: | ||
| < | < | ||
| [*]IGMP/MLD snooping | [*]IGMP/MLD snooping | ||
| - | <*> 802.1Q VLAN Support | + | |
| - | [*]GVRP (GARP VLAN Registration Protocol) | + | macvtapを利用する(後述) |
| + | |||
| + | Device Drivers | ||
| + | [*] Network device 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 | ||
| - | | ||
| - | (X) Preemptible Kernel (Low-Latency Desktop) | ||
| ==== 関連パッケージ ==== | ==== 関連パッケージ ==== | ||
| 行 44: | 行 50: | ||
| ==== ネットワーク設定 ==== | ==== ネットワーク設定 ==== | ||
| - | 物理インターフェイス(eth0)を介して、物理マシンも仮想マシンもブリッジ接続するようにする。 | + | === macvtapを利用する場合 === |
| + | |||
| + | * [[https:// | ||
| + | * [[https:// | ||
| + | |||
| + | ネットワークに関して当初は以下のようにしていたが、macvtapで物理NICに直接接続する方法もある。NICが複数ある場合は、余計なブリッジを構成しなくてよいので、こちらの方が便利かもしれない。ただし、いまのところGentooではmacvtapを起動スクリプトで扱えないので、仮想マシンを起動する時などにインタフェースを構成する必要がある。また、Qemuからも直接扱えないので、ネットワークデバイスに関するパラメータも少し変更が必要になる。 | ||
| + | |||
| + | 既にnetifrcパッケージに修正がなされつつあるようなので、Gentooの起動スクリプトでmacvtapが扱えるようになったら設定を見直そう。 | ||
| + | |||
| + | macvtapデバイスの構成 | ||
| + | |||
| + | 以下は、/ | ||
| + | |||
| + | # 「macvtap0」という名前でmacvtapデバイスを作成し、物理NICの「enp8s0f0」に接続 | ||
| + | # modeはpassthruとする。1つのVMで1つのNICを使うので今回は何でもよい | ||
| + | # 複数VMが物理NICを共有する形で構成される場合、modeによってVM同士の通信の仕方が変わる。 | ||
| + | ip link add link enp8s0f0 name macvtap0 type macvtap mode passthru | ||
| + | # 作成したインタフェースを起動 | ||
| + | ip link set macvtap0 up | ||
| + | # Qemuは今のところ/ | ||
| + | # / | ||
| + | chown root:kvm /dev/tap$(cat / | ||
| + | chmod 660 / | ||
| + | |||
| + | Qemuのネットワークインターフェースのパラメータ | ||
| + | # Qemu側からはインターフェースを直接利用できないのでtapのファイルディスクリプタを指定する | ||
| + | # fd=3は適当な番号(3未満は標準入出力で利用されている?) | ||
| + | # / | ||
| + | -netdev tap, | ||
| + | |||
| + | # macアドレスをHostのmacvtapインターフェースとゲストで一致させないと通信できない | ||
| + | # たぶん、物理NICを直接VMに接続するイメージなので、macアドレスが一致していないと通信できない | ||
| + | # macvtapを構成する際に指定してもよいが、自動的に付与されたものを利用する | ||
| + | # macvtapに割り当てられたmacアドレスは/ | ||
| + | -device virtio-net, | ||
| + | |||
| + | === tap + bridgeで構成する場合 === | ||
| + | |||
| + | Guest用に使う物理NICを増設したので、Host側のNICはHost専用で利用する。HostとGuestが別のネットワークに接続されることを前提に、両者の通信用に内部でローカルネットワークを構成する。QEMUでuserモードのネットワークデバイスを使うこともできるが、Guest側からもHostの物理NICが接続しているネットワークに接続する可能性を考えて、Bridgeを用意する(nftablesなどでフォワード、マスカレードすることもできるが、設定が面倒なので使わないことにする)。 | ||
| / | / | ||
| - | #物理インタフェイスのIPアドレス設定を空にする | + | |
| - | config_eth0=" | + | * Hostの物理NICの最近の命名規則は違っているが、とりあえずeth+Nとする。 |
| + | * eth0はHost用のNIC(マザーボード) | ||
| + | * eth1はGuest用に増設したNIC | ||
| + | |||
| + | ## Hostのネットワーク設定(通常通り) | ||
| + | config_eth0=" | ||
| + | routes_eth0=" | ||
| | | ||
| - | | + | |
| - | brctl_br0=" | + | ## Bridgeを作成しGuest用物理NICとGuestのtapを接続する |
| - | #rc_need_br0=" | + | |
| - | rc_net_br0_need=" | + | |
| | | ||
| - | # Host | + | # 物理NICにはIPを割り当てない |
| - | | + | |
| - | routes_br0=" | + | # tapデバイスをtap0として構成しIPを空に(IPはGuest OSが設定) |
| - | dns_domain_br0=" | + | |
| - | dns_servers_br0=" | + | |
| - | dns_search_br0=" | + | |
| - | | + | |
| - | # Guest | + | |
| - | config_tap0=" | + | |
| tuntap_tap0=" | tuntap_tap0=" | ||
| - | | + | |
| + | | ||
| + | bridge_br0=" | ||
| + | # bridgeデバイスそのものにはIPアドレスを設定しない | ||
| + | # HostからGuest用NICがわのネットワークに出ていく場合は適当なIPを設定 | ||
| + | config_br0=" | ||
| + | # bridgeのオプション設定 | ||
| + | bridge_forward_delay_br0=0 | ||
| + | bridge_hello_time_br0=1000 | ||
| + | |||
| + | # bridgeを起動する際の依存関係を記述 | ||
| + | # 起動スクリプトが実行される際の依存関係 | ||
| + | depend_br0() { | ||
| + | # / | ||
| + | need net.eth1 | ||
| + | need net.tap0 | ||
| + | } | ||
| - | ===== ゲストOSの起動 ===== | + | 以上の設定をしたうえで、/ |
| - | 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は空にしておく |
| - | | + | tuntap_tap_local0=" |
| - | -cdrom livecd-i686-installer-2007.0.iso \ | + | config_tap_local0=" |
| - | -boot d | + | # br_local0というbridgeデバイスを作成しtap_local0を参加 |
| - | | + | bridge_br_local0=" |
| - | -net nic | + | # bridge自体にIPアドレスを設定 |
| - | -net tap, | + | # Hostが利用するIPアドレス。適当なローカルアドレスにする |
| + | | ||
| + | | ||
| + | | ||
| + | |||
| + | | ||
| + | | ||
| + | } | ||
| - | オプションについて | + | br_local0というブリッジデバイスにGuestの2つ目のNICをtap経由で接続しておくことで、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がエミュレートされる。 | + | ディスクイメージの作成 |
| - | | + | |
| - | * 仮想ディスクのアクセスにvirtio経由を用いる。 | + | |
| - | * -cdrom | + | > qemu-img create -f raw -o preallocation=full Disk01_raw.img 30G |
| - | * CD-ROMイメージファイルの指定 | + | |
| - | | + | |
| - | * 起動ディスクの指定 「d」はCD-ROMから、「c」はHDDから | + | |
| - | * -net nic | ||
| - | * 新しくネットワークインタフェースを作成しvlan(デフォルト)に接続する | ||
| - | * -net nic, | ||
| - | * ネットワークデバイスとしてvirtioを利用する。指定しなければRealTek8139がエミュレートされる。 | ||
| - | * -net tap, | ||
| - | * ホストのtap0をvlan(デフォルト)に接続する | ||
| - | * -net tap, | ||
| - | * 上記設定に加えて、vhost=onでvhost-netを利用する。ゲストのカーネルでMessage Signaled Interrupts (MSI and MSI-X)、ホストのカーネルでVirtio network driverが必要。 | ||
| - | * -curses | + | Guestを起動するシェルスクリプトを適当に作成 |
| - | * ncursesを利用してコマンドライン上にコンソールをリダイレクトする。ゲストが高解像度の出力をする場合は利用不可。 | + | |
| - | * ターミナルソフトのRLoginでSSHしたホスト上でcursesオプションを指定して起動した場合、「ESC」キーと「2」を同時押しでQEMUのコンソールに切り替えられる。場合によっては「ESC」を長押しする必要がある。 | + | -name " |
| - | | + | -machine type=q35, |
| - | | + | -object rng-random, |
| - | * -vnc [host]:[ディスプレイno] | + | -cpu host \ |
| - | | + | -smp 8 \ |
| - | | + | -m 4G \ |
| - | | + | -drive file=exam_vm_raw.img, |
| + | -boot c \ | ||
| + | -netdev tap, | ||
| + | -device virtio-net, | ||
| + | -netdev tap, | ||
| + | -device virtio-net, | ||
| + | -monitor unix:/ | ||
| + | -serial unix:/ | ||
| + | | ||
| + | -daemonize \ | ||
| + | | ||
| - | | + | オプション |
| - | * リアルタイムクロックの設定。UTC扱いになる場合に適切に設定する。 | + | |
| + | * 仮想マシンの名称 | ||
| + | * -machine type=q35,accel=kvm | ||
| + | * 仮想マシンのタイプ:マザーボードの基本構成のようなもの | ||
| + | * KVMを有効にする。QEMUは汎用的な仮想マシンエミュレータでKVMでカーネルの支援が有効になる | ||
| + | * -object rng-random, | ||
| + | * 乱数生成器などを仮想マシンから見えるようにする | ||
| + | * -cpu host | ||
| + | * cpuのタイプ。他の種類のCPUもエミュレートできるがHostをそのまま使うのが一番効率がよい | ||
| + | * -smp 8 | ||
| + | * 割り当てるCPUの数。NUMA構成などもできるようだが単純にコア数だけ指定 | ||
| + | * -m 4G | ||
| + | * 割り当てるメモリ | ||
| + | * -drive file=exam_vm_raw.img, | ||
| + | * 仮想ハードディスクの設定。作成した仮想ディスクのイメージとフォーマットを指定。インターフェイスは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, | ||
| + | * ネットワークのバックエンドの設定。tapで先ほど作成したtap0に接続する。idは仮想マシン側に見せるデバイスの設定に利用。 | ||
| + | * scriptは仮想マシン起動時にtapデバイスを作成する場合に利用できる。ここでは静的に設定しているのでスクリプトは利用なし。 | ||
| + | * -device virtio-net, | ||
| + | * Guest側に見えるNICの設定。virtio-net経由でidで指定したバックエンド(net0)に接続。 | ||
| + | * -netdev tap, | ||
| + | * -device virtio-net, | ||
| + | * 同様に、Hostと通信するためだけに作成したBridgeに接続しているNICもGuestに作成 | ||
| + | * -monitor unix:/ | ||
| + | * QEMUモニタに接続するためのソケット。telnetでモニタにアクセスできるようにもできるが、telnetの場合、複数の仮想マシンを運用すると、各仮想マシンのモニタの区別はポート番号のみになり、管理しにくい。ソケットであれば、ソケット名をわかりやすく設定できるので便利。 | ||
| + | * ソケットへのアクセスはsocatコマンドで可能。 | ||
| + | * socat - UNIX-CONNECT:/ | ||
| + | * 上記コマンドにパイプでモニタコマンドを与えてやると直接モニタを操作できる。例えば「echo " | ||
| + | * telnetの場合は「-monitor telnet: | ||
| + | * -serial unix:/ | ||
| + | * LinuxやGrubのコンソールを出すためのシリアルポートを仮想マシン上に作成し、その出力をUNIXドメインソケットとして/ | ||
| + | * -display none | ||
| + | * 本番でサーバ運用の場合はディスプレイは不要なのでnone。 | ||
| + | * インストール時はcursesとすれば、sshなどのコマンドラインに直接Guestのコンソールを接続できる。ただし、テキストモードの場合のみ。グラフィックモードの場合はvncなどが必要。 | ||
| * -daemonize | * -daemonize | ||
| - | * コンソールから切り離す。バックグラウンドで起動する。 | + | * 本番時はターミナルから切り離して起動。 |
| - | * 端末がおかしくなる場合があるのでresetコマンドなどでリセットする。 | + | * -fsdev local, |
| + | * -device virtio-9p-pci, | ||
| + | * HostのディレクトリをGuestと共有。Guest側カーネルで9pのオプションを有効にする必要がある。 | ||
| + | * [[https:// | ||
| + | * fsdevで共有するディレクトリのバックエンドを設定し、deviceでGuestから見えるデバイスを生成する。mount_tagはGuestからmountする場合のデバイス名となる。 | ||
| | | ||
| - | ==== ゲストOSのカーネル設定 ==== | + | ==== ゲストOSの設定 ==== |
| - | 基本的には実マシンと同様に設定すればよいが、virtioを利用する場合には追加設定を行う。 | + | |
| - | 準仮想化の設定。仮想マシン上のカーネルオプション。ゲスト側で設定しておくとパフォーマンスが向上する。 | + | 従来はエミュレートされたハードウェアに対して通常のドライバを利用していたが、最近はGuestからHostへのアクセスは基本的にVirtio経由で行う。以下を参考に必要なドライバを組み込む。Virtio経由でアクセスするため、SATAやNICのドライバなども無効にしてよい。 |
| - | [*] Paravirtualized guest support---> | + | |
| - | --- Paravirtualized guest support | + | |
| - | [*] Paravirtual steal time accounting | + | |
| - | [ ] Xen guest support | + | |
| - | [*] KVM paravirtualized clock | + | |
| - | [*] KVM Guest support | + | |
| - | -*- Enable paravirtualization code | + | |
| - | [*] Paravirtualization layer for spinlocks | + | |
| - | virtioを利用しない場合の各種ドライバ | + | |
| - | Device Drivers ---> | + | |
| - | <*> Serial ATA and Parallel ATA drivers ---> | + | |
| - | <*> Intel ESB, ICH, PIIX3, PIIX4 PATA/SATA support | + | |
| - | + | ||
| - | | + | |
| - | | + | |
| - | [*] Realtek devices | + | |
| - | <*> RealTek RTL-8139 C+ PCI Fast Ethernet Adapter support (EXPERIMENTAL) | + | |
| - | <*> RealTek RTL-8129/8130/8139 PCI Fast Ethernet Adapter support | + | |
| - | [*] Use PIO instead of MMIO | + | |
| - | virtioを利用する場合(パフォーマンス向上) | + | === 時刻 === |
| - | Device Drivers ---> | + | Guestの時刻同期は、仮想ネットワークデバイスがハードウェアタイムスタンプをサポートしていないため、NTPではマイクロ秒レベルの正確な時刻同期ができないらしい。正確にクロックを同期するには、PTPを通してHostのクロックをハードウェアタイムスタンプで同期すればよいらしい。 |
| - | [*] Block devices ---> | + | |
| - | | + | * [[https:// |
| + | |||
| + | カーネルのPTPドライバを有効にする | ||
| + | | ||
| + | PTP clock support | ||
| + | [*] PTP clock support | ||
| + | [*] KVM virtual PTP clock | ||
| + | |||
| + | 時刻同期にPTPで時刻を同期できるchronyを利用する。 | ||
| + | |||
| + | chrony.confは以下の1行のみを有効にする。server行などはすべてコメントアウト。 | ||
| + | |||
| + | refclock PHC /dev/ptp0 poll 2 | ||
| + | |||
| + | 起動時にhwclockが走らないようにbootランレベルから削除しておく。起動時の時刻同期はカーネル機能で対応。 | ||
| + | Device Drivers | ||
| + | | ||
| + | | ||
| + | (rtc0) | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | |||
| + | === シリアルポートにコンソールを出力 === | ||
| + | |||
| + | カーネルにシリアルポートのドライバ等を組み込む。「Console on 8250/16550 and compatible serial port」を有効にしないと、起動からログインプロンプトまでのカーネルメッセージや起動メッセージが表示できないので注意。PNPサポートは、どちらでもよい気がする。 | ||
| + | |||
| + | Device Drivers | ||
| + | Character devices | ||
| + | | ||
| + | Serial drivers | ||
| + | [*] 8250/16550 and compatible serial support | ||
| + | [ ] | ||
| + | [*] | ||
| + | [ ] | ||
| + | [ ] | ||
| + | [*] | ||
| + | |||
| + | 起動オプションの変更とGrub自体の出力先をコンソールにも出すようにする。 | ||
| + | / | ||
| | | ||
| - | [*] Network device support ---> | + | # カーネルの「console」コマンドラインオプションを追加し、tty0とttyS0(シリアルポート)の両方に |
| - | -*- Network core driver support | + | # コンソールメッセージを出力するようにする |
| - | < | + | |
| | | ||
| - | Character devices ---> | + | # Grub自体の出力もconsoleとシリアルポートの両方に出すようにする |
| - | < | + | |
| - | < | + | # 上記パラメータにserialを追加すると以下がないと警告が出る |
| - | <*> VirtIO Random Number Generator support | + | |
| - | + | | |
| - | | + | |
| - | < | + | |
| - | < | + | |
| - | + | 起動後の仮想コンソール(シリアルコンソール)をシリアルポートに出力する。 | |
| - | Bus options (PCI etc.) ---> | + | |
| - | [*] Message Signaled Interrupts (MSI and MSI-X) | + | この設定がなければ、起動時のカーネルメッセージや起動メッセージはシリアルコンソールに表示されるが、起動してからのログインプロンプトがシリアルポートに出ないので、シリアルコンソールには何も見えなくなる。 |
| + | |||
| + | /etc/inittab | ||
| + | # シリアルコンソールをttyS0に | ||
| + | s0: | ||
| + | |||
| + | socatコマンドでUNIXドメインソケット経由で仮想マシンのシリアルコンソールに接続 | ||
| + | # escape=0x11でCtrl+qをエスケープシーケンスに指定する。socat自体を終了させる際のシーケンス | ||
| + | socat stdin, | ||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| - | virtioを利用する場合、ディスクのデバイスファイルは以下の様になる。 | ||
| - | * /dev/vda? | ||
| - | virtioを利用する場合、ホスト側で以下のオプションを有効にする。 | ||
| - | Device Drivers ---> | ||
| - | [*] Network device support ---> | ||
| - | -*- Network core driver support | ||
| - | <*> Virtio network driver (EXPERIMENTAL) | ||
| - | | ||
| - | Virtio drivers ---> | ||
| - | <*> PCI driver for virtio devices (EXPERIMENTAL) | ||
| - | virtioを利用する場合の参考サイト | ||
| - | * [[http:// | ||
| - | CONFIG_VIRTIO_BLK | ||
| - | CONFIG_VIRTIO_NET | ||
| - | CONFIG_VIRTIO_CONSOLE | ||
| - | CONFIG_HW_RANDOM_VIRTIO | ||
| - | CONFIG_VIRTIO | ||
| - | CONFIG_VIRTIO_RING | ||
| - | CONFIG_VIRTIO_PCI | ||
| - | CONFIG_VIRTIO_BALLOON | ||
| - | ===== 設定後の起動 ===== | ||
| - | virtioを利用する場合の通常運用時の起動オプション例。SSH等でネットワークからアクセスできる状態になっていれば、グラフィックは無効にしてバックグラウンドで起動する。qemuモニタにはtelnetでアクセスできるようにしておく。 | ||
| - | / | ||
| - | -cpu core2duo \ | ||
| - | -smp 2 \ | ||
| - | -m 768 \ | ||
| - | -k ja \ | ||
| - | -drive file=/ | ||
| - | -boot c \ | ||
| - | -net nic, | ||
| - | -net tap, | ||
| - | -rtc clock=host, | ||
| - | -monitor telnet:: | ||
| - | -nographic \ | ||
| - | -daemonize | ||
| - | ===== ゲストのkernelオプション ===== | ||
| - | クロックソースとしてkvmを指定するためブートローダでkernelに起動オプションを指定する。 | ||
| - | grubの場合 | ||
| - | * / | ||
| - | kernel / | ||
linux/kvm.1590982155.txt.bz2 · 最終更新: by admin
