Hyper-V

From ArchWiki
Jump to navigation Jump to search

Hyper-V は Microsoft Windows の特定のエディションに含まれているハイパーバイザです。Arch Linux の仮想マシンを動作させることができます。一般的に Hyper-V はデスクトップとして使うことよりも企業における使用を想定して作られています。VirtualBox, Parallels, VMware などの一般消費者向けの VM プログラムにあるような便利で簡単なインターフェイスは付属していません。最新版の Windows 10 と Windows Server 2016 では Arch Linux を簡単に設定して互換性を高めるオプションがあります。インターネット接続共有 (ICS) をセットアップしなくても内部スイッチの NAT やマルチ NAT、ポートフォワーディングが使えます。Arch Linux では第2世代の仮想マシンが利用できます。

インストール

Windows Server 2008 以降の Windows や Pro エディションの Windows 8, 8.1, 10 には Hyper-V が付属しています。コントロールパネルの "Programs and Features" から "Turn Windows features on or off" で有効にできます。"Hyper-V" チェックボックスにチェックを入れて、変更を適用し、画面の指示に従ってください。

ネットワークの設定

最初に、仮想スイッチを設定して仮想マシンがインターネットに接続できるようにする必要があります。Hyper-V を有効にしたら、Hyper-V Manager を起動してください (検索するか、コマンドプロンプトから次のコマンドを実行してください):

%windir%\system32\mmc.exe "%windir%\system32\virtmgmt.msc"

仮想スイッチの設定

仮想マシンを既存のネットワークに接続するためには、内部ネットワークスイッチあるいは外部ネットワークスイッチ (仮想ネットワークアダプタ) を使用します。外部スイッチは既存のネットワークアダプタ (有線あるいは無線) のどれかに割り当てる (ブリッジする) 必要があります。内部スイッチではホストと仮想マシンの間のネットワーク接続をするのに外部ネットワークにアクセスする必要がありません。内部スイッチに NAT 機能を追加することで、ホストを仮想マシンに対するルーターとして仮想マシンから外部ネットワークにアクセスできるようになります。

Hyper-V マネージャ GUI では全てのネットワーク機能 (NAT 設定など) を設定することはできません。管理者権限で PowerShell を使うことで詳細な設定が可能になります。

外部スイッチ

右サイドバーの、"Virtual Switch Manager..." を選択します。ダイアログが開くので、左サイドバーの "New virtual network switch" を選択してください。"What type of virtual switch do you want to create?" から "External" を選び、"Create Virtual Switch" を選択してください。仮想スイッチに新しい名前を付けてください。"External network" から外部スイッチに紐付けるネットワークアダプタを選択します。

ネットワークが切断されると警告が表示されるので、続行してください。スイッチを設定するためにネットワークが一時的に切断されます。

上記の設定は (管理者権限で起動した) PowerShell で以下のコマンドを使っても設定できます:

# Get a list of the network adapters in the host. In a laptop you should typically see 'Ethernet' and 'Wi-Fi'
PS C:\WINDOWS\system32> Get-NetAdapter

# Create the external switch with a name of VM-External-Switch, bound to the network adapter named Wi-Fi retrieved from the previous command
PS C:\WINDOWS\system32> New-VMSwitch -Name "VM-External-Switch" -AllowManagementOS $True -NetAdapterName "Wi-Fi"

仮想マシンの Arch Linux で VM のネットワークアダプタとして外部スイッチを選択することで Windows ホストのネットワークアダプタが仮想マシンの eth0 インターフェイスにブリッジされます。Arch Linux の中では通常通りに (systemd-networkdnetctl を使って) 固定 IP アドレスまたは DHCP でインターフェイスを設定できます。外部ネットワークからは仮想マシンは別のホストとして扱われます。

例えば、Arch Linux 仮想マシンで固定 IP を使用する場合、Windows ホストが 192.168.0.100/24 なら、Arch Linux 仮想マシンのインターフェイスは 192.168.0.101/24 などと設定して、ゲートウェイと DNS サーバーはホストと同じに設定してください。

