linux:kvm
差分
このページの2つのバージョン間の差分を表示します。
| 両方とも前のリビジョン前のリビジョン次のリビジョン | 前のリビジョン | ||
| linux:kvm [2020/08/04 12:27] – Wiki Editor | linux:kvm [2022/01/06 10:40] (現在) – [ゲストOSの設定] Wiki Editor | ||
|---|---|---|---|
| 行 28: | 行 28: | ||
| < | < | ||
| [*]IGMP/MLD snooping | [*]IGMP/MLD snooping | ||
| + | |||
| + | macvtapを利用する(後述) | ||
| + | | ||
| + | Device Drivers | ||
| + | [*] Network device support | ||
| + | | ||
| + | | ||
| + | |||
| + | |||
| KSM (複数のVM間でメモリを共有する) | KSM (複数のVM間でメモリを共有する) | ||
| 行 41: | 行 50: | ||
| ==== ネットワーク設定 ==== | ==== ネットワーク設定 ==== | ||
| + | === 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 / | ||
| + | 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などでフォワード、マスカレードすることもできるが、設定が面倒なので使わないことにする)。 | Guest用に使う物理NICを増設したので、Host側のNICはHost専用で利用する。HostとGuestが別のネットワークに接続されることを前提に、両者の通信用に内部でローカルネットワークを構成する。QEMUでuserモードのネットワークデバイスを使うこともできるが、Guest側からもHostの物理NICが接続しているネットワークに接続する可能性を考えて、Bridgeを用意する(nftablesなどでフォワード、マスカレードすることもできるが、設定が面倒なので使わないことにする)。 | ||
| 行 117: | 行 164: | ||
| -drive file=exam_vm_raw.img, | -drive file=exam_vm_raw.img, | ||
| -boot c \ | -boot c \ | ||
| - | -netdev tap, | + | -netdev tap, |
| - | -netdev tap, | + | |
| - | -monitor unix:/ | + | -netdev tap, |
| + | | ||
| + | -monitor unix:/ | ||
| + | -serial unix:/ | ||
| -display none \ | -display none \ | ||
| -daemonize \ | -daemonize \ | ||
| 行 158: | 行 208: | ||
| * 上記コマンドにパイプでモニタコマンドを与えてやると直接モニタを操作できる。例えば「echo " | * 上記コマンドにパイプでモニタコマンドを与えてやると直接モニタを操作できる。例えば「echo " | ||
| * telnetの場合は「-monitor telnet: | * telnetの場合は「-monitor telnet: | ||
| + | * -serial unix:/ | ||
| + | * LinuxやGrubのコンソールを出すためのシリアルポートを仮想マシン上に作成し、その出力をUNIXドメインソケットとして/ | ||
| * -display none | * -display none | ||
| * 本番でサーバ運用の場合はディスプレイは不要なのでnone。 | * 本番でサーバ運用の場合はディスプレイは不要なのでnone。 | ||
| 行 169: | 行 221: | ||
| * fsdevで共有するディレクトリのバックエンドを設定し、deviceでGuestから見えるデバイスを生成する。mount_tagはGuestからmountする場合のデバイス名となる。 | * 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 | ||
linux/kvm.1596511652.txt.bz2 · 最終更新: by Wiki Editor
