Ноутбук с чипом Broadcom BCM4360 или Realtek RTL8821CE после установки системы встречает владельца тишиной: сеть не находится, а в списке устройств модуль ядра отсутствует. Открытые драйверы есть не для всех чипов, и часть оборудования по-прежнему работает только с проприетарными модулями, которые собираются отдельно от ядра. Механизм DKMS автоматизирует эту сборку при каждом обновлении ядра, а статья разбирает полный путь: опознание чипа, установка broadcom-wl и rtl8821ce-dkms, разрешение конфликтов модулей, подпись при Secure Boot и типичные ограничения, о которых лучше знать заранее.

Почему проприетарные модули живут вне ядра

Ядро Linux принимает только код под свободной лицензией, поэтому двоичные компоненты Broadcom никогда не попадут в основное дерево. Выход давний: модуль-обертка wl собирается из исходников, а внутри линкуется с закрытым двоичным блобом. Realtek исторически шел тем же путем - исходники драйверов распространялись в сторонних репозиториях, пока часть кода не вычистили и не приняли в ядро в виде семейства rtw88. Такой порядок создает главную сложность: при каждом обновлении ядра внешний модуль обязан пересобраться под новые заголовки, иначе система остается без сети. Эту рутину и закрывает DKMS: пакет драйвера регистрируется в службе, и при установке нового ядра служба сама запускает сборку под его версию. Устроен механизм прозаично. Исходники модуля ложатся в каталог /usr/src рядом с файлом dkms.conf, где описаны имя, версия и команда сборки. Установка проходит этапы add, build и install, после чего depmod обновляет карту зависимостей, и modprobe находит модуль для любого из ядер, под которыми прошла сборка. Ошибки при этом не остаются невидимыми: журнал сборки лежит в каталоге /var/lib/dkms, и по нему всегда видно, на каком шаге и почему все развалилось.

Опознание чипа и выбор между драйверами

Прежде чем ставить что-либо, чип опознают по точному идентификатору:

lspci -nn | grep -i network
03:00.0 Network controller [0280]: Broadcom Inc. BCM4360 [14e4:43a0]

Пара цифр в квадратных скобках - ключ ко всему дальнейшему. Модуль wl обслуживает семейство BCM4311, 4312, 4313, 4321, 4322, 43224, 43225, 43227, 43228, 43142, 4331, 4352 и 4360, но работает только на архитектурах i386 и amd64. Для части из этих чипов существуют открытые альтернативы: b43 поддерживает 4311, 4312, 4321, 4322 и 4331, а brcmsmac берет на себя 4313, 43224 и 43225. Открытый драйвер предпочтительнее везде, где работает: он живет в ядре, обновляется вместе с ним и не требует черных списков. Отдельная деталь b43: открытому коду нужна микропрограмма, которую ставит пакет firmware-b43-installer - утилита b43-fwcutter вырезает блоб из фирменного драйвера и раскладывает файлы в /lib/firmware, после чего карта оживает без единого проприетарного модуля. RTL8821CE с идентификатором 10ec:c821 имеет свою развилку: начиная с ядра 5.9 адаптер обслуживает встроенный модуль rtw88_8821ce, и сторонняя сборка rtl8821ce-dkms нужна только старым системам, ядро которых младше этой версии. Версию ядра фиксируют командой uname -r: она сразу отвечает на вопрос, нужна ли сторонняя сборка для RTL8821CE вообще. Для чипов Broadcom выбор версии не спасает - открытые драйверы покрывают лишь часть семейства, и топовые карточки вроде BCM4360 исторически жили только с проприетарным модулем. Порядок работы с картой Broadcom выглядит так:

  1. Опознать чип командой lspci -nn и записать идентификатор вида 14e4:43a0;
  2. Сверить чип со списком поддержки wl и с открытыми альтернативами b43 и brcmsmac;
  3. Если открытый драйвер подходит, установить его и остановиться на этом шаге;
  4. Добавить компоненты non-free в репозитории и поставить пакет broadcom-sta-dkms;
  5. Проверить черный список конфликтных модулей и загрузить wl через modprobe;
  6. Убедиться в работоспособности сети командой nmcli device wifi list.

