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

 
(同じ利用者による、間の40版が非表示)
7行目: 7行目:
==== パッケージ管理システムからインストール ====
==== パッケージ管理システムからインストール ====
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
37行目: 37行目:
  sudo usermod -aG libvirt $USER
  sudo usermod -aG libvirt $USER
<br>
<br>
==== ソースコードからインストール ====
==== ソースコードからインストール ====
===== GNU TLS 3.6.14以降のインストール =====
===== GNU TLSのインストール =====
パッケージ管理システムのGNU TLSのバージョンが3.6.14未満の場合は、GNU TLSのソースコードをビルドしてインストールする。<br>
パッケージ管理システムのGNU TLSのバージョンが3.6.14未満の場合は、GNU TLSのソースコードをビルドしてインストールする。<br>
<u>また、GNU TLS 3.6.14(2022/4現在の最新)のビルドでは、Nettle 3.4.1が必要となることに注意する。</u><br>
<u>GNU TLS 3.6.14 (2022/4 現在の最新) のビルドでは、Nettle 3.4.1が必要となることに注意する。</u><br>
<br>
<br>
GNU TLSのビルドに必要なライブラリをインストールする。<br>
GNU TLSのビルドに必要なライブラリをインストールする。<br>
  sudo zypper install libtasn1-devel libunistring-devel unbound-devel p11-kit-devel gmp-devel libnettle-devel
  sudo zypper install libtasn1-devel libunistring-devel unbound-devel p11-kit-devel libidn2-devel trousers-devel \
                    gmp-devel libnettle-devel # GMP, Nettleをパッケージ管理システムからインストールする場合
<br>
<br>
GNU TLSのソースコードをダウンロードする。<br>
GNU TLSのソースコードをダウンロードする。<br>
54行目: 56行目:
*: https://gnutls.org/download.html
*: https://gnutls.org/download.html
<br>
<br>
ビルドディレクトリを作成して、GMP、Nettle、GNU TLSをビルドおよびインストールする。<br>
GMP、Nettle、GNU TLSをビルドおよびインストールする。<br>
  # GMP (パッケージ管理システムにあるGMPが古い場合)
  # GMPのインストール (パッケージ管理システムにあるGMPのバージョンが古い場合)
  ../configure --prefix=<Nettle、GMP、GNU TLSのインストールディレクトリ>
  ../configure --prefix=<GMP、Nettle、GNU TLSのインストールディレクトリ>
  make -j $(nproc)
  make -j $(nproc)
  make install
  make install
   
   
  # Nettle (パッケージ管理システムにあるNettleが古い場合)
  # Nettleのインストール (パッケージ管理システムにあるNettleのバージョンが古い場合)
  ../configure --prefix=<Nettle、GMP、GNU TLSのインストールディレクトリ> --enable-openssl --enable-x86-aesni --enable-x86-sha-ni --enable-x86-pclmul
  ../configure --prefix=<GMP、Nettle、GNU TLSのインストールディレクトリ> \
              --enable-openssl   \
              --enable-x86-aesni \
              --enable-x86-sha-ni \
              --enable-x86-pclmul
  make -j $(nproc)
  make -j $(nproc)
  make install
  make install
   
   
  # GNU TLS
  # GNU TLSのインストール
  ../configure --prefix=<Nettle、GMP、GNU TLSのインストールディレクトリ> --enable-shared
  ../configure --prefix=<GMP、Nettle、GNU TLSのインストールディレクトリ> \
              --enable-shared
  make -j $(nproc)
  make -j $(nproc)
  make install
  make install
73行目: 80行目:
  vi ~/.profile
  vi ~/.profile
