Как я могу оставить радио беспроводной карты выключенным по умолчанию?

11

Беспроводная карта PCI моего настольного компьютера всегда сканирует доступные беспроводные сети, но я использую ее редко. Могу ли я оставить радио выключенным, пока оно мне не понадобится?

ændrük
источник

Ответы:

4

Существует как минимум два задания Upstart, которые влияют на состояние беспроводной сети по умолчанию:

  • /etc/init/rfkill-restore.confвосстанавливает состояние мягкой блокировки для всех радиостанций до того состояния, в котором они были при последнем отключении, как записано в /var/lib/rfkill/saved-state.
  • /etc/init/network-manager.confзапускает Network Manager, который, в свою очередь, восстанавливает свое представление о состоянии беспроводной сети /var/lib/NetworkManager/NetworkManager.state.

Если вы посмотрите на эти две конфигурации работы, вы обнаружите, что они не имеют временных отношений , что мне кажется недостатком дизайна. Я предполагаю, что это состояние гонки редко является проблемой, потому что /etc/init/rfkill-restore.confоно намного проще и имеет меньше стартовых условий.

Все решения по принудительному отключению по умолчанию, которые я видел, пытаются использовать /etc/rc.local, включая «современное» решение, которое придумали @Lekensteyn и @ rubo77. К сожалению, это решение не работает для меня ни на одном из двух ноутбуков, которые я пробовал. Это не особенно удивительно потому , что /etc/rc.local также не имеет не временные отношения , которые я могу найти ни к одному из /etc/init/rfkill-restore.confи /etc/init/network-manager.conf. Задержка /etc/rc.localперед сном rfkill block wifi- это ужасный обходной путь для этого беспорядка состояния гонки, но он работает, если задержка достаточно велика.

Лучшим решением было бы для нас навязать желаемые состояния в /var/lib/rfkill/saved-stateи /var/lib/NetworkManager/NetworkManager.state до того, как эти два задания Upstart даже будут разрешены для выполнения. Мы можем достичь этого, создав собственную работу Upstart. На самом деле нам понадобятся два файла конфигурации задания, чтобы достичь необходимого времени.

Наша первая конфигурация работы делает необходимые нам модификации файла. Он будет запущен как можно раньше и будет запущен только один раз. Создать /etc/init/radio-silence.confс этим содержанием:

# 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:]]+)[01][[:space:]]*\$/\11/" /var/lib/rfkill/saved-state
  sed -i -re "s/^(WirelessEnabled=).*\$/\1false/" /var/lib/NetworkManager/NetworkManager.state
end script

Поскольку при запуске ноутбука я предпочитаю полную тишину радиосвязи, я мягко блокирую все радиостанции, не только беспроводные, но вы можете изменить первое sedиз вышеперечисленного, чтобы ограничить влияние этой работы на беспроводные устройства, которые вы хотите мягко заблокировать.

Наша вторая конфигурация работы несет ответственность за обеспечение того , чтобы ни один из rfkill-restoreи network-managerрабочих мест будет начинаться до radio-silenceне завершит модификации файла. Создайте /etc/init/radio-silence-wait.confследующим образом:

# 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

Благодаря этому решению я больше не вижу проблем с состоянием гонки, хотя я не рассматривал теоретическую гонку между rfkill-restoreи network-manager.

Для получения более подробной информации о том, как эти задания работают вместе для достижения нашей временной цели, обратитесь к моему вопросу и ответу: «Как создать одноразовое задание Upstart, которое гарантированно завершится до начала двух других заданий?»

froage
источник
7

«Современное» решение с использованием Network Manager: просто снимите флажок «Включить беспроводную связь» в апплете Network Manager (KDE: Управление сетью). Команда nmcli nm wifi offэквивалентна. Продолжайте чтение, если вы время от времени включаете Wi-Fi, но хотите перезагрузить его, чтобы отключить.

Состояние беспроводной связи запоминается в файле /var/lib/NetworkManager/NetworkManager.state. Чтобы отключить Wi-Fi при загрузке, убедитесь, что ключ WirelessEnabledостается в false. Вы можете сделать это, отредактировав скрипт инициализации Network Manager или воспользовавшись /etc/rc.localуловкой ниже. Команда, которая вам нужна:

sed s/^WirelessEnabled=true/WirelessEnabled=false/ -i /var/lib/NetworkManager/NetworkManager.state
rfkill block wifi