仮想マシンで DHCP を使用する場合、IP アドレスは外部ネットワークの DHCP ネットワークによって割り当てられます。

内部スイッチ

内部スイッチを作成する際も外部スイッチと手順は同じですが、仮想スイッチのタイプとして「内部スイッチ」を選ぶようにしてください。Windows 10 Anniversary Update (バージョン 1607, OS ビルド 14393) から、Hyper-V に内部スイッチのネイティブ NAT サポートが追加されています。古いバージョンでは、インターネット接続共有 (ICS) を使って内部スイッチで仮想マシンからネットワークにアクセスできるようにすることが可能です。

使用している Windows のバージョンを確認するには、コマンドプロンプトか PowerShell で以下のコマンドを実行:

> winver

PowerShell で以下のコマンドを使うことで内部スイッチを作成できます:

# Create the internal switch with a name of VM-Internal-Switch
PS C:\WINDOWS\system32> New-VMSwitch -Name "VM-Internal-Switch" -SwitchType Internal

# Verify that the internal switch was created
PS C:\WINDOWS\system32> Get-VMSwitch

# Get the ifIndex of the newly created internal switch, usually named 'vEthernet (name)'
PS C:\WINDOWS\system32> Get-NetAdapter

# Set the IP address of the internal switch, noting the ifIndex retrieved from the previous command.
# In this example, the network address of the internal switch is 192.168.3.0/24, and the ifIndex is 50.
PS C:\WINDOWS\system32> New-NetIPAddress -IPAddress 192.168.3.1 -PrefixLength 24 -InterfaceIndex 50

# The VMs using the internal switch must use static IP addresses, such as 192.168.3.2/24.
# Support for DHCP in internal switches is not included in current Windows versions (as of Version 1703, OS Build 15063).

上記のコマンドを実行すると、ホストと仮想マシンは同一の仮想ネットワーク (192.168.3.0/24) 上で互いに通信できるようになります。ただし NAT あるいは ICS を設定しないかぎり仮想マシンは外部ネットワークにアクセスできません。

Windows 10 ビルド 14393 以上では、以下のコマンドで内部スイッチの NAT とポートフォワーディングを設定できます:

# Create the NAT with IP address of the internal switch
PS C:\WINDOWS\system32> New-NetNat -Name "VM-NAT-Network" -InternalIPInterfaceAddressPrefix 192.168.3.1/24

# Verify that the NAT was created
PS C:\WINDOWS\system32> Get-NetNat

# Enable SSH port forwarding on port 2222 of any interface on the host, to a VM with an IP address of 192.168.3.2/24
PS C:\WINDOWS\system32> Add-NetNatStaticMapping -NatName "VM-NAT-Network" -Protocol TCP -ExternalIPAddress 0.0.0.0 -ExternalPort 2222 -InternalIPAddress 192.168.3.2 -InternalPort 22

# Verify that the port forward is active
PS C:\WINDOWS\system32> Get-NetNatStaticMapping

コマンドについて詳しくは Microsoft の NetNat ドキュメントを参照してください。

古いバージョンの Windows では、インターネット接続共有を使います。ネットワークと共有センターを開いて、アダプターの設定と変更で、使用しているインターネットアダプタのインターネット接続の共有を有効にしてください。接続を共有することができたら、先に作成した仮想スイッチをブリッジに追加します。

仮想マシンの作成

左サイドバーの "Hyper-V Manager" から "PC" を選択してください。そして右サイドバーの "New" > "Virtual Machine..." を選んでください。新しい仮想マシンのウィザードでは、大抵の設定を自由にすることができますが、一部には必ず設定しなければならない項目があります。

