前言

以前 Ubuntu 修改網路卡設定時大部分都是透過修改 /etc/network/interfaces 後執行 ifdownup 即可,Ubuntu 自 17.10 版後將預設的網路卡管理工具變更為 Netplan,設定檔內容採用 YAML 格式進行設定,風格上其實並沒有差太多,轉換過程中沒有什麼太大的問題,如果需要開發自動化管理系統,有 Netplan 的話應該是可以省下一些時間,Netplan 的導入個人是樂見其成。

系統升級後設定檔遺失

今天在工作時將一台 Ubuntu Server 從 16.04 升級到 18.04 後發現無法連線,估計是升級時不小心全部覆蓋,而系統升級後將舊的網路卡管理套件直接幹掉並切換到 Netplan,記得先前升級其他台 server 時系統會保留舊的設定,並不會自動切換過去,其實也還好就重新設定,但是系統有把 /etc/netplan 建好了,但是並沒有出現預設的 50-cloud-init.yaml 設定檔。

解決方式

把關鍵字餵狗後竟然找不到相關的文章(教學倒是一堆),除了照著網路上的範例設定照著 key 之外,還有一個方法可以嘗試。大部分套件在安裝時一定會有說明文件一同安裝進系統,透過 dpkg -L {套件名稱} 可以列出與套件有關的所有目錄與檔案路徑。

dpkg -L netplan.io

/.
/etc
/etc/netplan
/lib
/lib/netplan
/lib/netplan/generate
/lib/systemd
/lib/systemd/system
/lib/systemd/system/[email protected]
/lib/systemd/system-generators
/usr
/usr/sbin
/usr/share
/usr/share/bash-completion
/usr/share/bash-completion/completions
/usr/share/bash-completion/completions/netplan
/usr/share/doc
/usr/share/doc/netplan.io
/usr/share/doc/netplan.io/changelog.gz
/usr/share/doc/netplan.io/copyright
/usr/share/doc/netplan.io/examples
/usr/share/doc/netplan.io/examples/bonding.yaml
/usr/share/doc/netplan.io/examples/bonding_router.yaml
/usr/share/doc/netplan.io/examples/bridge.yaml
/usr/share/doc/netplan.io/examples/bridge_vlan.yaml
/usr/share/doc/netplan.io/examples/dhcp.yaml
/usr/share/doc/netplan.io/examples/direct_connect_gateway.yaml
/usr/share/doc/netplan.io/examples/loopback_interface.yaml
/usr/share/doc/netplan.io/examples/network_manager.yaml
/usr/share/doc/netplan.io/examples/source_routing.yaml
/usr/share/doc/netplan.io/examples/static.yaml
/usr/share/doc/netplan.io/examples/static_multiaddress.yaml
/usr/share/doc/netplan.io/examples/static_singlenic_multiip_multigateway.yaml
/usr/share/doc/netplan.io/examples/vlan.yaml
/usr/share/doc/netplan.io/examples/windows_dhcp_server.yaml
/usr/share/doc/netplan.io/examples/wireless.yaml
/usr/share/doc/netplan.io/netplan.html
/usr/share/man
/usr/share/man/man5
/usr/share/man/man5/netplan.5.gz
/usr/share/man/man8
/usr/share/man/man8/netplan-apply.8.gz
/usr/share/man/man8/netplan-generate.8.gz
/usr/share/man/man8/netplan-try.8.gz
/usr/share/netplan
/usr/share/netplan/netplan
/usr/share/netplan/netplan/__init__.py
/usr/share/netplan/netplan/cli
/usr/share/netplan/netplan/cli/__init__.py
/usr/share/netplan/netplan/cli/commands
/usr/share/netplan/netplan/cli/commands/__init__.py
/usr/share/netplan/netplan/cli/commands/apply.py
/usr/share/netplan/netplan/cli/commands/generate.py
/usr/share/netplan/netplan/cli/commands/ip.py
/usr/share/netplan/netplan/cli/commands/migrate.py
/usr/share/netplan/netplan/cli/commands/try_command.py
/usr/share/netplan/netplan/cli/core.py
/usr/share/netplan/netplan/cli/utils.py
/usr/share/netplan/netplan/configmanager.py
/usr/share/netplan/netplan/terminal.py
/usr/share/netplan/netplan.script
/lib/systemd/system-generators/netplan
/usr/sbin/netplan

可以看到在 /usr/share/doc/netplan.io/examples/ 下有範例設定檔,直接 copy 一份比較符合需求的設定檔到 /etc/netplan 並修改即可。

sudo cp /usr/share/doc/netplan.io/examples/static.yaml /etc/netplan/50-cloud-init.yaml

記得先查詢你的網路卡介面名稱,然後修改範例設定檔中的網路卡名稱。查詢方式有三種

  1. ip a

    1: lo:  mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
        inet 127.0.0.1/8 scope host lo
           valid_lft forever preferred_lft forever
        inet6 ::1/128 scope host
           valid_lft forever preferred_lft forever
    2: ens160:  mtu 1500 qdisc mq state UP group default qlen 1000
        link/ether 00:0c:29:16:d4:1b brd ff:ff:ff:ff:ff:ff

  2. networkctl

    IDX LINK             TYPE               OPERATIONAL SETUP
      1 lo               loopback           n/a         unmanaged
      2 ens160           ether              n/a         unmanaged

  3. ifconfig -a
    最廣為人知的指令,如果是舊系統升級應該都還可以使用,但如果是全新安裝的 Ubuntu 18 預設是沒有自帶的,這點需要注意。

    ens160: flags=4098  mtu 1500
            ether 00:0c:29:16:d4:1b  txqueuelen 1000  (Ethernet)
            RX packets 0  bytes 0 (0.0 B)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 0  bytes 0 (0.0 B)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
    
    lo: flags=73  mtu 65536
            inet 127.0.0.1  netmask 255.0.0.0
            inet6 ::1  prefixlen 128  scopeid 0x10
            loop  txqueuelen 1000  (Local Loopback)
            RX packets 416  bytes 26296 (26.2 KB)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 416  bytes 26296 (26.2 KB)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

改完後大概像這樣

network:
  version: 2
  renderer: networkd
  ethernets:
    ens160:
      addresses:
        - 192.168.2.160/24
      gateway4: 192.168.2.1
      nameservers:
          addresses: [1.1.1.1, 8.8.8.8]

最後執行 sudo netplan apply 套用即可。

留言