Заметка про менеджеры пакетов в 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, …)

Общие свойства популярных пакетных менеджеров

Многие пакетные менеджеры предоставляют почти одинаковый функционал:

  1. установка пакетов (на примере fish shell)
  • apt-get install fish
  • dnf install fish
  • pacman -S fish
  • emerge --ask app-shells/fish
  1. обновление списка пакетов (но не самих пакетов)
  • apt-get update
  • dnf makecache
  • pacman -Sy
  • emerge --sync
  1. обновление самих пакетов
  • apt-get upgrade
  • dnf upgrade
  • pacman -Syu
  • emerge --update @world

То есть все пакетные менеджеры делают почти одно и то же (из перечисленных emerge, пакетный менеджер gentoo, чуть отличается от остальных, про него поговорим в отдельной секции)

Как происходит установка пакетов

Мы уже увидели, что все пакетные менеджеры работают примерно одинаково: package-manager install/update/upgrade/remove (packages)

Рассмотрим чуть подробнее, как работает install.

  1. Пакетный менеджер смотрит в известном ему списке пакетов, есть ли пакет fish. Список пакетов берется из репозитория, в некоторых (apt-get/pacman) его нужно обновить руками заранее (apt-get update/pacman -Sy), в некоторых (dnf/homebrew) список пакетов обновляется перед install
  2. Скачивается пакет и кладется в cache. Формат пакетов отличается от менеджера к менеджеру. Почти всегда это какой-то архив с метаинформацией, например для apt-get это .dpkg
  3. Пакет распаковывается и “устанавливается”. Обычно установка состоит из нескольких этапов.
  • Установка зависимостей - в метаинформации пакета хранится, какие зависимости ему нужны. Это могут быть любые пакеты - например byobu зависит от tmux, python и чего-то еще.
  • pre-install hook - есть не у всех пакетов. Может потребоваться для ручной настройки (спросить у пользователя где он находится, принять лецинзионное соглашение/etc).
  • Копирование файлов в нужные папки, обычно в /usr, реже в /opt - все как настроит пакет.
  • post-install hook/clean - аналогично pre-install, это произвольный скрипт, который может сделать что угодно. Обычно он вкратце пишет, что за программа, куда поставилась, где читать мануал и очищает, если надо, временные файлы.
  1. Пакет добавляется в базу данных локально поставленных пакетов. Она нужна чтобы не ставить пакет дважды, чтобы знать что обнавлять и для множества других вещей.

Тогда возникает вопрос - а чем вообще эти пакетные менеджеры отличаются.

Почему их так много и в чем отличия

На почему их так много ответ прост:

alt