После обновления Ubuntu на ноутбуке (Dell Vostro A860) до версии 9.10 перестал работать Wifi при абсолютной тишине в логах. Модуль ath5k грузится без ошибки и правильно распознает чип от Atheros. А Network Manager скупо пишет "Устройство не готово".
После продолжительного гугления выяснилось, что все дело в некорректной работе функциональной кнопки (Fn + F11), отвечающей за включение/отключение Wifi и Bluetooth:
$ tail /sys/class/rfkill/*/{state,name,type,persistent} ==> /sys/class/rfkill/rfkill1/state <== 0 ==> /sys/class/rfkill/rfkill2/state <== 0 ==> /sys/class/rfkill/rfkill3/state <== 0 ==> /sys/class/rfkill/rfkill1/name <== phy0 ==> /sys/class/rfkill/rfkill2/name <== dell-wifi ==> /sys/class/rfkill/rfkill3/name <== dell-bluetooth ==> /sys/class/rfkill/rfkill1/type <== wlan ==> /sys/class/rfkill/rfkill2/type <== wlan ==> /sys/class/rfkill/rfkill3/type <== bluetooth ==> /sys/class/rfkill/rfkill1/persistent <== 0 ==> /sys/class/rfkill/rfkill2/persistent <== 0 ==> /sys/class/rfkill/rfkill3/persistent <== 0
Как видим, rfkill1 и rfkill2 имеют тип wlan. Состояние (state) у обоих равно 0, означающему SOFT LOCK. Кроме состояния 0 могут быть 1 и 2, UNLOCK и HARD LOCK соответственно.
Вся проблема состоит в том, что при нажатии на упомянутую ранее функциональную кнопку состояние переключается только между значениями SOFT LOCK и HARD LOCK, минуя UNLOCK. Из-за этого блокируется переход интерфейса Wifi в активный режим, наглядно демонстрируемый командой
$ sudo ifconfig wlan0 up SIOCSIFFLAGS: Unknown error 132
Решение состоит в принудительном переводе в состояние UNLOCK. Для этого пишем простой скрипт
#!/bin/sh for i in /sys/class/rfkill/rfkill*/type; do type="`cat $i`" if [ "$type" = "wlan" ]; then n="`echo $i | sed -r 's%/type$%%'`"; echo 1 > ${n}/state; fi; done;
Сохраняем скрипт в файл "/usr/local/sbin/unlock-wlan" и делаем его исполняемым
$ sudo chmod +x /usr/local/sbin/unlock-wlan
После ручного запуска скрипта надо перезапускать Network Manager – иначе он ничего не заметит. Теперь настраиваем Upstart для исполнения нашего скрипта при загрузке системы, перед стартом Network Manager. Для этого создаем файл "/etc/init/unlock-wlan.conf"
# unlock-wlan - unlock wireless device # description "unlock wireless device" # Скрипт запускается перед настройкой сетевых интерфейсов start on starting networking task exec /usr/local/sbin/unlock-wlan
|