Wi-Fi в Linux славится своей дружелюбностью, но у правил есть известные исключения: старые чипы Broadcom и бюджетные карточки Realtek десятой серии помнят эпоху, когда производитель думал о ядре вторым делом. Симптомы известны: после установки системы адаптера просто нет в списке, либо он есть, но после обновления ядра модуль отваливается. Решение у этой истории стабильное: проприетарный или форкнутый драйвер ставится через DKMS, и дальше модуль сам пересобирается под каждое новое ядро. В статье полная процедура для broadcom-wl и rtl8821ce с подводными камнями Secure Boot и контролем результата.

Сначала выяснить, что за железо стоит в машине

Перед любыми телодвижениями узнаём, что внутри: lspci -nnk | grep -A3 -i network на ноутбуке с PCIe-картой или lsusb для USB-свистка. Строка вроде Broadcom BCM43142 или Realtek RTL8821CE однозначно определяет дальнейший путь. Важная точность: идентификация по числам [14e4:43a0] имеет силу приговора, потому что у одного маркетингового имени бывают разные ревизии; смотрите на коды в квадратных скобках - они говорят правду.

Дальше проверяем, не заработало ли уже само: многие Broadcom покрываются открытым brcmfmac, часть Realtek - штатным rtw88 из ядра. iwconfig или ip link покажет интерфейс, и если он есть и работает стабильно, не трогайте ничего - открытый драйвер всегда лучше проприетарного. Статья нужна, когда интерфейса нет или он ломается при обновлении ядра.

broadcom-wl, установка через DKMS на Debian и Ubuntu

Для большого семейства старых чипов Broadcom (BCM4311, BCM4313, BCM4321, BCM4322, BCM4331, BCM4352 и родни) рабочим вариантом остаётся проприетарный драйвер wl, именуемый broadcom-sta. На Debian и Ubuntu он ставится пакетом broadcom-sta-dkms: apt install broadcom-sta-dkms подтянет исходники, соберёт модуль под текущее ядро и пропишет DKMS-хуки на будущие обновления. После установки модуль встаёт в работу через modprobe wl, предварительно выгрузив открытые bcma и brcmsmac, чтобы они не дрались за железо.

Детали, о которых нужно помнить. Первое: сетевые менеджеры бывают старомодными - на старых установках полезно убедиться, что NetworkManager видит устройство, и в конфиге managed=true. Второе: журнал ошибок смотрится через dmesg | grep wl и journalctl -k -f в процессе подключения. Третье: при смене ядра на ванильное заголовки обязаны стоять, иначе DKMS просто не соберёт модуль под новую версию.

rtl8821ce, пакетная установка и тонкости

Чип RTL8821CE встречается в массовых ноутбуках и успешно покрывается форком tomasпino с DKMS-сборкой: пакет rtl8821ce-dkms в репозиториях многих дистрибутивов (в Ubuntu - из universe, на Arch - из AUR) собирает модуль под текущее ядро. После установки система обычно сразу видит интерфейс без дополнительных пассов руками. Если пакет в вашем дистрибутиве отсутствует, делается git clone формального репозитория и dkms add из него; процедура стабильно описана в README форка.

Приятное отличие от Broadcom: драйвер открытый, обновляется любителями и свежие ядра поддерживает активно. Известная проблема одна - настройки энергосбережения по умолчанию иногда роняют линк на ноутбуках при работе от батареи; лечится созданием файла /etc/modprobe.d/8821ce.conf с options 8821ce rtw_power_mgnt=0, которое отключает агрессивный сон карты. На стационарных адаптерах этого не требуется.

Secure Boot и подпись модулей, шаг, который все забывают

Любой DKMS-модуль на системе с включённым Secure Boot должен быть подписан, иначе ядро откажется его загружать - и симптомы будут максимально обманчивы: модуль собран, но modprobe говорит Operation not permitted или Required key not available. Лечение на Ubuntu автоматизированное: пакет shim-signed и MOK при установке DKMS предлагают придумать MOK-пароль, и при первой перезагрузке синий экран MOK Manager попросит его ввести, чтобы внести ключ в прошивку. Если экран проигнорирован, модуль не загрузится, и всё процедуру можно пройти заново через update-secureboot-policy.

