Tera Termでエラーが発生した場合の対処法 :「SSHパケットを送信中にエラーが発生しました. 切断します. (WSAAsyncSelect:10093)」

はじめに

KVMでCentOS7にCentOS7の仮想環境を立ててみるで建てたCentOS環境にTera TermからSSHで接続したところ、画面が真っ黒なまま接続出来ず、Tera Termを閉じるとタイトルのエラーが発生。
原因は分からなかったものの解消方法はわかったのでメモします。

エラー画面

同じ目にあっている人がいたら試してみてください。

対処法

  1. メニューから「設定」>「SSH…」を選択します
  2. 優先する鍵交換アルゴリズムの順(E) (SSH2のみ)の欄で「ecdh-sha2-nistp256」が「ecdh-sha2-nistp384」より上にあれば、「ecdh-sha2-nistp256」の方を下に持ってくる。
    というか、「ecdh-sha2-nistp521」→「ecdh-sha2-nistp384」→「ecdh-sha2-nistp256」の順にするとより良い。(セキュリティ的な意味で)
  3. メニューから「設定」>「設定の保存(S)…」を忘れずに。
  4. Tera Termを再起動してSSH接続し直す。

以上でエラーが解消しSSH接続できるようになったと思います。

おわりに

原因はわかってないですがとりあえず解消はできました。Tera Termのバグなのか仮想環境側のバグなのかも不明です。物理のCentOSには接続出来ているので仮想環境の問題の匂いもしますが断定はできない。
今はこれ以上調べる余力も技術もないので、一旦上記でしのぎます。

KVM上の仮想環境に立てたからかSSH関連で色々とトラブルにあいました。おかげさまでLinuxの仕組みを少しだけ知ることができたので、いつでも見返せるよう少しずつ記事にしていきたいなと思います。

KVMでCentOS7にCentOS7の仮想環境を立ててみる

はじめに

自由に使えるLinux環境が欲しいなと思いまして。

物理環境は色々やりすぎて壊れると面倒ですし、仮想環境を立てることにしました。

最近は仮想化といえばコンテナ仮想化(特にdocker)の話題が多いですが、端末丸ごと使い潰したい場合や、一から何度も構築の練習をしたい場合は従来からのハイバーバイザ仮想化の方が良いと踏んで始めてみようと思います。

KVMとは

Kernel-based Virtual Machine

Linuxで使われるハイパーバイザ型の仮想化基盤です。

CentOS7などではデフォルトで有効となっています。

今回の環境

ホストOS:CentOS Linux release 7.5.1804(Core)

CPU:Intel Celeron (コア数2) 詳細は忘れてしまった。コア数2以上ないと動かなかったような気も

ゲストOS:CentOS Linux release 7.6.180 (Core)

作成方法

必要なソフトウェア(パッケージ)のインストール

バージョンとかにこだわる必要がある人はソースからインストールする方法をググりましょう。

そうでない人は以下のコマンドを実行します。

$ sudo yum install -y qemu-kvm libvirt libvirt-client virt-install virt-manager bridge-utils

私も調べながらなので全て何に使うのか理解したわけじゃないですが

一応何に使うのか一覧を

  • qemu-kvm:KVMにおいて仮想マシンのハードウェアをエミュレートするもの
  • libvirt:仮想化管理用のAPI群
  • libvirt-client:仮想端末に接続するためのクライアント
  • virt-install:仮想端末をインストールするためのソフトウェア
  • virt-manager:仮想端末をGUIで管理するためのソフトウェア。Hyper-Vマネージャーのような存在。試していないがホスト側にGUI環境が存在していないなら不要だと思われる

ネットワーク周りの設定

調べてみると、仮想OSをインストールする前にまずはネットワークの設定が必要らしいです。

多分後からでもできるのですが手戻りが嫌なので先に設定します

ホストOSとゲストOSで通信するためと、ゲストOSがほすとOSのネットワークインターフェースを使用してインターネットに接続するためです。

やること

仮想ブリッジを作成してホストマシンの設定を移し替えます。

ホストマシンは作成した仮想ブリッジにNICを接続して通信をできるようにします。

仮想マシンは作成時にNICを仮想ブリッジに紐づけることになります。(ここは仮想マシンインストール時にやります)

仮想ブリッジの作成

以下のコマンドを実行します。

$ nmcli con add type bridge ifname br0

br0という名前(ifname)の仮想ブリッジを作成します。

以下のコマンドで作成できたかを確認します。

$ nmcli dev

DEVICE列がbr0、TYPE列がbridgeとなっているデバイスがあればOKです。

CONNECTION列は上記コマンドでは指定していないのでデフォルト値になります。おそらくbridge-br0となっていると思います。

仮想ブリッジにホストマシンのネットワーク設定を移し替え

以下のコマンドを、IPアドレスなどを自身のホスト環境のものに当てはめて実行します。

br0ではなく接続名(bridge-br0)を指定することに注意です

$ nmcli con mod bridge-br0 ipv4.method manual ipv4.address "192.168.0.10/24" ipv4.gateway "192.168.0.1" ipv4.dns "192.168.0.1"

書くまでもないレベルですが、

  • IPv4手動設定
  • IPアドレス設定
  • デフォルトゲートウェイ設定
  • DNSサーバ設定