Установка broadcom-wl на Debian и Ubuntu

В Debian драйвер живет в компоненте non-free, поэтому в файле /etc/apt/sources.list у основных репозиториев добавляются компоненты contrib и non-free, а для новых выпусков еще и non-free-firmware. После обновления списка пакетов установка занимает одну строку:

sudo apt update
sudo apt install broadcom-sta-dkms linux-headers-amd64

Перед установкой драйвера систему приводят в порядок: apt full-upgrade подтягивает последнее ядро и заголовки из репозитория, потому что смесь старого ядра со свежими заголовками - привычный источник загадочных сбоев DKMS. Пакет broadcom-sta-dkms тянет исходники модуля, регистрирует их в DKMS и собирает под текущее ядро. Заголовки ядра обязательны: без них сборка завершится с сообщением о том, что Makefile не нашел дерево ядра. В Ubuntu тот же драйвер поставляется пакетом bcmwl-kernel-source из компонента multiverse, и менеджер дополнений предложит его сам, как только увидит подходящий чип:

sudo apt install bcmwl-kernel-source
sudo modprobe wl

Ubuntu-пакет дополнительно кладет готовый файл /etc/modprobe.d/blacklist-bcm43.conf, который отводит конфликтные открытые модули в сторону, поэтому после установки достаточно перезагрузиться или явно загрузить wl. Проверка идет через dmesg | grep wl и список интерфейсов: появляется беспроводной интерфейс, и nmcli начинает видеть сети. Если modprobe отвечает, что модуль не найден, первым делом смотрят dkms status - сборка могла сорваться из-за отсутствия заголовков. Рабочая строка вывода выглядит так:

wl/v6.30.223.271, 6.8.0-40-generic, x86_64: installed

Если вместо installed стоит added или сборка отсутствует вовсе, виноваты заголовки ядра или ошибки компиляции, и все ответы лежат в make.log внутри каталога модуля. Если modprobe отвечает, что модуль не найден, первым делом смотрят dkms status - сборка могла сорваться из-за отсутствия заголовков.

Сборка rtl8821ce-dkms из исходников

Для старых систем с ядрами младше 5.9 путь один - сторонние исходники и DKMS. Сначала ставится окружение сборки:

sudo apt install dkms bc build-essential module-assistant git
sudo m-a prepare

Затем исходники берут из репозитория проекта rtl8821ce на GitHub и запускают штатный сценарий:

git clone <репозиторий rtl8821ce> rtl8821ce
cd rtl8821ce
sudo ./dkms-install.sh

Сценарий регистрирует модуль в DKMS, собирает его и устанавливает в дерево модулей, после чего dkms status показывает строку с именем 8821ce и номером версии. Версия заголовков обязана совпадать с версией ядра, под которую идет сборка, поэтому перед установкой проверяют linux-headers-$(uname -r) или ставят мета-пакет linux-headers-generic, который всегда тянется следом за ядром. Если адаптер в этот момент держит старый модуль, его выгружают через modprobe -r, иначе новый не привяжется без перезагрузки. После ручной установки не помешает depmod -a, чтобы карта зависимостей увидела свежий файл. Ручной эквивалент - команды dkms add, dkms build и dkms install с указанием версии, а самым простым запасным вариантом остается обычная связка make и make install, но тогда модуль не пересоберется сам при обновлении ядра. В архивах Ubuntu существовал и готовый пакет rtl8821ce-dkms для старых выпусков вплоть до focal, и на этих системах он до сих пор самый короткий путь. Стоит знать и о судьбе проекта: репозиторий rtl8821ce заморожен, автор после восьми лет поддержки без карты в руках прямо объявил о завершении работы. На современных системах с ядром 5.9 и новее вся эта кухня не нужна: встроенный rtw88_8821ce работает из коробки, а сторонний модуль при его наличии стоит снять, чтобы два драйвера не боролись за один адаптер.

Конфликты модулей и черный список

Broadcom - классический случай борьбы драйверов за устройство. При старте системы модули ssb и bcma могут захватить чип раньше wl, после чего проприетарный драйвер отказывается инициализироваться. Лечение - черный список:

