Сразу к делу: если pacman -Syu пишет, что всё обновлено, а uname -r показывает старое ядро, значит, пакет ядра не установлен, не пересобран или ты просто не перезагружался. Правильная команда в этом случае: pacman -S linux (или pacman -S linux-lts), а перед ней обязателен полный pacman -Syu. Ошибка unable to locate package пришла из apt, в pacman она выглядит иначе: error: target not found: linux. Она появляется, когда pacman не находит пакет с таким именем: либо имя неверное, либо база пакетов устарела, либо зеркала отдают битые файлы баз.
Самая частая причина проще, чем кажется: ты не перезагружался. pacman -Syu обновляет файлы ядра на диске, но работающая система продолжает использовать старое ядро до перезагрузки. uname -r показывает версию загруженного ядра, а не установленного. Проверь обе версии:
uname -r # загруженное ядро
pacman -Q linux # установленный пакет ядра
Если версии различаются, а пакет обновлён, просто перезагрузись. После перезагрузки uname -r покажет новую версию.
Вторая причина: пакет linux вообще не установлен. pacman -Syu обновляет только установленные пакеты. Если у тебя стоит linux-lts или linux-zen, а не linux, то команда pacman -Syu пакет linux не тронет. Посмотри, какие пакеты ядра есть в системе:
pacman -Qs '^linux'
Третья причина: в меню GRUB несколько записей ядра, и ты загрузил старую. После обновления GRUB может показывать и старые, и новые ядра, пока не перегенерирован конфиг. Выбирай самую свежую запись в меню.
Ещё один нюанс: pacman -Q linux на системе без пакета linux ответит error: package 'linux' was not found. Это нормальный ответ, а не поломка. Просто ядро linux у тебя не установлено, и pacman -Syu его не обновляет.
Если сомневаешься, какое ядро загружено, посмотри на дату файла в /boot: ls -l /boot/vmlinuz-linux. Свежая дата означает, что пакет обновлён, и дело только в перезагрузке.
Четвёртая причина: ядро внесено в IgnorePkg в /etc/pacman.conf. Тогда pacman -Syu пропускает его намеренно. Об этом ниже.
Полный текст ошибки в pacman выглядит так:
$ pacman -S linux
error: target not found: linux
Перевод: pacman не нашёл пакет с именем linux в синхронизированных базах. Причин три.
В apt та же ситуация называется E: Unable to locate package. Формулировки разные, смысл один: пакет не найден. В интернете чаще встречается именно apt-вариант, поэтому новички ищут «unable to locate package», хотя работают с pacman.
Проверить, когда синхронизировалась база, можно по дате файла /var/lib/pacman/sync/core.db. Если дата старая, база давно не обновлялась.
Первая: неверное имя пакета. В Arch нет пакета kernel. Есть linux, linux-lts, linux-zen, linux-hardened. Если ты привык к Debian и ищешь linux-image-..., забудь: в Arch имена другие. Как выбрать подходящее ядро, разобрано в статье «Какое ядро выбрать: linux, linux-lts, linux-zen или linux-hardened».
Вторая: устаревшая или рассинхронизированная база пакетов. Если ты давно не обновлялся, локальные базы могут не содержать актуальную запись о пакете linux. Лечится полным обновлением pacman -Syu.
Третья: зеркала. Если в /etc/pacman.d/mirrorlist только мёртвые зеркала, pacman может получить устаревшие или повреждённые файлы баз. Как это проверить и починить, рассказано ниже.
В Arch пакеты ядра называются по имени ядра, а не по слову «kernel». Пакет linux собирается с конфигурацией, близкой к ванильной, и считается ядром по умолчанию. Рядом живут linux-lts (долгосрочная ветка), linux-zen (оптимизированное для десктопа) и linux-hardened (с усиленной безопасностью). Пакета с именем kernel не существует, поэтому pacman -S kernel всегда даёт error: target not found.
Это частая ловушка для новичков, перешедших с других дистрибутивов. В Ubuntu ядро ставится как linux-image-generic, в Fedora как kernel, а в Arch просто linux. Запомни: в Arch имя пакета ядра совпадает с именем файла в /boot. vmlinuz-linux соответствует пакету linux, а vmlinuz-linux-lts пакету linux-lts.
Несколько ядер можно держать одновременно: linux и linux-lts спокойно живут рядом, каждое со своим initramfs и своей записью в GRUB. Это удобно для отката, если свежее ядро не завелось.
Соблазн сделать pacman -Sy (обновить только базу) и сразу pacman -S linux понятен: быстрее, чем полное обновление. Но это ловушка. pacman -Sy обновляет базу пакетов, не обновляя установленные пакеты. Дальше ты ставишь свежее ядро поверх старой системы и получаешь частичное обновление: часть пакетов новая, часть старая. Библиотеки и ядро могут разъехаться по версиям, и система перестанет загружаться.
Бывает и хуже: после pacman -Sy база новее установленных пакетов, и pacman может предложить понизить версию ядра. Согласишься, и получишь ядро, которое не совместимо с остальной системой.
Правило одно: перед установкой любого пакета, тем более ядра, выполняй полное обновление:
pacman -Syu
Только после успешного завершения ставь ядро. Подробно про частичные обновления и их последствия читай в статье «Частичное обновление pacman: почему это опасно».
После установки ядра хуки обычно сами перегенерируют grub.cfg. Но если новой записи в меню нет, сгенерируй конфиг вручную:
grub-mkconfig -o /boot/grub/grub.cfg
Перед этим проверь, что файлы ядра на месте:
ls /boot/vmlinuz-linux /boot/initramfs-linux.img
Если файлов нет, переустанови ядро (pacman -S linux). Если файлы есть, а записи в меню нет, разбирайся с GRUB отдельно: «GRUB не видит ядра после обновления».
Иногда /boot переполнен, и файлы ядра не записались. Проверь свободное место командой df -h /boot. Если раздел забит, сначала освободи место, потом переустанавливай ядро.
Вот тут и начинается «магия». Если пакет linux уже установлен, команда pacman -S linux не выдаст ошибку «уже установлен». Она переустановит пакет: заново распакует файлы и, главное, заново выполнит хуки. А хуки ядра пересобирают initramfs через mkinitcpio и перегенерируют grub.cfg.
Хуки живут в /usr/share/libalpm/hooks/. Для ядра это 90-mkinitcpio-install.hook (пересборка initramfs) и 30-grub-mkconfig.hook (перегенерация grub.cfg). Когда ты переустанавливаешь пакет, pacman выполняет их заново, как при обычной установке.
После переустановки проверь, что initramfs на месте: ls -l /boot/initramfs-linux.img. Если дата файла свежая, хуки отработали.
Поэтому pacman -S linux чинит:
/usr/src/linux;/boot/initramfs-linux.img;/boot/vmlinuz-linux;Если initramfs был собран с другим ядром, а ты переключился на linux, переустановка приведёт всё в порядок. Про эту ситуацию читай статью «initramfs создан с другим ядром».
То же самое работает для любого ядра: pacman -S linux-lts, pacman -S linux-zen и так далее. Это штатный способ переустановить ядро начисто, без удаления и повторной установки.
Если pacman -Syu стабильно пропускает ядро, хотя версия в репозитории новее, проверь /etc/pacman.conf. Строка IgnorePkg = linux заставляет pacman не обновлять этот пакет. Иногда туда попадает целый список:
IgnorePkg = linux linux-headers
Посмотри, нет ли ядра в этой строке. Если есть, убери его из списка и выполни pacman -Syu. Либо обнови ядро явной установкой: pacman -S linux спросит подтверждение, потому что пакет в списке игнорируемых, и после ответа y переустановит его.
Похожая директива IgnoreGroup работает для целых групп пакетов. Если ядро не обновляется вместе с остальным, проверь обе строки.
Иногда проблема обратная: ядро в репозитории старее установленного. Такое бывает, когда зеркала не синхронизированы или ты смотрел на устаревшее зеркало. Проверь, какую версию предлагает репозиторий:
pacman -Si linux
В выводе смотри поле Version. Сравни с установленной:
pacman -Q linux
Если версия в репозитории старее, чем установленная, обнови список зеркал. Открой /etc/pacman.d/mirrorlist и поставь первым рабочий сервер:
Server = https://geo.mirror.pkgbuild.com/$repo/os/$arch
Затем снова выполни pacman -Syu. Настройка зеркал подробно описана в статье «Настройка mirrorlist в Arch Linux».
Посмотреть все доступные ядра можно так: pacman -Ss '^linux'. В выдаче будут и пакеты ядер, и связанные пакеты вроде linux-headers. Версия в поле Version у пакета linux и есть версия ядра в репозитории.
Если после всех шагов ядро всё ещё не обновляется, загляни в /var/log/pacman.log. Там видно, что pacman делал с пакетом linux и не было ли ошибок при выполнении хуков.
Технически можно, но не нужно. pacman -S linux без предварительного pacman -Syu создаёт частичное обновление и рискованно. Сначала полное обновление, потом ядро.
Проверь, что ты перезагрузился и что в GRUB выбрана свежая запись. Затем сравни pacman -Q linux и uname -r. Если пакет обновлён, а загружается старое ядро, перегенерируй конфиг grub-mkconfig -o /boot/grub/grub.cfg и перезагрузись снова.
uname -r показывает загруженное ядро, а pacman -Q linux установленный пакет. Список всех установленных ядер даёт pacman -Qs '^linux'.
Нет. Обычное pacman -Syu само обновляет ядро и пересобирает initramfs через хуки. Переустановка pacman -S linux нужна только для ремонта: сломанный симлинк, пропавший initramfs, битый конфиг GRUB.
GRUB хранит старые записи, пока не перегенерирован grub.cfg. После grub-mkconfig -o /boot/grub/grub.cfg меню почистится, останутся только актуальные ядра.
Ядро не обновилось: почти всегда это не «проблема с репозиториями», а одна из трёх вещей. Либо ты не перезагрузился, либо пакет ядра не установлен, либо база пакетов рассинхронизирована. Правильный порядок прост: pacman -Syu, затем pacman -S linux (или нужное ядро), при необходимости grub-mkconfig -o /boot/grub/grub.cfg, затем перезагрузка. А «магия» pacman -S linux в том, что это просто переустановка с повторным запуском хуков, которая чинит половину проблем с ядром. Если после всех шагов ядро всё ещё не то, повтори порядок ещё раз: обновление, переустановка, генерация конфига, перезагрузка.
Задай вопрос в чате — отвечаем быстро, по делу и без воды.
Комментарии