MochiuWiki : SUSE, EC, PCB
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
ツール
リンク元
関連ページの更新状況
特別ページ
ページ情報
We ask for
Donations
検索
個人用ツール
ログイン
Toggle dark mode
名前空間
ページ
議論
表示
閲覧
ソースを閲覧
履歴を表示
インストール - KVMのソースを表示
提供: MochiuWiki : SUSE, EC, PCB
←
インストール - KVM
あなたには「このページの編集」を行う権限がありません。理由は以下の通りです:
この操作は、次のグループのいずれかに属する利用者のみが実行できます:
管理者
、new-group。
このページのソースの閲覧やコピーができます。
== 概要 == ここでは、KVM(Kernel-based Virtual Machine)とQEMUのインストールと仮想マシンの設定方法を記載する。<br> 搭載しているCPUが仮想化機構(Intel VTやAMD-V等)を備えている必要がある。<br> <br><br> == KVMとQEMUのインストール == ==== パッケージ管理システムからインストール ==== KVMとQEMUをインストールする。<br> # RHEL sudo dnf install qemu-kvm libvirt virt-install virt-manager # SUSE sudo zypper install qemu-kvm libvirt virt-install virt-manager または sudo zypper install patterns-server-kvm_server patterns-server-kvm_tools <br> モジュールが読み込まれているか確認する。<br> lsmod | grep kvm <br> もし、パッケージのインストール後にKVMモジュールが読み込まれていない場合、以下のコマンドを実行する。<br> # Intel CPU sudo modprobe kvm-intel # AMD CPU sudo modprobe kvm-amd <br> 正常に読み込まれている場合は、以下のように表示される。<br> kvm_intel 241664 0 kvm 704512 1 kvm_intel irqbypass 16384 1 kvm <br> KVMを起動および自動起動する場合は、以下のコマンドを実行する。<br> sudo systemctl start libvirtd sudo systemctl enable libvirtd <br> 必要であれば、libvirtグループにユーザがアクセスできるように設定する。<br> sudo usermod -aG libvirt $USER <br> ==== ソースコードからインストール ==== ===== GNU TLSのインストール ===== パッケージ管理システムのGNU TLSのバージョンが3.6.14未満の場合は、GNU TLSのソースコードをビルドしてインストールする。<br> <u>GNU TLS 3.6.14 (2022/4 現在の最新) のビルドでは、Nettle 3.4.1が必要となることに注意する。</u><br> <br> GNU TLSのビルドに必要なライブラリをインストールする。<br> sudo zypper install libtasn1-devel libunistring-devel unbound-devel p11-kit-devel libidn2-devel trousers-devel \ gmp-devel libnettle-devel # GMP, Nettleをパッケージ管理システムからインストールする場合 <br> GNU TLSのソースコードをダウンロードする。<br> もし、パッケージ管理システムにあるGMPおよびNettleが古い場合、これらのソースコードもダウンロードする。<br> * GMP *: https://gmplib.org/#DOWNLOAD * Nettle *: https://ftp.gnu.org/gnu/nettle/ * GNU TLS *: https://gnutls.org/download.html <br> GMP、Nettle、GNU TLSをビルドおよびインストールする。<br> # GMPのインストール (パッケージ管理システムにあるGMPのバージョンが古い場合) ../configure --prefix=<GMP、Nettle、GNU TLSのインストールディレクトリ> make -j $(nproc) make install # Nettleのインストール (パッケージ管理システムにあるNettleのバージョンが古い場合) ../configure --prefix=<GMP、Nettle、GNU TLSのインストールディレクトリ> \ --enable-openssl \ --enable-x86-aesni \ --enable-x86-sha-ni \ --enable-x86-pclmul make -j $(nproc) make install # GNU TLSのインストール ../configure --prefix=<GMP、Nettle、GNU TLSのインストールディレクトリ> \ --enable-shared make -j $(nproc) make install <br> ~/.profileファイル等に環境変数を追記する。<br> vi ~/.profile <br> <syntaxhighlight lang="sh"> # ~/.profileファイル export PATH="<GMP、Nettle、GNU TLSのインストールディレクトリ>/bin:$PATH" export LD_LIBRARY_PATH="<GMP、Nettle、GNU TLSのインストールディレクトリ>/lib64:$LD_LIBRARY_PATH" export PKG_CONFIG_PATH="$PKG_CONFIG_PATH:$(pkg-config --variable pc_path pkg-config)" export PKG_CONFIG_PATH="<GMP、Nettle、GNU TLSのインストールディレクトリ>/lib64/pkgconfig:$PKG_CONFIG_PATH" </syntaxhighlight> <br> PCを再起動する。<br> <br> ===== QEMUのインストール ===== QEMUのビルドに必要なライブラリをインストールする。<br> sudo zypper install flex bison indent dtc automake gcc gcc-c++ make glibc glibc-utils glib2-devel gtk3-devel ncurses-devel libxml2-devel \ libgnutls-devel gmp-devel libnettle-devel libseccomp-devel liburing-devel libgbm-devel glusterfs-devel \ libjpeg8-devel libpng16-devel libpulse-devel alsa-devel libjack-devel spice-protocol-devel libspice-server-devel \ libxkbcommon-devel libcap-devel libcap-ng-devel libpcap-devel libcurl-devel virglrenderer-devel xfsprogs-devel \ libiscsi-devel libzstd-devel libnfs-devel libvdeplug-devel brlapi-devel libSDL2-devel libSDL2_image-devel librados-devel \ lzfse-devel libmpath0 libcacard-devel lzo-devel snappy-devel libgcrypt-devel libu2f-server-devel libu2f-host-devel \ usbredir-devel libusb-1_0-devel libpmem-devel libkeyutils1 keyutils-devel libselinux-devel fuse-devel fuse3-devel libbpf-devel \ libbd_swap-devel libcapstone-devel libslirp-devel libfdt-devel sphinx libsphinxclient-devel numad libnuma1 numactl libnuma-devel \ librbd-devel rdma-core-devel libnet-devel libfvde-devel libdmmp-devel multipath-tools-devel libssh-devel libssh2-devel \ pipewire-devel sndio-devel libjson-c-devel libcmocka-devel python3-pytest python3-flake8 python3-restructuredtext_lint vte-devel libdw-devel \ sysprof-devel gtk-vnc-devel libcbor-devel qatzip-devel # QEMU 10.0以降 systemd-devel # SUSE 15.4以降の場合 sysprof-ui-devel # SUSE 15.5以前の場合 libudev-devel # SUSE 15.3以前の場合 <br> * QEMUの公式Webサイトから、ソースコードをダウンロードする場合 *: [https://www.qemu.org/download/ QEMUの公式Webサイト]にアクセスして、ソースコードをダウンロードする。 *: ダウンロードしたファイルを解凍する。 *: <syntaxhighlight lang="text"> tar xf qemu-<バージョン>.tar.xz cd qemu-<バージョン> </syntaxhighlight> *: <br> * Gitからソースコードをダウンロードする場合 *: <syntaxhighlight lang="text"> git clone git://git.qemu.org/qemu.git cd qemu git submodule update --init --recursive </syntaxhighlight> <br> QEMUをビルドおよびインストールする。<br> mkdir build && cd build ../configure --prefix=<QEMUのインストールディレクトリ> \ --enable-trace-backends=simple \ # テキストベースのトレース機能を有効化 --enable-kvm \ # KVMによるハードウェア仮想化支援を有効化 --enable-spice \ # SPICEプロトコルによるリモートデスクトップ機能を有効化 --enable-spice-protocol \ # SPICEプロトコルのライブラリサポートを有効化 --enable-usb-redir \ # ホストUSBデバイスのゲストへの転送機能を有効化 (SPICE経由でリモートからもリダイレクト可能な方式) --enable-opengl \ # OpenGLによるGPUアクセラレーションを有効化 --enable-tpm \ # TPM (Trusted Platform Module) エミュレーションを有効化 --enable-xkbcommon \ # XKBキーボードマッピングライブラリを有効化 --enable-bzip2 \ # bzip2圧縮ライブラリを有効化 --enable-sdl \ # SDLによるグラフィック・オーディオ出力を有効化 --enable-gtk \ # GTKツールキットによるGUIウィンドウ表示を有効化 --enable-vdi \ # VirtualBoxのVDI形式ディスクイメージ対応を有効化 --enable-qcow1 \ # 旧形式qcow1ディスクイメージのサポートを有効化 --enable-tools \ # qemu-img等の補助ツール群のビルドを有効化 --enable-fdt \ # FDT (Flattened Device Tree) サポートを有効化 --audio-drv-list=oss,alsa,sdl,pa # オーディオドライバとしてOSS, ALSA, SDL, PulseAudioを指定 # 下記のオプションは任意 または 指定不可 --enable-vfio-user-server # 任意 : VFIO (Virtual Function I/O) ユーザサーバ機能を有効にする場合 # 仮想マシンへの直接パススルーをユーザスペースで実現するプロトコル # 主にリモートPC上のデバイスを仮想マシンにアタッチしたり、ソフトウェアでエミュレートしたデバイスをVFIOデバイスとして公開する場合に使用 --enable-libusb # ローカルでUSBを直接パススルーする方式 # <code>--enable-usb-redir</code> オプションを指定している場合は不要 --enable-hax # QEMU 8.2以降は、このオプションは指定不可 --target-list=i386-softmmu,i386-linux-user,x86_64-softmmu,x86_64-linux-user # ターゲットをx86およびx86_64に限定する場合 # ターゲットにARM EABIHFおよびAArch64を追加する場合は、<code>arm-softmmu,arm-linux-user,aarch64-softmmu,aarch64-linux-user</code> を指定する make -j $(nproc) または ninja -j $(nproc) make install または ninja -j $(nproc) install <br> <u>※注意</u><br> <u><code>--enable-vfio-user-server</code> オプションは、QEMUのコンフィギュレーションにおいて、VFIOをユーザ空間で使用するためのサーバ機能を有効にする。<br></u> <br> <u>VFIO-userは、QEMUの比較的新しい機能であり、以下に示すような目的がある。</u><br> * リモートデバイスエミュレーション *: ホストPCとは別のマシン上でデバイスエミュレーションを実行できるようにする。 * セキュリティの向上 *: デバイスエミュレーションを分離された環境で実行することで、セキュリティを強化する。 * 柔軟性の向上 *: デバイスエミュレーションをより柔軟に管理・スケーリングできるようになる。 <br> <u>このオプションを有効にすると、QEMUはVFIO-userプロトコルをサポートするサーバーとして動作できるようになる。</u><br> <u>これにより、リモートクライアントがQEMUに接続し、仮想化されたデバイスにアクセスすることが可能になる。</u><br> <br> <u>ただし、この機能は比較的新しく、実験的な面もあるため、本番環境での使用には注意が必要である。</u><br> <u>現状では、開発やテスト目的で使用されることが多い。</u><br> <br> ~/.profileファイル等に環境変数を追記する。<br> vi ~/.profile <br> <syntaxhighlight lang="sh"> # ~/.profileファイル export PATH="<QEMUのインストールディレクトリ>/bin:$PATH" </syntaxhighlight> <br> ===== セキュリティ設定 : AppArmorを使用している場合 ===== QEMUを/usrディレクトリ以外の場所にインストールする場合、パーミッションの問題が発生する可能性がある。<br> そのため、libVirtにQEMUを実行するためのAppArmorパーミッションを追加する必要がある。<br> <br> まず、/etc/apparmor.d/usr.sbin.libvirtdファイルにある最後の <code>}</code> スコープの直前に、以下に示す設定を追記する。<br> 以下の例では、QEMUを /home/<ユーザ名>/QEMU/ディレクトリ にインストールしているものとする。<br> sudo vi /etc/apparmor.d/usr.sbin.libvirtd <br> # /etc/apparmor.d/usr.sbin.libvirtdファイル # ...略 # 例 : /usr/bin/kvm rmix, /home/<ユーザ名>/QEMU/bin/qemu-i386 rmix, /home/<ユーザ名>/QEMU/bin/qemu-system-i386 rmix, /home/<ユーザ名>/QEMU/bin/qemu-x86_64 rmix, /home/<ユーザ名>/QEMU/bin/qemu-system-x86_64 rmix, } <br> 次に、/etc/apparmor.d/abstractions/libvirt-qemuファイルの最下行に、QEMU向けのAppArmorパーミッションを追加する。<br> sudo vi /etc/apparmor.d/abstractions/libvirt-qemu <br> # /etc/apparmor.d/abstractions/libvirt-qemuファイル /usr/bin/kvm rmix, /home/<ユーザ名>/QEMU/bin/qemu-i386 rmix, /home/<ユーザ名>/QEMU/bin/qemu-system-i386 rmix, /home/<ユーザ名>/QEMU/bin/qemu-x86_64 rmix, /home/<ユーザ名>/QEMU/bin/qemu-system-x86_64 rmix, <br> AppArmorの設定を反映させるため、ルールセットを再読み込みする。<br> sudo systemctl reload apparmor <br> ===== セキュリティ設定 : SELinuxを使用している場合 ===== QEMUを/usrディレクトリ以外の場所にインストールする場合、SELinuxによるアクセス拒否が発生する可能性がある。<br> そのため、QEMUバイナリに適切なセキュリティコンテキスト(ラベル)を付与する必要がある。<br> <br> まず、現在のSELinuxモードを確認する。<br> getenforce <br> <u>Permissive</u> または <u>Disabled</u> と表示された場合は、設定は不要である。<br> <u>Enforcing</u> と表示された場合は、以下に示す設定が必要となる。<br> <br> ====== ファイルコンテキストの設定 ====== QEMUバイナリに適切なコンテキストを設定する。<br> 以下の例では、QEMUを /home/<ユーザ名>/QEMU/ディレクトリにインストールしているものとする。<br> <br> sudo semanage fcontext -a -t qemu_exec_t "/home/<ユーザ名>/QEMU/bin/qemu-system-.*" sudo semanage fcontext -a -t qemu_exec_t "/home/<ユーザ名>/QEMU/bin/qemu-i386" sudo semanage fcontext -a -t qemu_exec_t "/home/<ユーザ名>/QEMU/bin/qemu-x86_64" <br> 関連ライブラリやデータファイルにも必要に応じて設定する。<br> sudo semanage fcontext -a -t qemu_exec_t "/home/<ユーザ名>/QEMU/libexec(/.*)?" sudo semanage fcontext -a -t virt_image_t "/home/<ユーザ名>/QEMU/share(/.*)?" <br> ====== コンテキストの適用 ====== 設定したコンテキストを実際のファイルに適用 (再ラベル付け) する。<br> sudo restorecon -Rv /home/<ユーザ名>/QEMU/ <br> ====== 設定の確認 ====== コンテキストが正しく設定されたかどうかを確認する。<br> ls -Z /home/<ユーザ名>/QEMU/bin/ <br> 正しく設定されていれば、<u>qemu_exec_t</u> ラベルが表示される。<br> <br> ====== ブール値の調整(必要に応じて) ====== 状況によっては、SELinuxのブール値を変更する必要がある。<br> <br> 仮想化関連のブール値を確認する。<br> getsebool -a | grep virt <br> 必要に応じて有効化する。<br> sudo setsebool -P virt_use_nfs on # NFSを使用する場合 sudo setsebool -P virt_use_samba on # Sambaを使用する場合 sudo setsebool -P virt_sandbox_use_all_caps on # 特権が必要な場合 <br> ====== 上記で解決しない場合 : カスタムポリシーモジュールの作成 ====== 上記の設定でもアクセス拒否が発生する場合は、カスタムポリシーを作成する。<br> <br> 拒否ログを確認する。<br> sudo ausearch -m avc -ts recent <br> ログからポリシーモジュールを自動生成する。<br> sudo ausearch -m avc -ts recent | audit2allow -M qemu_custom <br> モジュールをインストールする。<br> sudo semodule -i qemu_custom.pp <br> ===== libvirtのインストール ===== <u>※注意</u><br> <u>libvirtを手動でインストールすることは、一般的に推奨されない。</u><br> <u>パッケージ管理システムからインストールしたlibvirtを手動でインストールしたlibvirtで上書きする場合、正常に動作しない可能性がある。</u><br> <br> /usrディレクトリ以外のディレクトリ(ホームディレクトリ等)にインストールする場合、<br> <code>ldconfig</code>コマンドや同様のユーティリティを実行して、インストールした共有ライブラリのリストを更新、または、バイナリや共有ライブラリのパスを調整する必要がある。<br> <br> libvirtは、ユーザの設定に基づいた複数のデーモンを提供している。<br> 手動でインストールしたlibvirtが使用できるようにするには、適切なプロセスを起動する必要がある。<br> 例えば、libvirtdは、ほとんどの構成でvirtlogdサービスを起動する必要がある。<br> <br> libVirtのビルドに必要なライブラリをインストールする。<br> sudo zypper install flex bison automake gcc make glibc glibc-utils glib2-devel zlib-devel libapparmor-devel libblkid-devel bash-completion-devel \ numad libnuma1 numactl libnuma-devel libyajl2 yajl libyajl-devel libpixman-1-0 libpixman-1-0-devel libgsasl-devel libselinux-devel \ libtool libgnutls30 libgnutls-devel libnl3-devel libxml2-devel libtirpc-devel python3-docutils \ device-mapper-devel libpciaccess-devel rpcbind readline-devel rpcgen libxslt-devel bzip2 \ fuse3-devel libbpf-devel sphinx libsphinxclient-devel libcapstone-devel keyutils-devel \ libcurl-devel libudev-devel libiscsi-devel libzstd-devel libnfs-devel libu2f-server-devel libu2f-host-devel \ libcacard-devel libfdt-devel glusterfs-devel libpmem-devel libslirp-devel libSDL2-devel liburing-devel \ libseccomp-devel libbd_mpath-devel librados-devel usbredir-devel gtk3-devel virglrenderer-devel \ libspice-server-devel spice-protocol-devel libxkbcommon-devel alsa-devel libjack-devel \ libjpeg8-devel libpng16-devel libssh-devel libssh2-devel lzo-devel lzfse-devel libfido2-devel xfsprogs-devel \ snappy-devel brlapi-devel librbd-devel rdma-core-devel libnet-devel libfvde-devel libdmmp-devel multipath-tools-devel \ libcap-devel libcap-ng-devel libpcap-devel parted-devel audit-devel fuse-devel sanlock-devel wireshark-devel scrub \ python3-flake8 libcorosync-devel python3-capng python3-openwsman libwsman_clientpp-devel libattr-devel polkit-devel <br> [https://download.libvirt.org libvirtの公式Webサイト]にアクセスして、ソースコードをダウンロードする。<br> ダウンロードしたファイルを解凍する。<br> tar xf libvirt-<バージョン>.tar.xz cd libvirt-<バージョン> <br> または、Githubからソースコードをダウンロードすることもできる。<br> git clone https://github.com/libvirt/libvirt.git <br> libvirtをビルドおよびインストールする。<br> <u>この時、libvirtの一部のファイルは、/usrディレクトリにインストールされることに注意する。</u> # libvirt 6.7.0以降 (SLES / openSUSE推奨) meson build -Dsystem=false -Ddriver_qemu=enabled --prefix=<libvirtのインストールディレクトリ> ninja -C build ninja -C build install # libvirt 6.7.0以降 (SLED推奨) meson build -Dsystem=true -Ddriver_qemu=enabled --prefix=<libvirtのインストールディレクトリ> ninja -C build sudo ninja -C build install # AppArmorやFirewalld、Polkit等の各種設定ファイルとログファイルを作成するためにスーパーユーザ権限でインストールする # libvirt 6.7.0未満 mkdir build && cd build ../autogen.sh --prefix=<libvirtのインストールディレクトリ> make -j $(nproc) make install <br> libvirtdの実行に必要なライブラリをインストールする。<br> sudo zypper install libwsman3 <br> libvirtのバイナリファイルは/usrディレクトリにインストールされるが、libvirtのインストールディレクトリにrunファイルというヘルパースクリプトがインストールされる。<br> runファイルを実行することにより、libvirtのバイナリファイルを実行することができる。<br> runファイルは、libvirtユーティリティを実行するための環境変数を設定することができる。<br> <br> libvirtのインストールディレクトリにあるrunファイルを実行して、libvirtサービス(libvirtd)を起動する。<br> libvirtサービスのファイルは、/<libvirtのインストールディレクトリ>/etc/libvirtディレクトリに配置されている。<br> runファイルは、ビルドされたバージョンのツールを実行するために使用することができる。<br> sudo ./run src/virtlockd & # バックグラウンドで実行する必要がある sudo ./run src/virtlogd & # バックグラウンドで動作させる必要がある sudo ./run src/libvirtd # ログを見るためにフォアグラウンドで実行するlibvirtdデーモン <br> libvirtdデーモンを起動した後、virshコマンドを使用して仮想マシンを操作することができる。<br> 以下の例では、<code>virsh destroy</code>コマンドを使用して仮想マシンを破壊した後、<code>virsh list --all</code>コマンドを使用して仮想マシンが破壊されたことを確認している。<br> sudo ./run tools/virsh destroy apic_test # 出力例 Domain apic_test destroyed <br> sudo ./run tools/virsh list --all # 出力例 Id Name State ---------------------------- - apic_test shut off <br> ===== Virt-Managerのインストール ===== [https://github.com/virt-manager/virt-manager.git Virt-ManagerのGithub]からソースコードをダウンロードして、ビルドおよびインストールする。<br> Virt-Managerのビルドに必要なライブラリをインストールする。<br> sudo zypper install glib2-devel gtk3-devel gtksourceview-devel \ python3-devel python3-docutils python3-gobject-devel python3-libvirt-python python3-libguestfs \ libosinfo-devel gobject-introspection gobject-introspection-devel libguestfs0 libguestfs-devel gettext <br> Virt-Managerのソースコードをダウンロードする。<br> git clone https://github.com/virt-manager/virt-manager.git <br> 先に特定のインストールディレクトリを作成する必要がある。<br> mkdir -p /<Virt-Managerのインストールディレクトリ>/share/glib-2.0/schemas mkdir -p /<Virt-Managerのインストールディレクトリ>/share/icons/hicolor <br> Virt-Managerをビルドおよびインストールする。<br> meson build -Dprefix=<Virt-Managerのインストールディレクトリ> ninja -C build -j $(nproc) ninja -C build install <br><br> == 仮想ネットワークの設定 == このセクションでは、Br0という名前のブリッジを作成する。<br> まず、以下のコマンドを実行して、ブリッジユーティリティをインストールする。<br> sudo zypper install bridge-utils <br> ===== RHEL ===== 仮想マシンがブリッジ接続できるように、ブリッジネットワークを構成する。<br> ens2のインターフェース名の部分は環境によって異なるため、自身の環境に読み替えること。<br> ブリッジbr0を追加する。 nmcli connection add type bridge autoconnect yes con-name br0 ifname br0 Connection 'br0' (a7fa989a-798e-40ac-acc4-3d1733189b82) successfully added. <br> br0のIPアドレスを設定する。<br> nmcli connection modify br0 ipv4.addresses 10.0.0.30/24 ipv4.method manual <br> br0のゲートウェイを設定する。<br> nmcli connection modify br0 ipv4.gateway 10.0.0.1 <br> br0のDNSを設定する。<br> nmcli connection modify br0 ipv4.dns 10.0.0.1 <br> 既存のインターフェースは一旦削除する。<br> nmcli connection del ens2 <br> br0のメンバーとして再度追加する。<br> nmcli connection add type bridge-slave autoconnect yes con-name ens2 ifname ens2 master br0 <br> RHELを再起動する。<br> sudo systemctl reboot <br> 正常にbr0が起動しているか確認する。<br> ip a <br> ===== SUSE ===== 仮想マシンをブリッジ接続する場合は、NetworkManagerをwickedに変更して、ブリッジネットワークを構成する。<br> sudo mv /etc/sysconfig/network/ifcfg-eth0 /etc/sysconfig/network/ifcfg-br0 sudo vi /etc/sysconfig/network/ifcfg-br0 <br> 以下の内容を、/etc/sysconfig/network/ifcfg-br0ファイルに追記する。<br> # 最終行に追記 BRIDGE='yes' BRIDGE_FORWARDDELAY='0' BRIDGE_PORTS='eth0' BRIDGE_STP='off' <br> 次に、以下の内容を、/etc/sysconfig/network/routesファイルに追記する。<br> sudo vi /etc/sysconfig/network/routes <br> # 最終行:br0のデフォルトゲートウェイを追記する default 192.168.1.1 - br0 <br> wickedサービスを再起動する。<br> sudo systemctl restart wickedd wicked <br> 正常にbr0が起動しているか確認する。<br> ip a <br><br> == 仮想マシンの作成(CLI) == 仮想マシンをインストールして作成する。<br> ここでは、仮想マシンとしてSUSE Linxu Enterprise Server 15(以降、SUSEという)をインストールする。<br> <br> 取得したSUSEのisoファイルを/tmpディレクトリに配置して、テキストモードでインストールする。<br> コンソールからでもPutty等のエミュレータ経由からでも実行できる。<br> 初期設定では、仮想マシンの保管場所(ストレージプール)は、/var/lib/libvirt/imagesディレクトリであるが、ここでは、別の場所に新たにストレージプールを作成して進める。<br> <br> ===== ストレージプールディレクトリの作成 ===== まず、ストレージプールディレクトリを作成する。<br> sudo mkdir -p /var/kvm/images <br> ===== 仮想マシンの作成とインストール ===== sudo virt-install \ --name sle15 \ --ram 4096 \ --disk path=/var/kvm/images/sle15.img,size=30 \ --vcpus 2 \ --os-type linux \ --os-variant sle15 \ --network bridge=br0 \ --graphics none \ --console pty,target_type=serial \ --location /tmp/SLE-15-Installer-DVD-x86_64-GM-DVD1.iso \ --extra-args 'console=ttyS0,115200n8 serial' Starting install... # インストールが開始される <br> 上記の例で指定しているオプションの意味を以下に示す。その他多数のオプションは、<code>man virt-install</code>で確認できる。<br> * --name *: 仮想マシンの名前を指定する。 * --ram *: 仮想マシンのメモリ容量を指定する。(単位は、M) * --disk path=xxx ,size=xxx *: [path=]で仮想マシンのディスクの保管場所を指定する。(初期設定では、/var/lib/libvirt/imagesディレクトリ) *: [size=]で仮想マシンのディスク容量を指定する。(単位は、G) * --vcpus *: 仮想マシンの仮想CPU数を指定する。 * --os-type *: 仮想マシンのOタイプを指定する。 * --os-variant *: 仮想マシンの種類を指定する。 *: <code>osinfo-query os</code>で指定可能な種類を確認できる。 * --network *: 仮想マシンのネットワークタイプを指定する。<br>ここでは、仮想マシンにブリッジ接続させるため、<code>--network bridge=br0</code>としている。<br>br0は、上記セクションの[仮想ネットワークの設定]で設定したブリッジインターフェースを指定している。<br>ホストがNICを複数持っていて、かつ、ブリッジインターフェースを複数設定しており、仮想マシンからも同様に複数のネットワークインターフェースを使用する場合は、改行して複数指定する。 * --graphics *: グラフィクスを指定する。<br><code>none</code>を指定するとグラフィックスを使用しない。 * --console *: コンソールタイプを指定する。 * --location *: インストール元を指定する。 * --extra-args *: インストール時にカーネルに渡すパラメータを指定する。 <br> インストーラ起動後は、CLIでインストール作業を進める。CLIもGUIと同様なのでインストール過程は省略する。<br> インストールが完了すると、一旦再起動がかかり、以下のようにターミナル上に仮想マシンのログインプロンプトが表示される。<br> Welcome to SUSE Linux Enterprise Server 15 (x86_64) - Kernel 4.12.14-25.25-default (ttyS0). eth0: 10.0.0.204 fe80::5054:ff:feff:cfce linux-6am4 login: <br> ===== ホストと仮想マシンの切り替え ===== 仮想マシン側からホスト側へのコンソールの切り替えは、[Ctrl]キー + []]キーである。<br> また、ホスト側から仮想マシン側へのコンソールの切り替えは、<code>virsh console <仮想マシン名>]</code>と入力して実行する。<br> <br> ===== 仮想マシンの複製 ===== 作成した仮想マシンは容易に複製できる。<br> sudo virt-clone --original sle15 --name template --file /var/kvm/images/template.img Allocating 'template.img' | 30 GB 00:00:02 Clone 'template' created successfully. <br> # ディスクイメージ ll /var/kvm/images/template.img -rw------- 1 root root 2835087360 Jan 18 19:09 /var/kvm/images/template.img <br> # 定義ファイル ll /etc/libvirt/qemu/template.xml -rw------- 1 root root 3681 Jan 18 11:09 /etc/libvirt/qemu/template.xml <br><br> == 仮想マシンの作成(GUI) == ここでは、GUIの操作で、仮想マシンを作成およびインストールする。<br> <br> # ターミナルにて<code>sudo virt-manager</code>コマンドを実行して、Virtual Machine Managerを起動する。<br>左上のPCアイコンまたは[ファイル] - [新しい仮想マシンの作成]を選択して、新規仮想マシン作成ウィザードを開く。 # [新しい仮想マシン]画面が開くので、仮想マシンのインストール元を指定する。<br>インストールメディアまたはISOファイルとアーキテクチャを選択して、OSのタイプとバージョンを指定する。 # 仮想マシンのメモリ容量と仮想CPU数を指定する。 # 仮想ディスクの場所や容量を指定する。 # 仮想マシン名を入力する。また、これまでの設定内容を確認しておく。 # インストーラが起動するので、画面に従ってインストールする。 <br> ストレージや光学式ドライブをパススルーする場合、以下の手順に従う。<br> # virt-managerの起動後、仮想マシンのアイコンを右クリックして、[開く]を選択する。 # 画面左下にある[ハードウェアの追加]を選択して、画面左の[ストレージ] - 画面右の[カスタムストレージの選択または作成]項目に、/dev/sdXや/dev/srX等のデバイスファイル名を指定する。 # 画面右下の[完了]ボタンを押下する。 # 自動的にSCSIコマンドのパススルーが行われる。 <br><br> == KVMの操作方法 == Libvirtに含まれるVirshコマンドを使用した仮想マシンの操作方法を記載する。<br> <br> * 仮想マシンを起動する。 sudo virsh start <仮想マシン名> <br> * 仮想マシンを起動して同時にコンソールに接続する。 sudo virsh start <仮想マシン名> --console <br> * 仮想マシンを停止する。 sudo virsh shutdown <仮想マシン名> <br> * 仮想マシンを強制停止 sudo virsh destroy <仮想マシン名> <br> * 仮想マシンの削除 # ゲストOSの定義の削除 sudo virsh undefine <仮想マシン名> # 仮想マシンの定義ファイルの<仮想マシン名>.xmlファイルを確認する sudo ls /etc/libvirt/qemu # 仮想マシンの割り当てディスク(仮想マシンの物理ファイル)を削除する sudo rm -f <仮想マシンの割り当てディスク(仮想マシンの物理ファイル)>.qcow2 <br> * 仮想マシンをシステム起動時に自動起動の設定をする。 sudo virsh autostart <仮想マシン名> <br> * 仮想マシンの自動起動設定を解除する。 sudo virsh autostart --disable <仮想マシン名> <br> * 仮想マシンの一覧を表示する。 sudo virsh list <br> * 全ての仮想マシンを一覧を表示する。<br> sudo virsh list --all <br> * コンソールを切り替える。 *: 仮想マシン側からホスト側へのコンソールの切り替えは、 [Ctrl]キー + []]キーである。 *: ホスト側から仮想マシン側へのコンソールの切り替えは、<code>sudo virsh console <仮想マシン名></code>コマンドを実行する。 <br> * imgファイルをqcow2ファイルに変換する。 sudo qemu-img convert -f raw -O qcow2 <イメージ名>.img <イメージ名>.qcow2 <br> * 他、多くのサブコマンドが用意されている。 sudo virsh --help <br><br> == 仮想マシンのバックアップおよび復元 == ==== 仮想マシンのバックアップ ==== 仮想マシンを停止する。 sudo virsh shutdown <仮想マシン名> <br> 設定ファイルをバックアップする。<br> sudo virsh dumpxml <仮想マシン名> > /<バックアップ先のディレクトリ>/<仮想マシン名>.xml <br> 仮想マシンのイメージをバックアップする。<br> sudo cp -p /<仮想マシンのファイルが存在するディレクトリ>/<仮想マシン名>.qcow2 <バックアップ先のディレクトリ> <br> また、各仮想マシンの定義ファイルは、/etc/libvirt/qemuディレクトリに存在する。<br> その定義ファイルを指定して<code>virsh define</code>コマンドを実行することで、仮想マシンを<code>virsh</code>コマンドで管理できるようになる。<br> sudo virsh define /etc/libvirt/qemu/<仮想マシン名>.xml <br> <u>なお、この定義ファイルは直接編集せず、<code>virsh edit</code>コマンドを使用して編集すること。</u><br> <u>なぜなら、<code>virsh edit</code>コマンドを使用することで、定義ファイルに誤りがあった場合にエラーを出力してくれるので安全である。</u><br> sudo virsh edit <仮想マシン名> # 標準エディタをnanoに変更する場合 sudo EDITOR=nano virsh edit <仮想マシン名> <br> ==== 仮想マシンの復元 ==== バックアップした仮想マシンのイメージを復元する。<br> sudo cp -p /<仮想マシンのイメージをバックアップしたディレクトリ>/<仮想マシン名>.qcow2 <仮想マシンのイメージを保存するディレクトリ> <br> バックアップした設定ファイルを復元する。<br> sudo cp -p /<仮想マシンのイメージをバックアップしたディレクトリ>/<仮想マシン名>.xml /etc/libvirt/qemu <br> 復元した設定ファイルをKVMに反映する。<br> sudo virsh define /etc/libvirt/qemu/<仮想マシン名>.xml <br> バックアップに成功すると、以下のようなメッセージが出力される。<br> ドメイン <仮想マシン名> が /etc/libvirt/qemu/<仮想マシン名>.xml から定義されました <br> 復元されたSUSEを起動する。<br> sudo virsh start <仮想マシン名> <br><br> == KVMを使用した仮想マシンのスナップショット == ===== スナップショットの概要 ===== KVMにおけるスナップショットとは、仮想マシンのある時点の状態を保持する機能である。<br> スナップショットは、一般的なバックアップのように全てのデータを保持せずに、仮想マシン上の変更が発生した時に差分のみを保持する。<br> <br> スナップショットは、仮想マシン本体またはスナップショットファイルのいずれかが破損すると、元の状態に戻すことはできなくなるので、<br> バックアップの代わりとして利用する場合は注意すること。<br> <br> スナップショットの作成手順として、親スナップショット(external)を作成して、それから派生する子スナップショット(internal)を作成する。<br> <br> ===== 親スナップショット(external)の取得 ===== <code>virsh snapshot-create-as</code>コマンドを使用することで、仮想マシンの親スナップショット(external)を取得することができる。<br> スナップショットの取得は、仮想マシンが起動中でも可能である。<br> sudo virsh snapshot-create-as <仮想マシン名> <スナップショット名> "<コメント>" --disk-only --atomic <br> ===== 親スナップショット(external)の復元 ===== 親スナップショットの復元は、<code>virsh snapshot-revert</code>コマンドを使用する。<br> 親スナップショットの復元については、子スナップショット(internal)を取得してから行うこと。<br> sudo virsh snapshot-revert <仮想マシン名> <スナップショット名> <br> ===== 親スナップショット(external)の削除 ===== 親スナップショット(external)を削除する場合は、<code>--metadata</code>オプションを付けることで削除できる。<br> sudo virsh snapshot-delete <仮想マシン名> <親スナップショット名> --metadata <br> ===== 子スナップショット(internal)の取得 ===== 親スナップショット(external)を取得した状態で、以下のコマンドを実行すると、スナップショットを取得することができる。<br> なお、スナップショット名は親スナップショット(external)や他の子スナップショット(internal)と被らないようにすること。<br> sudo virsh snapshot-create-as <仮想マシン名> <子スナップショット名> "<コメント>" <br> ===== 子スナップショット(internal)の復元 ===== 特定のスナップショットに復元するには、<code>virsh snapshot-revert</code>コマンドを使用する。<br> 指定するスナップショットは、子スナップショット(internal)を指定するようにする。<br> sudo virsh snapshot-revert <仮想マシン名> <子スナップショット名> <br> ===== 子スナップショット(internal)の削除 ===== <code>virsh snapshot-delete</code>コマンドを実行することで、スナップショットを削除することができる。<br> sudo virsh snapshot-delete <仮想マシン名> <子スナップショット名> <br> ===== スナップショットの確認 ===== sudo virsh snapshot-list <仮想マシン名> <br> # 出力例 Name Creation Time State ------------------------------------------------------------ SN01_KVM_SUSE 2020-01-01 00:00:00 +0900 shutoff <br> ===== スナップショットのツリー表示 ===== スナップショットの派生関係を確認する場合、<code>--tree</code>オプションを付けることで確認できる。<br> sudo virsh snapshot-list <仮想マシン名> --tree <br> # 出力例 SN01_KVM_SUSE | +- SN02_KVM_SUSE | +- MariaDB_KVM_SUSE +- PostgreSQL_KVM_SUSE <br> ===== 現在の状態が、どのスナップショットからの派生か確認する ===== <code>virsh snapshot-list</code>コマンドに<code>--tree --current</code>オプションを使用することで確認することができる。<br> sudo virsh snapshot-list <仮想マシン名> --tree --current <br> # 出力例 MariaDB_KVM_SUSE <br><br> == QEMUを使用した仮想マシンのスナップショット == このセクションでは、QEMUイメージツールを使用して、QCOW2形式で利用できる高度な機能のいくつかを記載する。<br> Virt-Managerには、QCOW2形式のファイルにおいて、スナップショットの作成等の行う機能は無い。<br> <br> QCOW2形式のファイル(バッキングファイル)に基づくスナップショットを作成と、バッキングファイルへの参照を削除する手順を記載する。<br> <br> ==== 仮想マシンの情報の表示 ==== 仮想マシンのファイルに関するいくつかの基本情報を表示する。<br> ファイルのディスク上のサイズ、参照されているバッキングファイルの名前、使用可能なスナップショットのリストが含まれる。<br> qemu-img info <仮想マシン名またはスナップショット名>.qcow2 <br> ==== 仮想マシンのファイルの作成 ==== 単純なQCOW2形式の仮想マシンのファイルを作成する。<br> このファイルに使用されるディスク容量は比較的小さくなるが、最大ストレージ容量は<ストレージ容量>となる。<br> qemu-img create -f qcow2 <仮想マシン名> <仮想マシンの最大ストレージ容量> 例. qemu-img create -f qcow2 openSUSE_15_3.qcow2 100G <br> ==== バックアップファイルの作成 ==== バッキングファイル(仮想マシンのファイル)に基づくQCOW2形式のバックアップファイルを作成する。<br> バックアップファイルは、バッキングファイルの変更を回避するために、Redirect-on-Writeを使用してバッキングファイルを参照するファイルである。<br> <br> KVM / QEMUにより書き込まれたクラスタは、全てバックアップファイルに書き込まれるため、バッキングファイルは変更されない。<br> <br> バックアップファイルを使用する場合は、KVM / QEMUを使用してバックアップファイルに対して新しい仮想マシンを作成する。<br> <br> <u>バッキングファイルを変更すると、それに基づく全てのバックアップファイルが破損するため注意すること。</u><br> qemu-img create -f qcow2 -b <仮想マシンのファイル名>.qcow2 -l <バックアップファイル名>.qcow2 または qemu-img create -f qcow2 -b <仮想マシンのファイル名>.qcow2 <バックアップファイル名>.qcow2 <br> もし、バッキングファイルを実行する場合は、必ずバックアップファイルを削除すること。<br> また、以下のコマンドを実行することで、バックアップファイルの情報を表示することができる。<br> qemu-img <バックアップファイル名>.qcow2 <br> ==== スナップショットの一覧の表示 ==== 指定された仮想マシンのファイルに存在する全てのスナップショットの一覧を表示する。<br> qemu-img snapshot -l <仮想マシンのファイル名>.qcow2 <br> ==== スナップショットの作成 ==== スナップショットを作成する。<br> QEMUのスナップショットは、スナップショットが作成された時の仮想マシンの状態の簡単な図である。<br> qemu-img snapshot -c <スナップショット名> <仮想マシンのファイル名>.qcow2 <br> ==== スナップショットの復元 ==== スナップショットを適用する。<br> スナップショットが作成された時に保存されたクラスタを単純に復元するため、仮想マシンをその時点の状態に戻すことができる。<br> qemu-img snapshot -a <スナップショット名> <仮想マシンのファイル名>.qcow2 <br> ==== スナップショットの削除 ==== 指定された仮想マシンのファイルから各スナップショットを削除する。<br> スナップショットはファイルサイズが大きいため、ディスク領域を大きく消費する可能性がある。<br> このコマンドは、仮想マシンのファイルに割り当てたディスク領域ではなく、関連するクラスタを解放する。<br> qemu-img snapshot -d <スナップショット名> <仮想マシンのファイル名>.qcow2 <br> ==== 仮想マシンのファイルの変換 ==== 同じQCOW2形式との間で変換する場合、仮想マシンのファイルの現在の状態のみを出力ファイルにコピーする。<br> 出力ファイルには、参照されたバッキングファイルの全てのクラスタが含まれる。ただし、スナップショットの情報はコピーされない。<br> この変換は、バッキングファイルへの参照なしで、スタンドアロンイメージを作成する効果がある。<br> <br> <code>-p</code>オプションは、コピー操作中に進行状況情報を表示する。(変換 / コピーは時間が掛かるため、<code>-p</code>オプションを使用する)<br> qemu-img convert -p -f qcow2 <変換元の仮想マシンのファイル名>.qcow2 -O qcow2 <変換後の仮想マシンのファイル名>.qcow2 <br> ==== 一時的なスナップショット ==== QEMUは一時的なスナップショットもサポートしており、ユーザは個別のQCOW2形式のファイルを明示的に作成する必要はない。<br> <br> <code>-snapshot</code>オプションを使用すると、実行中に仮想マシンに加えられた変更は、<br> 全て一時ファイルに書き込まれて、仮想マシンがオフになると自動的に破棄される。<br> この時、仮想マシンのファイルへの変更は保存されない。<br> qemu -hda <仮想マシンのファイル名>.qcow2 -snapshot <br><br> == 仮想マシンの保存先の変更 == 別のHDD / SSDに仮想マシンを配置する場合、初期設定ではアクセス権限エラーになる。<br> そこで、/etc/libvirt/qemu.confファイルに以下の設定を追記する。<br> # /etc/libvirt/qemu.confファイル ・ ・ ・ user = "root" group = "root" <br> また、別のHDD / SSDに仮想マシンを配置する時は、配置先のディレクトリで以下のコマンドを実行する。<br> 以下では、<仮想マシン名>.qcow2ファイルを最大100[GB]の領域で仮想マシンを作成している。<br> qemu-img create -f qcow2 <仮想マシン名>.qcow2 100G <br> QXLを使用する場合、VRAMの容量が足りない時は、以下の設定を記述する。<br> <video> <model type='qxl' ram='65536' vram='65536' vgamem='65536' heads='1' primary='yes'/> </video> <br><br> == 仮想マシンに割り当てるIPアドレス == 存在するKVMのネットワーク名を確認する。<br> sudo virsh net-list <br> IPアドレスの変更を行うため、KVMのネットワークを編集する。<br> sudo virsh net-edit <KVMのネットワーク名> 例. sudo virsh net-edit default <br> <syntaxhighlight lang="xml"> <network> <!-- ...略 --> <ip address='192.168.xxx.1' netmask='255.255.255.0'> <dhcp> <range start='192.168.xxx.2' end='192.168.xxx.254'/> </dhcp> </ip> </network> </syntaxhighlight> <br><br> == エラー時の対処方法 == ==== QEMUのアクセス権限の付与 ==== 別のHDD / SSDに仮想マシンを配置する場合、初期設定ではアクセス権限エラーになる。<br> そこで、/etc/libvirt/qemu.confファイルに以下の設定を追記する。<br> sudo vi /etc/libvirt/qemu.conf <br> # /etc/libvirt/qemu.confファイル ・ ・ ・ user = "root" group = "root" <br> また、別のHDD / SSDに仮想マシンを配置する時は、配置先のディレクトリで以下のコマンドを実行する。<br> 以下では、<仮想マシン名>.qcow2ファイルを最大100[GB]の領域で仮想マシンを作成している。<br> qemu-img create -f qcow2 <仮想マシン名>.qcow2 100G <br> ==== ネットワーク ==== VM起動時に下記のエラーが出力されて、VMが起動できないことがある。<br> ERROR Requested operation is not valid: network 'default' is not active <br> まず、以下のコマンドを実行する。<br> この時、以下のメッセージが出力された場合は、<code>sudo virsh net-start default</code>を実行する。<br> 今後、このネットワークを自動起動するには、<code>sudo virsh net-autostart --network default</code>を実行する。<br> # 実行 sudo virsh net-list --all # 出力 名前 状態 自動起動 永続 ------------------------------------------------ default 停止状態 いいえ (no) はい (yes) <br> また、以下のようにネットワークが表示されない場合がある。<br> Name State Autostart Persistent ---------------------------------------------------------- <br> その時は、/run/libvirt/network/default.xmlファイルを作成して、以下に示す内容を記述する。(デフォルトネットワークを作成する)<br> <br> # /run/libvirt/network/default.xmlファイル <networkstatus> <class_id bitmap='0-2'/> <floor sum='0'/> <network> <name>default</name> <uuid>e8a9f86b-1c3a-4fa5-ab03-1fb563b12b84</uuid> <forward mode='nat'> <nat> <port start='1024' end='65535'/> </nat> </forward> <bridge name='virbr0' stp='on' delay='0'/> <mac address='52:54:00:a3:0d:b0'/> <ip address='192.168.122.1' netmask='255.255.255.0'> <dhcp> <range start='192.168.122.2' end='192.168.122.254'/> </dhcp> </ip> </network> </networkstatus> <br> 次に、そのネットワークをKVMホストに永続的に追加するには、以下のコマンドを実行する。<br> sudo virsh net-define --file default.xml <br> ===== ファイアーウォール ===== VM起動時に下記のエラーが出力されて、VMが起動できないことがある。<br> error: Failed to start network default error: internal error: Failed to initialize a valid firewall backend <br> この時、ファイアーウォールサービスをインストールする。<br> sudo zypper install firewalld <br> サービスを有効にして、ネットワークを再び機能させるために、次のコマンドを実行する。<br> sudo systemctl enable --now firewalld sudo systemctl restart libvirtd <br> ==== DNSマスカレード ==== VM起動時に下記のエラーが出力されて、VMが起動できないことがある。<br> error: Failed to start network default error: Cannot check dnsmasq binary /usr/sbin/dnsmasq: No such file or directory <br> この時、DNSマスカレードをインストールする。<br> sudo zypper install dnsmasq <br> ==== ホストOSのスリープ / ハイバネート ==== ゲストOSの起動中にホストOSのスリープ / ハイバネートを実行する場合、ホストOSがロックアップするバグが存在する。<br> <br> VFIOを有効にしたゲストOSは、スリープ / ウェイクアップサイクルを通して実行したままにすると不安定になる傾向があり、<br> シャットダウンを実行する時、ホストOSがロックアップすることが知られている。<br> <br> ===== 方法 1 ===== これを回避する方法は、libvirtフックスクリプトとsystemdユニットを使用して、<br> ゲストOSの実行中にホストOSがスリープ状態になることを防ぐ。<br> <br> また、libvirtフックスクリプトを実行するためには、実行可能なパーミッションが必要である。<br> sudo vi /etc/libvirt/hooks/qemu <br> <syntaxhighlight lang="sh"> # libvirtフックスクリプト #!/bin/bash OBJECT="$1" OPERATION="$2" SUBOPERATION="$3" EXTRA_ARG="$4" case "$OPERATION" in "prepare") systemctl start libvirt-nosleep ;; "release") systemctl stop libvirt-nosleep ;; esac </syntaxhighlight> <br> スリープ / ハイバネートを無効化するデーモンを作成する。<br> sudo vi /usr/lib/systemd/system/libvirt-nosleep.service <br> # /usr/lib/systemd/system/libvirt-nosleep.serviceファイル [Unit] Description=Preventing sleep while libvirt domain "%i" is running [Service] Type=simple ExecStart=/usr/bin/systemd-inhibit --what=sleep --why="Libvirt domain \"%i\" is running" --who=%U --mode=block sleep infinity <br> 上記のデーモンのシンボリックリンクを/etc/systemd/systemディレクトリに張る。<br> sudo ln -s /usr/lib/systemd/system/libvirt-nosleep.service /etc/systemd/system/ <br> 上記で作成したデーモンを有効にする。<br> sudo systemctl daemon-reload <br> 上記で作成したデーモンを開始する。<br> sudo systemctl start libvirt-nosleep.service <br> 上記で作成したデーモンを停止する。<br> sudo systemctl stop libvirt-nosleep.service <br> ゲストOSを起動して、スリープが抑制されているかどうかを確認する。<br> systemd-inhibit --list <br> ===== 方法 2 (推奨) ===== 同様に、libvirtフックスクリプトとシェルスクリプトを使用して、ゲストOSの実行中にホストOSがスリープ状態になることを防ぐ方法もある。<br> <br> libvirtフックから呼び出す場合、仮想マシンが起動する瞬間に呼び出されるため、確実に仮想マシンが起動し終わるまで待機することが可能である。<br> sudo vi /usr/local/bin/libvirt-inhibit-sleep.sh <br> <syntaxhighlight lang="sh"> # /usr/local/bin/libvirt-inhibit-sleep.shファイル #!/bin/bash # KVMドメインの実行中にスリープを抑制するスクリプト(フック用) # 引数として仮想マシン名を受け取る DOMAIN="$1" # 引数が指定されていない場合はエラー if [ -z "$DOMAIN" ]; then echo "Error: No domain name specified" >&2 exit 1 fi # ログファイルの設定(デバッグ用) LOG_FILE="/var/log/libvirt/hooks/nosleep-${DOMAIN}.log" mkdir -p /var/log/libvirt/hooks # ログ関数 log_message() { echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" >> "$LOG_FILE" } log_message "Sleep inhibit started for domain: $DOMAIN" # 仮想マシンが完全に起動するまで少し待機 # フックはVMの起動処理の初期段階で呼ばれるため sleep 5 # 指定されたドメインが存在するか確認 if ! virsh dominfo "$DOMAIN" &>/dev/null; then log_message "Error: Domain '$DOMAIN' does not exist" exit 1 fi # スリープを抑制しながら、ドメインの状態を監視 # ドメインが停止したら、このコマンド全体が終了する log_message "Starting systemd-inhibit for domain: $DOMAIN" systemd-inhibit --what=sleep \ --why="Libvirt domain $DOMAIN is running" \ --who="libvirt-hook" \ --mode=block \ /bin/bash -c " while virsh domstate '$DOMAIN' 2>/dev/null | grep -q 'running'; do sleep 60 done " log_message "Domain '$DOMAIN' has stopped, releasing sleep inhibit" exit 0 </syntaxhighlight> <br> このシェルスクリプトに実行権限を付加する。<br> sudo chmod u+x /usr/local/bin/libvirt-inhibit-sleep.sh <br> 次に、libvirtフックスクリプトを作成する。<br> libvirtフックスクリプトは、libvirtは仮想マシンの状態が変わるたびに、このスクリプトを呼び出す。<br> その時、仮想マシンの名前、何が起きたか (start, stopped等)、それがbegin (開始) なのか end (終了) なのかという情報を引数として渡す。<br> libvirtフックスクリプトは、「仮想マシンが起動を開始した」というイベント (started / begin) を検知すると、libvirt-inhibit-sleep.shをバックグラウンドで起動する。<br> <br> フックスクリプト自体は短時間で終了する必要があるため、nohupコマンドを使用する。<br> スリープ抑制は長時間実行され続ける必要があるため、バックグラウンドプロセスとして独立させる。<br> <br> sudo vi /etc/libvirt/hooks/qemu <br> <syntaxhighlight lang="sh"> # /etc/libvirt/hooks/qemuファイル #!/bin/bash # Libvirt QEMU hook script # 仮想マシンの起動・停止時にスリープ抑制を制御する # このスクリプトは以下の引数で呼ばれます: # $1 = 仮想マシン名(guest name) # $2 = 動作(operation): start, stopped, など # $3 = サブ動作(sub-operation): begin, end # $4 = 追加引数(あれば) GUEST_NAME="$1" OPERATION="$2" SUB_OPERATION="$3" # ログファイルの設定 HOOK_LOG="/var/log/libvirt/hooks/qemu-hook.log" mkdir -p /var/log/libvirt/hooks # ログ関数 log_message() { echo "$(date '+%Y-%m-%d %H:%M:%S') - $GUEST_NAME - $OPERATION/$SUB_OPERATION - $1" >> "$HOOK_LOG" } log_message "Hook called" # 仮想マシンが起動した時 if [ "$OPERATION" = "started" ] && [ "$SUB_OPERATION" = "begin" ]; then log_message "VM starting, launching sleep inhibit script" # スリープ抑制スクリプトをバックグラウンドで実行 # nohupを使用して、このフックスクリプトが終了しても継続実行させる nohup /usr/local/bin/libvirt-inhibit-sleep.sh "$GUEST_NAME" >> /var/log/libvirt/hooks/nosleep-${GUEST_NAME}.log 2>&1 & # プロセスIDをファイルに保存(将来的な管理用) echo $! > "/var/run/libvirt-nosleep-${GUEST_NAME}.pid" log_message "Sleep inhibit script launched with PID: $!" fi # 仮想マシンが停止した時 # スリープ抑制スクリプトは自動的に終了するはずだが、念のため確認 if [ "$OPERATION" = "stopped" ] && [ "$SUB_OPERATION" = "end" ]; then log_message "VM stopped" # PIDファイルが存在すれば削除 if [ -f "/var/run/libvirt-nosleep-${GUEST_NAME}.pid" ]; then rm -f "/var/run/libvirt-nosleep-${GUEST_NAME}.pid" log_message "Cleaned up PID file" fi fi exit 0 </syntaxhighlight> <br> ログファイルを配置するディレクトリを作成する。<br> sudo mkdir -p /var/log/libvirt/hooks <br> ゲストOSを起動して、スリープが抑制されているかどうかを確認する。<br> systemd-inhibit --list <br><br> == 各ゲストOSのインストール == ==== Windows 11 ==== TPM 2.0を有効にするために、SWTPMをインストールする。<br> * パッケージ管理システムからインストールする場合 *: <code>sudo zypper install swtpm</code> *: <br> * ソースコードからインストールする場合 *: まず、SWTPMのビルドに必要な依存関係のライブラリをインストールする。 *: <code>sudo zypper install automake autoconf bash coreutils expect expect-devel libtool sed libtpms0 libtpms-devel \</code> *: <code>fuse fuse-devel libglib-2_0-0 glib2-devel json-glib-devel net-tools net-tools-deprecated python3 python3-Twisted \</code> *: <code>libselinux-devel socat trousers trousers-devel gnutls libgnutls-devel libtasn1 libtasn1-6 libtasn1-devel libseccomp-devel libunistring-devel</code> *: <br> *: 次に、SWTPMのGithubからソースコードをダウンロードする。 *: <code>wget https://github.com/stefanberger/swtpm/archive/refs/tags/<バージョン>.tar.gz</code> *: または *: <code>git clone https://github.com/stefanberger/swtpm.git</code> *: <br> *: ダウンロードしたファイルを解凍して、ビルドディレクトリを作成する。 *: <code>tar xf swtpm-<バージョン>.tar.gz</code> *: <code>cd swtpm-<バージョン> && mkdir build && cd build</code> *: <br> *: tssグループとそのユーザを作成する必要がある。 *: <code>sudo zypper install system-user-tss</code> *: SWTPMをビルドおよびインストールする。 *: <code>../autogen.sh --prefix=<SWTPMのインストールディレクトリ> --libdir=/<SWTPMのインストールディレクトリ>/lib64 \</code> *: <code>--with-openssl --with-tss-user=root --with-tss-group=tss # tcsdはファイルを通常ユーザ/通常グループまたはroot/tssにする必要がある</code> *: または *: <code>../autogen.sh --prefix=<SWTPMのインストールディレクトリ> --libdir=/<SWTPMのインストールディレクトリ>/lib64 \</code> *: <code>--with-openssl --with-tss-user=$USER --with-tss-group=<$USERが所属しているグループ名> # tcsdはファイルを通常ユーザ/通常グループまたはroot/tssにする必要がある</code> *: <br> *: <code>make -j $(nproc)</code> *: <code>make check -j $(nproc)</code> # 実行は任意である *: <code>make install</code> *: <br> *: ~/.profileファイル等に環境変数PATHおよびLD_LIBRARY_PATHを追記する。 *: <code># ~/.profileファイル</code> *: <code>export PATH="<SWTPMのインストールディレクトリ>/bin:$PATH"</code> *: <code>export LD_LIBRARY_PATH="<SWTPMのインストールディレクトリ>/lib64:$LD_LIBRARY_PATH"</code> <br> Virt-ManagerでTPM 2.0を追加する時、XMLファイルは以下のように設定される。<br> <syntaxhighlight lang="xml"> ... 略 <devices> <tpm model='tpm-tis'> <backend type='emulator' version='2.0'/> </tpm> </devices> ...略 </syntaxhighlight> <br> ==== openSUSE ==== openSUSEをインストールする場合、KMSが有効化されていると、udevの確認でインストーラがフリーズする。<br> <br> 回避方法は、openSUSEのインストール画面において、[F3]キーを押下する。<br> カーネルパラメータエントリにnomodesetと入力して、KMSを無効にする。<br> <br> * QXLを使用する場合 *# openSUSEのインストールが完了した後、YaSTを起動して、ブートローダの設定にあるnomodesetの記述を削除する。<br> *# 次に、以下のコマンドを実行して、QXLをロードする。<br> *#: <code>sudo modprobe qxl modeset=1</code> *# initrdを再構築するために、以下のコマンドを実行する。<br> *#: <code>sudo dracut -f /boot/initrd $(uname -r)</code> * GPUパススルーを使用する場合 *# ホストOSがSUSEの場合、ホストのブートローダの設定に<code>pci=noaer</code>を記述する。(<u>'''不要の可能性がある'''</u>) *# ゲストOSのopenSUSEのインストールが完了した後、YaSTを起動して、ブートローダの設定にあるnomodesetの記述を確認する。<br><u>GPUパススルーを使用する場合、<code>nomodeset</code>の記述は削除しない。</u> *# もし、ブートローダの設定において、<code>nomodeset</code>の記述が削除されている場合、<code>nomodeset</code>を追記する。 <br><br> {{#seo: |title={{PAGENAME}} : Exploring Electronics and SUSE Linux | MochiuWiki |keywords=MochiuWiki,Mochiu,Wiki,Mochiu Wiki,Electric Circuit,Electric,pcb,Mathematics,AVR,TI,STMicro,AVR,ATmega,MSP430,STM,Arduino,Xilinx,FPGA,Verilog,HDL,PinePhone,Pine Phone,Raspberry,Raspberry Pi,C,C++,C#,Qt,Qml,MFC,Shell,Bash,Zsh,Fish,SUSE,SLE,Suse Enterprise,Suse Linux,openSUSE,open SUSE,Leap,Linux,uCLnux,Podman,電気回路,電子回路,基板,プリント基板 |description={{PAGENAME}} - 電子回路とSUSE Linuxに関する情報 | This page is {{PAGENAME}} in our wiki about electronic circuits and SUSE Linux |image=/resources/assets/MochiuLogo_Single_Blue.png }} __FORCETOC__ [[カテゴリ:RHEL]][[カテゴリ:SUSE]]
インストール - KVM
に戻る。
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
ツール
リンク元
関連ページの更新状況
特別ページ
ページ情報
We ask for
Donations
Collapse