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 地址!👍

相關連結