ubuntu22.04 & 23.04にKVM(Kernel-based Virtual Machine)をインストールしてみた
メインのOSをubuntuにしてもう10年近くになるが、ソフトの関係でWindowsを使わざるを得ないことがある。そのためWindowsをVirtualBoxの
ゲストOSとして入れているが、ホストマシン(一昔前のcorei7、ubuntu22.04)の性能の関係かWindows10をゲストとするとさすがに重い。(WindowsXPはサクサク動く)
そこで、ゲストの動作が比較的軽いと言われるKVM(Kernel-based Virtual Machine)を試してみた。
結果的には劇的に軽くなるほどではないものの(ネット情報ではGPUやUSBを仮想マシンに占有させてネイティブに近い動作も可能とか)、VirtualBox上ではつまづきながら
動いていたWindows10がkvmではそこそこ使える程度になることがわかったので、今後仮想マシンの運用をVirtualBoxからkvmに置き換えることにした。
(Windows起動直後やバックグラウンドでupdateが動作しているときの重さはどうしようもないが..)
このページは、kvmをインストールして、ゲストOSとしてWindowsをインストールし、さらに実際に運用できるように共有フォルダなどの最低の設定をした際の作業メモである。 (kvmは端末で操作した方が便利なことが多いので、その防備録として)
KVMをインストールしてゲストにWindowsをインストールした感想:
長所:VirtualBoxと比べてゲストOSの動作が比較的軽い。(長所はこれだけ?)
短所:ホストOSとの共有ディレクトリの設定がVirtualBoxと比べて手間がかかる。特にゲストOSがWindowsXPの場合は。
(ホストがubuntuならあれこれ迷わずオーソドックスなsambaを使うのが吉)
短所:端末でコマンドを叩く機会が増える。
・ホストOS:ubuntu22.04
・参考にしたサイト:
https://www.linuxtechi.com/how-to-install-kvm-on-ubuntu-22-04/
sudo apt update
sudo apt upgrade ※保留中のリストがあれば sudo apt install xxx で個別にインストール。
sudo apt install -y qemu-kvm virt-manager libvirt-daemon-system virtinst libvirt-clients bridge-utils
sudo systemctl enable --now libvirtd ※実行したかどうか忘れた
sudo systemctl start libvirtd ※実行したかどうか忘れた
sudo usermod -aG kvm $USER
sudo usermod -aG libvirt $USER
参考にしたサイトの『 6) Launch KVM Virtual Machines Manager 』以下はKVMの起動とかゲストOSのインストールなのでさらっとながめた。
※ホストの端末でIPアドレスを確認すると virbr0:の項目が追加されているのでIPアドレスを確認しておく。(192.168.122.1/24となっていた。)
参考サイトの例に従わなかった部分:
『 2) Check if Virtualization is enabled 』
-->> CPUがKVMに対応しているかどうかの確認をしている箇所はcorei7なので対応しているはずとしてパスした。
『 5) Create Network Bridge (br0) 』
-->> ホストマシンの外にあるKVM仮想マシンにアクセスする予定はないのでパスした。
インストール時にインターネット接続をOFFにしておくとMicrosoftアカウント地獄に落ちなくて済む。インターネットに接続してるとMicrosoftアカウントを作成しろと 迫ってくる。仮に作成しても後で通常の使用者での起動に戻せる。 そんな具合だからゲストのWindows10からのインターネット接続は特別な設定も必要なかった。
virtio周りのソフトなどをあれこれ試してみたけど、結局、ホストのubuntu側にsambaを導入した。この方が自然な気がする。
ubuntuへのsambaの導入については、ubuntuのデフォルトファイラーであるnautilusで適当なディレクトリのプロパティから「ローカルネットワーク共有」タブで 共有ディレクトリに設定すると、その時点でsambaが導入されていなければそのままsambaのインストールが始まる。ちなみに、私は標準のファイラーではないpcmanfmを 使っていたため共有タブが出てこずに悩んだ。
sudo pdbedit -a <user> ※<user>はubuntuにログインするユーザー名
パスワードの設定を求められるが、sambaへのパスワードなのでubuntuへのログインパスワードではない。同じでも問題なし。
[global]セクションの編集
・unix,dosのcharactor setの設定のコメントを外す
・interfacesにvirbro0(kvmをインストールすると開かれるネットワーク)の存在するネットワーク(192.168.122.0/24)を追加
こんな感じ interfaces = 127.0.0.0/8 192.168.122.0/24
ファイルの末尾に共有ディレクトリを定義>(共有名を[Share]とした。)
※[ ]で囲ったのは任意の共有名であって[global]のような既定のセクション名ではない。
※追加する共有ディレクトリ数は任意だが、共有名1つに対して1つの共有ディレクトリとなるようだ、当然ながら。
[Share] #共有名
# 共有フォルダーを指定(ubuntuで共有設定したフォルダ。この例ではubuntuのPublicディレクトリ)
path = /home/●●/Public
# 書き込みを許可する
writable = yes
# ゲストユーザー (nobody) を許可する
guest ok = yes
# 全てゲストユーザーとして扱う(guest onlyのコメントを外した方が簡単かも?)
#guest only = yes
# ファイル作成時のパーミッションを [777] とする
force create mode = 777
# フォルダー作成時のパーミッションを [777] とする
force directory mode = 777
(どうでもいいことだが、sambaを使わないでVirtFsで共有する場合はQemuのパーミッションをrootからユーザーに権限の変更をしないと一般ユーザーでの 書き込みが制限される。オーソドックスに共有をsambaで管理する場合はQemuのパーミッションを気にする必要はない。)
Windowsで解像度の選択肢の中にディスプレイいっぱいに表示する解像度がない場合は
virtio-win-xxx.iso(ダウンロードサイト:
https://github.com/virtio-win/virtio-win-pkg-scripts/blob/master/README.md:
このページでStable か Latestを選択してダウンロードする。サイズは500MB超)をWindows内でマウントするか、仮想OSのCDROMとして取り込んで、
Windowsでのドライバの変更の際に検索すると適切なドライバが見つかる場合が多い。
このisoにはディスプレイドライバ以外にも含まれている。デバイスマネージャで?マークがついた機器のドライバも検索すると結構な確率でヒットする。
ホストに無線LANで接続しているプリンター(Brother DCP-J952N)のwindowsドライバーをインストール。 ゲストのWindowsでは有線LAN接続としてプリンターのIPアドレス(固定)を指定してインストールした。
最初は接続できずググってあれこれ試したが、なんの事はない、仮想マシンマネージャでゲストWindowsXPのNICのデバイスモデルをvirtioのイーサネットアダプタを選択して、 virtio-win-xxx.isoからドライバーをインストールすればあっさり接続できた。
WindowsXPでもホストubuntu側にsambaをインストールして共有フォルダの設定をするのはWindows10のときと同じだが、古いOS?なのでWindows10より少し手間が増える。
追加する作業は次の2点である。
ホスト側のsambaの共有フォルダにアクセスするためには、windows10でのsmb.confの編集に加えて[global]設定で次の行を追加する。
server min protocol = NT1
これはXPの共有レベルがSMB1であるため、最近のsambaの共有レベルSMB2に対応できないため、あえてSMB1(NT1)にsamba側のレベルを下げるものである。
(セキュリティ上、好ましくないがやむを得ない?)
WindowsXP側のレジストリを変更する必要がある。
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsaの中のimcompatibilitylevelの値を3に設定する。
この変更でめでたくホストの共有フォルダにアクセスできるようになる。
windows側での共有フォルダの登録方法は通常のネットワークドライブの追加と同じである。
\\<virbro0のIPアドレス>\<共有名>で設定する。
なお、上記の共有レベルの変更をsambaに設定後、すでに設定していたゲストのWindows10のネットワークフォルダ(ドライブ)にアクセスできなくなった。
Windows10側でネットワークドライブを一旦削除して再設定すると再びアクセスできるようになった。
おそらくデフォルトではディスプレイいっぱいに表示できる解像度はないと思うので、ディスプレイドライバをVirtio-win-xxx.iso内で検索させる。 運が良ければの画面いっぱいに表示できる解像度を持つドライバが見つかる。
仮想マシンマネージャの設定でOSにインストールするデバイスのモデルを変更することで適切なドライバが見つかる場合もあるが、WindowsXPはいまだに 現役で稼働しているOSであるものの業界としては遺物扱いであるため、virtio-winのisoにも該当がない場合がある。その場合は諦めるしかない。
CDやDVDで提供されているソフトウェアをゲストOSにインストールする際にいちいちISOイメージにして仮想CDROMで読み込むのは面倒なので、ホスト側の
物理CDROM(DVD)をゲスト側から直接読めるように設定する。
virsh attach-diskコマンドかデバイス用のxmlを用意すると追加できるとのことで、xmlは面倒なので次のコマンドで追加した。
virsh attach-disk <ゲストOS名> /dev/sr0 sdc --config --type cdrom --mode readonly
実は上記のコマンドで実行する前に、sdcのところをhdcで実行してIDEのCDROMが登録されてしまった。KVMでゲストを起動するとIDEは対応していないと怒られてしまった。
sdcは3番目のSCSIデバイスという意味かと思う。初期状態でゲストに登録されているCDROMデバイスはsataだけどそれでいいのかと思っていたが、
やはり少し問題あり。登録できたけど、sataではなくscsiとして認識された。
やむなくvirsh edit <domain>コマンド('domainはKVMに登録したゲストOS名)で設定を開いてbus='scsi'をbus='sata'に
書き換えると今度はsataのCDROMとして登録された。
追加したCDROMにDVD(実機の光学ドライブはDVDマルチなので)を挿入するとゲストOSでちゃんと認識した。USB機器の使用はリダイレクトしてゲスト占有することになるが、 追加したCDROMはホスト側とゲスト側で同時に認識されている。なんだか危険な気もするがいちいちリダイレクトしなくていいのである意味便利。
なお、誤ってscsi機器を登録したためscsiコントローラーが新たに追加されたので、virsh edit <domain>でscsiコントローラの行を削除した。
仮想マシンマネージャのGUIでも削除できると思う。
上記により追加したCDROMを削除する場合は、virsh editで該当するデバイス行を削除するのが確実である。というのは、登録したCDROMを
次のコマンドで削除できると思っていたができなかった。
virsh detach-disk <ゲストOS名> sdc
メッセージとしてはOSが起動していないので削除できないという意味のようだが、よくわかない。
追記:
端末でvirsh # でvirshのターミナルに入り、attach-diskのコマンドのヘルプを見てみると、先ほどのbusの設定に関するオプションがあった。
--targetbus <string>
そのオプションを先ほどのデバイス登録のコマンドに追加する次のようになる。
virsh attach-disk <ゲストos名> /dev/sr0 sdc --config --type cdrom --targetbus sata --mode readonly
これでvirsh edit
仮想OSのディスクイメージを移動させたいことがある。virtualboxではこれが意外と面倒だけど、KVMでは各仮想OS用の.xml設定ファイルを編集すればよい。 と言っても直接.xmlファイルを編集せず次のコマンドを使って編集する。
virsh edit <ゲストOS名>
Windows10のディスクイメージをsata3接続のSSDに移動してみた。予想どおりイライラせずに使える速度で動作するようになった。
ちなみに、SSDのベンチマークでは書き込みが400MB/s、読み込みが300MB/s(何故か読み出しが遅い。システムの関係か?)そこそこで平均以下のSSDだったし、
ゲストのWindows10にはCPU2とメモリ4GBという最低限の設定だったが、イライラせずに使える速度で動作することに少し感動し、また、ディスクアクセスの速度が
動作速度に大きな影響を与えていることを実感した。
ここからは追加情報。より高性能なホストマシンに憧れて新しいデスクトップを組んだ。ハードディスクのないSSD環境なので仮想OSもさらにキビキビ動作するであろうことから、
リアルWindowsパーディションはついに消え去った。(Windowsのゲームなどしないので私には不要だった。)ubuntu23.04にしたのは2023.1月発売のマザーボードだったので
マザーボードの発売以降のバージョンにしたかったため。
クリーンインストールしてこのサイトの防備録を見ながらKVMの仮想環境を再度構築する中で気づいた点があったのでさらに防備録を追加することにした。
kvmをインストールしたあとubuntu23.04に限らず一旦再起動する必要があるようです。(何かのサービスを開始すればいいのかもしれないけどよく分からないので。) インストールしてそのまま新しい仮想マシンの作成をしようとすると何とかが接続されていないとかいうエラーが出る。また、バックアップしておいたOSの設定ファイルや ディスクイメージをリストアしようとすると何かが動作していないとかわけの分からないエラーで悩まされる。 そこで再度上書き的にkvmのインストール作業をやり直して念の為再起動してから仮想OSの追加を実行したら追加のメニューが出て既存のディスクイメージからインポートできた。 ...と思ったけど、再起動だけの問題ではないようだ。原因は不明だけど、仮想OSの追加をしようとすると何とかの接続がありませんというエラーが出る場合がある。 すでにインストールしている仮想OSを開いて(起動する必要はない)閉じるとそのエラーは出なくなる。
ubuntu22.04のKVMで使っていたSSD上のWindows10のディスクイメージを元に新たな仮想OSを作成したらそのまま認識された。その際に、KVMからSSDへのアクセス権が ないとのメッセージが出たが、KVM側でアクセス権の変更を行えるようだ。変更できるなら確認メッセージを出さないでほしいものだ。
通常の場合、新規にディスクイメージを作成すると既定の場所にディスクイメージが作成される。そのイメージを他の場所に移動させて、該当する設定ファイル内の
イメージファイルのパス名を変更すれば普通に使用できることはわかっていたが、KVMが認識するイメージファイルの置き場にそのディレクトリが自動的に追加されるとは
知らなかった。
ちなみに、その置き場を定義するxmlのリストは virsh pool-list でステータスを含めて表示される。新たに追加されるディスクイメージの置き場は
「カスタムストレージの選択または作成」で選択できるし、そこで別の置き場を追加もできる。