を設定してます。コマンドの意味を考えながら学習すると、後から別のところで出てきたときに出てきやすくなりますね。

ホストマシンのNICを接続

この手順では一度ネットワークが切断されるので注意です。手順ミスをした時に元のIP設定が使えなくても接続できる方法(例えば物理的にディスプレイとキーボードを使う)があった方が安心です。

仮想ブリッジにNICを紐づける設定を追加します。

$ #仮想ブリッジにホストのNICを紐づける設定を追加
$ nmcli con add type bridge-slave ifname enp3s0 master bridge-br0
$ #次の手順でパスワードを求められて再起動がかからない状態で切断されないようにするために権限昇格
$ su
# #ホストの従来の設定を削除
# nmcli con del [元の設定の接続名] && reboot

再起動されるので、時間をおいて再度ホストに接続してください。

設定確認

$ nmcli dev
$ #DEVEICE: enp3s0 - TYPE: ehernet - CONNECTION: bridge-slave-enp3s0 のデバイスがあればOK 
$ brctl show
$ #bridge name: br0 - interface: enp3s0 のブリッジがあればOK
$ ip a
$ #br0に元のホストのIPなどが設定されていればOK

以上でネットワークの設定完了です。

仮想マシンのインストール

ようやくゲストOSのインストールです。

ゲストOSのisoを取得

cURLで取得します。

ダウンロード元のURLはインストールするOSに応じて自分で探すしかないですが、筆者がインストールしたCentOSの場合ここから適当ものを選びました。(ページが更新されている可能性はありますが)

例だと奈良のサーバです。

$ #iso保存用のディレクトリを作成(今回は/iso)
$ cd /
$ mkdir iso
$ curl -LO http://ftp.nara.wide.ad.jp/pub/Linux/centos/7.6.1810/isos/x86_64/CentOS-7-x86_64-DVD-1810.iso

ゲストOSのインストール

調べると仮想ディスクの作成をしている手順もあるのですが、なくても仮想マシンの作成はできるよう。

コマンド実行

以下のコマンド実行時に自動で作成されている?(.qcow形式のファイルができるがこれがそうな気がする)

ちょっと理解しきれていないですが、今回は試すこと優先で進めたのでそのままインストールへ進みます。

$ sudo virt-install --name=testvm \
--memory=1024 \
--disk size=20 \
--vcpus=1 \
--location='/iso/CentOS-7-x86_64-DVD-1810.iso' \
--network bridge=br0 \
--graphics=none \
--extra-args='console=tty0 console=ttyS0, 115200n8'

オプションは適宜変更してもらえればと思います。

オプション 内容
name 作成する仮想マシンの名前
memory 仮想マシンのメモリ量
disk size 仮想マシンのディスクサイズ(GB単位)
cpus 仮想マシンの仮想CPU数
location インストールするゲストOSのisoファイルのパス
network ホストのどのブリッジを使用するかの設定
graphics GUIを使用するか
(使用する場合はどのように設定するかは調べてません。kdeとかを指定するのかも)
extra-args ホストマシンからゲストマシンへ接続するための設定
入出力デバイスとホストのコンソールを紐づけている?
最後の115200n8はない場合も見かけたが、ないと接続できなくなるような記述っぽいものもあったのでつけておくと無難。ボーレート、パリティ、データビット数の設定らしい。

コマンドを実行すると、色々と画面が流れて、CentOS7のインストーラanacondaが起動します。(最初Pythonのanacondaかと思って???となりました)

インストール

画面に従って設定していきます。

注意点は2点です。

  1. 設定中にqで抜けない
  2. 削除操作はdeleteキーで(back spaceではない)

特に1は、押してしまうとインストールが中断されます。動かない仮想マシンが出来上がります。

対処法は調べればあると思いますが、面倒だったので私は仮想マシンを一度削除して作り直しました。

設定を確定して先に進むときはc キーを押すようになっています。

設定が終わったらbキーでインストールを開始します。(全て設定する必要はないですが、全てやっておいた方が後で楽だと思います。)

自動で画面が進みますが、この画面で長期間止まります。筆者の場合は1時間くらい放置して別のことしていたら先に進んでました。調べてみるとBUGのような記述もあったのですが確信はできず

この画面になったらインストール完了です。Enterを押すと仮想マシンへログインできます。(インストーラでパスワードを設定していたらパスワードを求められる)

仮想マシンへの接続と切断

上記手順を実施した直後だと接続している状態ですが、ここは順序立てて説明します。

仮想マシン一覧の確認

以下のコマンドで。管理者権限でインストールした場合は確認時も管理者権限が必要です。(一般ユーザー権限でインストールできるかは未確認)

—all オプションをつけない場合は、起動中の仮想マシンのみを表示します。慣れておくと混乱しません。

$ sudo virsh list --all

接続

IDか名前で仮想マシンを指定して接続します。

$ sudo virsh console testvm

切断

接続時に書いてありますが、^ + ] で切断します。

WindowならCtrl + ]です。

おわりに

以上で、KVMでCentOS7の仮想マシンを使えるようになりました。

OSが起動しなくなるまで弄り倒してあげましょう。(ホストに影響のない範囲で。また、何らかの形でホスト含むOSが起動しなくなっても筆者は責任を取れません。)

楽しいLinuxライフを!