VPN-пакет, который сообщает Installed: (none), не отсутствует; он просто не установлен. Строка, которая решает, можно ли его установить, — это Candidate, и APT выводит её из индексов, имени suite, архитектуры и любых действующих правил закрепления. Большинство сообщений об исчезнувшем VPN-пакете оказываются проблемой кандидата, а не проблемой упаковки. Прочитайте обе строки, прежде чем трогать хотя бы одну запись источников.

Я проверяю кандидата первым, потому что это стоит одной команды и отсекает половину обычных догадок.

Что вам говорит вывод apt-cache policy

apt-cache policy читает локальный кэш пакетов, а не сеть. Он печатает установленную версию, версию кандидата и таблицу каждого индекса, который предлагает пакет, вместе с привязанным к нему приоритетом.

apt-cache policy openvpn
apt-cache madison openvpn
apt list -a network-manager-openvpn

Кандидат — это версия, которую APT выбрал бы прямо сейчас. madison перечисляет, что предлагает каждый источник с его приоритетом, и именно так вы замечаете пакет, который есть в индексе, но проигрывает соревнование закрепления. Руководство apt-cache описывает то и другое как чтение кэша, поэтому ни одно из них не доказывает, что зеркало доступно в этот момент.

Если строка кандидата пуста или показывает (none), ничто в настроенных источниках не подходит для этой системы в её текущей настройке.

Четыре причины, по которым кандидат исчезает

На практике причина почти всегда одна из четырёх вещей, и у каждой своё решение.

Имя suite в ваших источниках должно совпадать с дистрибутивом, для которого собран пакет. Система Debian bookworm, направленная на зеркало trixie, или выпуск Ubuntu, переименованный в файле sources.list.d во время обновления, ничего не решают для пакетов, существующих только в другом suite. Сравните lsb_release -cs с полем suite в каждой записи.

APT видит только пакеты, собранные для архитектур, которые знает dpkg. 32-битный контейнер, образ arm64 или установка на Raspberry Pi, запрашивающая пакет, поставляемый только для amd64, получает пустого кандидата вместо сообщения об ошибке. dpkg --print-architecture и dpkg --print-foreign-architectures скажут, в каком наборе вы на самом деле находитесь.

Компоненты тоже важны. Пакет в contrib или non-free невидим, когда включён только main, а universe в Ubuntu ведёт себя так же. Индекс существует, и пакет в нём есть; просто ваш список включённых компонентов его не содержит.

Закрепление — тихая причина. Файл в /etc/apt/preferences.d может ограничить пакет ниже порога установки, и тогда вполне хороший кандидат исчезает из вывода, хотя индекс всё ещё его перечисляет. Поскольку policy печатает приоритеты рядом с каждым источником, пакет, у которого каждый источник имеет низкий номер закрепления, — это подсказка.

Устаревшие индексы выглядят как отсутствующие пакеты

Кэш — это снимок. Если последний apt update не удался на одном индексе, запросы продолжают отвечать из более старой копии, и нужного вам пакета в этой копии может не быть.

apt update печатает ошибки по каждому индексу, поэтому читайте их, а не прокручивайте сразу к последней строке.

Обновление, которое не удаётся из-за ошибки подписи, истёкшего файла release или недоступного зеркала, оставляет предыдущий индекс на месте. Это разумное решение, потому что оно сохраняет работающий кэш, когда зеркало ненадолго недоступно. Побочный эффект в том, что поиск может удаться, пока репозиторий офлайн. Это также значит, что отсутствие пакета ничего не доказывает, пока вы не узнаете, когда индекс был получен в последний раз. Проверьте даты файлов в /var/lib/apt/lists, прежде чем винить имя пакета.

Назовите пакет, который действительно нужен

OpenVPN — это демон, а части, которые обычно нужны людям, — отдельные пакеты.

Движок, плагин NetworkManager и редактор рабочего стола — это три пакета с тремя именами, а у плагина есть вариант GTK, имя которого различается между дистрибутивами. apt-cache search --names-only openvpn сопоставляет имена и предоставленные имена вместо описаний, и это то, что нужно, когда вы приблизительно знаете, как называется эта вещь.

Если имя действительно неизвестно, один раз поищите по описаниям, затем вернитесь к точным именам. Не добавляйте суффикс -gui, позаимствованный из другого дистрибутива, и не делайте вывод, что пакета больше не существует.

Меняйте источники последними, затем проверьте транзакцию

Добавление репозитория меняет того, кто поставляет ваши обновления, поэтому оно относится к концу расследования, а не к началу.

Перед этим подтвердите выпуск, архитектуру, компонент и состояние закрепления. Запишите, какие из четырёх вы проверили, чтобы следующий человек не повторял обход. Если все четыре верны, а кандидат всё ещё отсутствует, честный вывод — этот выпуск не поставляет такой пакет. Остальные варианты — backport, пакет поставщика или другой поддерживаемый выпуск, и каждый из них осознанный выбор, а не догадка.

Когда кандидат всё же появится, смоделируйте перед применением: apt-get install --simulate с именем пакета покажет, что будет подтянуто и что удалено. Доступность пакета, установка и работающий туннель остаются тремя отдельными этапами, и туннелю всё ещё нужны его профиль, учётные данные, маршруты и DNS, прежде чем он начнёт передавать трафик.

Похожие статьи