Ответы:
Существует как минимум два задания 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, которое гарантированно завершится до начала двух других заданий?»
«Современное» решение с использованием 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, если вы решите использовать беспроводную карту.
/etc/rc.local
как скрипт запускается с правами root. Маловероятно, что вы можете отключить Wi-Fi без прав root. Если я пытаюсь rfkill block wifi
или rfkill unblock wifi
я получаю сообщение «Не удается открыть устройство управления RFKILL: в доступе отказано».
$ rfkill block wifi
NetworkManager отображается сообщение «Беспроводная связь отключена» и $ iwconfig
отображается Tx-Power=off
. $ rfkill unblock wifi
отменяет этот эффект.
/etc/rc.local
. Используйте это вместо:/bin/sleep 10 && rfkill block wifi
/var/lib/NetworkManager/NetworkManager.state
файл, который сохраняет настройки, WirelessEnabled=false
является одним из таких. Я
Самый простой способ отключить беспроводную карту - щелкнуть правой кнопкой мыши индикатор NetworkManager (маленький значок в правом верхнем углу панели) и снять флажок Enable Wireless
. Это приводит к отключению ( ifconfig wlan0 down
) интерфейса и больше не выполняет сканирование.
tlp
, пожалуйста, прочитайте весь ответ.Все ответы на этот вопрос сейчас довольно старые и не работают в новых версиях Ubuntu, использующих systemd. Ответ Froage работал для меня 14.04, но не работает 16.04.
Systemd использует systemd-rfkill.service
для сохранения состояния переключателя rfkill во время выключения и восстановления его при каждой загрузке.
Вы должны передать параметр командной строки ядра для восстановления состояния переключателя rfkill при каждой загрузке.
/etc/default/grub
с вашим предпочтительным текстовым редактором.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.Оригинальный ответ:
Включение DEVICES_TO_DISABLE_ON_STARTUP
и настройка отключения Bluetooth и Wi-Fi может работать для вас. ( Это сработало для этого человека )
Этот вопрос здесь на аскубунту. Это похоже на более старый ответ на этот вопрос. Но учтите, что я сам не пробовал. Это может или не может работать.
Другие источники: 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
, запоминание состояния радио «при ранней загрузке» должно быть поведением по умолчанию, что заставляет меня полагать, что этот компонент каким-то образом поврежден.
Вы можете добавить
ifconfig wlan0 down
чтобы /etc/rc.local
, но сначала,
убедитесь, что если вы используете NetworkManager (у меня версия 0.8.4 ~ git.20110319t175609.d14809b-0ubuntu3), вы идете в меню « Редактировать соединения » -> « Беспроводная » вкладка, нажмите на соединение, нажмите « Редактировать » и убедитесь, что на вкладке « Беспроводная связь » флажок « Подключать автоматически » НЕ установлен.
rfkill
.