如何替 Multipass 建立的 VM 設定一組固定 IP 地址 | The Will Will Web

The Will Will Web

記載著 Will 在網路世界的學習心得與技術分享

如何替 Multipass 建立的 VM 設定一組固定 IP 地址

雖然透過 Multipass 建立 Ubuntu VM 相當便利,但是若要設定一組固定 IP 地址卻相對困難,我最近因為想要在家裡架一台 VM 起來,讓我的在同一個區域網路上的筆電也可以順利連上我的 VM,這篇文章我將來說明我的設定方法。

  1. 建立一個 Hyper-V 的外部網路交換器 (External Virtual Switch)

    以下命令請以系統管理員身份開啟 PowerShell 執行:

    Import-Module Hyper-V
    
    # 取得擁有連線的實體網路介面
    $adapter = Get-NetAdapter -Physical | where { $_.Status -eq 'Up' }
    
    # 如果超過一張連線的實體網路介面就取用第一張網路介面
    if ($adapter.Count -gt 1) {
        $adapter = $adapter[0]
    }
    
    # 取得目前設定 External 的虛擬交換器 (Virtual Switch)
    $externalSwitch = Get-VMSwitch -SwitchType External
    
    # 如果沒有 External 的虛擬交換器就建立一個新的 (LANBridge)
    if ($externalSwitch -eq $null) {
        $externalSwitch = New-VMSwitch -Name 'LANBridge' -NetAdapterName $adapter.Name -AllowManagementOS $true
    }
    
    $networkName = $externalSwitch.Name
    
  2. 檢查 Multipass 可用的網路清單

    接著上一個步驟,你應該會看到名為 LANBridge 的網路

    multipass networks --format yaml
    
  3. 設定預設的 Bridge 網路名稱 (LANBridge)

    multipass set local.bridged-network=$networkName
    
  4. 透過 multipass 建立虛擬機器 (vm1) 並指定網路與設定一張手動的網路介面

    multipass launch --name 'vm1' --bridged --network "name=${networkName},mode=manual"
    
  5. 查詢網路介面資訊 (包含 IP 資訊)

    multipass exec 'vm1' -- ip -br address show scope global
    

    此時你應該會看到三張網路介面:

    eth0             UP             172.29.217.133/20
    eth1             UP             192.168.1.12/24
    eth2             DOWN
    

    這裡的 eth0Multipass 內部使用的網路介面,這個 IP 地址每次 VM 重開機都會變更。

    而這個 eth1 的 IP 為 Bridge 網路透過區域網路的 DHCP Server 自動取得的 IP 地址。

    最後的 eth2 則是啟動過程透過 --network 指定的手動網路介面,你必須自行設定網路介面。

  6. 手動調整 VM 的固定 IP 地址

    編輯 /etc/netplan/50-cloud-init.yaml 網路設定:

    multipass exec 'vm1' -- sudo vi /etc/netplan/50-cloud-init.yaml
    

    原本的設定長這樣:

    network:
        ethernets:
            default:
                dhcp4: true
                match:
                    macaddress: 52:54:00:5d:5b:6e
            extra0:
                dhcp4: true
                dhcp4-overrides:
                    route-metric: 200
                match:
                    macaddress: 52:54:00:5d:49:8e
                optional: true
        version: 2
    

    加入 eth2 網路介面設定後的檔案內容長這樣:

    network:
        ethernets:
            default:
                dhcp4: true
                match:
                    macaddress: 52:54:00:5d:5b:6e
            extra0:
                dhcp4: true
                dhcp4-overrides:
                    route-metric: 200
                match:
                    macaddress: 52:54:00:5d:49:8e
                optional: true
            eth2:
                addresses: [192.168.1.101/24]
                gateway4: 192.168.1.1
                nameservers:
                   addresses: [168.95.1.1, 8.8.8.8]
        version: 2
    
  7. 透過「重新開機」套用網路更新

    multipass exec 'vm1' -- sudo reboot
    

    我有試過用 sudo netplan apply 套用網路變更,但是每次都會等到 Timeout 才回應,所以才用重開機套用快多了!

  8. 查詢網路介面資訊 (包含 IP 資訊)

    multipass exec 'vm1' -- ip -br address show scope global
    

    此時你應該會看到三張網路介面:

    eth0             UP             172.29.217.133/20
    eth1             UP             192.168.1.12/24
    eth2             UP             192.168.1.101/24
    

    其中 eth2192.168.1.101 就會是一個固定的 IP 地址!👍

相關連結