Wi-Fi: Difference between revisions

From Alpine Linux
No edit summary
(minor adjustment for b43)
(44 intermediate revisions by 17 users not shown)
Line 1: Line 1:
This document describes how to set up a wireless network connection with WPA encryption.
This page describes how to set up a wireless network connection with WPA encryption.


First make sure your wireless drivers are loaded properly. (if you are using a '''Broadcom chipset''', see the [[#Broadcom_Wi-Fi_Chipset_Users|section at the bottom of this post]].)
Choose a wireless daemon between {{Pkg|iwd}} and {{Pkg|wpa_supplicant}}


Install {{Pkg|wireless-tools}} and {{Pkg|wpa_supplicant}}.
== Prerequisites ==
{{Cmd|apk add wireless-tools wpa_supplicant}}


Bring the link up so we can look for wireless networks. (An error here means you probably need extra drivers/firmware.)
Working wireless drivers
{{Note|in most cases installing {{Pkg|linux-firmware}} should get you the required drivers}}
 
If you are using a '''Broadcom chipset''', see the [[#Broadcom_Wi-Fi_Chipset_Users|Broadcom Wi-Fi section]].)
 
== iwd ==
 
[https://wiki.archlinux.org/title/Iwd iwd] (iNet wireless daemon) is a wireless daemon written by Intel and aiming at replacing {{Pkg|wpa_supplicant}}. The core goal of the project is to optimize resource utilization by not depending on any external libraries and instead utilizing features provided by the Linux Kernel to the maximum extent possible.
 
{{Pkg|iwd}} is supported since [https://alpinelinux.org/posts/Alpine-3.10.0-released.html Alpine Linux 3.10].
 
To get started, install {{Pkg|iwd}}:
 
{{Cmd|apk add iwd}}
 
To do anything with iwd, it has to be running:
 
{{Cmd|rc-service iwd start}}
 
If it was not running, running <code>iwctl ..</code> commands will print
 
The name net.connman.iwd was not provided by any .service files 
Failed to retrieve IWD dbus objects, quitting...
 
and running just <code>iwctl</code> will say it is waiting for IWD to start.
 
List your available wifi device(s) (you probably have ''wlan0''):
 
{{Cmd|iwctl device list}}
 
If you don't know the SSID of your network you can run a scan and retrieve a list of all the detected networks:
 
{{Cmd|iwctl station wlan0 scan && iwctl station wlp8s0 get-networks}}
 
To connect to a network:
 
{{Cmd|iwctl station wlan0 connect <SSID>}}
 
<br>
 
{{Note|iwd automatically stores network passphrases in the /var/lib/iwd directory and uses them to auto-connect in the future. If you run diskless Alpine, make sure to include this directory to the apkovl and commit:
{{Cmd|lbu add /var/lib/iwd && lbu commit -d}}}}
 
{{Note|Since version 1.10, iwd supports IPv6, but it is disabled by default. To enable it, add the following to the configuration file:
{{Cat|/etc/iwd/main.conf|<nowiki>[Network]
EnableIPv6=true</nowiki>}}}}
 
<br>
 
Finally, configure {{Pkg|iwd}} and its dependency {{Pkg|dbus}} to start automatically on boot:
{{Cmd|rc-update add iwd boot && rc-update add dbus boot}}
 
<br>
 
Add a entry for the desired interface (e.g. {{Path|wlan0}}):
{{Cat|/etc/network/interfaces|auto wlan0
iface wlan0 inet dhcp}}
 
{{Note|You could instead use the iwd's built-in network configuration by setting {{Path|<nowiki>EnableNetworkConfiguration=true</nowiki>}} in {{Path|/etc/iwd/main.conf}}}}
 
<br>
 
Manually restart '''networking''':
 
{{Cmd|rc-service networking restart}}
 
<br>
 
Your wifi interface should now be up and have a dedicated IP adress:
{{Cmd|ip a show wlan0}}
 
<br>
 
Useful link: [https://wiki.archlinux.org/title/Iwd#Enable_built-in_network_configuration Archlinux wiki page] if you need more specific configuration.
 
== wpa_supplicant  ==
 
To get started install {{Pkg|wpa_supplicant}}
 
{{Cmd|apk add wpa_supplicant}}
 
<br>
 
To list your available network interfaces:
{{Note|if you don't see any wireless interfaces (e.g. {{Path|wlan0}}), you probably need to load and/or install drivers/firmware.}}
 
<br>
 
{{Cmd|ip link}}
or
{{Cmd|ip a}}
 
<br>
 
Bring up the desired interface:
{{Cmd|ip link set wlan0 up}}
{{Cmd|ip link set wlan0 up}}


Find a network to connect to. Look for the ESSID. In this example we will use the ESSID "MyNet".
{{Note|If this errors with <code>ioctl 0x8914 failed: No error information</code>, that's <code>busybox ip</code>'s way of saying your wireless radio is rfkill'd. See the [[#Rfkill|Rfkill section]] for information on how to unblock your wireless radio.}}
{{Cmd|iwlist wlan0 scanning}}
 
<br>
 
Use this command to add your Wi-Fi network to wpa_supplicant:
{{Cmd|wpa_passphrase 'ExampleWifiSSID' 'ExampleWifiPassword' > /etc/wpa_supplicant/wpa_supplicant.conf}}
''(Access point not broadcasting its SSID requires additional line <code>scan_ssid=1</code> in the file <code>wpa_supplicant.conf</code>)''
 
{{Note|the Wi-Fi SSID and password are case sensitive and the single quote before and after the SSID and password need to be there}}
 
<br>


Let's set the ESSID:
Start wpa_supplicant in the foreground to make sure the connection succeeds.
{{Cmd|iwconfig wlan0 essid MyNet}}
{{Cmd|wpa_supplicant -i wlan0 -c /etc/wpa_supplicant/wpa_supplicant.conf}}


We need to create a shared key for wpa_supplicant.
<br>
{{Cmd|wpa_passphrase MyNet > wpa.conf}}
It will wait for the password from stdin. Enter the password and enter. Now you will have a {{Path|wpa.conf}} file with the preshared key.


Start wpa_supplicant with the generated config:
If all is well, run it as a daemon in the background by setting the {{Path|-B}} option.
{{Cmd|wpa_supplicant -Dwext -iwlan0 -c ./wpa.conf}}
{{Cmd|wpa_supplicant -B -i wlan0 -c /etc/wpa_supplicant/wpa_supplicant.conf}}


From another console, start dhcpcd:
<br>
 
Configure the interface with an IP address.
{{Cmd|udhcpc -i wlan0}}
{{Cmd|udhcpc -i wlan0}}


You should get an IP address.
Sanity check: the interface should have a {{Path|inet}} address.
{{Cmd|ip addr show wlan0}}


You then want to make the connection process automatic on boot-up.  Open {{Path|/etc/network/interfaces}} and add the following stanza:
<br>
auto wlan0
iface wlan0 inet dhcp
{{Note|I had to append `pre-up iwconfig wlan0 essid <ESSID>` to automatically connect to the network.}}


You will also need to set wpa_supplicant to start automatically on boot:
=== Automatic Configuration on System Boot  ===
{{Cmd|rc-update add wpa_supplicant boot}}


Next, create {{Path|/etc/wpa_supplicant/}} (permissions of 755 with root:root are fine), and move {{Path|wpa.conf}} into that folder, renaming it to {{Path|wpa_supplicant.conf}}.
Add a entry for the desired interface (e.g. {{Path|wlan0}}):
{{Cat|/etc/network/interfaces|auto wlan0
iface wlan0 inet dhcp}}


Reboot and check that you are associated with the access point:
{{Note|Dont remove or comment out the '''auto lo''' entry}}
{{Cmd|iwconfig wlan0}}
and check that you got a DHCP lease:
{{Cmd|ifconfig wlan0 {{!}} grep addr}}


== Broadcom Wi-Fi Chipset Users  ==
Sanity check: Make sure {{Path|/etc/wpa_supplicant/wpa_supplicant.conf}} is the correct configuration for the wireless access point you want to connect to.
The Broadcom chipset is quite popular among older computers. You will need to compile the firmware manually for this chipset as it is not included.  


You can check if you have a Broadcom chipset by using dmesg:
Bring the interface down.


{{Cmd|dmesg {{!}} grep Broadcom}}
{{Cmd|ip link set wlan0 down}}


First install the SDK an Git:
<br>
{{Cmd|apk add alpine-sdk git}}


Then git clone aports from git.alpinelinux.org.
Manually restart (or '''start''') '''networking'''.


(remove $, new users can't add links to the wiki)
{{Cmd|/etc/init.d/networking --quiet restart &}}


{{Cmd|git clone git:/$/git.alpinelinux.org/abuild}}
<br>


Change your directory to '''aports/non-free/b43-firmware''', then build it.
If all is well (feel free to confirm with the sanity checks),  


''You can't be root and must be a user of the group abuild (use groupadd)''
Configure wpa_supplicant to start automatically on boot:


{{Cmd|abuild -r}}
{{Cmd|# rc-update add wpa_supplicant boot}}


Install the generated packge file (it will be in ~/packages/) - make sure to pass '''--allow-untrusted'''
<br>


{{Cmd|apk add --allow-untrusted ~/packages/...pkg}}
Also make sure '''networking''' is set to automatically start on boot:


Now we need fwcutter, which is executed from the firmware package:
{{Cmd|# rc-update add networking boot}}


{{Cmd|apk add b43-fwcutter b43-firmware}}
<br>
 
'''Optional security precaution:'''
 
By default {{Pkg|wpa_supplicant}} will store your Wi-Fi password in plain text:
 
{{Cat|(Example) /etc/wpa_supplicant/wpa_supplicant.conf|<nowiki>network={
    ssid="<YourSSIDShouldBeHere>"
        #psk="<YourPasswordShouldBeHereInPlainText>"
    psk=<RandomLettersAndNumbersShouldBeHere>
}</nowiki>}}
 
this is not necessary and {{Pkg|wpa_supplicant}} should funtion just fine without it, if you dont want your stored password in plain text just delete the line with <code>#psk="<YourPasswordShouldBeHereInPlainText>"</code> on it.
 
<br>
 
== Launching udhcpc through wpa_cli actions ==
 
{{Todo|Figure out if theses two sections are different or connected to one another}}
 
With the above configuration, udhcpc will only run once at boot.
If the Wifi isn't available then, or the network changes in between, it needs to be notified.
This is done through the wpa_cli action script in /etc/wpa_supplicant/wpa_cli.sh
 
== Automatic Reconnection when WIFI signal is lost  ==
To enable automatic reconnection when wifi signal is lost add these to config:
 
{{Cat|/etc/wpa_supplicant/wpa_supplicant.conf|<nowiki>ap_scan=1
autoscan=periodic:10
disable_scan_offload=1
</nowiki>
}}
 
 
{{Cmd|rc-update add wpa_cli boot}}
 
<br>
 
== Troubleshooting ==
 
==== Broadcom Wi-Fi Chipset Users  ====
 
The Broadcom chipset is quite popular among older computers. The b43 driver is included in the linux-lts or linux-edge kernel packages. However, you might need to compile the firmware manually for this chipset as it is not included in linux-firmware for some cargs.
 
You can check if you have a Broadcom chipset by using lspci:
 
{{Cmd|lspci -nn -d 14e4:}}
 
Now we need fwcutter:
 
{{Cmd|apk add b43-fwcutter}}
 
Now we have everything to download the proprietary driver and extract the firmware from it:
 
<pre>
export FIRMWARE_INSTALL_DIR="/lib/firmware"
wget http://www.lwfinger.com/b43-firmware/broadcom-wl-5.100.138.tar.bz
tar xjf broadcom-wl-5.100.138.tar.bz2
sudo b43-fwcutter -w "$FIRMWARE_INSTALL_DIR" broadcom-wl-5.100.138/linux/wl_apsta.o
</pre>
 
More information can be found [http://linuxwireless.sipsolutions.net/en/users/Drivers/b43/#Other_distributions_not_mentioned_above here].


Now you need to use modprobe so the device will show up:
Now you need to use modprobe so the device will show up:
Line 76: Line 233:
{{Cmd|modprobe b43}}
{{Cmd|modprobe b43}}


To automate this on startup add it to /etc/modules:
Now continue with the normal instructions.
 
<br>
 
==== Rfkill ====
 
''See Also: [https://wiki.archlinux.org/title/Network_configuration/Wireless#Rfkill_caveat Network configuration/Wireless#Rfkill caveat - ArchLinux Wiki]''
 
<br>
 
Many laptops have a hardware button (or switch) to turn off wireless card, however, the card can also be blocked by kernel. This can be changed using rfkill. To show the current of your Wi-Fi:
 
{{Cat|(example) $ rfkill list|0: phy0: wlan
    Soft blocked: no
    Hard blocked: no}}
 
<br>
 
If the card is hard-blocked, use the hardware button or switch to unblock it. If the card is not hard-blocked but soft-blocked, use the following command:  


{{Cmd|echo b43 >> /etc/modules}}
{{Cmd|# rfkill unblock wifi}}
 
<br>
 
== See Also ==
 
* [[Installation#Post-Install|Post Install]]
* [[Alpine setup scripts]]


Now continue with the normal instructions.


[[Category:Networking]]
[[Category:Networking]]

Revision as of 19:38, 12 October 2022

This page describes how to set up a wireless network connection with WPA encryption.

Choose a wireless daemon between iwd and wpa_supplicant

Prerequisites

Working wireless drivers

Note: in most cases installing linux-firmware should get you the required drivers

If you are using a Broadcom chipset, see the Broadcom Wi-Fi section.)

iwd

iwd (iNet wireless daemon) is a wireless daemon written by Intel and aiming at replacing wpa_supplicant. The core goal of the project is to optimize resource utilization by not depending on any external libraries and instead utilizing features provided by the Linux Kernel to the maximum extent possible.

iwd is supported since Alpine Linux 3.10.

To get started, install iwd:

apk add iwd

To do anything with iwd, it has to be running:

rc-service iwd start

If it was not running, running iwctl .. commands will print

The name net.connman.iwd was not provided by any .service files  
Failed to retrieve IWD dbus objects, quitting...

and running just iwctl will say it is waiting for IWD to start.

List your available wifi device(s) (you probably have wlan0):

iwctl device list

If you don't know the SSID of your network you can run a scan and retrieve a list of all the detected networks:

iwctl station wlan0 scan && iwctl station wlp8s0 get-networks

To connect to a network:

iwctl station wlan0 connect <SSID>


Note: iwd automatically stores network passphrases in the /var/lib/iwd directory and uses them to auto-connect in the future. If you run diskless Alpine, make sure to include this directory to the apkovl and commit:

lbu add /var/lib/iwd && lbu commit -d

Note: Since version 1.10, iwd supports IPv6, but it is disabled by default. To enable it, add the following to the configuration file:

Contents of /etc/iwd/main.conf

[Network] EnableIPv6=true


Finally, configure iwd and its dependency dbus to start automatically on boot:

rc-update add iwd boot && rc-update add dbus boot


Add a entry for the desired interface (e.g. wlan0):

Contents of /etc/network/interfaces

auto wlan0 iface wlan0 inet dhcp
Note: You could instead use the iwd's built-in network configuration by setting EnableNetworkConfiguration=true in /etc/iwd/main.conf


Manually restart networking:

rc-service networking restart


Your wifi interface should now be up and have a dedicated IP adress:

ip a show wlan0


Useful link: Archlinux wiki page if you need more specific configuration.

wpa_supplicant

To get started install wpa_supplicant

apk add wpa_supplicant


To list your available network interfaces:

Note: if you don't see any wireless interfaces (e.g. wlan0), you probably need to load and/or install drivers/firmware.


ip link

or

ip a


Bring up the desired interface:

ip link set wlan0 up

Note: If this errors with ioctl 0x8914 failed: No error information, that's busybox ip's way of saying your wireless radio is rfkill'd. See the Rfkill section for information on how to unblock your wireless radio.


Use this command to add your Wi-Fi network to wpa_supplicant:

wpa_passphrase 'ExampleWifiSSID' 'ExampleWifiPassword' > /etc/wpa_supplicant/wpa_supplicant.conf

(Access point not broadcasting its SSID requires additional line scan_ssid=1 in the file wpa_supplicant.conf)

Note: the Wi-Fi SSID and password are case sensitive and the single quote before and after the SSID and password need to be there


Start wpa_supplicant in the foreground to make sure the connection succeeds.

wpa_supplicant -i wlan0 -c /etc/wpa_supplicant/wpa_supplicant.conf


If all is well, run it as a daemon in the background by setting the -B option.

wpa_supplicant -B -i wlan0 -c /etc/wpa_supplicant/wpa_supplicant.conf


Configure the interface with an IP address.

udhcpc -i wlan0

Sanity check: the interface should have a inet address.

ip addr show wlan0


Automatic Configuration on System Boot

Add a entry for the desired interface (e.g. wlan0):

Contents of /etc/network/interfaces

auto wlan0 iface wlan0 inet dhcp
Note: Dont remove or comment out the auto lo entry

Sanity check: Make sure /etc/wpa_supplicant/wpa_supplicant.conf is the correct configuration for the wireless access point you want to connect to.

Bring the interface down.

ip link set wlan0 down


Manually restart (or start) networking.

/etc/init.d/networking --quiet restart &


If all is well (feel free to confirm with the sanity checks),

Configure wpa_supplicant to start automatically on boot:

# rc-update add wpa_supplicant boot


Also make sure networking is set to automatically start on boot:

# rc-update add networking boot


Optional security precaution:

By default wpa_supplicant will store your Wi-Fi password in plain text:

Contents of (Example) /etc/wpa_supplicant/wpa_supplicant.conf

network={ ssid="<YourSSIDShouldBeHere>" #psk="<YourPasswordShouldBeHereInPlainText>" psk=<RandomLettersAndNumbersShouldBeHere> }

this is not necessary and wpa_supplicant should funtion just fine without it, if you dont want your stored password in plain text just delete the line with #psk="<YourPasswordShouldBeHereInPlainText>" on it.


Launching udhcpc through wpa_cli actions

Todo: Figure out if theses two sections are different or connected to one another


With the above configuration, udhcpc will only run once at boot. If the Wifi isn't available then, or the network changes in between, it needs to be notified. This is done through the wpa_cli action script in /etc/wpa_supplicant/wpa_cli.sh

Automatic Reconnection when WIFI signal is lost

To enable automatic reconnection when wifi signal is lost add these to config:

Contents of /etc/wpa_supplicant/wpa_supplicant.conf

ap_scan=1 autoscan=periodic:10 disable_scan_offload=1


rc-update add wpa_cli boot


Troubleshooting

Broadcom Wi-Fi Chipset Users

The Broadcom chipset is quite popular among older computers. The b43 driver is included in the linux-lts or linux-edge kernel packages. However, you might need to compile the firmware manually for this chipset as it is not included in linux-firmware for some cargs.

You can check if you have a Broadcom chipset by using lspci:

lspci -nn -d 14e4:

Now we need fwcutter:

apk add b43-fwcutter

Now we have everything to download the proprietary driver and extract the firmware from it:

export FIRMWARE_INSTALL_DIR="/lib/firmware"
wget http://www.lwfinger.com/b43-firmware/broadcom-wl-5.100.138.tar.bz
tar xjf broadcom-wl-5.100.138.tar.bz2
sudo b43-fwcutter -w "$FIRMWARE_INSTALL_DIR" broadcom-wl-5.100.138/linux/wl_apsta.o

More information can be found here.

Now you need to use modprobe so the device will show up:

modprobe b43

Now continue with the normal instructions.


Rfkill

See Also: Network configuration/Wireless#Rfkill caveat - ArchLinux Wiki


Many laptops have a hardware button (or switch) to turn off wireless card, however, the card can also be blocked by kernel. This can be changed using rfkill. To show the current of your Wi-Fi:

Contents of (example) $ rfkill list

0: phy0: wlan Soft blocked: no Hard blocked: no


If the card is hard-blocked, use the hardware button or switch to unblock it. If the card is not hard-blocked but soft-blocked, use the following command:

# rfkill unblock wifi


See Also