GNS3 でバックエンド開発を便利に(後編)

[前編はこちら](https://qiita.com/t-eno/items/52dc7e64ce972c68653d)
[CentOS8 へのGNS3 インストール手順(2019/10/03 投稿)](https://qiita.com/t-eno/items/d6b00adb48ed60615819)

# はじめに
後編では自分で作成した仮想マシーンをGNS3 に取り込んでいきます。

- Linux 仮想マシーン
- cisco CSR1000v
- Docker コンテナ

の3つを取り込む例を書きます。

# 8. Linux 仮想マシーンの作成と取り込み
物理マシーンのKVM でディスクイメージファイルを作成して、それをGNS3 マシーンに送って取り込む。
下記は最小構成のCentOS7 の仮想マシーンを作成する例。目的に合わせてks ファイルを編集して構成を変える。Ubuntu などの他のディストリビューションでも良い。
## 8-1. 作成
**[物理マシーン]**
ks ファイルの作成。

```text:CentOS7.ks
cmdline
install
lang ja_JP.UTF-8
keyboard jp106

network --device eth0 --onboot yes --bootproto=static --ip=192.168.205.231 --netmask=255.255.255.0 --gateway=192.168.205.254 --nameserver=8.8.8.8 --noipv6
network --hostname=CentOS7

zerombr
bootloader --location=mbr --append="crashkernel=auto biosdevname=0 net.ifnames=0 console=tty0 console=ttyS0,115200n8"

clearpart --linux --drives=vda
part /boot --fstype xfs --size=1024 --ondisk=vda
part pv.1 --size=1024 --grow --ondisk=vda
volgroup centos pv.1
logvol / --fstype xfs  --name=root --vgname=centos --size=1024 --grow

rootpw --plaintext rootpassword
user --groups=wheel --name=user-01 --password=user-01password --plaintext
authconfig --enableshadow --passalgo=sha512
selinux --enforcing
firstboot --disabled
timezone --utc Asia/Tokyo
reboot

%packages --nobase
%end
```

ディスクイメージファイルの作成。

```
sudo qemu-img create -f qcow2 /var/lib/libvirt/images/CentOS7.qcow2 8G
```

仮想マシーンの作成。

```
sudo virt-install --connect=qemu:///system \
--name=CentOS7 \
--vcpus=1 \
--ram=1024 \
--accelerate \
--hvm \
--disk /var/lib/libvirt/images/CentOS7.qcow2,size=8,format=qcow2,bus=virtio \
--location='/opt/Linux/CentOS-7-x86_64-DVD-1804.iso' \
--network bridge=br205,model=virtio \
--nographics \
--initrd-inject=./CentOS7.ks \
--extra-args='ks=file:/CentOS7.ks biosdevname=0 net.ifnames=0 console=tty0 console=ttyS0,115200n8' \
--os-type=linux \
--os-variant=centos7.0 \
--arch=x86_64
```

**[Linux 仮想マシーン]**
作りたい仮想マシーンに沿って共通設定をセットアップする。
ifcfg-ethX のHWADDR, UUID の行は必ず削除またはコメントアウトしておく。
ディスクイメージファイルの容量が小さい方がGNS3 の動作が軽くなるので、余分なファイルは削除しておくと良い。

```
sudo sed -i -e "/HWADDR/s/^/#/" /etc/sysconfig/network-scripts/ifcfg-eth0
sudo sed -i -e "/UUID/s/^/#/" /etc/sysconfig/network-scripts/ifcfg-eth0
sudo yum -y update
sudo yum -y install telnet traceroute tcpdump wget zip unzip mlocate git
---snip---
共通のセットアップ
---snip---
sudo yum clean all
sudo shutdown -h now
```

**[物理マシーン]**
ディスクイメージファイルを圧縮する。
先に述べたように、ディスクイメージファイルの容量が小さい方がGNS3 の動作が軽くなる。

```
sudo qemu-img convert -c -f qcow2 -O qcow2 /var/lib/libvirt/images/CentOS7.qcow2 ~/CentOS7.qcow2
```

ディスクイメージファイルをGNS3 マシーンにscp.

```
scp ~/CentOS7.qcow2 192.168.205.230:./
sudo rm ~/CentOS7.qcow2
```

**[CentOS7-GNS3-01]**
ディスクイメージファイル保存場所を適当に作成してそこに保存する。
以下は/opt/Linux に保存する場合。

```
sudo mkdir /opt/Linux
sudo mv ~/CentOS7.qcow2 /opt/Linux
sudo chown -R root:root /opt/Linux
```

## 8-2. GNS3 への取り込み
**[CentOS7-GNS3-01]**
Edit &rarr; Preferences 
&darr;
Qemu &rarr; Qemu VMs &rarr; New
![qemu-new.png](https://qiita-image-store.s3.amazonaws.com/0/147025/05bc5e6e-71f6-f3c5-6d25-494774ca5500.png)
適当に名前を付ける。
![qemu-name.png](https://qiita-image-store.s3.amazonaws.com/0/147025/9d30b369-866e-8726-60dd-3e5b4da1b99f.png)
割り当てメモリーサイズ。後からでも変更できる。
![qemu-memory.png](https://qiita-image-store.s3.amazonaws.com/0/147025/4cca4ffc-c98a-5d85-487b-fd47fb65a547.png)
Console type はデフォルトのtelnet のまま。
![qemu-console.png](https://qiita-image-store.s3.amazonaws.com/0/147025/837df52c-e035-3bd1-9798-5c00d471ad42.png)
/opt/Linux に保存したディスクイメージファイルを指定。
このとき、自分のホームディレクトリにコピーするかどうか聞かれるが、コピーする必要は全く無くディスク容量を無駄に消費するだけなので必ずNo を選ぶ。
マップ上に何台配置してもこの大元のディスクイメージファイルに変更はかからないのでご安心を。
![qemu-image.png](https://qiita-image-store.s3.amazonaws.com/0/147025/ea9f5608-bbd0-ba99-75c7-3d9ac9e6b418.png)
![qemu-copy-no.png](https://qiita-image-store.s3.amazonaws.com/0/147025/b7f2c969-fef2-d6a8-b913-455a977cad63.png)
続いて、
Qemu &rarr; Qemu VMs &rarr; Edit
で細かい設定をする。
![qemu-edit.png](https://qiita-image-store.s3.amazonaws.com/0/147025/32f37e9f-8696-80a4-a2c7-9673c04ad2f3.png)
Symbol で好みのアイコンを選ぶ。
ここで割り当てメモリー容量やCPU 数も変更できる。
![linux-edit-general-settings.png](https://qiita-image-store.s3.amazonaws.com/0/147025/03c37972-06e0-1cd7-db33-9f765392f9a1.png)
マップ上のEthernet アダプター表示名のフォーマットをeth{0} にする。
デフォルトのアダプター数も変更できる。(画像では1 のまま)
![linux-wdit-network.png](https://qiita-image-store.s3.amazonaws.com/0/147025/f7e5d46d-75e6-cc9f-df2f-64c83f4ee432.png)
ここまでできたら
File &rarr; New blank project
でプロジェクトを新規作成してマップに配置していく。
![gns3-new-project.png](https://qiita-image-store.s3.amazonaws.com/0/147025/69dcbda7-b93d-9803-d72a-af5625e58ee7.png)
取り込んだLinux 仮想マシーンとCloud を配置する。
![gns3-linux-cloud.png](https://qiita-image-store.s3.amazonaws.com/0/147025/20975a33-81b3-c51b-6ecb-b1c68ab0339e.png)
デフォルトで備わっているEthernet Switch を挟んでLinux 仮想マシーンとCloud を結線する。
![gns3-connection.png](https://qiita-image-store.s3.amazonaws.com/0/147025/c500374d-529f-5ac0-993c-52d8108d1f2a.png)
開始ボタンを押して仮想マシーンを起動し、アイコンをダブルクリックか右クリックからのConsole でコンソール画面を出す。
尚、停止状態なら右クリックのConfigure で個別にスペックを変更できる。
![gns3-start.png](https://qiita-image-store.s3.amazonaws.com/0/147025/e149b7e1-d2db-740b-1300-c2f2cd97e61a.png)
ログインできるようになったら外部と通信できるか確認してみる。
![linux-console.png](https://qiita-image-store.s3.amazonaws.com/0/147025/7096d619-1752-bf40-5ddb-ba8651e96d4e.png)

**[GNS3 上Linux 仮想マシーン]**
ホスト名もIP Address も最初に作成したときのままなので個別に変更する。
ホスト名の変更。

```
sudo hostnamectl set-hostname <hostname>
```

IP Address の変更。
コマンドだけで変更できる人はそうする。
コマンドに不慣れな人は以下のように`nmtui` で変更した方がわかりやすいと思われる。

```
sudo nmtui
````

![15.png](https://qiita-image-store.s3.amazonaws.com/0/147025/8b4d8478-08e0-50df-5761-4d7580ca9b49.png)
設定できたら再起動。
起動してきたら外部からssh できるか確認する。

# 9. cisco CSR1000v の作成と取り込み
## 9-1. インストールメディアイメージファイルの入手
CSR1000v のインストールメディアイメージファイルをcisco のサイトからダウンロードするわけだが、古いバージョンのものなら無料アカウントで誰でもダウンロードできる。
例えば、[Cloud Services Router 1000V](https://software.cisco.com/download/home/284364978/type/282046477/release/3.15.0S) からバージョン3.15.0S のiso ファイルをダウンロードする。
![CSR1000v_Download.png](https://qiita-image-store.s3.amazonaws.com/0/147025/19d732f7-729b-047a-4a37-4a972ca48c9e.png)
ログインを求められるのでアカウントを作成してダウンロードする。
途中、利用規約への同意を求められたりするが臆すること無く同意して進める。
csr1000v-universalk9.03.15.00.S.155-2.S-std.iso というファイルがダウンロードされるはずである。

**CSR1000v のディスクイメージ作成にはGUI が必要になるので、今回は物理マシーンではなくGNS3 マシーンにダウンロードしたファイルをscp する。**

## 9-2. 作成
**[CentOS7-GNS3-01]**
ディスクイメージファイルを作成。

```
qemu-img create -f qcow2 ~/CSR1000v.qcow2 8G
```

CSR1000v インストールメディアを読み込んで起動。
この時にGUI が必要になるので、このコマンドは必ずリモートデスクトップしてGUI 上で実行する。

```
qemu-system-x86_64 -boot d ~/CSR1000v.qcow2 -enable-kvm -cpu host -m 2560M -cdrom ~/csr1000v-universalk9.03.15.00.S.155-2.S-std.iso
```

![cisco-install.png](https://qiita-image-store.s3.amazonaws.com/0/147025/fd4ad49c-bd3b-171c-500b-71ee7d65d7c8.png)
QEMU という新しい窓が起動する。
色々表示されるが一切キー入力する必要は無く放置する。
操作可能になるまでだいたい20分くらいかかる。
![cisco-installing.png](https://qiita-image-store.s3.amazonaws.com/0/147025/6a9ec50e-dc38-00b9-43df-a376773e159a.png)
最後にyes / no を聞かれるのでno と入力。
![cisco-dialog-no.png](https://qiita-image-store.s3.amazonaws.com/0/147025/eafd026e-2d1d-620f-2dff-091bb3c915b0.png)
ログが流れ始める。
止まったあたりでEnter を数回入力するとプロンプトが返ってくる。
![cisco-start.png](https://qiita-image-store.s3.amazonaws.com/0/147025/3c300219-9013-13ab-446d-31e8b9f6747f.png)
ここで共通の設定をするわけだが、platform console serial の設定だけは必ず入れる。この設定を入れないとテキストコンソールできない。
以下は、platform console serial の設定とホスト名とユーザーID, password, enable password を全てcisco で設定する例。
最後は必ずcopy コマンドで設定を保存する。
終ったらX 切り。

```
enable
configure terminal
platform console serial
hostname CSR1000v-XX
username cisco password 0 cisco
enable secret cisco
line vty 0 4
 password cisco
 login local
---snip---
共通設定
---snip---
end
copy system:running-config nvram:startup-config
```

![cisco-cofiguration.png](https://qiita-image-store.s3.amazonaws.com/0/147025/009e19bd-ed76-748b-43c4-3363cd2fa03b.png)

作成したディスクイメージファイルを適当な保存ディレクトリを作成して保存する。
以下は圧縮して/opt/cisco に保存する例。

```
sudo mkdir /opt/cisco
sudo qemu-img convert -c -f qcow2 -O qcow2 ~/CSR1000v.qcow2 /opt/cisco/CSR1000v.qcow2
rm ~/CSR1000v.qcow2
```

Linux 仮想マシーンの時と同様の手順でGNS3 に取り込む。異なる所や注意する所のみ書いていく。
割り当てメモリーは2560MB (2.5 GB)
![cisco-memory.png](https://qiita-image-store.s3.amazonaws.com/0/147025/74c88a79-3386-b86f-d7f3-14e8c920290f.png)
繰り返しになるが、ディスクイメージファイルのコピーは必要無いので必ずNo.
![cisco-image-copy-no.png](https://qiita-image-store.s3.amazonaws.com/0/147025/8ec22de8-a44f-dee7-20f3-0418353ec54e.png)
シンボルを好みのものに変更してCategory をRouters にする。
![cisco-edit-general-settings.png](https://qiita-image-store.s3.amazonaws.com/0/147025/558e5725-e899-77cd-48ac-36aa855479a3.png)
Ethernet アダプターのマップ上の表示フォーマットをGigabitEthernet{port1} に変更。
アダプター数も好きなように変更する。
![cisco-edit-network.png](https://qiita-image-store.s3.amazonaws.com/0/147025/52fac9c2-74f7-bb11-f293-e00b4ce7f9dc.png)
追加オプションに-cpu host を追記する。
![cisco-edit-advanced-settings.png](https://qiita-image-store.s3.amazonaws.com/0/147025/5883714d-70bc-dda5-69c3-2995ceb20c23.png)
ここまでできたら同様にマップに取り込み、起動して接続したインターフェースにアドレスを設定してno shutdown をかけて外部からtelnet できるか確認する。
(起動に15分くらいかかるので気長に待つ。)
![cisco-map.png](https://qiita-image-store.s3.amazonaws.com/0/147025/2465a74e-d6af-3f7a-e0a0-3e962197c53d.png)

# 10. Docker コンテナ
Docker コンテナもGNS3 上に配置して他のノードと通信させられる。
ここではcentos:7 のコンテナを取り込む例を書く。

Edit &rarr; Preferences 
&darr;
Docker &rarr; Docker Containers &rarr; New
![docker-new.png](https://qiita-image-store.s3.amazonaws.com/0/147025/6fe92245-8366-0acc-8a0d-f4f4453d1a75.png)
pull するイメージの名前を指定。
既にpull 済ならExisting image を選択する。
![docker-image.png](https://qiita-image-store.s3.amazonaws.com/0/147025/e88e83be-f768-1fb0-25e7-b0c866a46da3.png)
適当に名前を付ける。
![docker-name.png](https://qiita-image-store.s3.amazonaws.com/0/147025/d7029762-a173-c2ff-28ed-ee138ff0405f.png)
マップ上のEthernet アダプター数。
![docker-adapter.png](https://qiita-image-store.s3.amazonaws.com/0/147025/9228a94f-2b07-b394-3f34-dece3c478bf8.png)
コンテナで実行するコマンド。
ここでは`/bin/bash`とする。
![docker-command.png](https://qiita-image-store.s3.amazonaws.com/0/147025/a506b132-0ad5-0243-5db6-f58f1d6e20cd.png)
コンソールタイプを選ぶ。デフォルトのtelnet で良い。
![docker-console.png](https://qiita-image-store.s3.amazonaws.com/0/147025/6bcdc98a-33be-8f67-4e6d-1b9d7807277b.png)
環境変数を定義する必要がある場合はここで定義する。
![docker-env.png](https://qiita-image-store.s3.amazonaws.com/0/147025/4ece3703-6191-c338-d709-d2b54facafba.png)
マップ上に配置する。
pull が必要な場合はここで自動でpull が開始される。
![docker-map.png](https://qiita-image-store.s3.amazonaws.com/0/147025/e1eb2bf8-0d2a-6bf2-153c-2481a2edade7.png)
配置したコンテナにIP Address を割り当てる。
アイコン右クリック &rarr; configure &rarr; Network configuration &rarr; Edit
![docker-edit.png](https://qiita-image-store.s3.amazonaws.com/0/147025/d8a46368-618a-6dd2-b451-9d2169673009.png)
コメントアウトを外してアドレスの設定を書く。
![docker-interface.png](https://qiita-image-store.s3.amazonaws.com/0/147025/5b5358de-01cd-3bf2-0f93-1a6a90dfc5b5.png)
結線して動作開始させる。
外部と疎通できるか確認する。
![docker-ping.png](https://qiita-image-store.s3.amazonaws.com/0/147025/56619301-627b-6e57-b0f4-0658c0bd0d01.png)

# まとめ
KVM で動作する仮想マシーンなら基本何でもGNS3 で動くはずである。Docker コンテナも動かすことができることを確認できた。サーバーを動作させるだけでなく、その周りのネットワークもマウス操作のみで簡単に構築できるので、これを開発環境に取り入れれば開発がもっと便利になる。
CSR1000v の起動が遅くメモリー消費量が多いのが難点だが、VyOS という軽量なソフトウェアルーターがあるのでこれを取り入れてみるのも良い。イメージファイルの作り方は検索すれば出てくる。

[前編はこちら](https://qiita.com/t-eno/items/52dc7e64ce972c68653d)