<br>
<br>
<syntaxhighlight lang="sh">
  # ~/.profileファイル
  # ~/.profileファイル
   
   
  export PATH="<Nettle、GMP、GNU TLSのインストールディレクトリ>/bin:$PATH"
  export PATH="<GMP、Nettle、GNU TLSのインストールディレクトリ>/bin:$PATH"
  export LD_LIBRARY_PATH="<Nettle、GMP、GNU TLSのインストールディレクトリ>/lib64:$LD_LIBRARY_PATH"
  export LD_LIBRARY_PATH="<GMP、Nettle、GNU TLSのインストールディレクトリ>/lib64:$LD_LIBRARY_PATH"
  export PKG_CONFIG_PATH="<Nettle、GMP、GNU TLSのインストールディレクトリ>/lib64/pkgconfig:$(pkg-config --variable pc_path pkg-config)"
  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>
<br>
PCを再起動する。<br>
PCを再起動する。<br>
<br>
<br>
 
===== QEMUのインストール =====
===== QEMUおよびlibvirtのインストール =====
QEMUのビルドに必要なライブラリをインストールする。<br>
QEMUのビルドに必要なライブラリをインストールする。<br>
  sudo zypper install flex bison automake gcc gcc-c++ make glibc glibc-utils glib2-devel gtk3-devel ncurses-devel libxml2-devel \
  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 \
                     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 \
                     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 libudev-devel virglrenderer-devel xfsprogs-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 \
                     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 \
                     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 \
                     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 \
                     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
                     librbd-devel rdma-core-devel libnet-devel libfvde-devel libdmmp-devel multipath-tools-devel libssh-devel libssh2-devel \
<br>
                     pipewire-devel sndio-devel libjson-c-devel libcmocka-devel python3-pytest python3-flake8 python3-restructuredtext_lint vte-devel libdw-devel \
libVirtのビルドに必要なライブラリをインストールする。<br>
                     sysprof-devel gtk-vnc-devel
sudo zypper install flex bison lautomake gcc make glibc glibc-utils glib2-devel zlib-devel ibapparmor-devel libblkid-devel bash-completion-devel \
                     libcbor-devel qatzip-devel # QEMU 10.0以降
                     numad libnuma1 numactl libnuma-devel libyajl2 yajl libyajl-devel libpixman-1-0 libpixman-1-0-devel libgsasl-devel libselinux-devel \
                     systemd-devel               # SUSE 15.4以降の場合
                    libtool libgnutls30 libgnutls-devel libnl3-devel libxml2-devel libtirpc-devel python3-docutils \
                     sysprof-ui-devel           # SUSE 15.5以前の場合
                    device-mapper-devel libpciaccess-devel rpcbind readline-devel rpcgen libxslt-devel bzip2 \
                     libudev-devel               # SUSE 15.3以前の場合
                     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>
