はじめに
Hyper-Vの仮想マシンにはネットワーク接続を提供する仮想スイッチが接続できます。
仮想スイッチについては以下の記事でわかりやすく解説されています
その仮想スイッチの1つである「Default Switch」を接続した仮想マシンは起動するたびにIPアドレスが変更されてしまうため、ホストマシンからSSH接続を行う際に、都度IPアドレスを確認する手間が発生します。
仮想マシンがWindowsの場合であれば、ホストマシンのPowerShellから以下のコマンドを実行することで、IPアドレスの情報を取得することができます。
Get-VMNetworkAdapter -VMName "仮想マシン名"
しかし、仮想マシンがUbuntuなどのLinux OSの場合、このコマンドではIPアドレスを特定できません。
ホストマシンからLinux仮想マシンに自動でSSH接続するバッチやスクリプトを作成したい場合、別途「内部スイッチ」を作成し仮想マシンに固定IPアドレスを割り当てる必要があります。
mshome.net を利用したホスト名による名前解決
この問題を解決する方法として、"仮想マシンのホスト名".mshome.net という形式でホスト名を指定することで、固定のホスト名で仮想マシンにSSH接続することが可能になります。
ssh "ユーザー名"@"仮想マシンのホスト名".mshome.net
mshome.net とは、Windowsの「インターネット接続共有 (ICS : Internet Connection Sharing)」機能によって、ローカルネットワークの名前解決のために自動的に生成・利用される特別なドメインサフィックスです。
この mshome.net が付いた名前解決の情報は
C:\Windows\System32\drivers\etc\hosts.ics というファイルに書き込まれています。
仮想マシンが起動しIPアドレスが割り当てられたタイミングで、ホストOSは hosts.ics にその仮想マシンのホスト名とIPアドレスの対応関係を自動的に書き込みます。
これにより仮想マシンのホスト名とIPアドレスの関係が自動更新されるため、SSH接続が可能になります。
注意点
hosts.ics のデータ不整合
hosts.ics ファイルに正しく仮想マシンのホスト名とIPアドレスが書き込まれていない場合があり、名前解決できない場合があります。
hosts.icsには以下のように通常のhostsファイルと同じ形式でホスト名とIPアドレスの対応関係が記載されています。
"IPアドレス" "仮想マシンのホスト名".mshome.net
名前解決ができない場合、該当の仮想マシンのレコードがなかったり、古いままであることがあります。
ics 拡張子について
ics拡張子のファイルはiCalendarというカレンダーアプリ用のデータ形式のファイルとみなされます。
そのためhosts.icsをダブルクリックで開こうとすると、Outlookなどのアプリで開かれてしまう可能性があります。
hosts.icsの中身はテキストのため、確認したい場合はメモ帳などで開くことをおすすめします。
hosts.ics ファイルの手動変更は厳禁
hosts.ics ファイルには、以下の文章が記載されています。
# This file has been automatically generated for use by Microsoft Internet
# Connection Sharing. It contains the mappings of IP addresses to host names
# for the home network. Please do not make changes to the HOSTS.ICS file.
# Any changes may result in a loss of connectivity between machines on the
# local network.
【和訳】
# このファイルは、Microsoftインターネット接続共有(ICS)によって自動的に生成されました。
# ホームネットワーク上のホスト名とIPアドレスのマッピング情報が含まれています。
# HOSTS.ICSファイルは手動で変更しないでください。
# 変更を加えると、ローカルネットワーク上のマシン間の接続が失われる可能性があります。
文章によるとネットワーク接続に問題が生じる可能性があるため、手動で編集はしない方がよさそうです。
データの不整合が起きた場合の解決策の1つとしては、仮想マシンを再起動してhosts.icsを更新させることが挙げられます。
まとめ
Hyper-VのDefault Switchを接続した仮想マシンは再起動の度IPアドレスが変更されてしまうためバッチファイルなどで固定IPを指定した接続はできません。
しかし、mshome.net を付けた仮想マシンのホスト名とIPアドレスの関係が自動更新されるため、ホスト名.mshome.netとすることで接続が可能になることを解説しました。
本記事が皆様の開発の一助となれば幸いです。

