libvirtのGUIクライアントvirt-managerを実行するVMをlibvirt内に作る話

libvirtは仮想化管理ライブラリです… って仮想サーバでOKでしょう。
今回はこのlibvirtのclientであるvirt-managerを操作するVMをビルドインする話です

はじめに

今回のことの発端は単純です…

libvirtの仮想マシーンを作成するタイミングがあったのですが新規作成ってどうするんだっけ?virt-installなんですが…これって覚えるのがめんどくさいです。
installでは1コマンドですが、CPUとかメモリとか変更するには…かなりめんどくさいですね。
だったらGUIで使えるvirt-managerを使えばいいじゃない!
virt-managerが動く環境を作る…のに一番シンプルなのはどうすれば良いのか?
そう、一番シンプルなのはlibvirtが動いている環境に入れれば良いわけです。
しかし!virt-managerはGUI(X11)ツールですのでX11を入れる必要がある…
CUIでやると言うポリシーで私はサーバを運用していますのでこれは排除
だったら別にLinuxのDesktop環境を作って…とか思いましたが空きがありませんでした。(Raspberry piはスペック不足だったはず)
だったら!virt-managerが動くVMを作って自身で管理させれば良いじゃない

こんな感じでVMの一つにvirt-managerが動作しているVMを置くとOKでしょう

ポイントとしてはサーバのubuntuではGUIがないのがポイントです

作業環境概略図

Ubuntu Desktopをインストールする

Ubuntu Desktopをインストールするにはどうすれば良いでしょうか?

ImageがBootするとX11にインストーラが展開されます…が、動作しているUbuntuサーバはCUIなのでGUIはありません。
さて、どうすれば良いでしょうか?
その解決がvncです。VNCは… GUIの内容を投げると思えば良いでしょう

早速VNCをインストールします

wataru@gitlab:~$ sudo apt-get install tigervncserver
wataru@gitlab:~$ sudo apt-get install virt-viewer

略しますが、virt-viewerも一緒に入れました。(ないバージョンの動作確認していませんでした)

インストールの流れの概略図はこの様な感じになります

1.にてvirsh-installを発行すると
2.にてVMの構築と1で指定したCDイメージを実行します(CDイメージは図では略)
こうするとインストーラがvnc-serverから出力されますのでそれを操作してやれば普通にインストールができます。

実際に実行したvirsh-installはこんな感じです

DISPLAY=:1  virt-install \
    --name=ubuntu-desktop \
    --vcpus=2 \
    --memory=2048 \
    --disk /mnt/raid/vm/ubuntu_desktop/disk.img,size=20  \
    --network=bridge:br0 \
    --arch=x86_64 \
    --graphics vnc,password=password,listen=0.0.0.0,port=5901 \
    --cdrom=/mnt/raid/download/ubuntu-22.04-desktop-amd64.iso

各所の説明は略しますが
CPUを2台
メモリを2048MBと指定します。
HDDを20GBで作っています。

ここでのポイントはgraphicsです。ここでvncで投げています。これが重要です。
VNCはサーバのIPアドレスとポート5901にて接続、するとパスワード要求が出ますので「password」で入ることができます。

Linuxのインストール時の注意

インストール中にVNCが切断される場合

インストーラが動いてインストールできますが、通常起動のインストーラの場合途中でVNCが切断される不具合が発生しました。
なので普通じゃない起動方法を推奨します。
BIOSが起動するとメニューが表示されますので通常の下にある「ubuntu ( safe graphics )」を選べば問題なく最後まで行きました。

インストール完了後再起動で上がってこない

インストールが完了してCDのイジェクトを行ってもらって再起動するとなんの反応もなくなります…
その場合はサーバの動作状況を確認してください

wataru@gitlab:~$ virsh list --all
 Id   Name             State
---------------------------------
 -    ubuntu-desktop   shut off

十中八九、シャットダウンしています
起動を手動で指定すればインストール処理を続けられます

wataru@gitlab:~$ virsh start ubuntu-desktop
Domain 'ubuntu-desktop' started

インストール完了後VNCには接続できるが表示がない場合

インストールが完了して先の手順でVMがrunning状態だと確認。
vnc clientも接続できるが黒画面… 右上に_だけ表示される。”Booting from HDD”だけ表示される…
はい、さまざまなパターンがありましたが、全ての原因は一つでした。
メモリの確保をしすぎて本体のサーバがパニックを起こしています!
サーバのメモリを確認すると

wataru@gitlab:~$ free -g
               total        used        free      shared  buff/cache   available
Mem:              15          13           0           0           2           1
Swap:              0           0           0