<br>
* QEMUの公式Webサイトから、ソースコードをダウンロードする場合
* QEMUの公式Webサイトから、ソースコードをダウンロードする場合
*: [https://www.qemu.org/download/ QEMUの公式Webサイト]にアクセスして、ソースコードをダウンロードする。
*: [https://www.qemu.org/download/ QEMUの公式Webサイト]にアクセスして、ソースコードをダウンロードする。
*: ダウンロードしたファイルを解凍する。
*: ダウンロードしたファイルを解凍する。
*: <code>tar xf qemu-<バージョン>.tar.xz</code>
*: <syntaxhighlight lang="text">
*: <code>cd qemu-<バージョン></code>
tar xf qemu-<バージョン>.tar.xz
cd qemu-<バージョン>
</syntaxhighlight>
*: <br>
*: <br>
* Gitからソースコードをダウンロードする場合
* Gitからソースコードをダウンロードする場合
*: <code>git clone git://git.qemu.org/qemu.git</code>
*: <syntaxhighlight lang="text">
*: <code>cd qemu</code>
git clone git://git.qemu.org/qemu.git
*: <code>git submodule update --init --recursive</code>
cd qemu
<br>
git submodule update --init --recursive
</syntaxhighlight>
<br>
<br>
QEMUをビルドおよびインストールする。<br>
QEMUをビルドおよびインストールする。<br>
125行目: 129行目:
   
   
  ../configure --prefix=<QEMUのインストールディレクトリ> \
  ../configure --prefix=<QEMUのインストールディレクトリ> \
               --enable-trace-backend=simple \
               --enable-trace-backends=simple   \ # テキストベースのトレース機能を有効化
               --target-list=i386-softmmu,i386-linux-user,x86_64-softmmu,x86_64-linux-user  # ターゲットをx86およびx86_64限定する場合
              --enable-kvm                    \  # KVMによるハードウェア仮想化支援を有効化
               # ターゲットにARMおよびAArch64を追加する場合は、arm-softmmu,arm-linux-user,aarch64-softmmu,aarch64-linux-userを指定する
              --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 -j $(nproc)  または  ninja -j $(nproc)
  make install  または  ninja -j $(nproc) install
  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>
<br>
~/.profileファイル等に環境変数を追記する。<br>
~/.profileファイル等に環境変数を追記する。<br>
  vi ~/.profile
  vi ~/.profile
<br>
<br>
<syntaxhighlight lang="sh">
  # ~/.profileファイル
  # ~/.profileファイル
   
   
  export PATH="<QEMUのインストールディレクトリ>/bin:$PATH"
  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>
<br>
PCを再起動する。<br>
[https://download.libvirt.org libvirtの公式Webサイト]にアクセスして、ソースコードをダウンロードする。<br>
ダウンロードしたファイルを解凍する。<br>
tar xf libvirt-<バージョン>.tar.xz
cd libvirt-<バージョン>
<br>
<br>
libvirtのソースコードをダウンロードする。<br>
または、Githubからソースコードをダウンロードすることもできる。<br>
  git clone https://github.com/libvirt/libvirt.git
  git clone https://github.com/libvirt/libvirt.git
<br>
<br>
libvirtをビルドおよびインストールする。<br>
libvirtをビルドおよびインストールする。<br>
<u>libVirtは、強制的に/usrディレクトリにインストールされることに注意する。</u>
<u>この時、libvirtの一部のファイルは、/usrディレクトリにインストールされることに注意する。</u>
  # libvirt 6.7.0以降
  # libvirt 6.7.0以降 (SLES / openSUSE推奨)
  meson build -Dsystem=true --prefix=<libvirtのインストールディレクトリ>
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
  ninja -C build
  sudo ninja -C build install  # このコマンドは、設定とログファイル構造を生成するために1度だけ必要となる
  sudo ninja -C build install  # AppArmorやFirewalld、Polkit等の各種設定ファイルとログファイルを作成するためにスーパーユーザ権限でインストールする
   
   
  # libvirt 6.7.0未満
  # libvirt 6.7.0未満
157行目: 328行目:
  make install
  make install
<br>
<br>
libvirtのバイナリファイルは/usrディレクトリにインストールされるが、libvirtのインストールディレクトリ内にrunファイルというヘルパースクリプトがインストールされる。<br>
libvirtdの実行に必要なライブラリをインストールする。<br>
runファイルを実行して、libvirtのバイナリファイルを実行することができる。runファイルは、libvirtユーティリティを実行するための環境変数を設定することができる。<br>
sudo zypper install libwsman3
<br>
libvirtのバイナリファイルは/usrディレクトリにインストールされるが、libvirtのインストールディレクトリにrunファイルというヘルパースクリプトがインストールされる。<br>
runファイルを実行することにより、libvirtのバイナリファイルを実行することができる。<br>
runファイルは、libvirtユーティリティを実行するための環境変数を設定することができる。<br>
<br>
<br>
libvirtのインストールディレクトリにあるrunスクリプトファイルを実行して、libvirtデーモン(libvirtd)を起動する。<br>
libvirtのインストールディレクトリにあるrunファイルを実行して、libvirtサービス(libvirtd)を起動する。<br>
デーモンの設定ファイルは、/<libvirtのインストールディレクトリ>/etc/libvirtディレクトリに配置されている。<br>
libvirtサービスのファイルは、/<libvirtのインストールディレクトリ>/etc/libvirtディレクトリに配置されている。<br>
runスクリプトファイルは、コンパイルされたバージョンのツールを実行するために使用することができる。<br>
runファイルは、ビルドされたバージョンのツールを実行するために使用することができる。<br>
  sudo ./run src/virtlockd &  # バックグラウンドで実行する必要がある
  sudo ./run src/virtlockd &  # バックグラウンドで実行する必要がある
  sudo ./run src/virtlogd &  # バックグラウンドで動作させる必要がある
  sudo ./run src/virtlogd &  # バックグラウンドで動作させる必要がある
197行目: 372行目:
<br>
<br>
Virt-Managerをビルドおよびインストールする。<br>
Virt-Managerをビルドおよびインストールする。<br>
  ./setup.py configure --prefix=<Virt-Managerのインストールディレクトリ>
  meson build -Dprefix=<Virt-Managerのインストールディレクトリ>
  ./setup.py build
  ninja -C build -j $(nproc)
  ./setup.py install
  ninja -C build install
<br><br>
<br><br>


207行目: 382行目:
  sudo zypper install bridge-utils
  sudo zypper install bridge-utils
<br>
<br>
===== CentOS =====
===== RHEL =====
仮想マシンがブリッジ接続できるように、ブリッジネットワークを構成する。<br>
仮想マシンがブリッジ接続できるように、ブリッジネットワークを構成する。<br>
ens2のインターフェース名の部分は環境によって異なるため、自身の環境に読み替えること。<br>
ens2のインターフェース名の部分は環境によって異なるため、自身の環境に読み替えること。<br>
230行目: 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>
427行目: 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>
==== 仮想マシンの復元 ====
==== 仮想マシンの復元 ====
バックアップした仮想マシンのイメージを復元する。<br>
バックアップした仮想マシンのイメージを復元する。<br>
719行目: 899行目:
シャットダウンを実行する時、ホストOSがロックアップすることが知られている。<br>
シャットダウンを実行する時、ホストOSがロックアップすることが知られている。<br>
<br>
<br>
===== 方法 1 =====
これを回避する方法は、libvirtフックスクリプトとsystemdユニットを使用して、<br>
これを回避する方法は、libvirtフックスクリプトとsystemdユニットを使用して、<br>
ゲストOSの実行中にホストOSがスリープ状態になることを防ぐ。<br>
ゲストOSの実行中にホストOSがスリープ状態になることを防ぐ。<br>
768行目: 949行目:
上記で作成したデーモンを停止する。<br>
上記で作成したデーモンを停止する。<br>
  sudo systemctl stop libvirt-nosleep.service
  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>


780行目: 1,100行目:
*: <code>sudo zypper install automake autoconf bash coreutils expect expect-devel libtool sed libtpms0 libtpms-devel \</code>
*: <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>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</code>
*: <code>libselinux-devel socat trousers trousers-devel gnutls libgnutls-devel libtasn1 libtasn1-6 libtasn1-devel libseccomp-devel libunistring-devel</code>
*: <br>
*: <br>
*: 次に、SWTPMのGithubからソースコードをダウンロードする。
*: 次に、SWTPMのGithubからソースコードをダウンロードする。
799行目: 1,119行目:
*: <code>../autogen.sh --prefix=<SWTPMのインストールディレクトリ> --libdir=/<SWTPMのインストールディレクトリ>/lib64 \</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>
*: <code>--with-openssl --with-tss-user=$USER --with-tss-group=<$USERが所属しているグループ名>  # tcsdはファイルを通常ユーザ/通常グループまたはroot/tssにする必要がある</code>
*: <br>
*: <code>make -j $(nproc)</code>
*: <code>make -j $(nproc)</code>
*: <code>make check -j $(nproc)</code>  # 実行は任意である
*: <code>make check -j $(nproc)</code>  # 実行は任意である
835行目: 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>を記述する。(<u>'''不要の可能性がある'''</u>)
*# ホスト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]]