Заметка про менеджеры пакетов в linux
2025-02-08 (updated: 2025-02-08 )
Introduction
Сегодня на семинаре по ОС говорили про то, почему файловые системы в современных linux выглядят так, откуда взялись папки /bin, /usr, /etc, etc. и немного обсудили пакетные менеджеры в linux.
Про пакетные менеджеры поговорить удалось совсем немного, поэтому хочется продолжить.
Что такое пакетные менеджеры
Пакетный менеджер - способ управлять пакетами (например программами), установленными в системе. Их есть много разных, под разные ОС, сейчас мы будем говорить про +- стандартные для разных linux.
Почти в каждом дистрибутиве linux есть свой менеджер пакетов (apt-get в Ubuntu/Debian, dnf/yum в Fedora, pacman в arch, …)
Общие свойства популярных пакетных менеджеров
Многие пакетные менеджеры предоставляют почти одинаковый функционал:
- установка пакетов (на примере fish shell)
apt-get install fishdnf install fishpacman -S fishemerge --ask app-shells/fish
- обновление списка пакетов (но не самих пакетов)
apt-get updatednf makecachepacman -Syemerge --sync
- обновление самих пакетов
apt-get upgradednf upgradepacman -Syuemerge --update @world
То есть все пакетные менеджеры делают почти одно и то же (из перечисленных emerge, пакетный менеджер gentoo, чуть отличается от остальных, про него поговорим в отдельной секции)
Как происходит установка пакетов
Мы уже увидели, что все пакетные менеджеры работают примерно одинаково:
package-manager install/update/upgrade/remove (packages)
Рассмотрим чуть подробнее, как работает install.
- Пакетный менеджер смотрит в известном ему списке пакетов, есть ли пакет
fish. Список пакетов берется из репозитория, в некоторых (apt-get/pacman) его нужно обновить руками заранее (apt-get update/pacman -Sy), в некоторых (dnf/homebrew) список пакетов обновляется передinstall - Скачивается пакет и кладется в cache. Формат пакетов отличается от менеджера к менеджеру. Почти всегда это какой-то архив с метаинформацией, например для
apt-getэто.dpkg - Пакет распаковывается и “устанавливается”. Обычно установка состоит из нескольких этапов.
- Установка зависимостей - в метаинформации пакета хранится, какие зависимости ему нужны. Это могут быть любые пакеты - например byobu зависит от
tmux,pythonи чего-то еще. pre-install hook- есть не у всех пакетов. Может потребоваться для ручной настройки (спросить у пользователя где он находится, принять лецинзионное соглашение/etc).- Копирование файлов в нужные папки, обычно в
/usr, реже в/opt- все как настроит пакет. post-install hook/clean- аналогичноpre-install, это произвольный скрипт, который может сделать что угодно. Обычно он вкратце пишет, что за программа, куда поставилась, где читать мануал и очищает, если надо, временные файлы.
- Пакет добавляется в базу данных локально поставленных пакетов. Она нужна чтобы не ставить пакет дважды, чтобы знать что обнавлять и для множества других вещей.
Тогда возникает вопрос - а чем вообще эти пакетные менеджеры отличаются.
Почему их так много и в чем отличия
На почему их так много ответ прост:
