お伝えしたいこと
LinuxをGNS3上で動作させる手順を紹介します。
GNS3上でQEMUベースのLinux VMを登録する手順を扱います。
Linux上でGNS3 Serverを動作させる構成において役に立つと思います。
本記事は、ホストマシンがGNS3とKVM環境をセットアップ済みのLinuxであることを前提にしています。
KVMのセットアップ手順については、KVMの初期設定、及びvirsh, virt-installによるVM作成を参照してください。
Linuxの準備
GNS3上でQEMU仮想マシンを動作させるには、GNS3に仮想ディスクファイル (※qcow2など) を登録する必要があります。
もちろん、その仮想マシンファイルにはLinuxがインストールされている必要があります。
シリアルコンソールに対応したい場合は、Linuxインストール後に#(任意) シリアルコンソールへの対応も実施しておいてください。
シリアルコンソールに対応しておいた方が使い勝手が向上するため、任意とは言いつつも実施しておくことをおすすめします。
(参考) Linux VMの作成手順
ご参考までに、KVMでLinux VMを作成するための簡易手順を示します。
CLIで行う場合は、以下のようなコマンドでLinuxマシンを新規作成、及び起動します。
以下のコマンドはCentOS Stream 8の例です。
virt-install \ --name centos_stream8 \ --memory 1024 \ --vcpus 2 \ --disk size=20 \ --cdrom /home/shared/libvirt/images/isos/centos/CentOS-Stream-8-x86_64-latest-dvd1.iso \ --os-variant centos-stream8 &
やり直し用に、VMの強制終了、及び削除のコマンドサンプルも示します。
virsh destroy centos_stream8 ; virsh undefine centos_stream8 --storage vda
CockpitなどのGUIによるVM作成手順については、KVMの基本操作集 - #VMの作成を参考にしてください。
(任意) シリアルコンソールへの対応
本セクションの作業は任意です。
この手順によって、Linuxにシリアルコンソール接続できるようにします。
GNS3上でLinuxを操作する場合はシリアルコンソールに対応させたほうが便利なので、本セクションの手順も含めて実施することを推奨します。
(参考) シリアルコンソールとは
GNS3にKVMベースのLinux VMを追加したとき、管理アクセスの選択肢としてデフォルトでは主に以下の選択肢が挙げられます。
- GNS3上のネットワーク経由でログインする
- グラフィカルコンソール経由でログインする
- サーバー本体に直接キーボード、マウス、ディスプレイを接続するのと同等
- GUIにも対応可能
- ホストマシンからコピペしづらいのが不便
グラフィカルコンソールとは、以下の画面のことです。
上記2つの方式にはそれぞれ弱点があります。
1はネットワークアクセスのために配線と初期設定が必要です。
2はホストマシンからのコピペがしづらいです。
そこで、本セクションでは第三の選択肢としてシリアルコンソール経由でのログインを使えるように設定変更します。
シリアルコンソールとは、例えばネットワーク機器にロールオーバーケーブルで接続してアクセス可能な画面のことです。
シリアルコンソールを使えば、ネットワーク接続性がなくてもコピペに対応したCLIアクセスが可能です。
その代わり、ファイル転送やGUI表示はできませんので、そこは他の方式と使い分けが必要です。
CLIベースのLinuxであれば、グラフィカルコンソールよりもシリアルコンソールの方が便利です。
Linuxをシリアルコンソールに対応させるには、Linux側で初期設定が必要です。
その手順は次のセクションで紹介します。
Linuxの設定変更
対象のLinuxマシンにログインして、GRUB 2の設定を変更することでシリアルコンソールを有効化します。
まずは、変更前の設定を事前に確認しておきます。
# (更新行のみ抜粋) sudo grubby --info=ALL # index=0 # args="ro crashkernel=auto resume=/dev/mapper/cs-swap rd.lvm.lv=cs/root rd.lvm.lv=cs/swap rhgb quiet $tuned_params" # index=1 # args="ro crashkernel=auto resume=/dev/mapper/cs-swap rd.lvm.lv=cs/root rd.lvm.lv=cs/swap rhgb quiet" sudo cat /etc/default/grub # GRUB_CMDLINE_LINUX="crashkernel=auto resume=/dev/mapper/cs-swap rd.lvm.lv=cs/root rd.lvm.lv=cs/swap rhgb quiet"
続いて設定を変更します。
sudo grubby --update-kernel=ALL --args="console=tty0 console=ttyS0,115200"
設定を確認します。
grubby --info=ALL
のargs
と、/etc/default/grub
のGRUB_CMDLINE_LINUX
のそれぞれに、console=tty0 console=ttyS0,115200
が追記されていることがわかります。
# (更新行のみ抜粋) sudo grubby --info=ALL # index=0 # args="ro crashkernel=auto resume=/dev/mapper/cs-swap rd.lvm.lv=cs/root rd.lvm.lv=cs/swap rhgb quiet console=tty0 console=ttyS0,115200 $tuned_params" # index=1 # args="ro crashkernel=auto resume=/dev/mapper/cs-swap rd.lvm.lv=cs/root rd.lvm.lv=cs/swap rhgb quiet console=tty0 console=ttyS0,115200" sudo cat /etc/default/grub # GRUB_CMDLINE_LINUX="crashkernel=auto resume=/dev/mapper/cs-swap rd.lvm.lv=cs/root rd.lvm.lv=cs/swap rhgb quiet console=tty0 console=ttyS0,115200"
OS再起動して更新を反映します。
sudo reboot
ご参考までに、console
オプションを削除して元の値に戻したい場合は以下のコマンドを実行します。
今回の手順ではもちろん実行する必要はありませんので、コメントアウトしてあります。
# sudo grubby --update-kernel=ALL --remove-args="console"
(参考) 実施した手順の意味
上記のgrubby
コマンドで一体何を変更したのかを補足します。
気になる方のみお読みください。
(参考) grubbyとは
grubby
とは、Boot Entryの設定値を表示、変更するコマンドラインツールです。
RHELではこのコマンドによってGRUB 2の設定変更をすることが推奨されています。1
grubby
コマンドを使用するパターンも含めて、GRUB 2の設定を変更する方法は3つあります。
興味のある方は、以下のリンクもご確認ください。
参考: RHEL7 - System Administrator’s Guide - 26.2. Configuring GRUB 2
(参考) Boot Entryとは
過去記事を参照してください。
(参考) consoleオプション
今回書き換えたのは、GRUB 2からLinux Kernelに渡すパラメータの1つです。
console
オプションの仕様は、以下のLinuxカーネルのドキュメントに記載があります。
参考: The Linux kernel user’s and administrator’s guide - Linux Serial Console
Linuxのデフォルトではグラフィカルコンソール (/dev/ttyX
) のみが有効化され、シリアルコンソール (/dev/ttySX
) は有効化されません。
今回はconsole
オプションを2回指定することで、グラフィカルコンソールとシリアルコンソールをそれぞれ有効化しています。
シリアルコンソールの指定ではconsole=ttyS0,115200
を指定していますが、これは以下のような意味を持ちます。
/dev/ttyS0
デバイスを生成する (※ttyS0は、COM1と同義)- ボーレートを115200に指定している (※デフォルトは9600。115200に変更することで表示速度を上げている)
RHEL7のSystem Administrator’s Guideでもconsole
オプションについて言及されています。2,3
ここで言いたいことは、今回実施した手順はRHELのドキュメントでもある程度裏打ちされたものであるということです。
LinuxをGNS3に登録する
VM設定の全体像
先に設定の全体像を示しておきます。
GNS3に既に慣れている方は、以下の画面だけで手の動かし方が十分に伝わると思います。
先にCentOS Stream8の例を示します。
CentOS Stream 9のVMを建てる場合のみ、QEMUのオプションに-cpu host
を追加で指定する必要があります。
このパラメータを指定するのは、CentOS Stream 9とQEMUの相性問題を回避するためです。
詳細は#Advancedを参照してください。
仮想ディスクファイルの格納
ここまでの手順で、Linux VMの作成が完了しているはずです。
作成した仮想マシンから、仮想ディスクファイルを取り出しましょう。
KVM環境の場合は、virsh domblklist 仮想マシン名
で仮想ディスクファイルのパスを確認できます。
virsh domblklist centos_stream8 # Target Source # --------------------------------------------------- # vda /home/shared/libvirt/images/centos_stream8.qcow2
作成した仮想マシンから仮想ディスクファイルを取り出し、~/GNS3/images/QEMU/
に格納しておきます。
cp /home/shared/libvirt/images/centos_stream8.qcow2 ~/GNS3/images/QEMU/
取り出した仮想ディスクファイルが現在のユーザーから読み書きできることを確認してください。
権限が足りていない場合は、chmod
やchown
で変更しておきましょう。
sudo chown $USER:$USER ~/GNS3/images/QEMU/centos_stream8.qcow2 chmod 644 ~/GNS3/images/QEMU/centos_stream8.qcow2 ls -lh ~/GNS3/images/QEMU/centos_stream8.qcow2 # -rw-r--r--. 1 endy endy 11G Apr 13 21:06 /home/endy/GNS3/images/QEMU/centos_stream8.qcow2
この段階で仮想ディスクファイルは既に取り出せたので、#Linuxの準備で作成したVMは削除しても問題ありません。
GNS3にQEMU仮想マシンとして登録する
本セクションでは、準備した仮想ディスクファイルをGNS3に登録します。
まずはGNS3を起動し、Edit > Preferences
(Ctrl+Shift+P
) から設定画面を開きます。
左のメニューからQEMU VMs
を選択し、New
ボタンからQEMUで再生する仮想マシンを新規登録します。
仮想マシン名を入力します。
今回はCentOS Stream 8
とします。
QEMU Binaryとメモリ容量を設定します。
QEMU Binaryは、/usr/bin/qemu-kvm
を選択します。
ただ、ほとんどの方はデフォルトのまま/bin/qemu-system-x86_64
を選んでも同じ意味になります (※)。
RAMにはLinux VMに割り当てたいメモリ容量を指定します。
(※) Fedoraの環境では/bin
は/usr/bin/
へのシンボリックリンクです。/usr/bin/qemu-kvm
は、KVMに対応したCPUアーキテクチャのバイナリに対するシンボリックリンクとなっており、x86_64
アーキテクチャのCPUを使っているなら/usr/bin/qemu-system-x86_64
と同じ意味になります。ここで大事なのは、ホストマシンのCPUアーキテクチャに対応したQEMUバイナリを選択することです。CPUアーキテクチャはuname -m
コマンドなどで確認できます。ARMなど他アーキテクチャのCPUを使っている方は選択肢が変わることもあります。わからない方は/usr/bin/qemu-kvm
を選んでおけばほぼ間違いないと思います
最後に、GNS3からコンソール接続するときの方式を選択します。
シリアルコンソールを使いたい場合は、telnet
を選択してください。
グラフィカルコンソールを使いたい場合は、vnc
かspice
を選択してください。
今回、私はtelnet
を指定しました。
最後に、QEMUにセットする仮想ディスクファイルを決定します。
今回は予め用意しておいたcentos_stream8.qcow2
を指定します。
QEMU仮想マシンをカスタマイズする
前のセクションの手順により、GNS3上にQEMU仮想マシンが登録されました。
作成した仮想マシンを選択し、Edit
から更に設定変更します。
General settings
まずはGeneral settings
タブです。
変更した箇所をピンクの枠で囲いました。
vCPUs以外はほぼ見た目にしか影響のない変更です。
お好みに合わせてカスタマイズしてください。
各設定の意味を下表にまとめました。
設定項目、デフォルト値、意味 | 今回の設定値 |
---|---|
Template name
デフォルト: なし
|
CentOS Stream 8
(※) デフォルトと同じ |
Default name format
デフォルト: {name}-{0}
|
cs8-{0}
|
Symbol
デフォルト: :/symbols/qemu_guest.svg
|
:/symbols/affinity/circle/blue/server.svg |
Category
デフォルト: End devices
|
End devices
(※) デフォルトと同じ |
RAM
デフォルト: なし
|
2048 MB
(※) デフォルトと同じ |
vCPUs
デフォルト: 1
|
4
|
Qemu binary
デフォルト: 環境依存 |
/usr/bin/qemu-kvm
(※) デフォルトと同じ |
Boot priority
デフォルト: HDD
|
HDD
(※) デフォルトと同じ |
On close
デフォルト: Power off the VM
|
Power off the VM
(※) デフォルトと同じ |
Console type
デフォルト: なし
|
telnet
|
Auto start console
デフォルト: OFF
|
OFF
(※) デフォルトと同じ |
(※1) Console typeでnone
を指定すると、QEMUのコマンドラインオプションに-serial
, -vnc
, -spice
などのオプションを指定しない。Auto start consoleの設定に関わらず、VM起動と同時にQEMUの内蔵コンソールが起動する。内蔵コンソールは、グラフィカルコンソールとシリアルコンソールを切り替える機能を持つ。ウィンドウを閉じるとVMを停止する
HDD
HDD
タブでは、HDA (Primary Master)のDisk interfaceをvirtio
に変更します。
デフォルトのnone
が選択されている場合、VM起動時に自動的にide
に変更されます。
このハードウェアの値がide
でもvirtio
でもVMは問題なく起動しますが、virtio
の方が性能が出やすいようなのでここで変更しています4。
CD/DVD
特に何も変更せず、空欄のままです。
今回は既にLinuxをインストール済みのため、CD/DVD (ISOファイル) をセットする必要はありません。
Network
Network
タブは下図のように設定しました。
変更した箇所を枠線で強調してあります。
設定値を下表にまとめます。
設定項目、デフォルト値、意味 | 今回の設定値 |
---|---|
Adapters
デフォルト: 1
|
3 |
First port name
デフォルト: なし
|
なし
(※) デフォルトと同じ |
Name format
デフォルト: Ethernet{0}
|
ens{port3}
(※3) |
Segment size
デフォルト: 0
|
0
(※) デフォルトと同じ |
Base MAC
デフォルト: __:__:__:__:__:__
|
__:__:__:__:__:__
(※) デフォルトと同じ |
Type
デフォルト: Intel Gigabit Ethernet (e1000)
|
Paravirtualized
|
Custom adapters
デフォルト: 設定なし
|
設定なし
(※) デフォルトと同じ |
Replicate network connection states in Qemu
デフォルト: ON
|
ON
(※) デフォルトと同じ |
Use the legacy networking mode
デフォルト: OFF
|
OFF
(※) デフォルトと同じ |
(※1) ネットワーク機器の仮想アプライアンスの場合、1番目のNICがしばしば管理インターフェースとして扱われる。そして2番目のNICからサービスポートとなる。その場合、First port nameをmgmt0
、Name formatをEth1/{port1}
と設定すると、先頭ポートから順にmgmt0
, Eth1/1
, Eth1/2
, ...
という番号付けができる。このようにポート番号付けの規則をチューニングすることで、GNS3上の表示と実機のshow interface
出力の間で整合性を取ることができる
(※2) {segment0}
は、Segment sizeと共に使う。Segment sizeが3だった場合、Eth{segment0}/{port0}
はEth0/0
, Eth0/1
, Eth0/2
, Eth1/0
, Eth1/2
, ...
のように3ポート周期でセグメント番号が変わる。{segment1}
と指定することで、1から始まる連番を指定することも可能。ネットワーク機器の仮想アプライアンスに対して有効
(※3) GNS3上でLinux VMをQEMUで動作させた場合、Linux実機上でポート番号がens3
, ens4
, ...
とアサインされた。したがって、Name formatをens{port3}
に設定した
Advanced
Advanced
タブについては、よく使うオプションにのみ言及しています。
特にCentOS Stream 9を使う場合は、Aditional settings > Optionsに追加設定が必要であるため、忘れないようにしてください。
Use as a linked base VMオプションについても念のため補足します。
このオプションが有効の場合、GNS3のトポロジにVMを追加する前に内部的にVMクローンするようになります。
つまり、このオプションが有効である限りはテンプレートVMを書き換える心配がありません。
テンプレートVMを書き換えたい場合には一時的にOFFにします。
設定項目、デフォルト値、意味 | 今回の設定値 |
---|---|
Aditional settings > Options デフォルト: なし
|
|
Aditional settings > Use as a linked base VM デフォルト: ON
|
ON
(※) デフォルトと同じ |
(※1) CentOS Stream 9をQEMUで起動する時、-cpu host
オプションを指定しないとKernel Panicになるという事象が報告されています5。私の環境においても2022/3/28リリース版のCentOS Stream 9のISOファイルにて再現しました。virt-install
やCockpitなど、libvirtを介する環境で作成したVMはオプションが正しく設定されているためか再現しませんでした。GNS3はlibvirtを介さずQEMUコマンドを直接実行してVMを起動するため、CentOS Stream 9 VMを起動する場合は-cpu host
を指定するワークアラウンドが必要です。-cpu host
自体はQEMUの推奨オプションであり、CentOS Stream 9以外のホストに対して同様に指定しても特に悪影響はありません
Usage
Usage
タブにはコメントを自由に書けます。
お好みで、VMの説明を簡単にメモすると便利です。
空欄のままでも問題ありません。
共通設定
General
セクションで特定のVMに閉じない一般的な設定ができます。
今回作成したLinux VMに関連する設定もあるので、ここで触れておきます。
Console applications
#General settingsでConsole type
をtelnet
に設定している場合、電源起動済みのVMをダブルクリックすることでシリアルコンソール接続できます。
以下の画面で、シリアルコンソール接続に使用するアプリケーションを指定します。
デフォルトはXterm
になっていますが、環境によってはXterm
が入っていないこともあると思います。
Xterm
から変更する場合、お使いのターミナルソフトウェアに合わせてGnome Terminal
やKonsole
など選択してください。
シリアルコンソール起動時のコマンドは自分自身で指定することも可能です。
私はTilixを使っているため、以下のように設定しました。
tilix -t "%d" -a session-add-down --focus-window -e "telnet %h %p"
%d
はコンソール画面のタイトル、%h
はコンソール接続先のIPアドレス、%p
はコンソール接続先のポート番号です (※)。
組み込み変数の意味について、詳細は上記スクリーンショットを参照してください。
(※) GNS3のシリアルコンソール接続は、内部的にtelnet通信を使用します
VNC
#General settingsでConsole type
をVNC
に設定している場合、VNCプロトコルによるコンソール接続になります。
以下の画面で、VNCコンソール接続に使用するアプリケーションを指定します。
デフォルトはTightVNC (vncviewer
) が選択されています。
私の環境ではRemote Viewer (remote-viewer
)がインストール済みなので、それを選択しました。
Remote Viewerは、sudo dnf install remote-viewer
でインストールできます。
Spice
#General settingsでConsole type
をSpice
に設定している場合、Spiceプロトコルによるコンソール接続になります。
以下の画面で、Spiceコンソール接続に使用するアプリケーションを指定します。
デフォルトはRemote Viewer (remote-viewer
) が選択されています。
私の環境としてはこのままで問題ないので、特に変更しませんでした。
Linuxの起動
いよいよ、GNS3上でLinuxを起動します。
まず、作成したCentOS Stream 8をGNS3上に追加します。
GNS3トポロジ上のVMを右クリックし、Start
を選択することでVMを起動します。
VMをダブルクリックするか、右クリックしてConsole
を選択することでコンソールを起動します。
ログインプロンプトが確認できれば、無事成功です。
後はケーブル配線して好きなトポロジを組んでみましょう。
作成したVMにSSHログインする方法は別の記事で紹介します。
(参考) GNS3で起動したVMはKVMを使っているか?
GNS3からQEMUでVMを起動した後にps -ef | grep qemu
コマンドを実行すると、-enable-kvm
を指定していることがわかります。
また、VM起動前後でlsmod | grep kvm
を実行して値を比較することでもKVMの利用を確認できます。
VM起動後は、intel_kvm
行、またはkvm_amd
行の右端にあるカウントが増加しています。
これは、VMがKVMカーネルモジュールを利用していることを表しています。
以下のコマンドでは、VM起動前では0
だったものが、VM起動後では6
に増加しています。
参考: KVMの初期設定、及びvirsh, virt-installによるVM作成 - #KVMの動作確認 (2/2)
################ # VM起動前 ################ lsmod | grep kvm # kvm_intel 360448 0 # kvm 1028096 1 kvm_intel # irqbypass 16384 1 kvm ################ # VM起動後 ################ lsmod | grep kvm # kvm_intel 360448 6 # kvm 1028096 1 kvm_intel # irqbypass 16384 5 kvm
まとめ
GNS3にLinux VMを追加し、コンソール接続する手順を紹介しました。
手順に書き起こすと長いですが、要点にまとめると3ステップなシンプルな手順です。
一度登録すれば、Use as a linked base VM
機能によって同じVMを何台でも作り放題になります。
GNS3によるネットワーク検証に役に立ちますので、ぜひお試しください。
-
RHEL7 - System Administrator’s Guide - 26. Working with GRUB 2 → 26.1の第三パラグラフ↩
-
RHEL7 - System Administrator’s Guide - 26.9. GRUB 2 over a Serial Console↩
-
RHEL7 - System Administrator’s Guide - 26.4. Making Persistent Changes to a GRUB 2 Menu Using the grubby Tool → Updating All Kernel Menus with the Same Arguments↩
-
Proxmox Forums - kernel panic when creating VMs (centos 9 stream ISO) - oguzさんの回答↩