かつて山市良と呼ばれたおじさんのブログ

セイテクエンジニアのブログ  かつて山市良と呼ばれたおじさんのブログ  メモ. Hyper-V上のLinuxゲストの最適化

 

 

メモ. 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ゲストでもサポートされます。

 

Linuxカーネルに組み込まれるHyper-Vゲストコンポーネント

 

 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はかなり前からある機能ですが、あまり知っている人はいないかもしれません。その他の機能な、仮想マシンの操作や設定のどこかで、必ず恩恵を受けているはずです。

 

  • Hyper-V Data Exchange Service ・・・ KVP(Key Value Pair、キーと値のペア)データ交換サービスのサポート。Hyper-Vホストからゲストの情報(IPアドレスや統合サービスのバージョンの取得)の取得(Microsoft Learn)、Hyper-VレプリカのフェールオーバーTCP/IP(Microsoft Leaern)を実現。
  • Hyper-V Guest Service Interface ・・・ ゲストサービスのサポート。Hyper-VホストからゲストへのCopy-VMFile(Microsoft Learn)による仮想マシンバス(VMBus)を介したファイルコピー。
  • Hyper-V Guest Shutdown Service ・・・ シャットダウン連携のサポート。
  • Hyper-V Heartbeat Service ・・・ ハートビートのサポート。
  • Hyper-V PowerShell Direct Service ・・・ PowerShell Direct(Microsoft Learn)によるHyper-Vホストからゲストへの接続のサポート。
  • Hyper-V Time Synchroniation Service ・・・ 時刻同期のサポート。
  • Hyper-V ボリューム シャドウ コピー リクエスター ・・・ ボリュームスナップショットサービス(VSS)バックアップのサポート。
  • Hyper-V リモートデスクトップ仮想サービス ・・・ 仮想マシン接続(vmconnect.exe)でのリモートデスクトッププロトコル(RDP)ベースの拡張セッションモードのサポート。

 

画面1
画面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)。

 

  • hv_vmbus ・・・ 仮想マシンバス(VMBus)のサポート。
  • hv_ntvsc ・・・ 統合デバイスタイプのネットワーク用VSCドライバー。
  • hv_storevsc ・・・ 統合デバイスタイプのストレージ用VSCドライバー、SCSIディスクのホットアド、オンライン拡張(VHDX)、仮想SANのサポートを含む。
  • hv_balloon ・・・ 動的メモリ(ホットアドおよびばるーニング)のサポート。
  • hv_utils ・・・ シャットダウン連携、時刻同期、ハートビート、KVPデータ交換サービス、KVP IPインジェクション(Hyper-VレプリカにおけるフェールオーバーTCP/IP)。
  • hyperv_keyboard ・・・ 統合デバイスタイプのキーボードドライバー。
  • hid_hyperv ・・・ 統合デバイスタイプ、マウス統合(ホスト、ゲスト間の移動)対応のマウスドライバー。
  • hyperv_fb ・・・統合デバイスタイプの フレームバッファービデオドライバー。
  • hyperv_drm ・・・ hyperv_fbベースのDRM(Direct Rendering Manager)ビデオドライバー。GNOMEおよびWaylandのサポート強化のために比較的最近追加されたらしい。

 

 Hyper-V上のLinuxゲストの機能については、初期の頃から旧ブログで積極的に実験してきました。さらに古くは、Microsoft Virtual Server/Virtual PC上のLinux VMにおけるVMAdditions for Linuxのビルド(ソースコードのmake)からの長い付き合いです。現在は最新情報を追いかけていませんが、大きな変更はないようです。今回は過去の経験を思い出しながら(旧ブログを見返しながら)、最近のバージョンのUbuntuで確認したことをメモします。

 

画面2

画面2 Hyper-V上のLinuxゲストでは、Linuxカーネルに標準で組み込まれているHyper-V対応のモジュールが自動的にインストールされる

 

仮想マシン接続(vmconnect)のディスプレイ画面解像度の調整

 

 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
画面3 「/etc/default/grub」にHyper-Vフレームバッファービデオドライバーの設定を書き込み、設定を反映して(update-grub)から再起動する

 

画面4
画面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
画面5 Ubuntu22.04 LTSの場合、「/etc/default/grub」にさらに"module_blacklist=hyperv_drm"を追加することで、解像度の変更(この例では640×480)ができた

 

Ubuntuゲストでの拡張セッションモードの利用について

 

 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を拡張セッションモードに対応させることができるようです。しかし、メンテナンスされていない以上、お勧めしません。自分で対応させるには、少し努力が必要です。

 

linuxic_scr06
画面6 Windows 10/11 Hyper-Vの「クイック作成」ギャラリーから作成したUbuntu DesktopのVMは、拡張セッションモードを既定で利用可能。Windowsゲストと同様に、ドライブのリダイレクトや全画面表示をサポート

 

KVPデータ交換、VSSバックアップ、ゲストサービスへの対応

 

 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
$ sudo apt install linux-cloud-tools-common linux-cloud-tools-generic
$ reboot

# (以下はサービスの状態確認)
$ sudo systemctl status hv-kvp-daemon.service

$ sudo systemctl status hv-vss-daemon.service
$ sudo systemctl status hv-fcopy-daemon.service

 

画面7
画面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のセキュアブート機能をサポートしていないことに留意してください。

blog_subscribe

blog_comment

最新記事