Поместите это раньше exit 0(как описано ниже). Команда rfkill block wifiвсе еще необходима из-за гонки с запуском Network Manager (NM). После запуска NM изменения файла состояния не действуют.


(старый ответ, который включает редактирование файла /etc/rc.localс объяснением rfkillкоманды)

Немного хакерский, но это должно сработать. Беспроводная карта может быть отключена с помощью rfkillкоманды. Все устройства, используемые rfkill, могут быть показаны с помощью rfkill list. Пример вывода:

0: phy0: Wireless LAN
        Soft blocked: no
        Hard blocked: no

Hard blockedЭто зависит от настроек оборудования, например, беспроводного коммутатора на ноутбуке. Soft blockedможет управляться ОС (Ubuntu).

Как это работает? У него нет man-страницы, rfkillв этом случае для запуска используется текст справки:

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

Ах, теперь мы где-то. Вы должны запустить rfkill block wifiот имени пользователя root, чтобы отключить беспроводное устройство. (WLAN является псевдонимом Wi - Fi, см исходный код из rfkill ).

Теперь, если вы хотите отключить беспроводные функции во время загрузки, добавьте команду в /etc/rc.local, запустив sudo nano /etc/rc.local. Используйте клавиши со стрелками / клавиши вверх / вниз страницы, чтобы перейти к предыдущей строке exit 0и добавить rfkill block wifi, чтобы конец файла был таким:

# By default, this script does nothing

rfkill block wifi
exit 0

Когда закончите, нажмите Ctrl+ X, затем нажмите, Yчтобы сохранить его и нажмите, Enterчтобы принять имя файла.

Если вы решили активировать устройство позже, запустите: sudo rfkill unblock wifi. Не забудьте удалить строку из /etc/rc.local, если вы решите использовать беспроводную карту.

Lekensteyn
источник
Благодарю. Я не понимаю почему, но, похоже, мне не нужно использовать sudo для работы rfkill.
rndrük
1
Вам не нужен sudo, так /etc/rc.localкак скрипт запускается с правами root. Маловероятно, что вы можете отключить Wi-Fi без прав root. Если я пытаюсь rfkill block wifiили rfkill unblock wifiя получаю сообщение «Не удается открыть устройство управления RFKILL: в доступе отказано».
Лекенштейн
На моем ThinkPad X60 и на моем рабочем столе с беспроводной картой PCI при запуске приложения $ rfkill block wifiNetworkManager отображается сообщение «Беспроводная связь отключена» и $ iwconfigотображается Tx-Power=off. $ rfkill unblock wifiотменяет этот эффект.
rndrük
1
Я решил это с задержкой: кажется, что в Ubuntu 14.04 вам нужно подождать несколько секунд, прежде чем отключить Wi-Fi /etc/rc.local. Используйте это вместо:/bin/sleep 10 && rfkill block wifi
rubo77
1
@ rubo77 Здесь (Arch Linux, Network Manager 0.9.8.10-3), существует /var/lib/NetworkManager/NetworkManager.stateфайл, который сохраняет настройки, WirelessEnabled=falseявляется одним из таких. Я
выложу
1

Самый простой способ отключить беспроводную карту - щелкнуть правой кнопкой мыши индикатор NetworkManager (маленький значок в правом верхнем углу панели) и снять флажок Enable Wireless. Это приводит к отключению ( ifconfig wlan0 down) интерфейса и больше не выполняет сканирование.

user4124
источник
2
Проверка этого пункта меню не влияет на поведение по умолчанию. При следующем включении компьютера беспроводное радио снова активируется.
rndrük
1
На моем Ubuntu 14.04 он остается выключенным, как и нужно после перезагрузки, если я включаю его в апплете сетевого менеджера
rubo77
1

Примечание: если вы используете tlp, пожалуйста, прочитайте весь ответ.

Все ответы на этот вопрос сейчас довольно старые и не работают в новых версиях Ubuntu, использующих systemd. Ответ Froage работал для меня 14.04, но не работает 16.04.

Systemd использует systemd-rfkill.serviceдля сохранения состояния переключателя rfkill во время выключения и восстановления его при каждой загрузке.

Вы должны передать параметр командной строки ядра для восстановления состояния переключателя rfkill при каждой загрузке.

  1. откройте /etc/default/grubс вашим предпочтительным текстовым редактором.
  2. добавить systemd.restore_state=1в качестве параметра GRUB_CMDLINE_LINUX. Эта строка должна теперь прочитать GRUB_CMDLINE_LINUX="systemd.restore_state=1". Вы можете добавить это GRUB_CMDLINE_LINUX_DEFAULTтакже. Любой из них работает. Смотрите этот вопрос для более подробной информации.

