Как определить, какой процесс установки я использовал для установки приложения?

Вопрос или проблема

Я использую различные способы установки приложений

  • apt install
  • snap install
  • .deb

Но каждый раз, когда мне нужно обновить программу, я сталкиваюсь с трудностями в определении, каким методом она была установлена, а значит, какой метод использовать для ее обновления.

Как мне легко узнать, каким методом установки я пользовался?

apt install загружает и устанавливает .deb пакеты. Некоторые из этих deb пакетов могут устанавливать соответствующие snap-пакеты.

Так, например, в случае с пакетом firefox на Ubuntu 22.04, по крайней мере, файл /var/lib/dpkg/info/firefox.preinst выполняет команду snap install firefox.

Также обратите внимание, что .deb пакет, который вы устанавливаете локально с помощью dpkg -i или gdebi, может добавить репозиторий apt, что позволит при выпуске обновлений они будут загружаться через apt.

apt policy package-name

Команда предоставит отчет о том, где версии пакетов package-name deb доступны в сконфигурированных репозиториях, включая запись для /var/lib/dpkg/status, если пакет установлен.

Если установленная версия совпадает с версией, найденной в одном из сконфигурированных репозиториев, это хороший показатель того, что она была установлена через apt (за исключением вышеупомянутого случая, когда вручную установленный .deb настраивает новый репозиторий apt).

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

Чтобы получить список установленных пакетов, которые не найдены ни в одном из текущих сконфигурированных репозиториев, можно выполнить:

aptitude search '~o'

(теперь поддерживается и apt list).

Это не покажет те, которые найдены в репозиториях, но с более старыми версиями, для чего можно выполнить:

aptitude search --disable-columns -F '%c%M%S %p %v "%d" [%t]' '~S~i !~U !~o' |
  awk  '$NF == "1739970680" || $NF == "[]"'

(!~U используется, чтобы не отображать те, которые можно обновить, то есть для которых доступна более новая версия в сконфигурированном репозитории).

Для получения списка snap-пакетов можно выполнить:

snap list

Или

snap list --all

для получения всех ревизий.

Если пакет включает в себя один или более исполняемых файлов, то, если он установлен из snap, он будет найден в /snap/bin как символическая ссылка на /usr/bin/snap.

$ type -a chromium
chromium is /snap/bin/chromium

Вы можете определить, принадлежит ли файл в пакете к .deb пакету (независимо от того, был ли он установлен вручную или через apt) с помощью dpkg -S (который на самом деле вызывает dpkg-query --search).

Будьте внимательны, однако, что в последние дни /bin является символической ссылкой на /usr/bin, и некоторые пакеты извлекают свои команды в /bin, а некоторые в /usr/bin, так что вам придется проверить оба:

$ dpkg -S /bin/firefox
dpkg-query: no path found matching pattern /bin/firefox
$ dpkg -S /usr/bin/firefox
firefox: /usr/bin/firefox

Или выполнить поиск по шаблону:

dpkg -S '*/bin/firefox'

