ユーザ用ツール

サイト用ツール


linux:kvm

差分

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

この比較画面へのリンク

両方とも前のリビジョン前のリビジョン
次のリビジョン
前のリビジョン
linux:kvm [2020/08/11 11:33] 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。
行 202: 行 254:
        [*]   PC-style 'CMOS'        [*]   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で反映する。 
 +   
 +  # カーネルの「console」コマンドラインオプションを追加し、tty0とttyS0(シリアルポート)の両方に 
 +  # コンソールメッセージを出力するようにする 
 +  GRUB_CMDLINE_LINUX_DEFAULT="rootfstype=ext4 zswap.enabled=1 zswap.zpool=zbud zswap.compressor=lz4 console=tty0 console=ttyS0,115200n" 
 +   
 +  # Grub自体の出力もconsoleとシリアルポートの両方に出すようにする 
 +  GRUB_TERMINAL="console serial" 
 +  # 上記パラメータにserialを追加すると以下がないと警告が出る 
 +  # シリアルポートの設定 
 +  GRUB_SERIAL_COMMAND="serial --speed=115200 --unit=0 --word=8 --parity=no --stop=1" 
 + 
 + 
 + 
 +起動後の仮想コンソール(シリアルコンソール)をシリアルポートに出力する。 
 + 
 +この設定がなければ、起動時のカーネルメッセージや起動メッセージはシリアルコンソールに表示されるが、起動してからのログインプロンプトがシリアルポートに出ないので、シリアルコンソールには何も見えなくなる。 
 + 
 +/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  
 + 
 + 
 + 
 + 
 + 
 + 
 + 
 + 
 + 
 + 
 + 
 + 
 + 
  
  
linux/kvm.1597113188.txt.bz2 · 最終更新: 2020/08/11 11:33 by Wiki Editor

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki