Пропал Wi-Fi после обновления ядра: пересборка модуля DKMS
Wi-Fi пропал после обновления ядра почти всегда из-за того, что модуль сетевой карты не пересобрался для нового ядра. Лечится это одной командой sudo dkms autoinstall, а если модуль встроенный, обновлением пакета linux-firmware. Ниже разберу диагностику и все способы починки по порядку.
Почему Wi-Fi пропадает после обновления ядра
Ядро в Arch Linux обновляется часто, и вместе с ним обновляются модули. Модули, которые живут внутри ядра, пересобираются автоматически. А вот драйверы вне дерева ядра, так называемые out-of-tree, собираются отдельно под каждую версию ядра.
К таким драйверам относятся модули многих Wi-Fi карт: rtl88x2bu, rtl8852be, rtl8821cu, иногда mt7921e и сетевые контроллеры Aquantia (aqc). Ставятся они через DKMS, систему, которая собирает модуль под каждое установленное ядро.
Почему вообще существуют out-of-tree драйверы? Производители Wi-Fi чипов, особенно Realtek, не спешат отправлять код в основное ядро. Драйвер живёт в отдельном репозитории, а пользователь собирает его сам. Отсюда и пакеты вида rtl88x2bu-dkms в AUR: они упаковывают исходники и отдают их DKMS. Пока ядро не меняется, всё работает. Сменилась версия ядра: модуль надо собирать заново.
Разберём, что происходит при обновлении. pacman -Syu ставит новое ядро в /boot и новые модули в /usr/lib/modules/<версия>. Сразу после обновления срабатывает хук DKMS: он берёт исходники внешних модулей, собирает их под свежее ядро и кладёт рядом с остальными. Если сборка прошла успешно, ты ничего не замечаешь. Если заголовки нового ядра не установлены или исходники несовместимы с новым ядром, хук падает, а pacman показывает предупреждение. Модуль для нового ядра так и не появляется, а старый остаётся лежать в /usr/lib/modules/<старая версия>.
Отдельно стоит сказать про initramfs. Если модуль прописан в mkinitcpio.conf в массиве MODULES, он попадает в образ initramfs и грузится на раннем этапе. Тогда пересборка модуля без пересборки initramfs не даст эффекта, образ останется со старым модулем.
После обновления ядра старый модуль остаётся собранным только для старой версии. Если DKMS не собрал модуль для новой, карта остаётся без драйвера. Симптомы классические:
nmcli deviceне показывает ни одного Wi-Fi устройства;iwctl device listпустой;ip linkне показываетwlan0;- проводная сеть при этом работает.
Самое неприятное, система загружается нормально, интернет по кабелю есть, а Wi-Fi просто исчез. Выглядит как поломка железа, хотя карта жива.
Как проверить, что модуль не собрался для нового ядра
Посмотри dkms status
Первая команда: dkms status. Она показывает все модули DKMS и ядра, под которые они собраны:
dkms status
Вывод выглядит примерно так:
rtl88x2bu/5.13.1, 6.12.10-arch1-1, x86_64: installed
rtl88x2bu/5.13.1, 6.13.1-arch1-1, x86_64: installed
Сверь список с версией текущего ядра:
uname -r
Если в выводе dkms status нет версии твоего ядра, вот и причина. Модуль просто не собрался под новое ядро.
Проверь, какой драйвер использует карта
Команда lspci покажет сетевой контроллер и загруженный для него драйвер:
lspci -knn -d ::0280
0280: класс сетевых контроллеров, туда попадают и Wi-Fi карты. Строка Kernel driver in use: rtl88x2bu означает, что драйвер загружен. Если такой строки нет, драйвер не подхватился.
Проверь список интерфейсов
ip link
Если wlan0 (или wl...) в списке нет, драйвер не подхватился. Если интерфейс есть, но не поднимается, проблема в другом: в NetworkManager, в wpa_supplicant или в прошивке.
Посмотри логи ядра
dmesg | grep -iE 'rtl|firmware|wifi'
Там часто видно, что модуль не нашёлся или прошивка не загрузилась. Например, Direct firmware load for rtlwifi/rtl8852befw.bin failed. Это уже про linux-firmware, а не про DKMS.
Проверь, загружается ли модуль вручную
Если dkms status показывает модуль как собранный, но Wi-Fi всё равно нет, попробуй загрузить его руками:
sudo modprobe rtl88x2bu
lsmod | grep rtl
Если modprobe молчит и модуль появился в lsmod, проблема не в сборке, а в подхвате. Проверь, не заблокирован ли модуль в чёрном списке: grep -r rtl /etc/modprobe.d/. Если модуль не грузится с ошибкой про неизвестный символ, он собран под другое ядро, и пересборка всё-таки нужна.
Как пересобрать модуль DKMS
Порядок действий простой: сначала заголовки, потом пересборка, потом проверка. Не пропускай шаги, каждый из них закрывает свою причину.
Убедись, что заголовки ядра на месте
DKMS собирает модуль из исходников, а для сборки нужны заголовки ядра. Без них сборка падает с ошибкой про отсутствующие файлы в /usr/lib/modules/.../build.
sudo pacman -S linux-headers
Если используешь LTS-ядро, ставь linux-lts-headers. Заголовки должны совпадать с ядром, под которое собираешь модуль.
Пересобери все модули
sudo dkms autoinstall
Команда соберёт все модули DKMS под все установленные ядра, для которых сборки ещё нет. Это самый простой вариант.
Можно собрать модуль точечно под конкретное ядро:
sudo dkms install rtl88x2bu/5.13.1 -k $(uname -r)
$(uname -r) подставит версию текущего ядра автоматически.
Переустанови пакет с модулем
Если autoinstall не помог, переустанови пакет. Хук DKMS в pacman пересоберёт модуль при установке:
sudo pacman -S rtl88x2bu-dkms
Имя пакета подставь своё: rtl8852be-dkms, rtl8821cu-dkms и так далее. После переустановки проверь dkms status: модуль должен появиться для нового ядра.
Если сборка падает с ошибкой
Смотри лог /var/lib/dkms/<модуль>/<версия>/build/make.log. Частые причины: несовместимость исходников с новым ядром (тогда жди обновления пакета в AUR) и нехватка места на диске. Проверить место: df -h /usr.
Пересобери initramfs
Если модуль нужен на раннем этапе загрузки, например, для шифрованного корня, пересобери initramfs:
sudo mkinitcpio -P
mkinitcpio -P пересоберёт initramfs для всех установленных ядер. Для большинства Wi-Fi карт это не требуется: модуль грузится позже, из корня. Но если после пересборки DKMS Wi-Fi так и не появился, прогони mkinitcpio -P и перезагрузись, это исключит ещё один вариант.
После пересборки перезагружайся и проверяй ip link.
Что делать, если модуль встроенный, а не из DKMS
Не все карты используют DKMS. Часть драйверов живёт прямо в ядре, но для работы им нужна прошивка, файлы в /usr/lib/firmware. Если прошивка не обновилась вместе с ядром, модуль загружается, но карта не поднимается.
Решение: обновить linux-firmware:
sudo pacman -Syu
sudo pacman -S linux-firmware
Проверить, что файлы прошивки на месте, можно так:
ls /usr/lib/firmware/rtlwifi/ | grep 8852
Если файла нет, обнови linux-firmware и перезагрузись. Обрати внимание: прошивки выходят отдельно от ядра, и свежая версия пакета часто чинит карты, которые «внезапно» перестали работать после очередного pacman -Syu. Про то, что именно обновляется в этом пакете, отдельная статья: linux-firmware: что обновляется.
Как быстро вернуть интернет без пересборки
Если Wi-Fi нужен прямо сейчас, а разбираться некогда, загрузись со старого ядра. Если у тебя установлено LTS-ядро, выбери его в меню GRUB при загрузке. Под него модуль уже собран, и Wi-Fi заработает сразу.
Важно: LTS-ядро должно быть установлено заранее, вместе с linux-lts-headers. Если его нет, поставь из рабочей системы:
sudo pacman -S linux-lts linux-lts-headers
После установки оно появится в меню GRUB, и при следующей проблеме с новым ядром у тебя будет рабочая загрузка. Про то, как держать несколько ядер в меню GRUB, в статье Несколько ядер в меню: linux, linux-lts, linux-hardened.
Как предотвратить пропажу Wi-Fi в будущем
Проверяй dkms status после каждого обновления
Одна команда, десять секунд:
dkms status
Если после pacman -Syu модуль не появился для нового ядра, пересобери сразу, пока не перезагрузился.
Следи за выводом pacman
При обновлении смотри вывод pacman. Если DKMS не смог собрать модуль, pacman покажет ошибку сборки прямо в терминале, с именем модуля и путём к логу. Увидел такое, не перезагружайся, а сразу разбирайся: ставь заголовки, пересобирай. Перезагрузка с несобранным модулем и есть тот самый «пропавший Wi-Fi».
Держи заголовки ядра установленными
linux-headers нужны не только для DKMS. Без них не соберётся ни один внешний модуль. Проверить, что версии совпадают:
pacman -Q linux linux-headers
Обе строки должны показывать одну версию.
Держи запасное ядро
LTS-ядро рядом с обычным, страховка на случай проблем. Если новое ядро сломало Wi-Fi, всегда есть рабочая загрузка.
Разберись, как работает DKMS
Понимание механизма убирает половину страха. Про то, как DKMS собирает и подключает модули, в статье DKMS: динамические модули ядра.
Эти привычки, проверка dkms status, слежка за выводом pacman, установленные заголовки и запасное ядро, закрывают проблему навсегда. Wi-Fi после обновления ядра перестанет пропадать.
Частые вопросы
Почему dkms status показывает модуль только для старого ядра?
Потому что после обновления ядра хук DKMS не отработал или отработал с ошибкой. Чаще всего причина: отсутствующие заголовки нового ядра. Поставь linux-headers и выполни sudo dkms autoinstall. Проверь также, что версии совпадают: pacman -Q linux linux-headers.
Нужно ли пересобирать initramfs после пересборки модуля DKMS?
Для Wi-Fi обычно нет: модуль загружается из корня, а не из initramfs. Пересборка нужна, если модуль используется на раннем этапе загрузки, например, для сетевого корня или шифрования. В сомнительных случаях sudo mkinitcpio -P не навредит.
Что делать, если dkms autoinstall не помог?
Проверь вывод команды на ошибки сборки. Частая причина: несовпадение версий заголовков и ядра. Также попробуй переустановить пакет с модулем: sudo pacman -S <имя>-dkms. Если ошибка осталась, смотри лог сборки в /var/lib/dkms/<модуль>/<версия>/build/make.log: последние строки обычно показывают причину, несовместимый код, отсутствующий заголовок, нехватка места.
Как узнать, какой модуль нужен моей карте?
Выполни lspci -knn -d ::0280 и посмотри строку с названием контроллера. Дальше ищи по этому имени пакет в AUR или репозиториях. Для большинства карт Realtek это rtl88x2bu-dkms, rtl8852be-dkms или rtl8821cu-dkms.
Пропадёт ли Wi-Fi снова при следующем обновлении ядра?
Если DKMS работает штатно, нет. Хук пересоберёт модуль автоматически. Проблемы начинаются, когда заголовки не установлены или хук падает. Если хук падает регулярно, посмотри статус службы systemctl status dkms и логи journalctl -u dkms. Проверка dkms status после каждого обновления закрывает вопрос.
Полезные ресурсы
- DKMS, ArchWiki: официальная документация по DKMS.
- Network configuration/Wireless, ArchWiki: настройка беспроводных сетей.
- Методика решения проблем в Arch Linux: общий подход к диагностике.
- Настройка Wi-Fi через wpa_supplicant: если после починки модуля сеть не поднимается.
Заключение
Пропажа Wi-Fi после обновления ядра: не поломка железа, а пропущенная пересборка модуля. Диагностика занимает минуту: dkms status, lspci -knn -d ::0280, dmesg. Лечение: sudo dkms autoinstall или переустановка пакета с модулем, а встроенным драйверам помогает обновление linux-firmware. Держи заголовки ядра установленными, проверяй dkms status после обновлений и имей под рукой LTS-ядро, и Wi-Fi больше не будет пропадать.
Не получилось? Поможем настроить
Задай вопрос в чате — отвечаем быстро, по делу и без воды.

Комментарии