linux server設定開機自動連線WIFI

Hello_wshuo 發表於 2022-11-27
Linux

1.前言

之前買了一個工控機,裝過幾個OS(linux 發行版),但是一直沒有細研究過流程,只是停留在能用就不管了,工控機自帶無線網路卡(和倆個有線網口),所以這篇文章好好介紹如何開機自動連線WIFI(無圖形化介面)。

2.安裝軟體

首先系統我安裝的是 ubuntu 18.04 server版 ,安裝過程不必贅述。

要連線家裡的wifi,首先要知道家裡wifi的加密模式,是否為WEP模式。

無密碼/WEP模式可直接使用以下命令連線:

sudo iw dev wlan0 connect [網路 SSID]
sudo iw dev wlan0 connect [網路 SSID] key 0:[WEP 金鑰]

如果是WPA 或WPA2 需要安裝 wpasupplicant 軟體包

sudo apt install wpasupplicant

3.生成配置檔案

sudo wpa_passphrase [網路SSID] [KEY秘鑰] > /etc/wpa_supplicant.conf

4.連線WIFI

wpa_supplicant -s -i wlp3s0 -D nl80211,wext -c /etc/wpa_supplicant.conf

看到很多文章說 加 & 放到後臺執行,其實 wpa_supplicant -B 引數就是放到後臺去執行。

動態獲取ip地址:

dhclinet

驗證是否可以連線網路:

curl www.baidu.com

4.開機自動連線WIFI

修改 /etc/network/interfaces 檔案:

# ifupdown has been replaced by netplan(5) on this system.  See
# /etc/netplan for current configuration.
# To re-enable ifupdown on this system, you can run:
#    sudo apt install ifupdown
auto wlp3s0
iface wlp3s0 inet dhcp
wpa-conf /etc/wpa_supplicant.conf

可以看到這個配置檔案前面說明了ifupdown 工具已經被 netplan 替換掉了,如果使用 ifupdown 這個工具就需要安裝一下:

sudo apt install ifupdown

ifupifdown 命令會讀取 /etc/network/interfaces 進行設定:

ifup wlp3s0 #啟用wlp3s0 並連線wifi
ifdown wlp3s0 #關閉wlp3s0 

ifupifdown 命令也是透過服務來控制的:(/etc/systemd/system/network-online.target.wants/networking.service)

[Unit]
Description=Raise network interfaces
Documentation=man:interfaces(5)
DefaultDependencies=no
Wants=network.target
After=local-fs.target network-pre.target apparmor.service systemd-sysctl.service systemd-modules-load.service
Before=network.target shutdown.target network-online.target
Conflicts=shutdown.target

[Install]
WantedBy=multi-user.target
WantedBy=network-online.target

[Service]
Type=oneshot
EnvironmentFile=-/etc/default/networking
ExecStartPre=-/bin/sh -c '[ "$CONFIGURE_INTERFACES" != "no" ] && [ -n "$(ifquery --read-environment --list --exclude=lo)" ] && udevadm settle'
ExecStart=/sbin/ifup -a --read-environment
ExecStop=/sbin/ifdown -a --read-environment --exclude=lo
RemainAfterExit=true
TimeoutStartSec=5min

networking 這個服務是開機自啟服務,每次開機就會執行 /sbin/ifup -a --read-environment ,從而連線wifi。

5. 其它問題

A start job is running for wait for network to be Configured 開機卡住2分鐘左右。

很多文章也說過,修改/etc/systemd/system/network-online.target.wants/systemd-networkd-wait-online.service

#  SPDX-License-Identifier: LGPL-2.1+
#
#  This file is part of systemd.
#
#  systemd is free software; you can redistribute it and/or modify it
#  under the terms of the GNU Lesser General Public License as published by
#  the Free Software Foundation; either version 2.1 of the License, or
#  (at your option) any later version.

[Unit]
Description=Wait for Network to be Configured
Documentation=man:systemd-networkd-wait-online.service(8)
DefaultDependencies=no
Conflicts=shutdown.target
Requires=systemd-networkd.service
After=systemd-networkd.service
Before=network-online.target shutdown.target

[Service]
Type=oneshot
ExecStart=/lib/systemd/systemd-networkd-wait-online
RemainAfterExit=yes
TimeoutStartSec=2sec #其它文章加入的

[Install]
WantedBy=network-online.target

簡單來說 systemd-networkd-wait-online 這個服務可以檢查所有網路介面網路是否處於就緒狀態,如果沒就緒就會阻塞住,但是直接設定服務的 timeout時間並不是好的做法。

我們簡單執行一下 /lib/systemd/systemd-networkd-wait-online 這個命令:

[email protected]:~# /lib/systemd/systemd-networkd-wait-online --help
systemd-networkd-wait-online [OPTIONS...]

Block until network is configured.

  -h --help                 Show this help
     --version              Print version string
  -q --quiet                Do not show status information
  -i --interface=INTERFACE  Block until at least these interfaces have appeared
     --ignore=INTERFACE     Don't take these interfaces into account
     --timeout=SECS         Maximum time to wait for network connectivity
[email protected]:~# 

可以看到,這個命令是可以帶有一些引數的,-i 判斷指定的網路介面,不必判斷所有的網路介面,所以這地方我只有指定我連線wifi的網路介面就合理了:

ExecStart=/lib/systemd/systemd-networkd-wait-online -i wlp3s0