えんでぃの技術ブログ

えんでぃの技術ブログ

ネットワークエンジニアの視点で、IT系のお役立ち情報を提供する技術ブログです。

GNS3・QEMU上でLinuxを起動する

お伝えしたいこと

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の作成手順

ご参考までに、KVMLinux 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を追加したとき、管理アクセスの選択肢としてデフォルトでは主に以下の選択肢が挙げられます。

  1. GNS3上のネットワーク経由でログインする
    • SSHHTTPSを初めとして各種プロトコルが使える
    • ファイル転送もできる (SCPやFTPなど)
    • GNS3上の配線に依存する
    • 管理IPアドレスの設定が必要
  2. グラフィカルコンソール経由でログインする
    • サーバー本体に直接キーボード、マウス、ディスプレイを接続するのと同等
    • GUIにも対応可能
    • ホストマシンからコピペしづらいのが不便

グラフィカルコンソールとは、以下の画面のことです。

graphical_console

上記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=ALLargsと、/etc/default/grubGRUB_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_8CentOS Stream 8の設定

CentOS Stream 9のVMを建てる場合のみ、QEMUのオプションに-cpu hostを追加で指定する必要があります。
このパラメータを指定するのは、CentOS Stream 9とQEMUの相性問題を回避するためです。
詳細は#Advancedを参照してください。

centos_stream_9CentOS Stream 9の設定

仮想ディスクファイルの格納

ここまでの手順で、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/

取り出した仮想ディスクファイルが現在のユーザーから読み書きできることを確認してください。
権限が足りていない場合は、chmodchownで変更しておきましょう。

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で再生する仮想マシンを新規登録します。

create_qemu_vm1

仮想マシン名を入力します。
今回はCentOS Stream 8とします。

create_qemu_vm2

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を選んでおけばほぼ間違いないと思います

create_qemu_vm3

最後に、GNS3からコンソール接続するときの方式を選択します。

シリアルコンソールを使いたい場合は、telnetを選択してください。
グラフィカルコンソールを使いたい場合は、vncspiceを選択してください。
今回、私はtelnetを指定しました。

create_qemu_vm4

最後に、QEMUにセットする仮想ディスクファイルを決定します。
今回は予め用意しておいたcentos_stream8.qcow2を指定します。

create_qemu_vm5

QEMU仮想マシンをカスタマイズする

前のセクションの手順により、GNS3上にQEMU仮想マシンが登録されました。
作成した仮想マシンを選択し、Editから更に設定変更します。

edit_qemu_vm1

General settings

まずはGeneral settingsタブです。
変更した箇所をピンクの枠で囲いました。
vCPUs以外はほぼ見た目にしか影響のない変更です。
お好みに合わせてカスタマイズしてください。

edit_qemu_vm2

各設定の意味を下表にまとめました。

設定項目、デフォルト値、意味 今回の設定値
Template name
デフォルト: なし

  • VMテンプレート名
  • わかりやすい名前をつける
CentOS Stream 8
(※) デフォルトと同じ
Default name format
デフォルト: {name}-{0}

  • GNS3トポロジに追加後のノード名
  • 短い方が扱いやすい
  • {}で変数が使える
    • {name}: Template nameの値
    • {0}: 0から始まる連番
cs8-{0}
Symbol
デフォルト: :/symbols/qemu_guest.svg

  • アイコン
  • お好みで選択する
:/symbols/affinity/circle/blue/server.svg
Category
デフォルト: End devices

  • VMのカテゴリを選択
  • 見た目にのみ影響する
  • わかりやすいものを選択する
End devices
(※) デフォルトと同じ
RAM
デフォルト: なし

  • VMのメモリ容量
2048 MB
(※) デフォルトと同じ
vCPUs
デフォルト: 1

  • VMのCPUコア数
4
Qemu binary
デフォルト: 環境依存

  • VM起動用のQEMUコマンドを指定する
