セイテクエンジニアのブログ かつて山市良と呼ばれたおじさんのブログ メモ. Hyper-V上のLinuxゲストの最適化
2024年07月26日配信
2024年10月17日更新
執筆者:山内 和朗
以前、「メモ. 手間はかかるが金いらずのV2V: VMwareのLinux VMをHyper-Vへ (その1、その2)」を取り上げましたが、Linux VMをHyper-Vに移行してからの最適化についてメモしておきます。
LinuxゲストをHyper-V上で実行する場合、何が最適化されるのか、最初に行ってしまうと、Windowsゲストで利用可能な「統合サービス」は、一部の機能(例えば、PowerShell Direct)を除いてすべてLinuxゲストでもサポートされます。
Hyper-V上でWindowsゲストを実行する場合、Hyper-Vに最適化されたゲストコンポーネント(VSC、Virtual Service Client)であるドライバーやサービスが最初から組み込まれており、何も追加しなくれもHyper-Vホスト側のホストコンポーネント(VSP、Virtual Service Provider)と連携してHyper-V上で最適化されます。Hyper-V VMのWindowsゲストでは、ホスト側の統合サービスの有効/無効に応じて、以下のサービスが自動起動されます(画面1)。Windows VMに対するPowerShell Direct接続やCopy-VMfileはかなり前からある機能ですが、あまり知っている人はいないかもしれません。その他の機能な、仮想マシンの操作や設定のどこかで、必ず恩恵を受けているはずです。
画面1 Hyper-V上のWindowsゲストのゲストコンポーネント(VSC)
Hyper-VにおけるLinuxゲストおよびFreeBSDゲストへの対応は古く、Linuxカーネル3.3(2012年リリース)からは、それまで「Linux Integration Services for Hyper-V(Linux IS、Linux IC)」と呼ばれていたGPLv2版のゲストコンポーネントが、Linux標準のドライバーツリーにマージされています。そのため、Hyper-V VMでLinuxゲストをインストールすると、特に何もしなくても、基本的な統合サービス、例えばシャットダウン連携や時刻同期、マウス統合、動的メモリ、「統合(合成)デバイス(Synthetic Device)」とも呼ばれるHyper-Vに最適化されたデバイスの使用が可能になります。現在のLinuxカーネルでは、以下のモジュールが標準で組み込まれます(画面2)。
Hyper-V上のLinuxゲストの機能については、初期の頃から旧ブログで積極的に実験してきました。さらに古くは、Microsoft Virtual Server/Virtual PC上のLinux VMにおけるVMAdditions for Linuxのビルド(ソースコードのmake)からの長い付き合いです。現在は最新情報を追いかけていませんが、大きな変更はないようです。今回は過去の経験を思い出しながら(旧ブログを見返しながら)、最近のバージョンのUbuntuで確認したことをメモします。
画面2 Hyper-V上のLinuxゲストでは、Linuxカーネルに標準で組み込まれているHyper-V対応のモジュールが自動的にインストールされる
Hyepr-V上のLinuxゲストでは、「仮想マシン接続(vmconnect.exe)」の「基本セッションモード」で接続する際のディスプレイ解像度の変更が可能です。しかし、例えば、Ubuntu DesktopのGNOMEデスクトップの「ディスプレイの設定」を開いても、既定の解像度「1024×768」(以前は「1152×864」でした)から変更できないことに悩むかもしれません。
ディスプレイの解像度は、GRUBの設定ファイル「/etc/default/grub」で変更することが可能です。以下のコマンドラインを実行して、「/etc/default/grub」の「GRUB_CMDLINE_LINUX_DEFAULT=」の行に、"video=hyperv_fb:水平解像度x垂直解像度"を追加して解像度を指定し、設定を反映してから再起動します(画面3、画面4)。
$ sudo vi /etc/default/grub $ suto update-grub $ reboot |
画面3 「/etc/default/grub」にHyper-Vフレームバッファービデオドライバーの設定を書き込み、設定を反映して(update-grub)から再起動する
画面4 ディスプレイ設定の解像度が1280×1024に変更された
デスクトップ環境の場合は、ローカルディスプレイの最大解像度に設定することで、全画面表示が可能になります。一方、デスクトップを持たないサーバーの場合、既定の1024×768では大きすぎて、操作し辛いかもしれません。その場合は、"video=hyperv_fb:800x600"(XGA)や"video=hyperv_fb:640x480"(VGA)にするとよいでしょう。
しかし、Ubuntu 22.04 LTSでは、上記の方法で解像度を変更できないという問題に遭遇しました。いろいろと試した結果、Ubuntu 22.04 LTSが登場する少し前に追加された新しいモジュール「hyperv_drm」が悪さをしているのではと予想し、「GRUB_CMDLINE_LINUX_DEFAULT=」の行にさらに"module_blacklist=hyperv_drm"を追加してみたところ、設定を変更することができました(画面5)。Ubuntu 22.04 LTSや他のLinuxディストリビューションの一部のバージョンで、当時、GNOMEがフリーズするという問題があり、その場合、"module_blacklist=hyperv_fb"で回避できるという情報があったので、それを参考にしてみました。なお、これらの問題は、Ubuntu 24.04 LTSでは発生しません。
画面5 Ubuntu22.04 LTSの場合、「/etc/default/grub」にさらに"module_blacklist=hyperv_drm"を追加することで、解像度の変更(この例では640×480)ができた
Microsoftは“開発中の機能”として、2018年にUbuntu 18.04 LTSに対して、仮想マシン接続の拡張セッションモードを利用可能にする方法を公開しました。以下のブログで使用されているmicrosoft/linux-vm-toolsリポジトリ(https://github.com/Microsoft/linux-vm-tools.git)は数年前にアーカイブ状態となり、メンテナンスされていません。アーカイブされたリポジトリの説明にありますが、Windows 10/11 Hyper-Vの「クイック作成」ギャラリーのUbuntuイメージについては、今もなお、拡張セッションモードが既定で利用可能になっています(ただし提供されているのはUbuntu Desktop 22.04 LTSまで、画面6)。
Sneak Peek: Taking a Spin with Enhanced Linux VMs(Feb 28, 2018)|VirtualizationーTeam
上記の方法でも、アーカイブされたリポジトリのインストールスクリプトを利用してUbuntu 24.04 LTSを拡張セッションモードに対応させることができるようです。しかし、メンテナンスされていない以上、お勧めしません。自分で対応させるには、少し努力が必要です。
画面6 Windows 10/11 Hyper-Vの「クイック作成」ギャラリーから作成したUbuntu DesktopのVMは、拡張セッションモードを既定で利用可能。Windowsゲストと同様に、ドライブのリダイレクトや全画面表示をサポート
Hyper-V上のLinuxゲストでは、Hyper-V対応のモジュールが自動的に有効になりますが、Hyper-Vホストから利用できる統合サービスの一部は、それだけでは対応できません。
例えば、「Hyper-Vマネージャー」のVMの「ネットワーク」タブでは、Windowsゲストの場合、ゲストのIPアドレス(IPv4およびIPv6)とその状態(OKなど)を確認することができますが、LinuxゲストではIPアドレスを確認できないはずです。LinuxゲストでIPアドレスの情報を取得するには、KVPデータ交換サービスに対応した「hv_kvp_daemon(またはhypervkvpd)」がLinuxゲスト側に必要です。この他、VSSバックアップのためには「hv_vss_daemon(またはhypervvssd)」、ゲストサービスのためには「hv_fcopy_daemon(またはhypervfcopyd)」がLinuxゲスト側に必要です(画面7)。
これらのLinuxゲスト側のサービス(デーモン)の導入方法は、Linuxディストリビューションによって異なります。Ubuntuの場合、以下のコマンドラインを実行して、hv_kvp_daemon(hv-kvp-daemon.service)、hv_vss_daemon(hv-vss-daemon.service)、hv_fcoy_daemon(hv-fcopy-daemon.service)を追加することができます。なお、これらのサービスは、Hyper-V VMの設定で統合サービス「データ交換」「バックアップ(ボリューム シャドウ コピー)」「ゲスト サービス」を有効にすることで、開始状態になります。
$ sudo apt-get update # (以下はサービスの状態確認) |
画面7 Linuxゲスト側に「hv_kvp_daemon」を導入すると、ゲストのIPアドレスを取得できるようになる。また、「hv_fcopy_daemon」を導入し、Hyper-Vホスト側で「ゲストサービス」を有効にすると、ホストからゲストへファイルをコピーできるようになる
CentOS、Debian、Red Hat Enterprise Linux(RHEL)、Oracle Linuxの場合、hyperv-daemons(およびcloud-init)パッケージをインストールすることで、これらのサービスを導入することができるようです。SUSE Linux Enterprise Server(SLES)およびopen SUSEについては、追加のパッケージのインストールは不要のはずです。Ubuntu以外のLinuxディストリビューションについては、10年以上前に確認したきりですので、最新バージョンでもそうだとは限りません。あしからず。*1
参考:
Windows Server と Windows 上の Hyper-v がサポートされている Linux および FreeBSD 仮想マシン(Microsoft Learn)
旧ブログのLinux/Free BSDのHyper-V対応状況まとめ(注: 2015年2月の古い投稿です)
*1 追記(2024年10月17日):
RHEL、AlmaLinux、Oracle Linux、Debian、SLES、openSUSE、Kali Linux、FreeBSDについては、標準のインストールオプション(FreeBSD以外はGUIあり)でKVP、VSS、FCOPY(FreeBSDは非サポート)の各サービスが既定でインストールされることを確認しました(2024年10月時点の各ディストリビューションの最新バージョンにて確認)。そのため、追加でHyper-V用のパッケージをインストールする必要はありません。なお、Kali LinuxおよびFreeBSDはHyper-V VMのセキュアブート機能をサポートしていないことに留意してください。