free 0GB… まともじゃないですね
この時はVMのメモリを8GBも取っていたのでしょうがないです。
ちなみにVMを停止すると…

wataru@gitlab:~$ free -g
               total        used        free      shared  buff/cache   available
Mem:              15           5           8           0           2           9
Swap:              0           0           0

ピッタリ8GB空きましたw

これを2GBまで削って現在は

wataru@gitlab:~$ free -g
               total        used        free      shared  buff/cache   available
Mem:              15           7           0           0           7           7
Swap:              0           0           0

ま、大丈夫でしょう…

パッケージがえらく時間がかかる問題

今回,22.04(LTS)のdesktopを使いましたが、日本のミラーを参照するとタイムアウトを大量に発生してくれます… その場合は日本ミラーではなくMainを参照する様に設定を変更してください

GUIではこんな感じで変更可能です… CUIでは… なんかmirrorファイルとかいじった気がします

画面サイズを変更するとログインできなくなる

これ結構、悩みました。解決方法は… OSのインストールでした。
インストールが完了したLinuxの設定をしているときに画面サイズが微妙なので変更したいと思います。
これは極力しない方が得策です。

ちなみに1920 x 1080 でもリフレッシュレートを60Hzにすれば表示はされます。
しかし、再起動すると画面が崩れて操作できなくなるのです
もしこのあたりをいじる場合には必ずSSHサーバの設定をしてからにしてください

SSHサーバをインストールする

注意点はIPを間違えないこと、ufwは標準では有効ではないことを覚えておいてください
あとはコマンド一発です。起動状態でインストールされます

sudo apt-get install openssh-server

VNCクライアントがコピペできません!

諦めてください。SSHで入る方が良いので早々にssh環境をインストールしてください

Virt-managerをインストールして起動する

はい、インストールして起動するまでですが、virt-managerのインストールはコマンド一発です

$ sudo apt-get install virt-manager

特に引っかかる部分はありませんが、もし見つからないとか言われるとapt-get updateとか実行してみてください。

はい、これで起動しますので起動してみます

起動すると何もありませんのでローカルのlibvirtの参照を未接続状態で上がります。

対象のサーバを選択すると以下のエラーが表示されます

読めば良いだけですが、SSH鍵がないのでアクセスできません。

鍵交換してやればOKです

$ ssh-keygen 
$ ssh-copy-id -i ~/.ssh/id_rsa.pub 192.168.1.201

はい、どうせvirt-managerだけしか接続しませんのでkeyの設定もデフォルトです。
作成後に公開鍵をサーバ(201)にコピーすれば終わりです。

これでvirt-managerを確認すると接続できました

これでGUIでVMを管理できる様になりました!

終いに

今回は自宅の仮想サーバ環境をGUIで管理するためのセットアップのメモを残しておきました。

にしても… まともに使うにはメモリが16GBでは足りないのですよ;;

物理部分でDockerなど動かしているので8GBは必須。
残り8GBを良くて1GBに切ったら8台のサーバ。そもそも0GBだったら不安定になりますので…
1GBのサーバを2、3台でしょうかね。
今回の場合 GUIなのでメモリを食いますので2GBは必要でしょう…

すると?1GBは1、2台ですか…

新しいサーバは近いですねw
見積もり出しているので買うだけなんですけどね

にしても、なんでSwapが0なんだろうw
kubernetesの試行錯誤で無効にして放置だったかも…

Tips

VMの削除方法

インストールを失敗すると再度インストーラを起動するのはめんどくさいです。
その場合はVMを削除してからインストーラを起動する方が楽です。

VMの削除はお上品な方法と下品な方法があります。
お上品な方法は…
undefineでマークして、再起動します(reset)するとマークしたVMは削除されます

wataru@gitlab:~$ virsh list --all
 Id   Name             State
--------------------------------
 2    ubuntu_desktop   running

wataru@gitlab:~$ virsh undefine ubuntu-desktop
Domain 'ubuntu-desktop' has been undefined

wataru@gitlab:~$ virsh reset ubuntu-desktop
Domain 'ubuntu-desktop' was reset

wataru@gitlab:~$ virsh list --all
 Id   Name   State
--------------------

しかしながらreset処理をcallしてもしつこくこびりついてrunning状態なものがあります。
その場合には少々お下品ですが強制的に削除する方法があります

wataru@gitlab:~$ virsh list --all
 Id   Name             State
--------------------------------
 2    ubuntu-desktop   running

wataru@gitlab:~$ virsh destroy ubuntu_desktop
Domain 'ubuntu-desktop' destroyed

wataru@gitlab:~$ virsh list --all
 Id   Name   State
--------------------

これでゴリって削除できます