Суть: сломанную систему можно восстановить без интернета, если есть сами пакеты. Собери нужные .pkg.tar.zst на другом компьютере или достань их из кэша, перенеси на флешке и поставь командой pacman -U /путь/*.pkg.tar.zst. Так лечится и kernel-module mismatch, когда после обновления ядра модули DKMS не совпадают с ним по версии. Ниже полный порядок действий для офлайн-восстановления.
Не переустанавливай систему. Почти любую поломку в Arch Linux можно вылечить офлайн, если под рукой есть пакеты. Вопрос только в том, где их взять.
Три источника пакетов без сети:
/var/cache/pacman/pkg;Если система ещё грузится, начни с кэша. Проверь, что в нём лежит:
ls /var/cache/pacman/pkg/ | grep <имя-пакета>
Нужная версия на месте, ставь её напрямую через pacman -U. Если кэш пуст, а сеть ещё работает, скачай пакеты заранее. Команда pacman -Sw загружает пакет в кэш, не устанавливая его:
sudo pacman -Sw <пакет>
Так набирается запас на будущее: обновил систему, проверил, что всё работает, и скачал свежие версии ключевых пакетов про запас. Когда сеть пропадёт, они уже будут лежать в кэше.
Если сеть пропала совсем, а кэш пуст, пакеты собираются на второй машине с интернетом. Подойдёт любой Arch Linux, даже виртуалка.
Скачай нужные пакеты вместе с зависимостями:
sudo pacman -Sw <пакет> --cachedir /mnt/usb/packages
Флаг --cachedir кладёт пакеты сразу на флешку, минуя системный кэш. Команда скачает и сам пакет, и все его зависимости, так что на флешке окажется полный набор. На выходе получится готовый набор файлов .pkg.tar.zst, который останется только перенести на сломанную машину.
Чтобы не вспоминать, что именно стояло на сломанной системе, заранее экспортируй список пакетов:
pacman -Qqe > packages.txt
Список пригодится и для восстановления, и для переустановки системы с нуля. Как им пользоваться, разобрано в статье «Экспорт списка пакетов».
Ещё один источник: кэш чужой машины. Если на втором компьютере стоит похожая система, скопируй его /var/cache/pacman/pkg целиком:
rsync -av /var/cache/pacman/pkg/ /mnt/usb/packages/
Версии могут не совпасть с твоими, но для восстановления это не критично: pacman сам подберёт совместимые.
pacman -U ставит пакеты из локальных файлов, без обращения к репозиториям. Это главный инструмент офлайн-восстановления.
Один пакет:
sudo pacman -U /mnt/usb/packages/<пакет>.pkg.tar.zst
Пачка пакетов одной командой:
sudo pacman -U /mnt/usb/packages/*.pkg.tar.zst
Звёздочка подставит все файлы из каталога. pacman разберёт зависимости между ними сам: если в пачке есть и библиотека, и программа, которая её использует, обе встанут в правильном порядке.
Если пакетов много и часть уже установлена, добавь флаг -u:
sudo pacman -Uu /mnt/usb/packages/*.pkg.tar.zst
-u пропускает пакеты, версия которых не новее установленной. Удобно, когда пачка собрана с другой машины и часть версий у тебя уже стоит.
Важно: pacman проверяет зависимости и может отказаться ставить пакет, если нужной библиотеки нет в пачке. Тогда добавь недостающий пакет в каталог и повтори команду. Список недостающих зависимостей pacman покажет в сообщении об ошибке.
Классический кейс из чата: обновил ядро, перезагрузился, и система либо не загрузилась, либо потеряла часть устройств. Причина простая: модули ядра не совпадают с самим ядром по версии.
Как это выглядит. Ядро обновилось с 6.12 на 6.13, а модули DKMS, например драйвер видеокарты или Wi-Fi, остались собранными под старое ядро. При загрузке модуль отказывается подключаться: версия модуля не совпадает с версией ядра. Проверяется это так:
uname -r
Вывод покажет версию текущего ядра. Теперь посмотри, под какую версию собраны модули:
ls /usr/lib/modules/
Если каталог модулей не совпадает с версией из uname -r, вот он, mismatch.
Что делать без сети. Модули DKMS пересобираются под новое ядро автоматически при установке пакета. Офлайн это значит одно: переустанови пакет с модулями из кэша или с флешки:
sudo pacman -U /mnt/usb/packages/<пакет-с-модулями>.pkg.tar.zst
После установки DKMS пересоберёт модули под текущее ядро. Проверь:
dkms status
Все строки должны показывать версию ядра из uname -r. Если какая-то строка показывает старую версию, модуль не пересобрался. Причина обычно в том, что пакет с модулями установлен, а заголовков нового ядра нет. Тогда добавь в пачку linux-headers нужной версии и переустанови оба пакета. Про то, как устроены динамические модули и почему они ломаются при обновлении ядра, читай в статье «DKMS: динамические модули».
Если пакета с модулями нет ни в кэше, ни на флешке, а система ещё грузится, загрузись со старым ядром из меню GRUB. Arch хранит несколько ядер, и старое ядро, под которое модули собраны, почти наверняка на месте. После загрузки откати новое ядро из кэша:
sudo pacman -U /var/cache/pacman/pkg/linux-<старая-версия>.pkg.tar.zst
Общий алгоритм отката после обновления разобран в статье «Сломалось после обновления: единый гайд по откату».
Если система не грузится вообще, лечить её придётся извне. Загрузись с live-USB, смонтируй разделы и войди в свою систему через chroot:
lsblk
mount /dev/nvme0n1p2 /mnt # корень, подставь свой раздел
mount /dev/nvme0n1p1 /mnt/boot # ESP, если есть отдельный /boot
arch-chroot /mnt
Теперь ты внутри установленной системы. Если пакеты лежат на флешке, смонтируй её и ставь:
mount /dev/sdb1 /mnt/usb
pacman -U /mnt/usb/packages/*.pkg.tar.zst
Внутри chroot pacman работает как обычно, но без сети. Если сеть в live-окружении есть, пробрось её в систему:
mount --rbind /dev /mnt/dev
mount --rbind /proc /mnt/proc
mount --rbind /sys /mnt/sys
arch-chroot /mnt
После этого внутри chroot доступен интернет, и можно обновить базу пакетов:
pacman -Sy
pacman -Sy обновляет только базу данных пакетов, без установки. Без свежей базы pacman может не найти пакеты, нужные для восстановления, или предложить устаревшие версии. Поэтому обновление базы внутри chroot делается первым делом, ещё до установки чего-либо. Дальше ставь или откатывай пакеты обычными командами. Полная последовательность восстановления через chroot, включая переустановку GRUB, описана в статье «grub rescue: что делать».
После всех действий выйди из chroot и перезагрузись:
exit
umount -R /mnt
reboot
AUR-пакеты не лежат в репозиториях, поэтому pacman -Sw их не скачает. Но собранный заранее пакет ставится офлайн тем же pacman -U.
Собери пакет на машине с интернетом, перенеси .pkg.tar.zst на флешку и поставь:
sudo pacman -U /mnt/usb/packages/<aur-пакет>.pkg.tar.zst
Зависимости из официальных репозиториев тоже должны быть в пачке, иначе pacman откажется ставить. Как организовать офлайн-сборку с кэшем исходников и пакетов, разобрано в статье «Сборка без интернета: локальный кэш makepkg».
Иногда пачки нет, а есть только список того, что сломалось. Тогда пакеты подбираются вручную.
Посмотри, какие файлы принадлежат пакету, и проверь, на месте ли они:
pacman -Ql <пакет>
Вывод покажет все файлы пакета. Такой список удобен и для проверки целостности: если файл из вывода отсутствует на диске, пакет повреждён и его переустановка обязательна. Если часть файлов отсутствует или битая, пакет стоит переустановить.
Когда pacman ругается на конфликт версий, а нужной версии в пачке нет, помогает установка с обходом проверок:
sudo pacman -U --dbonly --force /mnt/usb/packages/<пакет>.pkg.tar.zst
--dbonly записывает пакет в базу, не распаковывая файлы, а --force пропускает проверку конфликтов. Это костыль для экстренных случаев: файлы пакета останутся старыми, но база будет считать пакет установленным. Пользуйся им только чтобы поднять систему до появления сети, а потом переустанови пакеты нормально.
После восстановления системы сеть может не подняться сама, особенно если NetworkManager не запущен. Проверь статус:
systemctl status NetworkManager
Если сервис выключен, включи его:
sudo systemctl enable --now NetworkManager
Подключение к Wi-Fi через nmcli:
nmcli device wifi connect <имя-сети> password <пароль>
Для проводного соединения обычно достаточно включить сервис, NetworkManager сам поднимет интерфейс. Если сеть не появилась, проверь, что драйвер сетевой карты загрузился:
lsmod | grep <имя-драйвера>
Пустой вывод значит, что модуль не загрузился, и это снова вопрос к DKMS и версии ядра.
Нет. Пакеты нужно откуда-то взять. Без сети и без кэша остаётся только live-USB с интернетом: загрузиться с него, смонтировать систему и поставить пакеты из сети через chroot.
Добавь недостающие пакеты в каталог с пачкой и повтори команду. Список недостающих зависимостей pacman покажет в сообщении об ошибке. Скачать их можно на другом компьютере через pacman -Sw.
pacman -S ставит пакеты из репозиториев по сети, pacman -U ставит из локальных файлов. Для офлайн-восстановления нужен только -U.
Скорее всего, пакет с модулями установлен, но DKMS не пересобрал их под новое ядро. Проверь dkms status и пересобери модули вручную:
sudo dkms autoinstall
Да, при первой возможности. pacman -Sy обновит базу, а pacman -Syu приведёт систему в актуальное состояние. До этого момента не ставь новые пакеты: pacman может не знать о свежих версиях.
-U и -Sw.Восстановление без сети сводится к трём шагам: найти пакеты, перенести их на сломанную машину и поставить через pacman -U. Кэш pacman, флешка с пакетами с другого компьютера и chroot с live-USB закрывают почти все сценарии, включая kernel-module mismatch после обновления ядра. Главное, не паниковать и не переустанавливать систему: пакеты есть, значит, есть и лечение. А чтобы в следующий раз было проще, держи свежий кэш и список установленных пакетов под рукой.
Задай вопрос в чате — отвечаем быстро, по делу и без воды.
Комментарии