My desktop's PCI wireless card is always scanning for available wireless networks, but I only rarely use it. Can I keep the radio turned off until I need it?
There are at least two Upstart jobs that affect the default wireless state:
/etc/init/rfkill-restore.confrestores the soft block state for all radios to what they were at last shutdown, as recorded in
/etc/init/network-manager.confstarts Network Manager which in turn restores its idea of wireless state from
If you look at those two job configurations you will find that they have no temporal relationship, which seems like a design flaw to me. I'm guessing this race condition is rarely a problem because
/etc/init/rfkill-restore.conf is much simpler and has fewer start conditions.
All the solutions to enforcing a wireless-off default that I've seen try to use
/etc/rc.local, including the "modern" solution that @Lekensteyn and @rubo77 came up with. Unfortunately, that solution does not work for me on either of two laptops I have tried. This is not particularly surprising because
/etc/rc.local also has no temporal relationship that I can find to either of
/etc/init/network-manager.conf. Throwing in a lengthy sleep in
/etc/rc.local prior to issuing an
rfkill block wifi is an ugly workaround for this race condition mess, but it works if the delay is long enough.
A better solution would be for us to impose our desired states in
/var/lib/NetworkManager/NetworkManager.state before those two Upstart jobs are even permitted to run. We can achieve this by creating our own Upstart job. In actual fact, we'll need two job configuration files to achieve the timing we need.
Our first job configuration does the actual file modifications we need. It will run as early as possible and will only run once. Create
/etc/init/radio-silence.conf with this content:
# radio-silence - Ensure radio silence on startup # # Override default startup behaviour of radios to ensure they are all # disabled until the user deliberately enables them. This job requires # radio-silence-wait to delay start of any services that may depend on # resources manipulated by this job. description "Disable all radios by default" start on local-filesystems pre-start script sed -i -re "s/^(.+[[:space:]]+)[[:space:]]*\$/\11/" /var/lib/rfkill/saved-state sed -i -re "s/^(WirelessEnabled=).*\$/\1false/" /var/lib/NetworkManager/NetworkManager.state end script
As I prefer total radio silence when my laptop starts, I soft block all radios, not just wireless, but you can modify the first
sed in the above to limit this job's impact to whichever wireless devices you wish to soft block.
Our second job configuration is responsible for ensuring that neither of the
network-manager jobs will start before
radio-silence has completed the file modifications. Create
/etc/init/radio-silence-wait.conf as follows:
# radio-silence-wait - Helper task for radio-silence # # Delays the start of all jobs that may depend on resources manipulated # by radio-silence job. Avoids the need to modify job configuration of # those other jobs. description "Assist radio-silence by delaying jobs it affects" start on (starting rfkill-restore or starting network-manager) stop on (started radio-silence or stopped radio-silence) instance $JOB normal exit 0 2 task script status radio-silence | grep -q "start/running" && exit 0 start radio-silence || true sleep infinity end script
With this solution I am no longer seeing race condition problems, although I have not addressed the theoretical race between
For more detail on how these jobs work together to achieve our temporal goal, refer to my question and answer, "How do I create a single-execution Upstart job guaranteed to complete before two other jobs begin?"
"Modern" solution using Network Manager: simply uncheck the Wireless Enabled option at the Network Manager applet (KDE: Network Management). The command
nmcli nm wifi off is equivalent. Continue reading if you sporadically enable Wi-Fi, but would like to revert it to disabled on reboot.
The wireless state is remembered in the file
/var/lib/NetworkManager/NetworkManager.state. To disable Wi-Fi at boot, ensure that the key
WirelessEnabled stays at
false. You could do that by editing the init script of Network Manager, or by using the
/etc/rc.local trick below. The command you need is:
sed s/^WirelessEnabled=true/WirelessEnabled=false/ -i /var/lib/NetworkManager/NetworkManager.state rfkill block wifi
Put this before
exit 0 (as described below). The
rfkill block wifi command is still needed due to a race with startup of Network Manager (NM). Once NM has started, changes to the state file have no effect.
(old answer that involves editing file
/etc/rc.local with an explanation of the
A bit hacky, but it should work. A wireless card can be disabled using the
rfkill command. All devices used by rfkill can be shown using
rfkill list. Sample output:
0: phy0: Wireless LAN Soft blocked: no Hard blocked: no
Hard blocked is dependend on a hardware setting, e.g. a wireless switch on a notebook.
Soft blocked can be controlled by the OS (Ubuntu).
How does it work? It does not have a manpage, running
rfkill provides a help text in this case:
Usage: rfkill [options] command Options: --version show version (0.4) Commands: help event list [IDENTIFIER] block IDENTIFIER unblock IDENTIFIER where IDENTIFIER is the index no. of an rfkill switch or one of: <idx> all wifi wlan bluetooth uwb ultrawideband wimax wwan gps fm
Now, if you want to disable the wireless functions at boottime, add the command to /etc/rc.local by running
sudo nano /etc/rc.local. Use the arrow keys / page up/down keys to navigate to the line before
exit 0 and add
rfkill block wifi, so that the file end like this:
# By default, this script does nothing rfkill block wifi exit 0
When finished, press Ctrl + X, then press Y to save it and press Enter to accept the filename.
If you decide to activate the device later, run:
sudo rfkill unblock wifi. Do not forget to remove the line from /etc/rc.local if you decide to use the wireless card.
The easiest way to disable your wireless card is to right-click on the NetworkManager indicator (small icon on top-right on the panel), and untick the
Enable Wireless. This brings down (
ifconfig wlan0 down) the interface and it does not perform scanning anymore.
Note : If you use
tlp, please read the entire answer.
All answers to this question are pretty old now and don't work on newer Ubuntu releases which use systemd. froage's answer worked for me on 14.04 but doesn't work on 16.04.
systemd-rfkill.service to save the rfkill switch state during shutdown and restore it on every boot.
You have to pass a kernel command line parameter to restore rfkill switch state on every boot.
/etc/default/grubwith your preferred text editor.
systemd.restore_state=1as a parameter to
GRUB_CMDLINE_LINUX. That line should now read
GRUB_CMDLINE_LINUX="systemd.restore_state=1". You can add it to
GRUB_CMDLINE_LINUX_DEFAULTas well. Either of them works. See this question for more details.
This will ensure that the rfkill state gets restored on each boot. Make sure to turn bluetooth and wifi off before restarting.
Update : These issues were present in
tlp 0.8-1 which is available in 16.04 repositories. After updating to
tlp 0.9-1 using linrunner ppa, ALL isssues were solved.
This means passing the kernel parameter won't work for you.
Here is a little snippet (around line no. 195) from tlp's default configuration file (
# Restore radio device state (Bluetooth, WiFi, WWAN) from previous shutdown # on system startup: 0=disable, 1=enable. # Hint: the parameters DEVICES_TO_DISABLE/ENABLE_ON_STARTUP/SHUTDOWN below # are ignored when this is enabled! RESTORE_DEVICE_STATE_ON_STARTUP=0 # Radio devices to disable on startup: bluetooth, wifi, wwan. # Separate multiple devices with spaces. #DEVICES_TO_DISABLE_ON_STARTUP="bluetooth wifi wwan" # Radio devices to enable on startup: bluetooth, wifi, wwan. # Separate multiple devices with spaces. #DEVICES_TO_ENABLE_ON_STARTUP="wifi"
As you can see the option to
RESTORE_DEVICE_STATE_ON_STARTUPis disabled by default. But enabling that option does not help.
Even after you enable the option to
RESTORE_DEVICE_STATE_ON_STARTUP, disable wifi and bluetooth (using
rfkill block all) and keep restarting, somehow WiFi get enabled on every 2nd or 3rd boot. There is no guarantee that on next boot WiFi will be disabled. Surprisingly
tlpmanages to keep bluetooth disabled on every boot.
Same goes for 2nd option in the snippet,
DEVICES_TO_DISABLE_ON_STARTUP, which is also disabled by default. Enabling it doesn't work either.
Network Mangershows that WiFi is disabled but
rfkill listdoesn't show any soft-block on WiFi.
Note : I have read the line
"Hint: the parameters DEVICES_TO_DISABLE/ENABLE_ON_STARTUP/SHUTDOWN below are ignored when this is enabled!".
DEVICES_TO_DISABLE_ON_STARTUPto avoid conflicts.
- Similarly the other options provided
tlp-rdwdon't work as expected.
tlp users :
Update : Update to
tlp 0.9-1 using linrunner ppa.
DEVICES_TO_DISABLE_ON_STARTUPand setting it to disable Bluetooth and WiFi may work for you.( It worked for this person )
This question here on askubuntu. It is similar to an older answer to this question. But please note that I haven't tried it myself. It may or may not work.
You could add
ifconfig wlan0 down
/etc/rc.local, but first,
ensure that, if you're using NetworkManager (I have version 0.8.4~git.20110319t175609.d14809b-0ubuntu3), you go to menu "Edit Connections" -> "Wireless" tab, click on the connection, click "Edit", and make sure that, in the "Wireless" tab, the "Connect Automatically" checkbox is NOT checked.