"Specify Generation" では "Generation 1" あるいは "Generation 2" のどちらかを選択できます。第1世代の仮想マシンは BIOS ベースのマシンとレガシーなポートをエミュレートします。第2世代の仮想マシンは UEFI ベースのマシンを提供します。互換性や移植性などが理由で第1世代を使わなくてはならない理由がないのであれば、通常は第2世代仮想マシンを使うようにしてください。また、Arch Linux 仮想マシンで第2世代を使うときは、仮想マシンの設定で Hardware -> Security から Secure Boot を無効にしてください。

Assign Memory の "Startup memory" では、Arch やプログラムが正しく動作するように十分なメモリを設定してください。

"Configure Networking" の "Connection" では、先に作成した仮想スイッチを選択してください。

"Connect Virtual Hard Disk" では、"Create a virtual hard disk" を選択して、"Size" が問題ないことを確認してください。仮想ハードディスクはスパースなため、仮想 OS が書き込んだものを保存するのに必要な分だけしか仮想ハードディスクは消費しません。

"Installation Options" では、"Install an operating system from a bootable CD/DVD-ROM" を選択してください。ディスクや USB デバイスから Arch をインストールする場合、"Media" から "Physical CD/DVD drive" を選んで、適切なドライブ文字を選択してください。ISO ファイルから Arch をインストールする場合、"Image file (.iso)" を選んで、"Browse..." ダイアログからファイルを選択してください。第2世代マシンの場合、物理的な CD/DVD ドライブからの起動はサポートされていません。

仮想マシンの設定

次に、VM の設定を行なってください。

仮想マシンには仮想プロセッサを追加することができます。仮想マシンからより多くのプロセッサコアを使えるようにすることで、多くのケースでパフォーマンスが向上します。仮想マシンで重い処理をする場合、搭載されているプロセッサコアの半分を割り当てると良いでしょう。仮想プロセッサの数を変更するには、左サイドバーの "Processor" を選択して、"Number of virtual processors" を変更してください。

設定を変更したら、"OK" で変更を適用して設定ダイアログを終了してください。

Arch のインストール

仮想マシンの設定を終えたら、Arch のインストールを行います。右サイドバーから、"Start" を選んで、"Connect..." を選択してください。接続ウィンドウが開きます。ネットワークは Arch のインストールメディアが立ち上がったときに自動的に機能します。返答が返ってくるアドレスで ping を実行して確認してください:

ping archlinux.org

レスポンスが返ってこない場合、接続がうまくいっていません。その場合、Microsoft によって既知とされているバグ を踏んでいる可能性があります。Knowledge Base ページに書かれているホットフィックスをインストールしてみるか、暫く待ってから再度試行してください。

Arch のインストールは他のシステムのインストールと大して変わりません。第1世代 VM は (UEFI ではなく) BIOS しか使えないため、ブートローダーをインストールする際は BIOS 特有の手順に従ってください。

インストール後の設定

Arch のインストールが完了したら、設定に移ります。

まず、VM をシャットダウンして、設定ダイアログを開いてください。左のサイドバーの "IDE Controller 1" にある "DVD Drive" を選択します。"Media" から "None" を選択してください。これで VM が毎回インストールメディアから起動しなくなります。

共有ディレクトリ

ホストとゲストでファイルを共有するのはとても簡単です。まず、ホスト側で、ゲストと共有したいフォルダを選択あるいは作成してください。そしてフォルダのプロパティダイアログを開いてください (alt + Enter あるいは右クリックして "Properties..." を選択)。"Sharing" タブを開いて "Advanced Sharing..." を選択してください。そして "Share this folder" チェックボックスにチェックを入れます。デフォルトでは、フォルダは読み取り専用パーミッションになるため、VM からフォルダを読み込むことはできますが書き込むことはできません。パーミッションを変更したい場合、"Permissions" を選択してください。そこで、どのユーザーが共有フォルダにアクセスできるのか、そしてどのパーミッションを割り当てるのかを設定できます。双方向にファイルを共有したい場合、"Change" と "Read" 両方の "Allow" にチェックを入れてください。共有フォルダのプロパティダイアログを終了する前に、フォルダの "Network Path" を確認してください。ネットワークパスは \\computer name\folder name という形式になります。