Или поиск по подстроке (когда первый символ шаблона ни один из *[?/) с помощью dpkg -S bin/firefox (хотя это может также включать такие вещи, как /sbin/firefox-updater).

Здесь /bin/firefox и /usr/bin/firefox — это один и тот же файл, но в пакете указан только /usr/bin/firefox как один из его файлов-членов, в соответствующем .list файле:

$ grep -Fx /usr/bin/firefox /var/lib/dpkg/info/*.list
/var/lib/dpkg/info/firefox.list:/usr/bin/firefox

Здесь /usr/bin/firefox происходит из firefox .deb пакета, но, как упомянуто выше, программное обеспечение firefox на самом деле происходит из snap, а /usr/bin/firefox — это просто скрипт, который вызывает /snap/bin/firefox.

Другие источники информации, которые вы можете изучить, это журналы:

  • /var/log/aptitude* для вещей, установленных/удаленных/обновленных с помощью aptitude
  • /var/log/apt/history.log* для того же для команд apt.
  • /var/log/dpkg.log* для того же для dpkg (который вызывается apt и aptitude).
  • journalctl _COMM=snap-store для вещей, связанных с snap.

Если вы знакомы с git, использование etckeeper для ведения истории конфигурации вашей системы в репозитории git помогает. Возможно, понадобятся дополнительные настройки для работы с snap, которые являются особенностью Ubuntu.

Конечно, dpkg, apt* и snap — не единственные способы установки программного обеспечения, и deb/apt — не единственные системы управления пакетами, доступные на Ubuntu. Многие языки программирования поставляются с собственными системами управления пакетами, такими как pip3, cargo, cpan и т.д. И, конечно, вы или администратор вашей системы можете установить программное обеспечение с помощью простого копирования файлов или какого-либо пользовательского установщика, или make install или эквивалента дистрибутива с исходными кодами в вашем домашнем каталоге или /usr/local или /opt/vendor, и т.д., возможно с символическими ссылками в /bin, /usr/bin или /usr/local/bin или в другом месте стандартного $PATH.

В общем, все становится проще, если не устанавливать .deb пакеты из ненадежных источников. Это почти всегда плохая идея. (существуют очень-очень специфические исключения, но как обычный пользователь вы вряд ли с ними столкнетесь.)

В любом случае, первым шагом является выяснение местоположения указанного приложения. Если вы запускаете его из оболочки, простая команда type -p {command} покажет вам путь к программе. Если этот путь содержит /var…/snap…, то это snap-пакет.

Если нет, команда dpkg -S /path/to/executable подскажет, из какого пакета этот файл.

И если вы не знаете, из какого репозитория вы его установили, команда apt policy {package name} подскажет.

Ответ или решение

Определение метода установки приложения в системах, использующих Ubuntu и аналогичные дистрибутивы Linux, требует знания об инструментах и формате пакетов, с которыми вы работаете. Данная задача может осложниться использованием различных методов, таких как apt, snap и прямое использование .deb файлов. Разберем способы, которые помогут вам определить, каким методом было установлено то или иное приложение.

Теория

  1. APT и .deb пакеты: apt — это пакетный менеджер, который работает с .deb файлами. Он предназначен для установки программного обеспечения из репозиториев, что обеспечивает автоматические обновления и разрешение зависимостей. Однако, использование dpkg -i или gdebi для прямой установки .deb файла не добавляет информацию об обновлениях, кроме случаев, когда при установке конфигурируется новый репозиторий apt.

  2. Snap: snap — это другой формат и система управления пакетами, которая работает независимо от apt. Она упрощает управление зависимостями, поскольку приложения используются в отдельных контейнерах и включают все необходимые библиотеки.

Примеры

  • APT: Для проверки, установлен ли пакет через apt, используйте команду apt policy package-name. Это покажет, если текущая версия пакета доступна в одном из репозиториев, что является хорошим индикатором того, что она была установлена через apt.

  • Snap: Для просмотра установленных snap-пакетов, используйте команду snap list. Это позволит увидеть все snap-пакеты, установленные на вашей системе.

  • Методы для определения установленных файлов:

    • Команда type -p {command} может показать вам, где запускается исполняемый файл. Если путь содержит /snap/bin, это указывает на то, что файл используется в snap.
    • dpkg -S /путь/к/файлу поможет идентифицировать, какой пакетом управляет определенный файл.

Применение

  1. Поиск установленных пакетов, не связанных с репозиториями:
    Используйте aptitude search '~o', чтобы найти пакеты, которые могут быть установлены локально и которые больше не доступны в текущих репозиториях.

  2. Логи: Изучите логи для получения истории установки пакетов:

    • /var/log/apt/ и /var/log/dpkg.log* содержат информацию о всех установках, обновлениях и удалениях, выполненных с помощью соответствующих инструментов.
    • Для snap-пакетов можно использовать journalctl _COMM=snap-store.
  3. Гибкость использования различных инструментов: Не полагайтесь на установку .deb файлов из недостоверных источников. Для большинства пользователей лучше оставаться в пределах стандартных репозиториев, что облегчит управление и обновление пакетов.

Заключение

Чтобы поддерживать корректную и простую схему обновлений и установок, рекомендуется:

  • Ограничить установку программного обеспечения стандартными репозиториями.
  • Учитывать использование различных инструментов, в зависимости от требований и возможностей системы.
  • Методично вести логи всех изменений, используя инструменты, такие как etckeeper.

Это усилие объясняет важность и методы, с помощью которых вы можете контролировать установки программного обеспечения в вашей системе. Такой подход поможет в будущем избежать проблем с обновлениями и несовместимостью программного обеспечения.

Оцените материал
Добавить комментарий

Капча загружается...