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

セイテクエンジニアのブログ  かつて山市良と呼ばれたおじさんのブログ  vol.243 静的IPインジェクションのLinux向け代替策|Hyper-V 小技・裏技集

 

 

vol.243 静的IPインジェクションのLinux向け代替策|Hyper-V 小技・裏技集

2026年10月19日配信
2026年10月19日更新
執筆者:山内 和朗

 「Hyper-V小技・裏技集」シリーズでは、Hyper-Vの仮想環境を利用していて、知っていると便利な小技や裏技を紹介します。前回は、Hyper-Vが昔から備えている「静的IPインジェクション(Static IP Injection)」機能を紹介しましたが、この機能、Windowsゲストではうまく機能しますが、Linuxゲストでは機能しないことがあります。今回はその代替策を紹介。

 

PowerShellスクリプトによるUbuntu VMのIP設定

 

 前回説明したように、Linuxゲストに対してStatic IP Injectionが機能するためには、対象のVMで統合サービスの「データ交換」が有効になっていて、さらに対応するディストリビューションおよびバージョンであることと、hv-kvp-daemon(linux-cloud-tools-*)またはhypervkvpd(hyperv-daemons)の導入が必要です。しかし、すべての条件を満たしていても、必ず期待通りに動作するというわけではありません。前回はAlmalinux 9.xで動作を確認しましたが、Almalinux 10.xでは成功しませんでした。また、UbuntuはStatic IP Injectionに対応しており、古いバージョンでは問題なく動作していましたが、最近のバージョンでは動作を確認できませんでした(Static IP Injectionと互換性のないNetwork Managerの有無に関係なく)。

 

 そこで、Copy-VMFileとSSH Remoting(vol.237を参照)を使用して、PowerShellスクリプトをリモート実行してIPアドレスを設定する代替策を考えました。なお、SSH Remotingのためには、Hyper-VホストとLinux VMの両方にPowerShell 6以降が必要で、Linux VM側のOpen SSH ServerでSSH Remotingの設定と、sudo pwshをパスワードなしで実行できるようにするための設定(sudo visudoによるsudoersの編集)の設定が必要です。

 

 次の「Set-UbuntuIP.ps1」は、UbuntuのローカルのPowerShell(pwsh)で-Interface、-IPAddress、-PrefixLength、-Gateway、-DNSServersの各パラメーターを指定して実行することで、ネットワーク周りの設定を変更します。このスクリプトは、SSH Remotingを使用してネットワーク経由でリモートから実行することを想定しています。つまり、ネットワーク設定の変更でSSH Remotingの接続が切断されることを想定し、netplanの適用を2秒後にスケジューリングしてから終了するようにしています。

 

[Set-UbuntuIP.ps1](プレーンテキストでダウンロード)

param(
    [Parameter(Mandatory)]
    [string]$Interface,
    [Parameter(Mandatory)]
    [string]$IPAddress,
    [Parameter(Mandatory)]
    [int]$PrefixLength,
    [Parameter(Mandatory)]
    [string]$Gateway,
    [string]$DnsServers = @("8.8.8.8", "1.1.1.1")
)

$ErrorActionPreference = "Stop"

# check root
if ((id -u) -ne 0) {
    throw "You have to run 'sudo pwsh'!"
}

# check NIC
$NicExists = Test-Path "/sys/class/net/$Interface"
if (-not $NicExists) {
    throw "NIC interface '$Interface' does not exist."
}

# Netplan conf
$NetplanFile = "/etc/netplan/99-static-ip.yaml"

# DNSList to yaml
$DnsServersArray = @(
    $DnsServers -split ',' |
    ForEach-Object { $_.Trim() } |
    Where-Object { $_ -ne "" }
)

$DnsList = ($DnsServersArray | ForEach-Object {
    '"' + $_ + '"'
}) -join ', '

Write-Host "DnsServers raw: $DnsServers"
Write-Host "DnsServersArray:"
$DnsServersArray | ForEach-Object { Write-Host "  [$_]" }
Write-Host "DnsList: $DnsList"

$Yaml = @"
network:
  version: 2
  renderer: networkd
  ethernets:
    ${Interface}:
      dhcp4: false
      addresses:
        - $IPAddress/$PrefixLength
      routes:
        - to: default
          via: $Gateway
      nameservers:
        addresses: [$DnsList]
"@

Write-Host "=== Current configuration ==="
& ip -br addr show $Interface
& ip route

Write-Host ""
Write-Host "Writing: $NetplanFile"

$Yaml | Set-Content `
    -Path $NetplanFile `
    -Encoding utf8NoBOM

# Only rootc can view
& chmod 600 $NetplanFile

Write-Host ""
Write-Host "=== Netplan configuration ==="
Get-Content $NetplanFile

# Check Netplan conf
Write-Host ""
Write-Host "Validating Netplan..."
& netplan generate

if ($LASTEXITCODE -ne 0) {
    throw "Failed: netplan generate."
}

# Apply Netplan
#Write-Host "Applying Netplan..."
#& netplan apply
#
#if ($LASTEXITCODE -ne 0) {
#    throw "Failed: netplan apply."
#}
Write-Host "Scheduling netplan apply..."

& /usr/bin/systemd-run `
    --unit=netplan-apply-once `
    --on-active=2s `
    /usr/sbin/netplan apply

if ($LASTEXITCODE -ne 0) {
    throw "Failed to schedule netplan apply."
}

Write-Host "Netplan apply scheduled. Disconnecting..."
exit 0

 

Copy-VMとSSH Remotingによるスクリプトのリモート実行

 

 PowerShellスクリプト「Set-UbuntuIP.ps1」をHyper-Vホスト側で用意し、次のようにCopy-VMFile(VMの統合サービスの「ゲストサービス」が有効で、Linux側にhv-fcopy-daemonまたはhypervfcopydが必要)を使用してHyper-VホストからLinuxゲストにスクリプトをコピーし、SSH Remotingを使用して「Set-UbuntuIP.ps1」を適切なパラメーター付きで実行します(画面1)。

 

Copy-VMFile -Name "VM名" -SourcePath ".\Set-UbuntuIP.ps1" -DestinationPath "/tmp" -FileSource Host -Force

Invoke-Command -Hostname "ホスト名またはIPアドレス" -UserName ユーザー名 -ScriptBlock {

    sudo pwsh -File /tmp/Set-UbuntuIP.ps1 -Interface eth0 -IPAddress IPアドレス `
        -PrefixLength サブネットのプレフィックス長 `

        -Gateway デフォルトゲートウェイのIPアドレス `
        -DNSServers 'DNSサーバー1,DNSサーバー2のIP'

}

 

画面1 Copy-VMFileとSSH Remotingを使用した、PowerShellスクリプトによるLinux VM(Ubuntu)のネットワーク設定の変更

画面1 Copy-VMFileとSSH Remotingを使用した、PowerShellスクリプトによるLinux VM(Ubuntu)のネットワーク設定の変更

 

リファレンス(Microsoft Learn):

Copy-VMFile(Hyper-V)|SSH Remoting(PowerShell)

 

Hyper-V 小技・裏技集 (1)|(2)|(3)|(4)|(5)|(6)|(7)|(8)|(9)|(10)|(11)|(12)

blog_yamanxworld_subscribe

blog_yamanxworld_comment

blog_yamanxworld_WP_ws2025

最新記事