Это обеспечит восстановление состояния rfkill при каждой загрузке. Обязательно выключите Bluetooth и Wi-Fi перед перезагрузкой.


Проблемы с tlp:

Обновление: эти проблемы присутствовали в том, tlp 0.8-1что доступно в 16.04 репозиториях. После обновления до tlp 0.9-1использования linrunner ppa ВСЕ проблемы были решены.

Оригинальный ответ:

tlpмаскирует / отключает, systemd-rfkill.serviceчтобы «избежать конфликтов и обеспечить правильную работу опций переключения радиоустройств TLP» . ( Источник-1 , Источник-2 )

Это означает, что передача параметра ядра не будет работать для вас.

Вот небольшой фрагмент (около строки 195) из стандартного файла конфигурации tlp ( /etc/default/tlp).

# 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"
  • Как видите, опция RESTORE_DEVICE_STATE_ON_STARTUPпо умолчанию отключена. Но включение этой опции не помогает.

    Даже после того, как вы включите опцию RESTORE_DEVICE_STATE_ON_STARTUP , отключите Wi-Fi и Bluetooth (используя rfkill block all) и продолжите перезапуск, каким-то образом WiFi включается при каждой 2-й или 3-й загрузке. Нет гарантии, что при следующей загрузке WiFi будет отключен. Удивительно, но tlpудается отключить Bluetooth при каждой загрузке.

  • То же самое относится ко второму варианту во фрагменте DEVICES_TO_DISABLE_ON_STARTUP, который также отключен по умолчанию. Включение этого также не работает. Network Mangerпоказывает, что WiFi отключен, но rfkill listне показывает никаких программных блоков на WiFi.

    Примечание: я прочитал строку "Hint: the parameters DEVICES_TO_DISABLE/ENABLE_ON_STARTUP/SHUTDOWN below are ignored when this is enabled!".

    Я отключил RESTORE_DEVICE_STATE_ON_STARTUPперед включением, DEVICES_TO_DISABLE_ON_STARTUPчтобы избежать конфликтов.

  • Точно так же другие опции tlp-rdwне работают должным образом.


Решение для tlpпользователей:

Обновление: обновление для tlp 0.9-1использования linrunner ppa.

Оригинальный ответ:

  1. Включение DEVICES_TO_DISABLE_ON_STARTUPи настройка отключения Bluetooth и Wi-Fi может работать для вас. ( Это сработало для этого человека )

  2. Этот вопрос здесь на аскубунту. Это похоже на более старый ответ на этот вопрос. Но учтите, что я сам не пробовал. Это может или не может работать.


Другие источники: systemd-rfkill , tlp-configuration


Манодж
источник
Я попробовал ваш ответ, включив модификации обоих GRUB_CMDLINE_LINUXи GRUB_CMDLINE_LINUX_DEFAULTплюс (не упомянутую) sudo update-grubкоманду, и я не смог заставить ее работать в Pop_OS! 19.10 (который основан на Ubuntu 19.10). В соответствии с systemctl status systemd-rfkillэтим, эта служба уже запускается при каждой загрузке, и, поскольку значение по умолчанию - это 1, не должно быть необходимости в этих усилиях. Основываясь на информации в at man systemd-rfkill, запоминание состояния радио «при ранней загрузке» должно быть поведением по умолчанию, что заставляет меня полагать, что этот компонент каким-то образом поврежден.
Патрик Дарк
0

Лично я использую апплет управления питанием Jupiter, чтобы отключить беспроводную связь на своем ноутбуке, так как она управляется специальной кнопкой. Я не думаю, что в основном репо я должен был добавить ppa от Эндрю в Webupd8, чтобы получить его.

Надеюсь это поможет.

Аллан
источник
0

Вы можете добавить

ifconfig wlan0 down

чтобы /etc/rc.local, но сначала,

убедитесь, что если вы используете NetworkManager (у меня версия 0.8.4 ~ git.20110319t175609.d14809b-0ubuntu3), вы идете в меню « Редактировать соединения » -> « Беспроводная » вкладка, нажмите на соединение, нажмите « Редактировать » и убедитесь, что на вкладке « Беспроводная связь » флажок « Подключать автоматически » НЕ установлен.

waltinator
источник
1
Хотя это приведет к отключению интерфейса, это не сэкономит столько энергии, сколько отключение радиоприемника rfkill.
gertvdijk