Пакетные менеджеры: apt, dnf-yum, репозитории, установка ПО

↑ Этап 1 · Фундамент: Linux, Bash, сети

Желательно~4 мин чтенияУровень: junior

Зачем это на собесе

Установка и обновление ПО, репозитории и подписи — повседневная работа; важны воспроизводимость и безопасность.

Семейства

СемействоФорматИнструментыДистрибутивы
Debian.debapt, apt-get, dpkgDebian, Ubuntu
Red Hat.rpmdnf (ранее yum), rpmRHEL, Rocky, AlmaLinux, Fedora
Alpine.apkapkAlpine (контейнеры)
Archpkg.tarpacmanArch

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

apt (Debian/Ubuntu)

sudo apt update                          # обновить индекс пакетов (не сами пакеты)
sudo apt install -y nginx=1.24.0-1ubuntu1    # конкретная версия
sudo apt upgrade                         # обновить установленные
sudo apt full-upgrade                    # с удалением/заменой зависимостей
sudo apt remove nginx                    # удалить, конфиги остаются
sudo apt purge nginx                     # удалить вместе с конфигурацией
sudo apt autoremove
apt search nginx; apt show nginx; apt list --installed
apt-cache policy nginx                   # доступные версии и приоритеты
dpkg -l | grep nginx; dpkg -L nginx; dpkg -S /usr/sbin/nginx   # файлы пакета, чей файл
sudo apt-mark hold nginx                 # зафиксировать версию

dnf/yum (RHEL)

sudo dnf install -y nginx
sudo dnf update; sudo dnf remove nginx
dnf search|info|list installed nginx
dnf history; sudo dnf history undo 12
dnf provides /usr/sbin/nginx
sudo dnf versionlock add nginx           # плагин versionlock
rpm -qa; rpm -ql nginx; rpm -qf /usr/sbin/nginx; rpm -V nginx   # проверка целостности

Репозитории

  • Debian: /etc/apt/sources.list, /etc/apt/sources.list.d/*.list (или .sources — deb822);
  • RHEL: /etc/yum.repos.d/*.repo.

Подписи: ключи GPG, современный способ — отдельный keyring и signed-by:

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo "deb [arch=amd64 signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu jammy stable" \
  | sudo tee /etc/apt/sources.list.d/docker.list
sudo apt update && sudo apt install docker-ce

apt-key устарел. Не отключайте проверку подписи (--allow-unauthenticated, gpgcheck=0).

Практика в DevOps

  • Воспроизводимость: фиксировать версии (apt install pkg=version, hold/versionlock), в Dockerfile — конкретные теги;
  • Зеркала и кэш: внутренний репозиторий (Nexus, Artifactory, apt-cacher-ng) — скорость и отказоустойчивость;
  • Автоматические обновления безопасности: unattended-upgrades, dnf-automatic; тесты перед применением в проде;
  • Минимум пакетов на сервере и в образах: меньше уязвимостей;
  • Чистка кэша в Dockerfile в том же слое:
RUN apt-get update && apt-get install -y --no-install-recommends curl ca-certificates \
 && rm -rf /var/lib/apt/lists/*
  • Конфигурационное управление (Ansible: модули apt, dnf, package) вместо ручной установки;
  • Установка из исходников/бинарников — в /opt или /usr/local, по возможности упаковать (fpm), чтобы не терять управление.

Другие менеджеры: snap, flatpak, pip/npm/cargo (языковые, отдельно), Homebrew, Nix (декларативно и воспроизводимо).

Проблемы

  • «Unable to acquire the dpkg lock» — другой процесс apt/unattended-upgrades;
  • сломанные зависимости: apt --fix-broken install, dpkg --configure -a;
  • конфликт версий из разных репозиториев: приоритеты (apt_preferences), pinning;
  • apt update падает по подписи: просроченный или отсутствующий ключ.

Вопросы с ответами