ユーザ用ツール

サイト用ツール


linux:kvm

差分

このページの2つのバージョン間の差分を表示します。

この比較画面へのリンク

両方とも前のリビジョン前のリビジョン
次のリビジョン
前のリビジョン
linux:kvm [2020/08/04 12:27] Wiki Editorlinux:kvm [2022/01/06 10:40] (現在) – [ゲストOSの設定] Wiki Editor
行 28: 行 28:
        <*> 802.1d Ethernet Bridging        <*> 802.1d Ethernet Bridging
         [*]IGMP/MLD snooping         [*]IGMP/MLD snooping
 +
 +macvtapを利用する(後述)
 +  
 +  Device Drivers  ---> 
 +    [*] Network device support  --->
 +       [*]     MAC-VLAN support
 +       [*]       MAC-VLAN based tap driver
 +
 + 
  
 KSM (複数のVM間でメモリを共有する) KSM (複数のVM間でメモリを共有する)
行 41: 行 50:
  
 ==== ネットワーク設定 ==== ==== ネットワーク設定 ====
 +=== macvtapを利用する場合 ===
 +
 +  * [[https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html/virtualization_deployment_and_administration_guide/sect-virtual_networking-directly_attaching_to_physical_interface]]
 +  * [[https://ahelpme.com/linux/howto-do-qemu-full-virtualization-with-macvtap-networking/]]
 +
 +ネットワークに関して当初は以下のようにしていたが、macvtapで物理NICに直接接続する方法もある。NICが複数ある場合は、余計なブリッジを構成しなくてよいので、こちらの方が便利かもしれない。ただし、いまのところGentooではmacvtapを起動スクリプトで扱えないので、仮想マシンを起動する時などにインタフェースを構成する必要がある。また、Qemuからも直接扱えないので、ネットワークデバイスに関するパラメータも少し変更が必要になる。
 +
 +既にnetifrcパッケージに修正がなされつつあるようなので、Gentooの起動スクリプトでmacvtapが扱えるようになったら設定を見直そう。
 +
 +macvtapデバイスの構成
 +
 +以下は、/etc/init.d内のOpenRCの起動スクリプト側に記述。macvtapのデバイスファイル/dev/tapNは、インタフェースを作成した段階ではrootのみしかアクセスできない。そのためownerやpermissionを書き換えるためには、root権限で実行されているスクリプトで処理する必要がある。VMをrootで動かすならば必要ないが、別ユーザで動かしたいため。
 +
 +  # 「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は今のところ/dev/tapN経由で利用するが起動直後はデバイスファイルのownerとpermissionがrootのみrwとなっているため修正
 +  # /sys/class/macvtap0/ifindexが/dev/tapNの「N」を示す
 +  chown root:kvm /dev/tap$(cat /sys/class/net/macvtap0/ifindex)
 +  chmod 660 /dev/tap$(cat /sys/class/net/macvtap0/ifindex)
 +
 +Qemuのネットワークインターフェースのパラメータ
 +  # Qemu側からはインターフェースを直接利用できないのでtapのファイルディスクリプタを指定する
 +  # fd=3は適当な番号(3未満は標準入出力で利用されている?)
 +  # /dev/tapNの番号は/sys/class/net/${MACVTAP}/ifindex)から取得できる
 +  -netdev tap,id=net0,vhost=on,fd=3 3<>/dev/tap$(cat /sys/class/net/${MACVTAP}/ifindex)
 +  
 +  # macアドレスをHostのmacvtapインターフェースとゲストで一致させないと通信できない
 +  # たぶん、物理NICを直接VMに接続するイメージなので、macアドレスが一致していないと通信できない
 +  # macvtapを構成する際に指定してもよいが、自動的に付与されたものを利用する
 +  # macvtapに割り当てられたmacアドレスは/sys/class/net/${MACVTAP}/addressで取得できる
 +  -device virtio-net,netdev=net0,mac=$(cat /sys/class/net/${MACVTAP}/address)
 +
 +=== 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,driver=raw,if=virtio,index=0,media=disk,cache=writeback \     -drive file=exam_vm_raw.img,driver=raw,if=virtio,index=0,media=disk,cache=writeback \
     -boot c \     -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=net0,ifname=tap0,vhost=on,script=no,downscript=no 
-    -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 \ +    -device virtio-net,netdev=net0,mac=52:54:00:87:92:31 \ 
-    -monitor unix:/home/kvm-admin/monitor_socket/exam_vm.sock,server,nowait \+    -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/socket/monitor.sock,server,nowait \ 
 +    -serial unix:/home/kvm-admin/socket/console.sock,server,nowait \
     -display none \     -display none \
     -daemonize \     -daemonize \
行 158: 行 208:
     * 上記コマンドにパイプでモニタコマンドを与えてやると直接モニタを操作できる。例えば「echo "system_powerdown" |socat - UNIX-CONNECT:/foo/bar/vm01.sock」とすれば、仮想マシンに電源ボタンを押下したことを伝達できる。仮想マシン上のカーネルで電源ボタンの押下を検知できるようにし、acpidなどを設定しておくとHostから手軽にシャットダウンできる。     * 上記コマンドにパイプでモニタコマンドを与えてやると直接モニタを操作できる。例えば「echo "system_powerdown" |socat - UNIX-CONNECT:/foo/bar/vm01.sock」とすれば、仮想マシンに電源ボタンを押下したことを伝達できる。仮想マシン上のカーネルで電源ボタンの押下を検知できるようにし、acpidなどを設定しておくとHostから手軽にシャットダウンできる。
     * telnetの場合は「-monitor telnet:127.0.0.1:10100,server,nowait」。10100番ポートにtelnetするとモニタにアクセスできる。     * telnetの場合は「-monitor telnet:127.0.0.1:10100,server,nowait」。10100番ポートにtelnetするとモニタにアクセスできる。
 +  * -serial unix:/foo/var/console.sock,server,nowait
 +    * LinuxやGrubのコンソールを出すためのシリアルポートを仮想マシン上に作成し、その出力をUNIXドメインソケットとして/foo/var/console.sockに接続する。シリアルコンソールに関する他の設定は後述。
   * -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を利用しない場合の各種ドライバ +  * [[https://wiki.gentoo.org/wiki/QEMU/Linux_guest]]
-  Device Drivers ---> +
-    <*> Serial ATA and Parallel ATA drivers ---> +
-      <*> Intel ESB, ICH, PIIX3, PIIX4 PATA/SATA support +
-   +
-    [*] Network device support ---> +
-      [*] Ethernet driver 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 ---> + 
-      <*Virtio block driver (EXPERIMENTAL)+  * [[https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html/virtualization_deployment_and_administration_guide/chap-kvm_guest_timing_management]] 
 + 
 +カーネルのPTPドライバを有効にする 
 +   Device Drivers  ---> 
 +      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  ---> 
 +    Device Drivers  ---> 
 +      [*]   Set system time from RTC on startup and resume 
 +      (rtc0)  RTC used to set the system time 
 +       [*]   /sys/class/rtc/rtcN (sysfs) 
 +       [*]   /proc/driver/rtc (procfs for rtcN) 
 +       [*]   /dev/rtcN (character devices
 +       [*]   PC-style 'CMOS' 
 + 
 +=== シリアルポートにコンソールを出力 === 
 + 
 +カーネルにシリアルポートのドライバ等を組み込む。「Console on 8250/16550 and compatible serial port」を有効にしないと、起動からログインプロンプトまでのカーネルメッセージや起動メッセージが表示できないので注意。PNPサポートは、どちらでもよい気がする。 
 + 
 +  Device Drivers  ---> 
 +    Character devices  ---> 
 +      Serial drivers  ---> 
 +      Serial drivers  ---> 
 +        [*] 8250/16550 and compatible serial support 
 +        [ ]   Support 8250_core.* kernel options (DEPRECATED) 
 +        [*]   8250/16550 PNP device support 
 +        [ ]   Support for variants of the 16550A serial port 
 +        [ ]   Support for Fintek F81216A LPC to 4 UART RS485 API 
 +        [*]   Console on 8250/16550 and compatible serial port 
 + 
 +起動オプションの変更とGrub自体の出力先をコンソールにも出すようにする。 
 +/etc/default/grubを以下のように編集し、grub-mkconfigで反映する。
      
-    [*] Network device support ---> +  # カーネルの「console」コマンドラインオプションを追加し、tty0とttyS0(シリアルポート)の両方に 
-      -*- Network core driver support +  # コンソールメッセージを出力するようにする 
-        <*> Virtio network driver (EXPERIMENTAL)+  GRUB_CMDLINE_LINUX_DEFAULT="rootfstype=ext4 zswap.enabled=1 zswap.zpool=zbud zswap.compressor=lz4 console=tty0 console=ttyS0,115200n"
      
-    Character devices ---> +  # Grub自体の出力もconsoleとシリアルポートの両方に出すようにする 
-      <*> Virtio console +  GRUB_TERMINAL="console serial" 
-      <*> Hardware Random Number Generator Core support +  # 上記パラメータにserialを追加すると以下がないと警告が出る 
-      <*> VirtIO Random Number Generator support +  # シリアルポートの設定 
-   +  GRUB_SERIAL_COMMAND="serial --speed=115200 --unit=0 --word=8 --parity=no --stop=1" 
-    Virtio drivers ---> + 
-      <*> PCI driver for virtio devices (EXPERIMENTAL) + 
-      <*> Virtio balloon driver (EXPERIMENTAL) + 
-       +起動後の仮想コンソール(シリアルコンソール)をシリアルポートに出力する。 
-    Bus options (PCI etc.) ---> + 
-      [*] Message Signaled Interrupts (MSI and MSI-X)+この設定がなければ、起動時のカーネルメッセージや起動メッセージはシリアルコンソールに表示されるが、起動してからのログインプロンプトがシリアルポートに出ないので、シリアルコンソールには何も見えなくなる。 
 + 
 +/etc/inittab 
 +  # シリアルコンソールをttyS0に 
 +  s0:12345:respawn:/sbin/agetty -L 115200 ttyS0 vt100 
 + 
 +socatコマンドでUNIXドメインソケット経由で仮想マシンのシリアルコンソールに接続 
 +  # escape=0x11でCtrl+qをエスケープシーケンスに指定する。socat自体を終了させる際のシーケンス 
 +  socat stdin,raw,echo=0,escape=0x11 unix-connect:console.sock  
 + 
 + 
 + 
 + 
 + 
 + 
 + 
 + 
 + 
 + 
 + 
 + 
  
-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://plamo.linet.gr.jp/wiki/index.php?%CF%C3%C2%EA%2F%B2%BE%C1%DB%B2%BDon%20Plamo_QEMU-KVM%CA%D4]] 
  
-  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 · 最終更新: 2020/08/04 12:27 by Wiki Editor

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki