📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)

 
(同じ利用者による、間の78版が非表示)
5行目: 5行目:


== KVMとQEMUのインストール ==
== KVMとQEMUのインストール ==
==== パッケージ管理システムからインストール ====
KVMとQEMUをインストールする。<br>
KVMとQEMUをインストールする。<br>
  # CentOS
  # RHEL
  sudo yum install qemu-kvm libvirt virt-install virt-manager
  sudo dnf install qemu-kvm libvirt virt-install virt-manager
   
   
  # SUSE
  # SUSE
35行目: 36行目:
必要であれば、libvirtグループにユーザがアクセスできるように設定する。<br>
必要であれば、libvirtグループにユーザがアクセスできるように設定する。<br>
  sudo usermod -aG libvirt $USER
  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>
<br><br>


42行目: 382行目:
  sudo zypper install bridge-utils
  sudo zypper install bridge-utils
<br>
<br>
===== CentOS =====
===== RHEL =====
仮想マシンがブリッジ接続できるように、ブリッジネットワークを構成する。<br>
仮想マシンがブリッジ接続できるように、ブリッジネットワークを構成する。<br>
ens2のインターフェース名の部分は環境によって異なるため、自身の環境に読み替えること。<br>
ens2のインターフェース名の部分は環境によって異なるため、自身の環境に読み替えること。<br>
65行目: 405行目:
  nmcli connection add type bridge-slave autoconnect yes con-name ens2 ifname ens2 master br0
  nmcli connection add type bridge-slave autoconnect yes con-name ens2 ifname ens2 master br0
<br>
<br>
CentOSを再起動する。<br>
RHELを再起動する。<br>
  reboot
  sudo systemctl reboot
<br>
<br>
正常にbr0が起動しているか確認する。<br>
正常にbr0が起動しているか確認する。<br>
189行目: 529行目:
# 仮想マシン名を入力する。また、これまでの設定内容を確認しておく。
# 仮想マシン名を入力する。また、これまでの設定内容を確認しておく。
# インストーラが起動するので、画面に従ってインストールする。
# インストーラが起動するので、画面に従ってインストールする。
<br>
ストレージや光学式ドライブをパススルーする場合、以下の手順に従う。<br>
# virt-managerの起動後、仮想マシンのアイコンを右クリックして、[開く]を選択する。
# 画面左下にある[ハードウェアの追加]を選択して、画面左の[ストレージ] - 画面右の[カスタムストレージの選択または作成]項目に、/dev/sdXや/dev/srX等のデバイスファイル名を指定する。
# 画面右下の[完了]ボタンを押下する。
# 自動的にSCSIコマンドのパススルーが行われる。
<br><br>
<br><br>


201行目: 547行目:
<br>
<br>
* 仮想マシンを停止する。
* 仮想マシンを停止する。
  sudo virsh shutdown sle15
  sudo virsh shutdown <仮想マシン名>
<br>
<br>
* 仮想マシンを強制停止
* 仮想マシンを強制停止
  sudo virsh destroy sle15
  sudo virsh destroy <仮想マシン名>
<br>
* 仮想マシンの削除
# ゲストOSの定義の削除
sudo virsh undefine <仮想マシン名>
# 仮想マシンの定義ファイルの<仮想マシン名>.xmlファイルを確認する
sudo ls /etc/libvirt/qemu
# 仮想マシンの割り当てディスク(仮想マシンの物理ファイル)を削除する
sudo rm -f <仮想マシンの割り当てディスク(仮想マシンの物理ファイル)>.qcow2
<br>
<br>
* 仮想マシンをシステム起動時に自動起動の設定をする。
* 仮想マシンをシステム起動時に自動起動の設定をする。
  sudo virsh autostart sle15
  sudo virsh autostart <仮想マシン名>
<br>
<br>
* 仮想マシンの自動起動設定を解除する。
* 仮想マシンの自動起動設定を解除する。
  sudo virsh autostart --disable sle15
  sudo virsh autostart --disable <仮想マシン名>
<br>
<br>
* 仮想マシンの一覧を表示する。
* 仮想マシンの一覧を表示する。
230行目: 586行目:


== 仮想マシンのバックアップおよび復元 ==
== 仮想マシンのバックアップおよび復元 ==
ここでは、仮想マシンが以下の情報に基づいているとする。<br>
==== 仮想マシンのバックアップ ====
ドメイン名(仮想マシン名) : SUSE15
イメージ名 : SUSE15.qcow2
設定ファイル(XML) : SUSE15.xml
バックアップ先 : /run/media/Storage1 (外付けSSD)
<br>
===== 仮想マシンのバックアップ =====
仮想マシンを停止する。
仮想マシンを停止する。
  sudo virsh shutdown SUSE15
  sudo virsh shutdown <仮想マシン名>
<br>
<br>
設定ファイルをバックアップする。<br>
設定ファイルをバックアップする。<br>
  sudo virsh dumpxml SUSE15 > /<バックアップを保存するディレクトリ>/SUSE15.xml
  sudo virsh dumpxml <仮想マシン名> > /<バックアップ先のディレクトリ>/<仮想マシン名>.xml
<br>
<br>
仮想マシンのイメージをバックアップする。<br>
仮想マシンのイメージをバックアップする。<br>
  sudo cp -p <仮想マシンのイメージがあるディレクトリ>/SUSE.qcow2 /<バックアップを保存するディレクトリ>/.
  sudo cp -p /<仮想マシンのファイルが存在するディレクトリ>/<仮想マシン名>.qcow2 <バックアップ先のディレクトリ>
<br>
<br>
また、各仮想マシンの定義ファイルは、/etc/libvirt/qemuディレクトリに存在する。<br>
また、各仮想マシンの定義ファイルは、/etc/libvirt/qemuディレクトリに存在する。<br>
252行目: 602行目:
<u>なお、この定義ファイルは直接編集せず、<code>virsh edit</code>コマンドを使用して編集すること。</u><br>
<u>なお、この定義ファイルは直接編集せず、<code>virsh edit</code>コマンドを使用して編集すること。</u><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>


===== 仮想マシンの復元=====
==== 仮想マシンの復元 ====
運用しているSSDとは別のSSDで復元する。<br>
ここでは、外付けSSDを/run/media/Storage1にマウントしている。<br>
<br>
バックアップした仮想マシンのイメージを復元する。<br>
バックアップした仮想マシンのイメージを復元する。<br>
  sudo cp -p <仮想マシンのイメージをバックアップしたディレクトリ>/SUSE.qcow2 <仮想マシンのイメージを保存するディレクトリ>/.
  sudo cp -p /<仮想マシンのイメージをバックアップしたディレクトリ>/<仮想マシン名>.qcow2 <仮想マシンのイメージを保存するディレクトリ>
<br>
<br>
バックアップした設定ファイルを復元する。<br>
バックアップした設定ファイルを復元する。<br>
  sudo cp -p /run/media/Storage1/SUSE15.xml /etc/libvirt/qemu/.
  sudo cp -p /<仮想マシンのイメージをバックアップしたディレクトリ>/<仮想マシン名>.xml /etc/libvirt/qemu
<br>
<br>
復元した設定ファイルをKVMに反映する。<br>
復元した設定ファイルをKVMに反映する。<br>
  sudo virsh define /etc/libvirt/qemu/SUSE15.xml
  sudo virsh define /etc/libvirt/qemu/<仮想マシン名>.xml
<br>
<br>
バックアップに成功すると、以下のようなメッセージが出力される。<br>
バックアップに成功すると、以下のようなメッセージが出力される。<br>
  ドメイン SUSE が /etc/libvirt/qemu/SUSE15.xml から定義されました
  ドメイン <仮想マシン名> が /etc/libvirt/qemu/<仮想マシン名>.xml から定義されました
<br>  
<br>  
復元されたSUSEを起動する。<br>
復元されたSUSEを起動する。<br>
  sudo virsh start SUSE15
  sudo virsh start <仮想マシン名>
<br><br>
<br><br>


355行目: 706行目:
このファイルに使用されるディスク容量は比較的小さくなるが、最大ストレージ容量は<ストレージ容量>となる。<br>
このファイルに使用されるディスク容量は比較的小さくなるが、最大ストレージ容量は<ストレージ容量>となる。<br>
  qemu-img create -f qcow2 <仮想マシン名> <仮想マシンの最大ストレージ容量>
  qemu-img create -f qcow2 <仮想マシン名> <仮想マシンの最大ストレージ容量>
例.
qemu-img create -f qcow2 openSUSE_15_3.qcow2 100G
<br>
<br>
==== バックアップファイルの作成 ====
==== バックアップファイルの作成 ====
バッキングファイル(仮想マシンのファイル)に基づくQCOW2形式のバックアップファイルを作成する。<br>
バッキングファイル(仮想マシンのファイル)に基づくQCOW2形式のバックアップファイルを作成する。<br>
410行目: 765行目:
<br><br>
<br><br>


== 注意事項 ==
== 仮想マシンの保存先の変更 ==
別のHDD / SSDに仮想マシンを配置する場合、初期設定ではアクセス権限エラーになる。<br>
別のHDD / SSDに仮想マシンを配置する場合、初期設定ではアクセス権限エラーになる。<br>
そこで、/etc/libvirt/qemu.confファイルに以下の設定を追記する。<br>
そこで、/etc/libvirt/qemu.confファイルに以下の設定を追記する。<br>
428行目: 783行目:
   <model type='qxl' ram='65536' vram='65536' vgamem='65536' heads='1' primary='yes'/>
   <model type='qxl' ram='65536' vram='65536' vgamem='65536' heads='1' primary='yes'/>
  </video>
  </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>
<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>
VM起動時に下記のエラーが出力されて、VMが起動できないことがある。<br>
505行目: 899行目:
シャットダウンを実行する時、ホストOSがロックアップすることが知られている。<br>
シャットダウンを実行する時、ホストOSがロックアップすることが知られている。<br>
<br>
<br>
===== 方法 1 =====
これを回避する方法は、libvirtフックスクリプトとsystemdユニットを使用して、<br>
これを回避する方法は、libvirtフックスクリプトとsystemdユニットを使用して、<br>
ゲストOSの実行中にホストOSがスリープ状態になることを防ぐ。<br>
ゲストOSの実行中にホストOSがスリープ状態になることを防ぐ。<br>
548行目: 943行目:
上記で作成したデーモンを有効にする。<br>
上記で作成したデーモンを有効にする。<br>
  sudo systemctl daemon-reload
  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>
<br><br>


== 各ゲストOSのインストール ==
== 各ゲスト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 ====
openSUSEをインストールする場合、KMSが有効化されていると、udevの確認でインストーラがフリーズする。<br>
openSUSEをインストールする場合、KMSが有効化されていると、udevの確認でインストーラがフリーズする。<br>
564行目: 1,156行目:
*#: <code>sudo dracut -f /boot/initrd $(uname -r)</code>
*#: <code>sudo dracut -f /boot/initrd $(uname -r)</code>
* GPUパススルーを使用する場合
* GPUパススルーを使用する場合
*# ホストOSがSUSEの場合、ブートローダの設定に<code>pci=noaer</code>を記述する。
*# ホストOSがSUSEの場合、ホストのブートローダの設定に<code>pci=noaer</code>を記述する。(<u>'''不要の可能性がある'''</u>)
*# openSUSEのインストールが完了した後、YaSTを起動して、ブートローダの設定にあるnomodesetの記述を確認する。<br><u>GPUパススルーを使用する場合、<code>nomodeset</code>の記述は削除しない。</u>
*# ゲストOSのopenSUSEのインストールが完了した後、YaSTを起動して、ブートローダの設定にあるnomodesetの記述を確認する。<br><u>GPUパススルーを使用する場合、<code>nomodeset</code>の記述は削除しない。</u>
*# もし、ブートローダの設定において、<code>nomodeset</code>の記述が削除されている場合、<code>nomodeset</code>を追記する。
*# もし、ブートローダの設定において、<code>nomodeset</code>の記述が削除されている場合、<code>nomodeset</code>を追記する。
<br><br>
<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__
__FORCETOC__
[[カテゴリ:CentOS]][[カテゴリ:SUSE]]
[[カテゴリ:RHEL]][[カテゴリ:SUSE]]