次に、ホストの IP アドレスを確認してください。プロパティダイアログを終了して、コマンドプロンプトか PowerShell を開きます。ipconfig を実行してください。先に作成した仮想スイッチの名前が含まれているエントリが確認できるはずです (例: Ethernet adapter vEthernet (New Virtual Switch))。仮想スイッチのエントリの下に出力された、IPv4 Address を確認してメモしてください。

そして、Arch から共有フォルダをマウントします。VM を起動してください。Arch が起動したら、CIFS 共有をマウントするための cifs-utils をまずインストールします (CIFS は Windows の共有フォルダで使われているプロトコルです)。その後、共有フォルダをマウントする場所を決めてください。/mnt/Hyper-V など、/mnt 内のディレクトリにすることを推奨します。¥

以下が共有フォルダをマウントするコマンドです。先に確認したネットワークパスのバックスラッシュはスラッシュに置き換えてください:

# mount -t cifs [Network Path with forward slashes] mountpoint -o user=[user you wish to authenticate as],ip=[host IP noted earlier]

認証するユーザーのパスワードが要求されます。コマンドオプションの password=password を使ってパスワードを指定することもできますが、コマンド履歴ファイルにホストのパスワードが残ってしまうためセキュリティ上よろしくありません。また、スクリプトからコマンドを実行する場合、パスワードをスクリプト内に保存することになります。パスワードを直書きする代わりの方法として、credentials ファイルを使用することができます。ファイル内にユーザー名とパスワードを記入して、ファイルのアクセス権限を制限することが可能です。ファイルの名前は何でもかまいません。例えば、.credentials という名前でホームディレクトリに保存する場合、以下のようになります:

~/.credentials
username=username
password=password

ファイルを作成したら、パーミッションを変更して読み取り権限を制限します:

# chmod 600 ~/.credentials

そして mount コマンドに credentials オプションを追加します: credentials=~/.credentials。これで、共有フォルダをマウントするとき、自動的にユーザー名とパスワードが指定されます。

例えば、具体的に、ネットワークパスが \\PC\share の共有ディレクトリを /mnt/Hyper-V にマウントする場合、ホストのユーザー名が "John" でホストの IP アドレスが 198.123.151.23 なら、マウントコマンドは以下のようになります:

# mount -t cifs //PC/share /mnt/Hyper-V -o credentials=~/.credentials,ip=198.123.151.23

この方法の問題点として、ホストの IP アドレスが変わってしまった場合 (DHCP で動的に IP アドレスが割り当てられていたり、新しいネットワークに移行した場合など)、ゲスト側でホストの IP アドレスを毎回書き換える必要があります。しかしながら、smbclient パッケージに含まれている nmblookup ユーティリティを使用することで、SMB ホストに関連付けられている IP アドレスを確認することが可能です。上記の例の場合、以下のようになります:

nmblookup PC
198.123.151.23 PC<00>

IP アドレスだけが欲しい場合、headcut を使って抽出することができます:

nmblookup PC | head -n 1 | cut -d ' ' -f 1
192.123.151.23

さらに mount コマンドで使用する IP アドレスを上のコマンドで置き換えることができます:

# mount -t cifs //PC/share /mnt/Hyper-V -o credentials=~/.credentials,ip="$(nmblookup PC | head -n 1 | cut -d ' ' -f 1)"

起動時に自動的にマウントするなど、共有フォルダをマウントする方法は他にも存在します。詳しくは Samba の記事を参照してください。

Xorg

グラフィカルなプログラムは xf86-video-fbdev パッケージで Xorg を使うことで簡単に実行できます。パッケージをインストールしたら適当なウィンドウマネージャやデスクトップ環境を使ってください。X の起動に問題は発生しないはずです。