Почему apt-cache показывает «установлено (нет)» для вашего VPN-пакета
«Установлено (нет)» означает, что VPN-пакет не установлен, а не что он отсутствует. Прочитайте строки кандидата, закрепления и архитектуры, прежде чем править источники.
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, прежде чем он начнёт передавать трафик.