📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)
| (同じ利用者による、間の84版が非表示) | |||
| 5行目: | 5行目: | ||
== KVMとQEMUのインストール == | == KVMとQEMUのインストール == | ||
==== パッケージ管理システムからインストール ==== | |||
KVMとQEMUをインストールする。<br> | KVMとQEMUをインストールする。<br> | ||
# | # RHEL | ||
sudo | sudo dnf install qemu-kvm libvirt virt-install virt-manager | ||
# SUSE | # SUSE | ||
| 32行目: | 33行目: | ||
sudo systemctl start libvirtd | sudo systemctl start libvirtd | ||
sudo systemctl enable 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> | <br><br> | ||
| 39行目: | 382行目: | ||
sudo zypper install bridge-utils | sudo zypper install bridge-utils | ||
<br> | <br> | ||
===== | ===== RHEL ===== | ||
仮想マシンがブリッジ接続できるように、ブリッジネットワークを構成する。<br> | 仮想マシンがブリッジ接続できるように、ブリッジネットワークを構成する。<br> | ||
ens2のインターフェース名の部分は環境によって異なるため、自身の環境に読み替えること。<br> | ens2のインターフェース名の部分は環境によって異なるため、自身の環境に読み替えること。<br> | ||
| 62行目: | 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> | ||
RHELを再起動する。<br> | |||
reboot | sudo systemctl reboot | ||
<br> | <br> | ||
正常にbr0が起動しているか確認する。<br> | 正常にbr0が起動しているか確認する。<br> | ||
| 186行目: | 529行目: | ||
# 仮想マシン名を入力する。また、これまでの設定内容を確認しておく。 | # 仮想マシン名を入力する。また、これまでの設定内容を確認しておく。 | ||
# インストーラが起動するので、画面に従ってインストールする。 | # インストーラが起動するので、画面に従ってインストールする。 | ||
<br> | |||
ストレージや光学式ドライブをパススルーする場合、以下の手順に従う。<br> | |||
# virt-managerの起動後、仮想マシンのアイコンを右クリックして、[開く]を選択する。 | |||
# 画面左下にある[ハードウェアの追加]を選択して、画面左の[ストレージ] - 画面右の[カスタムストレージの選択または作成]項目に、/dev/sdXや/dev/srX等のデバイスファイル名を指定する。 | |||
# 画面右下の[完了]ボタンを押下する。 | |||
# 自動的にSCSIコマンドのパススルーが行われる。 | |||
<br><br> | <br><br> | ||
| 198行目: | 547行目: | ||
<br> | <br> | ||
* 仮想マシンを停止する。 | * 仮想マシンを停止する。 | ||
sudo virsh shutdown | sudo virsh shutdown <仮想マシン名> | ||
<br> | <br> | ||
* 仮想マシンを強制停止 | * 仮想マシンを強制停止 | ||
sudo virsh destroy | sudo virsh destroy <仮想マシン名> | ||
<br> | |||
* 仮想マシンの削除 | |||
# ゲストOSの定義の削除 | |||
sudo virsh undefine <仮想マシン名> | |||
# 仮想マシンの定義ファイルの<仮想マシン名>.xmlファイルを確認する | |||
sudo ls /etc/libvirt/qemu | |||
# 仮想マシンの割り当てディスク(仮想マシンの物理ファイル)を削除する | |||
sudo rm -f <仮想マシンの割り当てディスク(仮想マシンの物理ファイル)>.qcow2 | |||
<br> | <br> | ||
* 仮想マシンをシステム起動時に自動起動の設定をする。 | * 仮想マシンをシステム起動時に自動起動の設定をする。 | ||
sudo virsh autostart | sudo virsh autostart <仮想マシン名> | ||
<br> | <br> | ||
* 仮想マシンの自動起動設定を解除する。 | * 仮想マシンの自動起動設定を解除する。 | ||
sudo virsh autostart --disable | sudo virsh autostart --disable <仮想マシン名> | ||
<br> | <br> | ||
* 仮想マシンの一覧を表示する。 | * 仮想マシンの一覧を表示する。 | ||
| 227行目: | 586行目: | ||
== 仮想マシンのバックアップおよび復元 == | == 仮想マシンのバックアップおよび復元 == | ||
==== 仮想マシンのバックアップ ==== | |||
仮想マシンを停止する。 | 仮想マシンを停止する。 | ||
sudo virsh shutdown | sudo virsh shutdown <仮想マシン名> | ||
<br> | <br> | ||
設定ファイルをバックアップする。<br> | 設定ファイルをバックアップする。<br> | ||
sudo virsh dumpxml | sudo virsh dumpxml <仮想マシン名> > /<バックアップ先のディレクトリ>/<仮想マシン名>.xml | ||
<br> | <br> | ||
仮想マシンのイメージをバックアップする。<br> | 仮想マシンのイメージをバックアップする。<br> | ||
sudo cp -p < | sudo cp -p /<仮想マシンのファイルが存在するディレクトリ>/<仮想マシン名>.qcow2 <バックアップ先のディレクトリ> | ||
<br> | <br> | ||
また、各仮想マシンの定義ファイルは、/etc/libvirt/qemuディレクトリに存在する。<br> | また、各仮想マシンの定義ファイルは、/etc/libvirt/qemuディレクトリに存在する。<br> | ||
| 247行目: | 600行目: | ||
sudo virsh define /etc/libvirt/qemu/<仮想マシン名>.xml | sudo virsh define /etc/libvirt/qemu/<仮想マシン名>.xml | ||
<br> | <br> | ||
なお、この定義ファイルは直接編集せず、<code>virsh edit</code>コマンドを使用して編集すること。<br> | <u>なお、この定義ファイルは直接編集せず、<code>virsh edit</code>コマンドを使用して編集すること。</u><br> | ||
なぜなら、<code>virsh edit</code>コマンドを使用することで、定義ファイルに誤りがあった場合にエラーを出力してくれるので安全である。<br> | <u>なぜなら、<code>virsh edit</code>コマンドを使用することで、定義ファイルに誤りがあった場合にエラーを出力してくれるので安全である。</u><br> | ||
< | sudo virsh edit <仮想マシン名> | ||
# 標準エディタをnanoに変更する場合 | |||
sudo EDITOR=nano virsh edit <仮想マシン名> | |||
<br> | <br> | ||
==== 仮想マシンの復元 ==== | |||
バックアップした仮想マシンのイメージを復元する。<br> | バックアップした仮想マシンのイメージを復元する。<br> | ||
sudo cp -p <仮想マシンのイメージをバックアップしたディレクトリ>/ | sudo cp -p /<仮想マシンのイメージをバックアップしたディレクトリ>/<仮想マシン名>.qcow2 <仮想マシンのイメージを保存するディレクトリ> | ||
<br> | <br> | ||
バックアップした設定ファイルを復元する。<br> | バックアップした設定ファイルを復元する。<br> | ||
sudo cp -p / | sudo cp -p /<仮想マシンのイメージをバックアップしたディレクトリ>/<仮想マシン名>.xml /etc/libvirt/qemu | ||
<br> | <br> | ||
復元した設定ファイルをKVMに反映する。<br> | 復元した設定ファイルをKVMに反映する。<br> | ||
sudo virsh define /etc/libvirt/qemu/ | sudo virsh define /etc/libvirt/qemu/<仮想マシン名>.xml | ||
<br> | <br> | ||
バックアップに成功すると、以下のようなメッセージが出力される。<br> | バックアップに成功すると、以下のようなメッセージが出力される。<br> | ||
ドメイン | ドメイン <仮想マシン名> が /etc/libvirt/qemu/<仮想マシン名>.xml から定義されました | ||
<br> | <br> | ||
復元されたSUSEを起動する。<br> | 復元されたSUSEを起動する。<br> | ||
sudo virsh start | sudo virsh start <仮想マシン名> | ||
<br><br> | <br><br> | ||
| 351行目: | 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> | ||
| 406行目: | 765行目: | ||
<br><br> | <br><br> | ||
== | == 仮想マシンの保存先の変更 == | ||
別のHDD / SSDに仮想マシンを配置する場合、初期設定ではアクセス権限エラーになる。<br> | 別のHDD / SSDに仮想マシンを配置する場合、初期設定ではアクセス権限エラーになる。<br> | ||
そこで、/etc/libvirt/qemu.confファイルに以下の設定を追記する。<br> | そこで、/etc/libvirt/qemu.confファイルに以下の設定を追記する。<br> | ||
| 424行目: | 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> | ||
| 501行目: | 899行目: | ||
シャットダウンを実行する時、ホストOSがロックアップすることが知られている。<br> | シャットダウンを実行する時、ホストOSがロックアップすることが知られている。<br> | ||
<br> | <br> | ||
===== 方法 1 ===== | |||
これを回避する方法は、libvirtフックスクリプトとsystemdユニットを使用して、<br> | これを回避する方法は、libvirtフックスクリプトとsystemdユニットを使用して、<br> | ||
ゲストOSの実行中にホストOSがスリープ状態になることを防ぐ。<br> | ゲストOSの実行中にホストOSがスリープ状態になることを防ぐ。<br> | ||
| 519行目: | 918行目: | ||
case "$OPERATION" in | case "$OPERATION" in | ||
"prepare") | "prepare") | ||
systemctl start libvirt-nosleep | systemctl start libvirt-nosleep | ||
;; | ;; | ||
"release") | "release") | ||
systemctl stop libvirt-nosleep | systemctl stop libvirt-nosleep | ||
;; | ;; | ||
esac | esac | ||
</syntaxhighlight> | </syntaxhighlight> | ||
<br> | <br> | ||
sudo vi / | スリープ / ハイバネートを無効化するデーモンを作成する。<br> | ||
sudo vi /usr/lib/systemd/system/libvirt-nosleep.service | |||
<br> | <br> | ||
# | # /usr/lib/systemd/system/libvirt-nosleep.serviceファイル | ||
[Unit] | [Unit] | ||
| 537行目: | 937行目: | ||
Type=simple | Type=simple | ||
ExecStart=/usr/bin/systemd-inhibit --what=sleep --why="Libvirt domain \"%i\" is running" --who=%U --mode=block sleep infinity | 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> | <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> | ||
| 553行目: | 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の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__ | ||
[[カテゴリ: | [[カテゴリ:RHEL]][[カテゴリ:SUSE]] | ||