Вопрос или проблема
Я использую различные способы установки приложений
- 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
файлов. Разберем способы, которые помогут вам определить, каким методом было установлено то или иное приложение.
Теория
-
APT и .deb пакеты:
apt
— это пакетный менеджер, который работает с.deb
файлами. Он предназначен для установки программного обеспечения из репозиториев, что обеспечивает автоматические обновления и разрешение зависимостей. Однако, использованиеdpkg -i
илиgdebi
для прямой установки.deb
файла не добавляет информацию об обновлениях, кроме случаев, когда при установке конфигурируется новый репозиторий apt. -
Snap:
snap
— это другой формат и система управления пакетами, которая работает независимо отapt
. Она упрощает управление зависимостями, поскольку приложения используются в отдельных контейнерах и включают все необходимые библиотеки.
Примеры
-
APT: Для проверки, установлен ли пакет через
apt
, используйте командуapt policy package-name
. Это покажет, если текущая версия пакета доступна в одном из репозиториев, что является хорошим индикатором того, что она была установлена черезapt
. -
Snap: Для просмотра установленных snap-пакетов, используйте команду
snap list
. Это позволит увидеть все snap-пакеты, установленные на вашей системе. -
Методы для определения установленных файлов:
- Команда
type -p {command}
может показать вам, где запускается исполняемый файл. Если путь содержит/snap/bin
, это указывает на то, что файл используется в snap. dpkg -S /путь/к/файлу
поможет идентифицировать, какой пакетом управляет определенный файл.
- Команда
Применение
-
Поиск установленных пакетов, не связанных с репозиториями:
Используйтеaptitude search '~o'
, чтобы найти пакеты, которые могут быть установлены локально и которые больше не доступны в текущих репозиториях. -
Логи: Изучите логи для получения истории установки пакетов:
/var/log/apt/
и/var/log/dpkg.log*
содержат информацию о всех установках, обновлениях и удалениях, выполненных с помощью соответствующих инструментов.- Для snap-пакетов можно использовать
journalctl _COMM=snap-store
.
-
Гибкость использования различных инструментов: Не полагайтесь на установку .deb файлов из недостоверных источников. Для большинства пользователей лучше оставаться в пределах стандартных репозиториев, что облегчит управление и обновление пакетов.
Заключение
Чтобы поддерживать корректную и простую схему обновлений и установок, рекомендуется:
- Ограничить установку программного обеспечения стандартными репозиториями.
- Учитывать использование различных инструментов, в зависимости от требований и возможностей системы.
- Методично вести логи всех изменений, используя инструменты, такие как
etckeeper
.
Это усилие объясняет важность и методы, с помощью которых вы можете контролировать установки программного обеспечения в вашей системе. Такой подход поможет в будущем избежать проблем с обновлениями и несовместимостью программного обеспечения.