📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)
| (同じ利用者による、間の4版が非表示) | |||
| 39行目: | 39行目: | ||
==== ソースコードからインストール ==== | ==== ソースコードからインストール ==== | ||
===== GNU | ===== GNU TLSのインストール ===== | ||
パッケージ管理システムのGNU TLSのバージョンが3.6.14未満の場合は、GNU TLSのソースコードをビルドしてインストールする。<br> | パッケージ管理システムのGNU TLSのバージョンが3.6.14未満の場合は、GNU TLSのソースコードをビルドしてインストールする。<br> | ||
<u> | <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> | ||
| 55行目: | 56行目: | ||
*: https://gnutls.org/download.html | *: https://gnutls.org/download.html | ||
<br> | <br> | ||
GMP、Nettle、GNU TLSをビルドおよびインストールする。<br> | |||
# | # GMPのインストール (パッケージ管理システムにあるGMPのバージョンが古い場合) | ||
../configure --prefix=< | ../configure --prefix=<GMP、Nettle、GNU TLSのインストールディレクトリ> | ||
make -j $(nproc) | make -j $(nproc) | ||
make install | make install | ||
# | # Nettleのインストール (パッケージ管理システムにあるNettleのバージョンが古い場合) | ||
../configure --prefix=< | ../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 | # GNU TLSのインストール | ||
../configure --prefix=< | ../configure --prefix=<GMP、Nettle、GNU TLSのインストールディレクトリ> \ | ||
--enable-shared | |||
make -j $(nproc) | make -j $(nproc) | ||
make install | make install | ||
| 74行目: | 80行目: | ||
vi ~/.profile | vi ~/.profile | ||
<br> | <br> | ||
<syntaxhighlight lang="sh"> | |||
# ~/.profileファイル | # ~/.profileファイル | ||
export PATH="< | export PATH="<GMP、Nettle、GNU TLSのインストールディレクトリ>/bin:$PATH" | ||
export LD_LIBRARY_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="$PKG_CONFIG_PATH:$(pkg-config --variable pc_path pkg-config)" | ||
export PKG_CONFIG_PATH="< | export PKG_CONFIG_PATH="<GMP、Nettle、GNU TLSのインストールディレクトリ>/lib64/pkgconfig:$PKG_CONFIG_PATH" | ||
</syntaxhighlight> | |||
<br> | <br> | ||
PCを再起動する。<br> | PCを再起動する。<br> | ||
<br> | <br> | ||
===== QEMUのインストール ===== | ===== QEMUのインストール ===== | ||
QEMUのビルドに必要なライブラリをインストールする。<br> | QEMUのビルドに必要なライブラリをインストールする。<br> | ||
| 97行目: | 104行目: | ||
pipewire-devel sndio-devel libjson-c-devel libcmocka-devel python3-pytest python3-flake8 python3-restructuredtext_lint vte-devel libdw-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 | sysprof-devel gtk-vnc-devel | ||
systemd-devel | libcbor-devel qatzip-devel # QEMU 10.0以降 | ||
sysprof-ui-devel | systemd-devel # SUSE 15.4以降の場合 | ||
libudev-devel | sysprof-ui-devel # SUSE 15.5以前の場合 | ||
libudev-devel # SUSE 15.3以前の場合 | |||
<br> | <br> | ||
* QEMUの公式Webサイトから、ソースコードをダウンロードする場合 | * QEMUの公式Webサイトから、ソースコードをダウンロードする場合 | ||
*: [https://www.qemu.org/download/ QEMUの公式Webサイト]にアクセスして、ソースコードをダウンロードする。 | *: [https://www.qemu.org/download/ QEMUの公式Webサイト]にアクセスして、ソースコードをダウンロードする。 | ||
*: ダウンロードしたファイルを解凍する。 | *: ダウンロードしたファイルを解凍する。 | ||
*: < | *: <syntaxhighlight lang="text"> | ||
tar xf qemu-<バージョン>.tar.xz | |||
cd qemu-<バージョン> | |||
</syntaxhighlight> | |||
*: <br> | *: <br> | ||
* Gitからソースコードをダウンロードする場合 | * Gitからソースコードをダウンロードする場合 | ||
*: < | *: <syntaxhighlight lang="text"> | ||
git clone git://git.qemu.org/qemu.git | |||
cd qemu | |||
git submodule update --init --recursive | |||
</syntaxhighlight> | |||
<br> | <br> | ||
QEMUをビルドおよびインストールする。<br> | QEMUをビルドおよびインストールする。<br> | ||
| 116行目: | 129行目: | ||
../configure --prefix=<QEMUのインストールディレクトリ> \ | ../configure --prefix=<QEMUのインストールディレクトリ> \ | ||
--enable-trace-backends=simple \ | --enable-trace-backends=simple \ # テキストベースのトレース機能を有効化 | ||
--enable-kvm --enable-spice --enable-spice-protocol --enable-usb-redir | --enable-kvm \ # KVMによるハードウェア仮想化支援を有効化 | ||
--enable-opengl --enable-tpm --enable-xkbcommon --enable-bzip2 --enable-sdl \ | --enable-spice \ # SPICEプロトコルによるリモートデスクトップ機能を有効化 | ||
--enable-gtk --enable-vdi --enable-qcow1 --enable-tools --enable-fdt | --enable-spice-protocol \ # SPICEプロトコルのライブラリサポートを有効化 | ||
--audio-drv-list=oss,alsa,sdl,pa | --enable-usb-redir \ # ホストUSBデバイスのゲストへの転送機能を有効化 (SPICE経由でリモートからもリダイレクト可能な方式) | ||
--enable-vfio-user-server | --enable-opengl \ # OpenGLによるGPUアクセラレーションを有効化 | ||
--enable-libusb | --enable-tpm \ # TPM (Trusted Platform Module) エミュレーションを有効化 | ||
--enable-hax | --enable-xkbcommon \ # XKBキーボードマッピングライブラリを有効化 | ||
--target-list=i386-softmmu,i386-linux-user,x86_64-softmmu,x86_64-linux-user | --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) | ||
| 131行目: | 160行目: | ||
<br> | <br> | ||
<u>※注意</u><br> | <u>※注意</u><br> | ||
<u><code>--enable-vfio-user-server</code>オプションは、QEMUのコンフィギュレーションにおいて、VFIOをユーザ空間で使用するためのサーバ機能を有効にする。<br></u> | <u><code>--enable-vfio-user-server</code> オプションは、QEMUのコンフィギュレーションにおいて、VFIOをユーザ空間で使用するためのサーバ機能を有効にする。<br></u> | ||
<br> | <br> | ||
<u>VFIO-userは、QEMUの比較的新しい機能であり、以下に示すような目的がある。</u><br> | <u>VFIO-userは、QEMUの比較的新しい機能であり、以下に示すような目的がある。</u><br> | ||
| 156行目: | 185行目: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
<br> | <br> | ||
===== セキュリティ設定 : AppArmorを使用している場合 ===== | |||
QEMUを/usrディレクトリ以外の場所にインストールする場合、パーミッションの問題が発生する可能性がある。<br> | |||
そのため、libVirtにQEMUを実行するためのAppArmorパーミッションを追加する必要がある。<br> | |||
<br> | <br> | ||
まず、/etc/apparmor.d/usr.sbin.libvirtdファイルにある最後の <code>}</code> スコープの直前に、以下に示す設定を追記する。<br> | |||
まず、/etc/apparmor.d/usr.sbin. | 以下の例では、QEMUを /home/<ユーザ名>/QEMU/ディレクトリ にインストールしているものとする。<br> | ||
sudo vi /etc/apparmor.d/usr.sbin.libvirtd | sudo vi /etc/apparmor.d/usr.sbin.libvirtd | ||
<br> | <br> | ||
| 168行目: | 197行目: | ||
# ...略 | # ...略 | ||
# 例 : | # 例 : | ||
/usr/bin/kvm rmix, | /usr/bin/kvm rmix, | ||
/home/<ユーザ名> | /home/<ユーザ名>/QEMU/bin/qemu-i386 rmix, | ||
/home/<ユーザ名> | /home/<ユーザ名>/QEMU/bin/qemu-system-i386 rmix, | ||
/home/<ユーザ名> | /home/<ユーザ名>/QEMU/bin/qemu-x86_64 rmix, | ||
/home/<ユーザ名> | /home/<ユーザ名>/QEMU/bin/qemu-system-x86_64 rmix, | ||
} | } | ||
<br> | <br> | ||
| 182行目: | 210行目: | ||
# /etc/apparmor.d/abstractions/libvirt-qemuファイル | # /etc/apparmor.d/abstractions/libvirt-qemuファイル | ||
/usr/bin/kvm rmix, | /usr/bin/kvm rmix, | ||
/home<ユーザ名> | /home/<ユーザ名>/QEMU/bin/qemu-i386 rmix, | ||
/home/<ユーザ名> | /home/<ユーザ名>/QEMU/bin/qemu-system-i386 rmix, | ||
/home/<ユーザ名> | /home/<ユーザ名>/QEMU/bin/qemu-x86_64 rmix, | ||
/home/<ユーザ名> | /home/<ユーザ名>/QEMU/bin/qemu-system-x86_64 rmix, | ||
<br> | <br> | ||
AppArmorの設定を反映させるため、ルールセットを再読み込みする。<br> | |||
sudo systemctl reload apparmor | 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> | <br> | ||
| 817行目: | 899行目: | ||
シャットダウンを実行する時、ホストOSがロックアップすることが知られている。<br> | シャットダウンを実行する時、ホストOSがロックアップすることが知られている。<br> | ||
<br> | <br> | ||
===== 方法 1 ===== | |||
これを回避する方法は、libvirtフックスクリプトとsystemdユニットを使用して、<br> | これを回避する方法は、libvirtフックスクリプトとsystemdユニットを使用して、<br> | ||
ゲストOSの実行中にホストOSがスリープ状態になることを防ぐ。<br> | ゲストOSの実行中にホストOSがスリープ状態になることを防ぐ。<br> | ||
| 866行目: | 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> | ||