如何防止iwconfig电源管理被打开?

我受到这个错误的影响:869502
对我来说,一个看起来能够阻止内核崩溃的解决方法是禁用wlan0的电源管理。
sudo iwconfig wlan0 power off

然而,当我拔掉电源线时,它似乎会自动重新启用电源管理,并且在其他许多时候也是如此。
有什么可能导致这种情况吗?有人知道我该如何防止它发生吗?

1http://askubuntu.com/questions/285434/is-there-a-power-saving-application-similar-to-jupiter/285681#285681 - Qasim
3七年来一直在进行中。这是一个错误还是一个特性? - Ufos
https://unix.stackexchange.com/a/315400/126119 - Ufos
11个回答

输入iwconfig并查看输出。您应该能看到您的芯片组的名称以及电源管理是关闭还是开启。如果没有显示,那么很可能是关闭状态。
要关闭电源管理,请转到/etc/NetworkManager/conf.d/default-wifi-powersave-on.conf,然后您会看到
[connection]
wifi.powersave = 3

3更改为2,然后重新启动。

然后运行iwconfig,如果成功的话,你应该看到Power Management:off

来源:https://sites.google.com/site/easylinuxtipsproject/internet


1这似乎关闭了我的电源管理功能! - user3273814
1这似乎也是正确的做法。 - Ufos
这对我在Ubuntu 17.10上有效。看起来比其他方法(如黑名单)更直接简单,也更容易恢复。 - josephwb
2在Ubuntu 20.04上,适用于Qualcomm Atheros QCA9377的工作完美。 - Abdul Rauf
1以下是所有可能的值及其含义: NM_SETTING_WIRELESS_POWERSAVE_DEFAULT (0): 使用默认值 NM_SETTING_WIRELESS_POWERSAVE_IGNORE (1): 不更改现有设置 NM_SETTING_WIRELESS_POWERSAVE_DISABLE (2): 禁用省电模式 NM_SETTING_WIRELESS_POWERSAVE_ENABLE (3): 启用省电模式。来源:https://gist.github.com/jcberthon/ea8cfe278998968ba7c5a95344bc8b55. - Danijel
太棒了回答。非常感谢! - djhurio
这个回答似乎只限于网络管理器的使用... - Mehdi

无线电源管理由pm-utils中的一个钩子运行。您可以通过以下任何方式关闭它:
/etc/pm/config.d中创建一个文件。 我将其命名为黑名单:
gksu gedit /etc/pm/config.d/blacklist

并在文件内保留:

HOOK_BLACKLIST="wireless"

如果你想禁用其他挂钩,预设的挂钩位于/usr/lib/pm-utils/power.d/

或者

你可以在/etc/pm/sleep.d/etc/pm/power.d中创建一个空的挂钩。看看哪个对你起作用。 例如:

只需执行

sudo touch /etc/pm/sleep.d/wireless

或者

sudo touch /etc/pm/power.d/wireless

我用了第一种方法。它有效果。谢谢! - Alex
2没有一种方法适用于我。 - Mihai Capotă
1我们可以执行chmod -x /usr/lib/pm-utils/power.d/wireless吗? - Emad Arshad Alam
我在Ubuntu Studio 20.10中没有gksu命令。 - Phantômaxx

如果关闭无线接口的电源管理可以加速互联网速度,就像这样:
sudo iwconfig wlan0 power off

要使其永久生效,请执行以下命令:
  1. cd /etc/pm/power.d

  2. sudo gedit wifi_pwr_off

    这将打开一个空文件,请将下面的代码复制到其中:

    #!/bin/sh 
    /sbin/iwconfig wlan0 power off
    
  3. 保存文件,记得执行以下命令:

    sudo chmod +x wifi_pwr_off
    

    然后重新启动。


2当我写sudo iwconfig wlan0 power off时,我收到以下错误信息:无线请求“Set Power Management”(8B2C)错误: 在设备wlan0上的SET操作失败;没有这样的设备。 - Murhaf Sousli
3运行sudo iwconfig命令,不带任何参数,并检查哪个接口具有无线扩展功能。有时它可能是eth1 - Dilawar

我偏好的方法是在我的无线接口设置中,在/etc/network/interfaces文件中添加以下行:
post-up iwconfig wlan0 power off

