# Wifi on Ubuntu 18 _server_ ## TLDR 1. Install `wpasupplicant` 1. Turn on wifi radios: `sudo nmcli radio wifi on` 1. Check your devices are recognised even if they're not "managed": `sudo iwconfig` 1. Check your wifi (here called "wlp3s0") is capable of detecting nearby routers: `sudo iwlist wlp3s0 scan` 1. Configure `netplan` by dropping a file called `01-netcfg.yaml` into `/etc/netplan/` or edit existing file there. See example below. 1. `netplan try`, `netplan generate`, `netplan apply`. # The backstory I want to run Ubuntu *server* 18 on my laptop. This by default does not use X windows, so there is no desktop environment. It also by default does not enable wifi. Servers don't usually need wifi and desktop environments, right? Anyway, I want _both_ wifi and a desktop environment. I actually tried Ubuntu desktop with Gnome on this T420, but Firefox crashed several times, locking up the whole machine. Since I want the laptop to emulate a server environment for development I thought screw it, let's install Ubuntu server on here and just add a light desktop environment. ## ~~TODO~~ These items are no longer outstanding for me, since I got NetworkManager working including the XFCE desktop widget. ~~Outstanding items:~~ * ~~Add other wifi networks~~ * ~~Switch between networks~~ * ~~Get `nmtui` to display and switch between wifi networks~~ ## Install Ubuntu I'm using a Lenovo ThinkPad T420. On a Windows machine, I followed the instructions on the Ubuntu website for creating a bootable USB stick. On the T420 I had to go into the bios and move USB up the list so it would boot from the stick. Installation of Ubuntu was smooth, all went perfectly well. ## Install desktop environment There are plenty of choices, mine was: ``` sudo apt install xubuntu-desktop ``` ## Wifi Networks device not managed Imagine my delight when I first log into an X window session and realise that the laptop is not connected to the wifi/internet. ## Get wifi working This is based on a pretty poor understanding of what's going on. Here's what I guesstimate to be the situation. As of Ubuntu 17, networking is managed by either of two approaches: `NetworkManager` or `networkd`. Added to this, `netplan` is also used. See [netplan.io](netplan.io) `netplan` reads YAML config files and generates config files for `NetworkManager` or `networkd`, depending on your preferences. Also required, apparently, is `wpasupplicant`. Turn on wifi radios: ``` $ sudo nmcli radio wifi on $ sudo nmcli radio wifi enabled ``` Check your devices are all recognised, even if they're not currently being "managed": ``` $ sudo iwconfig lo no wireless extensions. enp0s25 no wireless extensions. wlp3s0 IEEE 802.11 ESSID:"my-router-name" Mode:Managed Frequency:2.412 GHz Access Point: 71:5F:58:2F:79:97 Bit Rate=58.5 Mb/s Tx-Power=15 dBm Retry short limit:7 RTS thr:off Fragment thr:off Power Management:off Link Quality=50/70 Signal level=-60 dBm Rx invalid nwid:0 Rx invalid crypt:0 Rx invalid frag:0 Tx excessive retries:12 Invalid misc:59 Missed beacon:0 ``` `wlp3s0` is the wifi device in my laptop. If yours doesn't appear.... good luck with that. Maybe try `ifconfig up wlp3s0` Check your wifi is capable of detecting nearby routers: ``` $ sudo iwlist wlp3s0 scan wlp3s0 Scan completed : Cell 01 - Address: 70:4F:57:3F:78:87 Channel:1 Frequency:2.412 GHz (Channel 1) Quality=50/70 Signal level=-60 dBm Encryption key:on ESSID:"my-router-name" ... ``` Again, if your output is different here, good luck! Configure netplan: My `/etc/netplan/01-netcfg.yaml` looks like this, note that it renders config files for `NetworkManager`. This should enable the network widget in the XFCE desktop. If this doesn't work, you can try `renderer: networkd`. That's fine, but the desktop widget will not work, and you'll need to use the command line to view and connect to networks. In this case, running `sudo netplan try` followed by `sudo netplan apply` seems to reliably re-connect to known networks if connection is lost. (Connections are lost very easily, e.g. on waking from sleep.) ```yaml # This file describes the network interfaces available on your system # For more information, see netplan(5). network: version: 2 # renderer: networkd renderer: NetworkManager wifis: wlp3s0: dhcp4: yes access-points: "my-router-name": password: "" "some-other-router": password: "plain-text-password" "Public Hotspot With No Password": {} ``` Do not be distracted by `/etc/network/interfaces`! Mine looks like this, note what the comments say, and note that there is nothing else in apart from the comments, i.e. it does nothing: ``` # 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 ``` `ifupdown` is not on my system. Running this seemed to get things working: ``` sudo su - netplan apply service network-manager restart ``` This is confusing. The `netplan` config file renders for `networkd` yet restarting the `network-manager` seems to apply the netplan changes to NetworkManager. At some point I think I also restarted the `wpa_supplicant` service: ``` sudo su - service wpa_supplicant restart ``` As of now the wifi is working perfectly. I have not yet rebooted. I notice that the wifi indicator panel in XFCE still says "WiFi Networks device not managed", but I think that's because it's checking with `NetworkManager`, which is not being used. ## Other nonsense Much random stabbing in the dark was involved, including the following, I have little idea if these were necessary but this is what Google led me to do: ``` rfkill unblock wifi systemctl disable systemd-networkd-wait-online.service systemctl mask systemd-networkd-wait-online.service ``` Useful stuff for debugging: ``` root@at420:~# service netplan-wpa@wlp3s0 status ● netplan-wpa@wlp3s0.service - WPA supplicant for netplan wlp3s0 Loaded: loaded (/lib/systemd/system/netplan-wpa@.service; indirect; vendor preset: enabled) Active: active (running) since Sat 2018-06-30 11:41:10 BST; 32min ago Main PID: 2971 (wpa_supplicant) Tasks: 1 (limit: 4390) CGroup: /system.slice/system-netplan\x2dwpa.slice/netplan-wpa@wlp3s0.service └─2971 /sbin/wpa_supplicant -c /run/netplan/wpa-wlp3s0.conf -iwlp3s0 Jun 30 11:41:10 t420 systemd[1]: Started WPA supplicant for netplan wlp3s0. Jun 30 11:41:10 t420 wpa_supplicant[2971]: Successfully initialized wpa_supplicant Jun 30 11:41:14 t420 wpa_supplicant[2971]: wlp3s0: SME: Trying to authenticate with 71:5F:58:2F:79:97 (SSID='' freq=2412 MHz) Jun 30 11:41:14 t420 wpa_supplicant[2971]: wlp3s0: Trying to associate with 71:5F:58:2F:79:97 (SSID='' freq=2412 MHz) Jun 30 11:41:14 t420 wpa_supplicant[2971]: wlp3s0: Associated with 71:5F:58:2F:79:97 Jun 30 11:41:14 t420 wpa_supplicant[2971]: wlp3s0: CTRL-EVENT-SUBNET-STATUS-UPDATE status=0 Jun 30 11:41:14 t420 wpa_supplicant[2971]: wlp3s0: WPA: Key negotiation completed with 71:5F:58:2F:79:97 [PTK=CCMP GTK=TKIP] Jun 30 11:41:14 t420 wpa_supplicant[2971]: wlp3s0: CTRL-EVENT-CONNECTED - Connection to 71:5F:58:2F:79:97 completed [id=0 id_str=] ``` ``` service wpa_supplicant status ● wpa_supplicant.service - WPA supplicant Loaded: loaded (/lib/systemd/system/wpa_supplicant.service; enabled; vendor preset: enabled) Active: active (running) since Sat 2018-06-30 11:27:51 BST; 49min ago Main PID: 1135 (wpa_supplicant) Tasks: 1 (limit: 4390) CGroup: /system.slice/wpa_supplicant.service └─1135 /sbin/wpa_supplicant -u -s -O /run/wpa_supplicant Jun 30 11:27:50 t420 systemd[1]: Starting WPA supplicant... Jun 30 11:27:51 t420 wpa_supplicant[1135]: Successfully initialized wpa_supplicant Jun 30 11:27:51 t420 systemd[1]: Started WPA supplicant. ```