/usr/bin/qemu-kvm
(※) デフォルトと同じ
Boot priority
デフォルト: HDD

HDD
(※) デフォルトと同じ
On close
デフォルト: Power off the VM

  • GNS3上でVMを "Stop" したときの動作
  • Power offが最も確実で早い
  • shutdownは、OSハング時は使えない
Power off the VM
(※) デフォルトと同じ
Console type
デフォルト: なし

  • VMへのコンソールアクセス方法
  • telnet: シリアルコンソール
  • vnc: グラフィカルコンソール
  • spice: グラフィカルコンソール
  • spice+agent: グラフィカルコンソール
  • none: 表の下に記載 (※1)
telnet
Auto start console
デフォルト: OFF

  • ON: VM起動時にコンソールを開く
  • 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

edit_qemu_vm3

CD/DVD

特に何も変更せず、空欄のままです。

今回は既にLinuxをインストール済みのため、CD/DVD (ISOファイル) をセットする必要はありません。

edit_qemu_vm4

Network

Networkタブは下図のように設定しました。
変更した箇所を枠線で強調してあります。

edit_qemu_vm5

設定値を下表にまとめます。

設定項目、デフォルト値、意味 今回の設定値
Adapters
デフォルト: 1

  • NIC
  • 後から変更できるのでお好みで
3
First port name
デフォルト: なし

なし
(※) デフォルトと同じ
Name format
デフォルト: Ethernet{0}

  • NIC番号の命名を変更する
  • First port nameが未設定の場合、
    1番目以降のNIC番号を設定する
  • First port nameが設定済の場合、
    2番目以降のNIC番号を設定する
  • {}で囲うことで変数を使える
  • {port0}: 0から始まる連番
  • {port3}: 3から始まる連番
  • Eth{segment0}/{port0}: (※2)
  • 参考: GNS3 - Port name formatting
ens{port3}
(※3)
Segment size
デフォルト: 0

  • Name formatに影響するパラメータ (※2)
  • 0は、1と同じ意味になる
0
(※) デフォルトと同じ
Base MAC
デフォルト: __:__:__:__:__:__

  • 1つ目のNICMACアドレスを指定する
  • 2つ目以降は、Base MACの値に1を足して生成
  • __:__:__:__:__:__: Base MACを自動生成する
  • 11:11:11:11:11:11: 左記のBase MACを利用
__:__:__:__:__:__
(※) デフォルトと同じ
Type
デフォルト: Intel Gigabit Ethernet (e1000)

Paravirtualized
Network I/O
(virtio-net-pci)
Custom adapters
デフォルト: 設定なし

  • NICに対して番号とドライバを個別指定する
設定なし
(※) デフォルトと同じ
Replicate network connection states in Qemu
デフォルト: ON

  • 正確な意味は不明だが、検証により以下を観測した
  • ON: GNS3の配線によって実機上でlink up/downする
  • OFF: 実機上で常にlink upする
ON
(※) デフォルトと同じ
Use the legacy networking mode
デフォルト: OFF

  • QEMU 2.9.0未満でのみ使用可能なモード
  • 現在のQEMUは6.1.0以上
  • このオプションを使うことはない
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 VMQEMUで動作させた場合、Linux実機上でポート番号がens3, ens4, ...アサインされた。したがって、Name formatens{port3}に設定した

Advanced

Advancedタブについては、よく使うオプションにのみ言及しています。

特にCentOS Stream 9を使う場合は、Aditional settings > Optionsに追加設定が必要であるため、忘れないようにしてください。

Use as a linked base VMオプションについても念のため補足します。
このオプションが有効の場合、GNS3のトポロジにVMを追加する前に内部的にVMクローンするようになります。
つまり、このオプションが有効である限りはテンプレートVMを書き換える心配がありません。
テンプレートVMを書き換えたい場合には一時的にOFFにします。

edit_qemu_vm6

