Сразу к делу: Wi-Fi пропал после обновления ядра почти всегда из-за того, что модуль сетевой карты не пересобрался для нового ядра. Лечится это одной командой sudo dkms autoinstall, а если модуль встроенный — обновлением пакета linux-firmware. Ниже разберу диагностику и все способы починки по порядку.
Ядро в 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 и ядра, под которые они собраны:
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 собирает модуль из исходников, а для сборки нужны заголовки ядра. Без них сборка падает с ошибкой про отсутствующие файлы в /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:
sudo mkinitcpio -P
mkinitcpio -P пересоберёт initramfs для всех установленных ядер. Для большинства Wi-Fi карт это не требуется: модуль грузится позже, из корня. Но если после пересборки DKMS Wi-Fi так и не появился — прогони mkinitcpio -P и перезагрузись, это исключит ещё один вариант.
После пересборки перезагружайся и проверяй ip link.
Не все карты используют 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.
Одна команда, десять секунд:
dkms status
Если после pacman -Syu модуль не появился для нового ядра — пересобери сразу, пока не перезагрузился.
При обновлении смотри вывод pacman. Если DKMS не смог собрать модуль, pacman покажет ошибку сборки прямо в терминале — с именем модуля и путём к логу. Увидел такое — не перезагружайся, а сразу разбирайся: ставь заголовки, пересобирай. Перезагрузка с несобранным модулем и есть тот самый «пропавший Wi-Fi».
linux-headers нужны не только для DKMS. Без них не соберётся ни один внешний модуль. Проверить, что версии совпадают:
pacman -Q linux linux-headers
Обе строки должны показывать одну версию.
LTS-ядро рядом с обычным — страховка на случай проблем. Если новое ядро сломало Wi-Fi, всегда есть рабочая загрузка.
Понимание механизма убирает половину страха. Про то, как DKMS собирает и подключает модули, — в статье DKMS: динамические модули ядра.
Эти привычки — проверка dkms status, слежка за выводом pacman, установленные заголовки и запасное ядро — закрывают проблему навсегда. Wi-Fi после обновления ядра перестанет пропадать.
Потому что после обновления ядра хук DKMS не отработал или отработал с ошибкой. Чаще всего причина — отсутствующие заголовки нового ядра. Поставь linux-headers и выполни sudo dkms autoinstall. Проверь также, что версии совпадают: pacman -Q linux linux-headers.
Для Wi-Fi обычно нет: модуль загружается из корня, а не из initramfs. Пересборка нужна, если модуль используется на раннем этапе загрузки — например, для сетевого корня или шифрования. В сомнительных случаях sudo mkinitcpio -P не навредит.
Проверь вывод команды на ошибки сборки. Частая причина — несовпадение версий заголовков и ядра. Также попробуй переустановить пакет с модулем: sudo pacman -S <имя>-dkms. Если ошибка осталась — смотри лог сборки в /var/lib/dkms/<модуль>/<версия>/build/make.log: последние строки обычно показывают причину — несовместимый код, отсутствующий заголовок, нехватка места.
Выполни lspci -knn -d ::0280 и посмотри строку с названием контроллера. Дальше ищи по этому имени пакет в AUR или репозиториях. Для большинства карт Realtek это rtl88x2bu-dkms, rtl8852be-dkms или rtl8821cu-dkms.
Если DKMS работает штатно — нет. Хук пересоберёт модуль автоматически. Проблемы начинаются, когда заголовки не установлены или хук падает. Если хук падает регулярно — посмотри статус службы systemctl status dkms и логи journalctl -u dkms. Проверка dkms status после каждого обновления закрывает вопрос.
Пропажа Wi-Fi после обновления ядра — не поломка железа, а пропущенная пересборка модуля. Диагностика занимает минуту: dkms status, lspci -knn -d ::0280, dmesg. Лечение — sudo dkms autoinstall или переустановка пакета с модулем, а для встроенных драйверов — обновление linux-firmware. Держи заголовки ядра установленными, проверяй dkms status после обновлений и имей под рукой LTS-ядро — и Wi-Fi больше не будет пропадать.
Задай вопрос в чате — отвечаем быстро, по делу и без воды.
Комментарии