Wi-Fi: Difference between revisions

From Alpine Linux
m (rephrased sentence about Network manager)
 
(39 intermediate revisions by 14 users not shown)
Line 1: Line 1:
This page 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 using [[#wpa_supplicant|wpa_supplicant]].  


== Prerequisites ==
== Prerequisites ==


Working wireless drivers  
Working wireless drivers. In most cases installing {{Pkg|linux-firmware}} should get you the required drivers. Installation of this package can produce errors on diskless or data disk modes. If such errors occur, switch to system disk mode.
{{Note|in most cases installing {{Pkg|linux-firmware}} should get you the required drivers}}
To list your available network interfaces:


If you are using a '''Broadcom chipset''', see the [[#Broadcom_Wi-Fi_Chipset_Users|Broadcom Wi-Fi section]].)
{{Cmd|ip link}}


<br>
or


== wpa_supplicant  ==
{{Cmd|ip a}}


To get started install {{Pkg|wpa_supplicant}}
Refer to [[#Troubleshooting|Troubleshooting]] section to see if you don't see any wireless interfaces (e.g. {{Path|wlan0}}). You probably need to load and/or install drivers/firmware. If you are using a '''Broadcom chipset''', see the [[#Broadcom_Wi-Fi_Chipset_Users|Broadcom Wi-Fi section]].


{{Cmd|apk add wpa_supplicant}}
Bring up the desired interface:
{{Cmd|# ip link set wlan0 up}}


<br>
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.


To list your available network interfaces:
== iwd ==
{{Note|if you don't see any wireless interfaces (e.g. {{Path|wlan0}}), you probably need to load and/or install drivers/firmware.}}
{{main|iwd }}


<br>
{{Tip| [[NetworkManager]],  the standard Linux network configuration tool suite supports both wireless daemons i.e [[iwd]] and [[#wpa_supplicant|wpa_supplicant]]. Using both may lead to conflicts.}}


{{Cmd|ip link}}
== wpa_supplicant  ==
or
{{Cmd|ip a}}


<br>
[[Configure_Networking#Network_setup-scripts|Network setup-scripts]] can configure your wifi quickly using <code>wpa_supplicant</code>. If it does not meet your requirement, please follow the steps outlined on this page.


Bring up the desired interface:
To get started install {{Pkg|wpa_supplicant}}
{{Cmd|ip link set wlan0 up}}


{{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|# apk add wpa_supplicant}}
 
<br>


Use this command to add your Wi-Fi network to wpa_supplicant:
Use this command to add your Wi-Fi network to wpa_supplicant:
{{Cmd|wpa_passphrase 'ExampleWifiSSID' 'ExampleWifiPassword' > /etc/wpa_supplicant/wpa_supplicant.conf}}
{{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>)''
''(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}}
{{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>


Start wpa_supplicant in the foreground to make sure the connection succeeds.
Start wpa_supplicant in the foreground to make sure the connection succeeds.
{{Cmd|wpa_supplicant -i wlan0 -c /etc/wpa_supplicant/wpa_supplicant.conf}}
{{Cmd|# wpa_supplicant -i wlan0 -c /etc/wpa_supplicant/wpa_supplicant.conf}}


<br>
<br>
If all is well, run it as a daemon in the background by setting the {{Path|-B}} option.
If all is well, run it as a daemon in the background by setting the {{Path|-B}} option.
{{Cmd|wpa_supplicant -B -i wlan0 -c /etc/wpa_supplicant/wpa_supplicant.conf}}
{{Cmd|# wpa_supplicant -B -i wlan0 -c /etc/wpa_supplicant/wpa_supplicant.conf}}


<br>
<br>
Configure the interface with an IP address.
Configure the interface with an IP address.
{{Cmd|udhcpc -i wlan0}}
{{Cmd|# udhcpc -i wlan0}}


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


<br>
<br>


==== Automatic Configuration on System Boot  ====
=== Automatic Configuration on System Boot  ===


Add a entry for the desired interface (e.g. {{Path|wlan0}}) to {{Path|/etc/network/interfaces}}:
Add a entry for the desired interface (e.g. {{Path|wlan0}}):
 
{{Cat|/etc/network/interfaces|auto lo
<pre>
auto wlan0
auto wlan0
iface wlan0 inet dhcp
iface wlan0 inet dhcp}}
</pre>


{{Note|Dont remove or comment out the '''auto lo''' entry}}
{{Warning|Don't remove or comment out the '''auto lo''' entry}}
 
<br>


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.
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.
<br>


Bring the interface down.
Bring the interface down.


{{Cmd|ip link set wlan0 down}}
{{Cmd|# ip link set wlan0 down}}


<br>
<br>
Manually restart (or '''start''') '''networking'''.
Manually restart (or '''start''') '''networking'''.


{{Cmd|/etc/init.d/networking --quiet restart &}}
{{Cmd|# rc-service networking --quiet restart &}}


<br>
<br>
Perform sanity checks like ping and browsing. For issues related to name resolution, refer [[Configure_Networking#Configuring_DNS|Networking]] page.


If all is well (feel free to confirm with the sanity checks),  
If all is well, Configure wpa_supplicant to start automatically on boot:
 
Configure wpa_supplicant to start automatically on boot:


{{Cmd|# rc-update add wpa_supplicant boot}}
{{Cmd|# rc-update add wpa_supplicant boot}}
<br>


Also make sure '''networking''' is set to automatically start on boot:
Also make sure '''networking''' is set to automatically start on boot:
Line 103: Line 85:
{{Cmd|# rc-update add networking boot}}
{{Cmd|# rc-update add networking boot}}


<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.


=== Launching udhcpc through wpa_cli actions ===
=== Launching udhcpc through wpa_cli actions ===


With the above configuration, udhcpc will only run once at boot.
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.
If the Wifi isn't available then, or the network changes after booting, udhcpc needs to be notified.
This is done through the wpa_cli action script in /etc/wpa_supplicant/wpa_cli.sh
You can automatically notify udhcpc of network changes by using a wpa_cli action file, such as the one installed by default at `/etc/wpa_supplicant/wpa_cli.sh`.


== Automatic Reconnection when WIFI signal is lost  ==
To manually start a wpa_cli daemon with an action file, use the `-a` option:
To enable automatic reconnection when wifi signal is lost add these to config:


{{Cat|/etc/wpa_supplicant/wpa_supplicant.conf|
{{Cmd|# wpa_cli -a /etc/wpa_supplicant/wpa_cli.sh}}
<nowiki>
ap_scan=1
autoscan=periodic:10
disable_scan_offload=1
</nowiki>
}}


<br>
To do this automatically, use the `wpa_cli` service included in {{Pkg|wpa_supplicant-openrc}}:


{{Cmd|rc-update add wpa_cli boot}}
{{Cat|/etc/conf.d/wpa_cli|<nowiki>WPACLI_OPTS="-a /etc/wpa_supplicant/wpa_cli.sh"</nowiki>}}


<br>
{{Cmd|# rc-update add wpa_cli boot}}


== Troubleshooting ==
== Troubleshooting ==


==== Broadcom Wi-Fi Chipset Users  ====
=== Check dmesg ===
 
Run dmesg and check for errors related to the wireless interface. Usually, dmesg gives maximum information related to network and all other hardware.
{{Cmd|# dmesg |grep wlan}}
or
{{Cmd|# dmesg}}
 
=== checking network cards ===


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.
{{Cmd|$ cat /proc/net/dev }} lists the network interfaces that are detected. If the expected interfaces are not available, Check what network hardware chip you have using lspci or lsusb:


You can check if you have a Broadcom chipset by using dmesg:
{{Cmd|$ lspci -nn }}
{{Cmd|$ lsusb }}


{{Cmd|dmesg {{!}} grep Broadcom}}
Refer [[How to get regular stuff working#Hardware_Management|hardware management]], if the default outputs shown above lacks sufficient information.


First install the SDK and Git:
Check what driver the card uses and modprobe it. Check that the card is in master mode.
{{Cmd|apk add alpine-sdk git}}
Check what driver you need on the [https://wireless.wiki.kernel.org/en/users/Drivers/b43#list_of_hardware b43 compatibility page]


Then git clone aports from git.alpinelinux.org.
=== 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 cards.


{{Cmd|git clone git://git.alpinelinux.org/aports}}
To check what broadcom chip you have using lspci:


Change your directory to '''aports/non-free/b43-firmware''', then build it.
{{Cmd|$ lspci -nn -d 14e4:}}


{{Tip|You can't be root and must be a user of the group abuild (use groupadd f.e. '''addgroup $(whoami) abuild''')}}
====B43====
{{Tip|If this is your first time building a package you will need to generate a key for use in signing packages (use '''abuild-keygen -a -i''')}}


{{Cmd|abuild -r}}
Download firmware cutter.


Install the generated packge file (it will be in ~/packages/) - make sure to pass '''--allow-untrusted'''
{{Cmd|$ apk add b43-fwcutter}}


{{Cmd|apk add --allow-untrusted ~/packages/...pkg}}
Now we have everything to download the proprietary driver and extract the firmware from it:


Now we need fwcutter, which is executed from the firmware package:
{{Cmd|<nowiki># export FIRMWARE_INSTALL_DIR="/lib/firmware"
$ wget http://www.lwfinger.com/b43-firmware/broadcom-wl-5.100.138.tar.bz2
$ tar xjf broadcom-wl-5.100.138.tar.bz2
$ b43-fwcutter -w "$FIRMWARE_INSTALL_DIR" broadcom-wl-5.100.138/linux/wl_apsta.o</nowiki>}}


{{Cmd|apk add b43-fwcutter b43-firmware}}
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:


{{Cmd|modprobe b43}}
{{Cmd|# modprobe b43}}
 
Now continue with the normal instructions.
 
====wl====


To automate this on startup add it to /etc/modules:
First install the software we need to build a driver[https://unix.stackexchange.com/questions/606073/how-to-build-kernel-modules-in-alpine-3-12 ^]:  


{{Cmd|echo b43 >> /etc/modules}}
{{Cmd|apk add git alpine-sdk linux-headers}}


Now continue with the normal instructions.
Then install the driver build repo (this is archived, however it's legacy so that doesn't matter):
 
{{Cmd|git clone https://github.com/antoineco/broadcom-wl
cd broadcom-wl
}}
 
Then follow the build instructions listed in the git repo:


<br>
{{Cmd|make
doas make install
doas depmod -A
doas modprobe wl
}}


==== Rfkill ====
reboot and you have a working wl driver!


''See Also: [https://wiki.archlinux.org/title/Network_configuration/Wireless#Rfkill_caveat Network configuration/Wireless#Rfkill caveat - ArchLinux Wiki]''
Now continue with the normal instructions.  


<br>
=== Rfkill ===


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:  
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
<p style="background-color:#f9f9f9; border:1px dashed #2f6fab; line-height:1.1em; padding:1em; font-family:monospace; font-size:10pt; white-space:pre; overflow:auto;"><span style="color:green;">~</span>'''$''' rfkill list
Soft blocked: no
0: phy0: wlan
Hard blocked: no}}
    Soft blocked: no
    Hard blocked: no
</p>
 
<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:  
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:  
Line 192: Line 208:
== See Also ==
== See Also ==


* [[Installation]]
* [[Configure_Networking| Networking in Alpine Linux]]
* [[Post installation]]
* [[Iwd|iwd]] - An alternate to wpa_supplicant
* [[Alpine setup scripts]]
* [[NetworkManager]] - Front-end to Networking
 
* [https://wiki.postmarketos.org/wiki/WiFi PostmarketOS Wiki]
* [https://wiki.archlinux.org/title/Network_configuration/Wireless Archwiki]
* [https://wiki.gentoo.org/wiki/Wi-Fi Gentoo Wiki]


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

Latest revision as of 10:42, 18 October 2024

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

Prerequisites

Working wireless drivers. In most cases installing linux-firmware should get you the required drivers. Installation of this package can produce errors on diskless or data disk modes. If such errors occur, switch to system disk mode. To list your available network interfaces:

ip link

or

ip a

Refer to Troubleshooting section to see if you don't see any wireless interfaces (e.g. wlan0). You probably need to load and/or install drivers/firmware. If you are using a Broadcom chipset, see the Broadcom Wi-Fi section.

Bring up the desired interface:

# ip link set wlan0 up

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.

iwd

Tip: NetworkManager, the standard Linux network configuration tool suite supports both wireless daemons i.e iwd and wpa_supplicant. Using both may lead to conflicts.

wpa_supplicant

Network setup-scripts can configure your wifi quickly using wpa_supplicant. If it does not meet your requirement, please follow the steps outlined on this page.

To get started install wpa_supplicant

# apk add wpa_supplicant

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 lo auto wlan0 iface wlan0 inet dhcp
Warning: Don't 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.

# rc-service networking --quiet restart &


Perform sanity checks like ping and browsing. For issues related to name resolution, refer Networking page.

If all is well, 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

With the above configuration, udhcpc will only run once at boot. If the Wifi isn't available then, or the network changes after booting, udhcpc needs to be notified. You can automatically notify udhcpc of network changes by using a wpa_cli action file, such as the one installed by default at `/etc/wpa_supplicant/wpa_cli.sh`.

To manually start a wpa_cli daemon with an action file, use the `-a` option:

# wpa_cli -a /etc/wpa_supplicant/wpa_cli.sh


To do this automatically, use the `wpa_cli` service included in wpa_supplicant-openrc:

Contents of /etc/conf.d/wpa_cli

WPACLI_OPTS="-a /etc/wpa_supplicant/wpa_cli.sh"

# rc-update add wpa_cli boot

Troubleshooting

Check dmesg

Run dmesg and check for errors related to the wireless interface. Usually, dmesg gives maximum information related to network and all other hardware.

# dmesg

or

# dmesg

checking network cards

$ cat /proc/net/dev

lists the network interfaces that are detected. If the expected interfaces are not available, Check what network hardware chip you have using lspci or lsusb:

$ lspci -nn

$ lsusb

Refer hardware management, if the default outputs shown above lacks sufficient information.

Check what driver the card uses and modprobe it. Check that the card is in master mode. Check what driver you need on the b43 compatibility page

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 cards.

To check what broadcom chip you have using lspci:

$ lspci -nn -d 14e4:

B43

Download firmware cutter.

$ 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.bz2 $ tar xjf broadcom-wl-5.100.138.tar.bz2 $ 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.

wl

First install the software we need to build a driver^:

apk add git alpine-sdk linux-headers

Then install the driver build repo (this is archived, however it's legacy so that doesn't matter):

git clone https://github.com/antoineco/broadcom-wl cd broadcom-wl

Then follow the build instructions listed in the git repo:

make doas make install doas depmod -A doas modprobe wl

reboot and you have a working wl driver!

Now continue with the normal instructions.

Rfkill

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:

~$ 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