設定項目、デフォルト値、意味 今回の設定値

Aditional settings > Options
デフォルト: なし
  • 原則、なし
  • CentOS Stream 9のみ
    -cpu host (※1)

Aditional settings > Use as a linked base VM
デフォルト: ON
  • ON: 仮想ディスクをコピーしてVM起動する
  • OFF: オリジナルのディスクでVM起動する
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の説明を簡単にメモすると便利です。

空欄のままでも問題ありません。

edit_qemu_vm7

共通設定

Generalセクションで特定のVMに閉じない一般的な設定ができます。
今回作成したLinux VMに関連する設定もあるので、ここで触れておきます。

Console applications

#General settingsConsole typetelnetに設定している場合、電源起動済みのVMをダブルクリックすることでシリアルコンソール接続できます。
以下の画面で、シリアルコンソール接続に使用するアプリケーションを指定します。

console_applications1

console_applications2

デフォルトはXtermになっていますが、環境によってはXtermが入っていないこともあると思います。
Xtermから変更する場合、お使いのターミナルソフトウェアに合わせてGnome TerminalKonsoleなど選択してください。

シリアルコンソール起動時のコマンドは自分自身で指定することも可能です。
私はTilixを使っているため、以下のように設定しました。

tilix -t "%d" -a session-add-down --focus-window -e "telnet %h %p"

%dはコンソール画面のタイトル、%hはコンソール接続先のIPアドレス%pはコンソール接続先のポート番号です (※)
組み込み変数の意味について、詳細は上記スクリーンショットを参照してください。
(※) GNS3のシリアルコンソール接続は、内部的にtelnet通信を使用します

VNC

#General settingsConsole typeVNCに設定している場合、VNCプロトコルによるコンソール接続になります。
以下の画面で、VNCコンソール接続に使用するアプリケーションを指定します。

vnc1

デフォルトはTightVNC (vncviewer) が選択されています。
私の環境ではRemote Viewer (remote-viewer)がインストール済みなので、それを選択しました。
Remote Viewerは、sudo dnf install remote-viewerでインストールできます。

Spice

#General settingsConsole typeSpiceに設定している場合、Spiceプロトコルによるコンソール接続になります。
以下の画面で、Spiceコンソール接続に使用するアプリケーションを指定します。

spice1

デフォルトはRemote Viewer (remote-viewer) が選択されています。
私の環境としてはこのままで問題ないので、特に変更しませんでした。

Linuxの起動

いよいよ、GNS3上でLinuxを起動します。

まず、作成したCentOS Stream 8をGNS3上に追加します。

add_vm

GNS3トポロジ上のVMを右クリックし、Startを選択することでVMを起動します。

start_vm

VMをダブルクリックするか、右クリックしてConsoleを選択することでコンソールを起動します。
ログインプロンプトが確認できれば、無事成功です。

connect_to_console

後はケーブル配線して好きなトポロジを組んでみましょう。
作成したVMSSHログインする方法は別の記事で紹介します。

(参考) GNS3で起動したVMKVMを使っているか?

GNS3で起動したVMは、KVMを使うようになっています。

GNS3からQEMUVMを起動した後にps -ef | grep qemuコマンドを実行すると、-enable-kvmを指定していることがわかります。

また、VM起動前後でlsmod | grep kvmを実行して値を比較することでもKVMの利用を確認できます。
VM起動後は、intel_kvm行、またはkvm_amd行の右端にあるカウントが増加しています。
これは、VMKVMカーネルモジュールを利用していることを表しています。
以下のコマンドでは、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ステップなシンプルな手順です。

  1. Linux VMをインストール済みのqcow2ファイルを用意する
  2. qcow2ファイルをGNS3に登録する
  3. GNS3上で起動する

一度登録すれば、Use as a linked base VM機能によって同じVMを何台でも作り放題になります。
GNS3によるネットワーク検証に役に立ちますので、ぜひお試しください。