Вопрос или проблема
Ubuntu 23.04 зависает на 1-2 минуты при использовании Wi-Fi. Я попробовал проприетарный драйвер broadcom-sta-dkms, предложенный Ubuntu, но это не решило проблему. У меня была точно такая же проблема с любым дистрибутивом с ядром 6 (например, Fedora). Есть мысли, как решить эту проблему?
Вывод команды lspci -nn | grep Broadcom
05:00.0 Сетевой контроллер [0280]: Broadcom Inc. and subsidiaries BCM4313 802.11bgn Беспроводной сетевой адаптер [14e4:4727] (rev 01)
Я считаю, что лучший работающий драйвер для вашего 14e4:4727 Broadcom – это bcmwl-kernel-source, а не brcmsmac или b43 и прошивка. Давайте установим его и посмотрим, будет ли улучшение:
sudo apt update
sudo apt install bcmwl-kernel-source
Перезагрузите и сообщите нам, есть ли какие-либо улучшения.
ИЗМЕНЕНИЕ: Вы показали, что bcmwl-kernel-source не работает. Давайте попробуем brcmsmac:
sudo -i
apt purge bcmwl-kernel-source
echo "blacklist b43" >> /etc/modprobe.d/blacklist.conf
echo "blacklist ssb" >> /etc/modprobe.d/blacklist.conf
exit
Перезагрузите. Есть ли какие-либо улучшения?
Следуя подсказкам, я нашёл баг, о котором сообщалось в ядре. У репортера была та же проблема, что и у меня, которая признана проблемой регрессии ядра.
Решение уже было предложено разработчиками Arch для ядра.
Как указано в обсуждении:
Существуют некоторые пути кода, которые не инициализируют rx->link_sta должным образом. Это вызывает сбой в местах, которые предполагают, что rx->link_sta действителен, если rx->sta действителен. Один известный случай вызван вызовом __ieee80211_rx_h_amsdu из fast-rx. Это приводит к сбою.
Я не смог это проверить на Ubuntu, так как у нее ядро 6.2, но патч работает на основном ядре 6.1.
Для тех, кто не может использовать
sudo apt install bcmwl-kernel-source
Вы можете вручную собрать из исходного кода (с применением патчей для сборки для ядра 6.x).
!заметьте: у меня ядро 6.5, тест пройден успешно.
Сначала мы клонируем исходный код:
git clone https://git.launchpad.net/ubuntu/+source/bcmwl/
(чтобы было подробно, мой последний коммит – cd76516d116a73018ca4cbe6b580bfd603465cb9, вы можете ‘git checkout cd76516d116a73018ca4cbe6b580bfd603465cb9’, если хотите иметь ту же ветку, что и я)
Перейдите в исходный код, вы увидите Makefile, README, debian и src, переместите Makefile в папку src
mv Makefile ./src/
Теперь создайте скрипт в директории src для применения патчей (уже в исходном коде)
#!/bin/bash
# путь к вашим патчам (измените, если хотите абсолютный путь)
PATCH_DIR="../debian/patches"
PATCHES=(
"0002-Makefile.patch"
"0003-Make-up-for-missing-init_MUTEX.patch"
"0010-change-the-network-interface-name-from-eth-to-wlan.patch"
"0013-gcc.patch"
"0019-broadcom-sta-6.30.223.248-3.18-null-pointer-fix.patch"
"0020-add-support-for-linux-4.3.patch"
"0021-add-support-for-Linux-4.7.patch"
"0022-add-support-for-Linux-4.8.patch"
"0023-add-support-for-Linux-4.11.patch"
"0024-add-support-for-Linux-4.12.patch"
"0025-add-support-for-Linux-4.14.patch"
"0026-add-support-for-Linux-4.15.patch"
"0027-add-support-for-linux-5.1.patch"
"0028-add-support-for-linux-5.6.patch"
"0029-Update-for-set_fs-removal-in-Linux-5.10.patch"
"0040-add-support-for-linux-5.18.patch"
"0041-dev-addr-access.patch"
"0042-add-support-for-linux-6.x.patch"
)
# Применяем все
for PATCH in "${PATCHES[@]}"; do
echo "Применение патча: $PATCH"
patch -p1 < "$PATCH_DIR/$PATCH"
if [ $? -ne 0 ]; then
echo "Не удалось применить $PATCH, пропускаем."
fi
done
echo "Все патчи успешно применены."
Теперь мы можем собрать
make -C /lib/modules/$(uname -r)/build M="$(pwd)"
или просто :
make
После сборки мы можем установить с помощью команды:
sudo make install
sudo modprobe -r wl
sudo modprobe wl
lsmod |grep wl
Если есть wl, вы увидите, что Wi-Fi работает.
Для тех, кто хочет использовать dkms для сборки: Вам нужно получить исходный код и применить патч, как указано выше. Скопируйте папку src в
/var/lib/dkms/bcmwl/6.30.223.271+bdcom/source
Теперь проверьте, есть ли какие-либо установленные dkms ранее, мы должны удалить его:
dkms status
sudo dkms remove bcmwl/6.30.223.271+bdcom --all
dkms status
Перейдите в /var/lib/dkms/bcmwl/6.30.223.271+bdcom/source/dkms.conf и удалите все патчи:
PACKAGE_NAME="bcmwl"
PACKAGE_VERSION="#VERSION#"
CLEAN="rm -f *.*o"
BUILT_MODULE_NAME[0]="wl"
MAKE[0]="make -C $kernel_source_dir M=$dkms_tree/$PACKAGE_NAME/$PACKAGE_VERSION/build"
DEST_MODULE_LOCATION[0]="/updates"
AUTOINSTALL="yes"
Теперь все чисто, просто идите на сборку
sudo dkms build bcmwl/6.30.223.271+bdcom
sudo dkms install bcmwl/6.30.223.271+bdcom
или просто сделайте это:
sudo apt update
sudo apt install bcmwl-kernel-source
Теперь все работает нормально.
Ответ или решение
Решение проблемы зависания ядра 6 с Broadcom 4313 на Ubuntu 23.04
Введение
Проблемы с зависанием операционной системы, особенно при использовании Wi-Fi, могут значительно ухудшить пользовательский опыт. В рассматриваемом случае, у вас возникла проблема с зависанием системы на Ubuntu 23.04 при использовании драйвера для адаптера Broadcom BCM4313. Давайте подробно разберем возможные решения.
Описание проблемы
Вы упомянули, что ноутбук зависает через 1-2 минуты использования Wi-Fi, и аналогичная проблема наблюдалась на других дистрибутивов с ядром 6, таких как Fedora. Проблема может быть связана с несовместимостью драйвера или ошибками, связанными с версией ядра, что подтверждается вашим исследованием и ссылками на ошибки в сообществе.
Анализ драйверов
Изначально вы попробовали установить broadcom-sta-dkms
, который не решил проблему. В свете вышеописанного трудно не отметить, что наилучшее решение для адаптера Broadcom 4313 может заключаться в использовании драйвера bcmwl-kernel-source
. Однако, учитывая vostro обновление, предлагается альтернативный путь через brcmsmac
.
Пошаговые шаги к решению
-
Удаление текущего драйвера:
sudo apt purge bcmwl-kernel-source echo "blacklist b43" | sudo tee -a /etc/modprobe.d/blacklist.conf echo "blacklist ssb" | sudo tee -a /etc/modprobe.d/blacklist.conf
-
Переустановка альтернативного драйвера:
Убедитесь, что у вас установленыbrcmsmac
и необходимые компоненты:sudo apt update sudo apt install firmware-b43-installer
-
Перезагрузка системы:
Перезагрузите компьютер и проверьте, появилась ли разница в работе Wi-Fi.
Устранение ошибок на уровне ядра
Если замена драйвера не привела к положительному результату, вероятно, вам стоит обратить внимание на ошибки, характерные для вашего ядра. По вашим данным, проблема может быть вызвана регрессией в коде ядра, что подтверждается сообщениями о крашах в используемых кодовых путях.
В этом случае вы можете попробовать использовать рекомендованное решение разработчиков Arch, связанное с патчами для исправления инициализации параметров. Такую процедуру можно выполнить следующим образом:
-
Клонирование и патчинг драйвера:
git clone https://git.launchpad.net/ubuntu/+source/bcmwl/ cd bcmwl mv Makefile ./src/
-
Создание и запуск скрипта для применения патчей:
Сохраните предложенный вами скрипт в папкеsrc
и выполните его, что позволит автоматизировать применение всех необходимых патчей. -
Сборка и установка:
make -C /lib/modules/$(uname -r)/build M="$(pwd)" sudo make install sudo modprobe -r wl sudo modprobe wl lsmod | grep wl
Заключение
Проблемы с Wi-Fi адаптерами часто требуют терпения и экспериментов с различными драйверами и конфигурациями. Убедитесь, что вы используете актуальные патчи и версии драйверов, которые подходят для вашего ядра. Если после всех предпринятых действий проблема все еще сохраняется, возможно, стоит рассмотреть возможность использования другого адаптера или возврата к предыдущей версии ядра, пока не будет выпущено стабильное решение проблемы.
Надеюсь, предоставленная информация будет полезна и поможет вам успешно решить проблему с зависанием системы при использовании Wi-Fi.