这是一个完整的例子:
auto wlan0
iface wlan0 inet static
 address 192.168.1.2
 network 192.168.1.0
 netmask 255.255.255.0
 broadcast 192.168.1.255
 gateway 192.168.1.254
 post-up iwconfig wlan0 power off
 wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf

注意到man interfaces中提到post-up的行为可能会在将来发生改变。

此解决方案远比编写自动关机脚本好。在进行关机之前加入睡眠的解决方案存在一个问题,即如果客户端在睡眠到期之前无法关联,则 wlan0 仍然处于关闭状态,即使网络已进入范围内。 - MerlinTheMagic
这个选项在Raspbian Stretch上运行得非常好。对我来说,这是更好的选择。 - Jagoliveira

另一种方法是在/etc/network/interfaces配置文件中添加一个明确的指令(wireless-power),以控制电源管理(例如,对于使用DHCP的wlan0禁用它)。
auto wlan0
iface wlan0 inet dhcp     
  wireless-power off

由于某种原因,得票最高的解决方案对我来说没有起作用,并且电源管理一直重新打开。最终我采取了以下步骤:
sudo gedit /etc/rc.local

在“exit 0”之前添加以下行:
( sleep 30 && iwconfig wlan0 power off )&

登录后30秒后关闭电源管理...

编辑:实际上这还不够。我一直尝试了很多方法,包括https://askubuntu.com/a/614245,我觉得这个解决了我的问题(希望如此)。


一个更好的方法(至少在Ubuntu 16.04上)是创建/etc/network/if-up.d/wifi-powerman-off文件,其内容如下:
#!/bin/sh

IWCONFIG=/sbin/iwconfig
WLAN_IFACE=<your wireless device here>

if [ ! -x $IWCONFIG ]; then
    exit 1
fi

if [ "$IFACE" = $WLAN_IFACE ]; then
    $IWCONFIG $IFACE power off
fi

将其设置为可执行文件。下次连接到网络时,电源管理将关闭。
这在NetworkManager中运行良好。

希望这次能成功。我希望,我希望,我希望!!!厌倦了Linux随机断开我的WiFi连接。 /抱怨 Ubuntu 16.04在这方面存在一些严重问题。/结束抱怨 - RyanNerd
不行,没用。Intel 7260简直就是个垃圾!我已经放弃了。 - RyanNerd

很好的建议。'sudo iwconfig wlan0 power off' 似乎是让我的ath9k模块稳定工作的唯一方法(在3.2内核上 - 奇怪的是,在大于3.5的内核中似乎没有问题,但由于它们与amd64的挂起到RAM/磁盘问题,这些内核不可行,不幸地... :-()

我创建了以下的`systemd service`来在重启后持久地关闭WiFi的电源管理。经过测试并且已知可行。只需将下面的bash脚本粘贴到一个文件中,将该文件设置为`chmod 700`权限,并使用`sudo ./yourFileName.sh`运行它。
if [ -d /root/scripts ]; then
    mkdir /root/scripts
fi

apt-get -y install iw
apt-get -y install wireless-tools

cat <<EOF> /root/scripts/pwr-mgmnt-wifi-disable.sh
#!/bin/bash
iw dev wlan0 set power_save off
EOF

chmod 700 /root/scripts/pwr-mgmnt-wifi-disable.sh


cat <<EOF> /etc/systemd/system//pwr-mgmnt-wifi-disable.service
[Unit]
Description=Disable WiFi Power Management
Requires=network-online.target
After=hostapd.service

[Service]
User=root
Group=root
Type=oneshot
ExecStart=/root/scripts/pwr-mgmnt-wifi-disable.sh

[Install]
WantedBy=multi-user.target

EOF

chmod 644 /etc/systemd/system/pwr-mgmnt-wifi-disable.service

systemctl enable pwr-mgmnt-wifi-disable.service
systemctl start pwr-mgmnt-wifi-disable.service

如果你使用laptop-mode-tools,那么你可以通过编辑/etc/laptop-mode/conf.d/wireless-iwl-power.conf(Ubuntu 14.04)来禁用无线电源管理。
# Control Intel IWL wireless power?
# Set to 0 to disable
CONTROL_IWL_POWER=0