sudo tee /etc/modprobe.d/broadcom-wl.conf <<EOF
blacklist b43
blacklist b43legacy
blacklist ssb
blacklist bcma
blacklist brcmsmac
EOF

После перезагрузки wl забирает устройство единолично, и сеть оживает. Обратная ситуация возникает при переходе на открытые драйверы: wl тогда вносят в черный список тем же способом, иначе ядру достанутся два претендента. С RTL8821CE конфликт выглядит иначе: имена модулей разные, rtw88_8821ce против 8821ce, но привязка к PCI-идентификатору одна, и тот, кто загрузился первым, отбирает адаптер. Правило простое: в системе остается один драйвер чипа, лишний удаляется через dkms remove, а его имя при необходимости попадает в файл черного списка. Эксперимент без перезагрузки тоже возможен: modprobe -r b43 освобождает устройство, затем modprobe wl пробует занять его сразу. Правки черных списков завершают командой update-initramfs -u: часть модулей успевает загрузиться уже из загрузочного образа, и без обновления initramfs старые правила будут жить там еще долго.

Подпись модулей при включенном Secure Boot

DKMS собирает модули без подписи, а ядро с включенной проверкой подписей такие модули отклоняет, и сеть снова пропадает - уже по другой причине. Состояние проверки показывает mokutil --sb-state. На большинстве машин, где вообще встречаются чипы Broadcom старого семейства, Secure Boot отсутствует, и вопрос не встает. На современных системах есть два решения. Простое - отключить проверку в настройках прошивки. Аккуратное - собственный сертификат MOK: создается ключ, в конфигурации DKMS прописывается команда подписи, при первой установке модуля система предлагает зарегистрировать сертификат, и после ввода пароля при следующей загрузке модули проходят проверку. После любых манипуляций с подписями модуль проверяется напрямую: modprobe wl или modprobe 8821ce без ошибок означает, что путь пройден полностью. Настройка сведена к трем шагам: генерация ключа и сертификата, запись путей к ним в конфигурацию DKMS, регистрация сертификата через mokutil --import. При следующей загрузке прошивка покажет синий экран менеджера MOK с предложением подтвердить регистрацию, и после ввода пароля все собранные DKMS модули получат законный статус. Одной регистрации хватает на годы, потому что сертификат меняют редко, а подпись выполняется автоматически при каждой сборке.

Ограничения проприетарных драйверов и откат

У wl есть жесткие рамки, о которых честно предупреждают еще до установки. Режим монитора не поддерживается, точку доступа из ноутбука не поднять, режим энергосбережения капризен, а на свежих версиях ядра сборка периодически ломается, и дистрибутивы догоняют ее собственными патчами. Фактические режимы проверяются через iw list: секция Supported interface modes честно перечисляет, что умеет загруженный драйвер, и у wl в ней окажется только обычный режим клиента. Для повседневной сети этого хватает, но Pentester с таким чипом работать не сможет. RTL8821CE огорчает иначе: на части ноутбуков активное энергосбережение PCIe вызывает обрывы соединения, и встроенный драйвер лечится опцией disable_aspm=1 для модуля rtw88_pci в /etc/modprobe.d, а сторонней сборке помогает параметр ядра pcie_aspm=off. Откат выполняется в обратном порядке: dkms remove снимает модуль из всех ядер, пакет удаляется через apt remove, черный список очищается, и открытый драйвер занимает освободившееся место. Отдельная глава любой беспроводной карты - энергосбережение. Команда iw dev показывает состояние power_save: включенная экономия на нестабильных чипах оборачивается лагами и обрывами, а отключается либо на лету через iw с ключом set power_save off, либо навсегда параметром wifi.powersave=2 в конфигурации NetworkManager. На проприетарном wl экономия батареи и так страдает: закрытый код не всегда дружит с тонкими настройками питания ядра, и обмен пары процентов времени работы на стабильную связь обычно оказывается выгодной сделкой. Если карта нужна изредка, бюджетным решением становится внешний USB-адаптер на чипе с открытой поддержкой: копеечное устройство снимает всю тему проприетарных модулей с повестки. Планируя покупку б/у ноутбука под Linux, чип беспроводной сети стоит проверять заранее - час, потраченный на чтение списков совместимости, экономит неделю возни с драйверами.