/etc/netplan/50-cloud-init.yaml not found

前言

以前 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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
/.
/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 並修改即可。

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

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

  1. ip a

    1
    2
    3
    4
    5
    6
    7
    8
    
    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

    1
    2
    3
    
    IDX LINK             TYPE               OPERATIONAL SETUP
      1 lo               loopback           n/a         unmanaged
      2 ens160           ether              n/a         unmanaged
    
  3. ifconfig -a 最廣為人知的指令,如果是舊系統升級應該都還可以使用,但如果是全新安裝的 Ubuntu 18 預設是沒有自帶的,這點需要注意。

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    
    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
    

改完後大概像這樣

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
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 套用即可。

comments powered by Disqus