На дистрибутивах без автомата процедура ручная: генерация ключа openssl, подпись модуля командой sign-file из пакета linux-headers, регистрация ключа через mokutil --import и подтверждение при перезагрузке. Один раз потраченный вечер закрывает вопрос криптографической подписи навсегда, а в будущих апдейтах ядра DKMS пересобирает и переподписывает модули сам. Важный контрольный приём: journalctl -k | grep -i cert покажет, приняла ли прошивка ваш ключ.

Проверка результата и жизнь дальше

Финальная проверка занимает минуту. Интерфейс виден в ip link, rfkill list не показывает блокировок hardware или software, nmcli device wifi list находит сети, подключение происходит по паролю, а iperf3 до домашнего сервера выдаёт честные мегабиты. Проверьте и сон: после пробуждения ноутбука подключение должно восстановиться само; если не восстанавливается, обычно ставится правило pm-utils или systemd-sleep, рестартирующее NetworkManager.

В дальнейшем обслуживание сводится к памяти о DKMS: любое обновление ядра запускает пересборку модулей автоматически, и единственная обязанность владельца - иногда проверять, что после апдейта ядра интерфейс на месте. Если система вдруг перешла на очень свежее ядро, а форк драйвера не собрался - это временное состояние, за вечер выкатывается патч, и пока можно загрузиться в старое ядро. Умение жить со сторонним драйвером и составляет основную часть этой статьи: немного внимания на старте, и беспроводная карта служит годами.

Ручная сборка драйвера из исходников, когда пакета нет

Если вашего дистрибутива не коснулась цивилизация готового пакета, процедура универсальна и отработана многократно. Сначала ставятся заголовки текущего ядра и компилятор: apt install build-essential linux-headers-$(uname -r) dkms git. Затем клонируется форк: git clone https://github.com/tomaspinho/rtl8821ce.git и переход в его каталог. Добавление в DKMS: sudo dkms add ., сборка sudo dkms install rtl8821ce/версия из README, и modprobe 8821ce активирует модуль вживую. Обновления форка подхватываются через git pull и повторную dkms install с новой версией: процедура механическая и спокойная.

Во время ручной установки встречается одна типичная ошибка: конфликт с уже загруженным штатным модулем rtw88 с более новых ядер, который пытается обслужить ту же карту. Тогда в /etc/modprobe.d/blacklist.conf добавляется blacklist rtw88_8821ce, и после перезагрузки в работу входит именно форкнутый драйвер. Проверка, что загрузился нужный, делается через lsmod | grep 8821: там должно быть 8821ce, а не rtw88. Отладка занимает десять минут, но только при условии, что вы знаете, какие модули могут драться за одно железо.

Альтернативы, если драйвер не взлетел

Иногда чип безнадёжно стар или специфичен, и проще решить вопрос железом. USB-адаптер на чипе mt7601u или свежем rtl8812au стоит копейки и работает из коробки; замена модуля mini-PCIe в ноутбуке на полностью поддерживаемый Intel вторичного рынка тоже популярна - карта Intel AX200 в слот вместо Broadcom решает проблему навсегда по цене пары чашек кофе. Из программных вариантов временным мостом бывает кабель Ethernet и точка доступа на телефоне, пока ищется рабочий драйвер.

И всё же самый важный урок этого списка звучит иначе: при покупке нового железа проверяйте чип заранее, а после покупки сразу проверяйте наличие интерфейса в live-режиме ещё до установки системы. Пять минут диллигенса избавляют от вечера DKMS, и это единственная известная прививка от проприетарных драйверов Wi-Fi.

Распространённые вопросы и ответы

После обновления ядра модуль пропал - что делать: загрузитесь со старым ядром через меню GRUB и соберите модуль под новое через dkms autoinstall либо откатитесь до починки форка. Wi-Fi виден, но не подключается - проверьте, что выгружен конкурирующий модуль и rfkill разблокирован. Низкая скорость на RTL8821CE - отключите энергосбережение, упомянутое выше, и проверьте канал роутера; на 2.4 ГГц узкие полосы 20 МГц работают стабильнее в плотной застройке. Secure Boot блокирует модуль - пройдите процедуру MOK ещё раз внимательно: ввод пароля должен быть произведён именно в синем экране, а не позже.

И последний совет вне списка технических руководств: храните в заметках точную модель чипа и команду, которой поставили драйвер. Через два года при переустановке системы эта карточка сэкономит вам вечер, и это ещё один шаг к эксплуатации, где всё объяснимо и восстанавливаемо.

Что внутри DKMS и почему это работает

Полезно понять механику, чтобы уверенно чинить DKMS, когда он вдруг отказывается делать свою работу. DKMS хранит исходники модулей в /usr/src в каталогах вида имя-версия, а конфигурацию - в /var/lib/dkms. При установке нового ядра хук на пакетном уровне запускает dkms autoinstall, который перебирает зарегистрированные модули и пересобирает их под свежие заголовки. Если сборка падает, лог лежит в /var/lib/dkms/имя/версия/build/make.log, и вот там обычно живёт ответ - то ли заголовков нет, то ли API изменился. Эта пара каталогов и файл лога - весь арсенал починки, остальное вторично.

Команды, которые стоит знать: dkms status покажет таблицу всех модулей и под какие ядра они собраны; dkms autoinstall попробует достроить недостающее; dkms remove сужает историю, когда модуль устарел; dkms mkbmdeb выпускает deb-пакет из собранного модуля, что удобно для распатронивания на однотипный парк машин. Инструмент простой, и потому его обожают каталоговеды, которые не любят разбираться с кухней ядер каждую неделю.

План на будущее, бережём систему при взрослении железа

Напоследок немного стратегии. Проприетарный драйвер Wi-Fi это не стыдно, но это долг: вы берёте в нагрузку необходимость следить за его совместимостью, и разумно сокращать такие долги при обновлении парка. При следующей покупке ноутбука выбирайте модель на Intel - и со временем DKMS вообще перестанет быть нужен в повседневной жизни, оставшись приятным умением, с которым вы научились знакомиться год назад. До того дня вежливая запись DKMS в вашей памяти будет тем, что действительно отличает машину с историей от машины с тревогами.

Вывод без церемоний: сначала диагностируем точный чип, затем ставим правильный драйвер через DKMS, подписываем модуль под Secure Boot, внимательно встречаем синий экран MOK, проверяем работу сном и обновлением - и больше не возвращаемся к этой теме годами. Именно такого результата вы и добивались, открывая эту статью.

Когда драйвер снова становится ненужным

Хороший финал у истории с DKMS таков: когда-нибудь модуль вольётся в основное ядро, и необходимость в пакете пропадёт. Узнать это можно из новостей релизов и списка изменений: rtw88 активно обрастает чипами, и модели годичной давности выходят из зоны форков. Тогда dkms remove отправляет архив в прошлую жизнь, карта продолжается работать на штатном драйвере, и дисциплина из этой статьи остаётся приятным воспоминанием о времени, когда вы умели поднимать сеть буквально из ничего.

Заключительный ритуал проверки после всех манипуляций

Завершающий список короткий: после перезагрузки uname -r показывает текущее ядро, dkms status подтверждает, что модуль собран именно под него, lsmod выводит нужный модуль, а nmcli device wifi list находит вашу точку доступа. Если все четыре строки совпали, можно считать вопрос закрытым. В противном случае двигаетесь по цепочке снизу вверх: сначала железо, потом модуль, потом Secure Boot, потом NetworkManager - такой порядок каждый раз приводит к находке за пятнадцать минут, и это удивительно приятное чувство для тех, кто ещё помнит эпоху ndiswrapper и пересборок ядра каждую пятницу.
И это финальный кадр истории о маленькой карточке, которая не хотела работать, а потом работала долгие годы.