Продвинутое управление пакетами

TL;DR: Анализ зависимостей, поиск orphans, очистка кэша, pinning версий. Работает кроссплатформенно (apt, pacman, dnf с разным синтаксисом).

Анализ зависимостей

# Что зависит от пакета?
# apt
apt rdepends nginx
 
# pacman
pactree -r nginx
 
# dnf
dnf repoquery --whatrequires nginx
# От чего зависит пакет?
# apt
apt depends nginx
 
# pacman
pactree nginx
 
# dnf
dnf repoquery --requires nginx

Orphan-пакеты (ничьи зависимости)

# Найти orphans
# pacman
pacman -Qdtq
 
# Удалить orphans
# pacman
sudo pacman -Rns $(pacman -Qdtq)
 
# apt
sudo apt autoremove --purge
 
# dnf
sudo dnf autoremove

Анализ размера

# Самые большие пакеты
# pacman
pacman -Qi | awk '/^Name/{name=$3} /^Installed Size/{print $4,$5,name}' | sort -rh | head -20
 
# apt (dpkg)
dpkg-query -Wf '${Installed-Size}\t${Package}\n' | sort -rn | head -20
 
# dnf
rpm -qa --queryformat '%{SIZE}\t%{NAME}\n' | sort -rn | head -20

Очистка кэша

# pacman — хранит все скачанные пакеты
du -sh /var/cache/pacman/pkg/
sudo paccache -r                   # оставить 3 последних версии
sudo paccache -rk1                 # оставить только 1
 
# apt
du -sh /var/cache/apt/archives/
sudo apt clean                     # удалить весь кэш
sudo apt autoclean                 # удалить старые версии
 
# dnf
sudo dnf clean all

Pinning версий (apt)

Зафиксировать версию пакета, чтобы apt upgrade не обновлял:

# Заблокировать обновление
sudo apt-mark hold package-name
 
# Разблокировать
sudo apt-mark unhold package-name
 
# Список заблокированных
apt-mark showhold

Для pacman — добавить в /etc/pacman.conf:

IgnorePkg = package-name

Установка из исходников

# Установить инструменты сборки
# Ubuntu
sudo apt install build-essential
 
# Arch
sudo pacman -S base-devel
 
# Типичный процесс
tar xzf package-1.0.tar.gz
cd package-1.0
./configure --prefix=/usr/local
make -j$(nproc)
sudo make install

Совет: Устанавливайте из исходников в /usr/local/, чтобы не конфликтовать с пакетным менеджером.

Откат версии

# pacman — из кэша
sudo pacman -U /var/cache/pacman/pkg/package-oldversion.pkg.tar.zst
 
# apt — указать конкретную версию
apt list -a package-name           # доступные версии
sudo apt install package-name=1.2.3-1
 
# dnf
sudo dnf downgrade package-name

Типичные ошибки

ОшибкаРешение
Broken dependenciesapt: sudo apt -f install. pacman: pacman -Syu
Конфликт файловpacman: --overwrite. apt: dpkg --force-overwrite
make install мусорит в системуИспользовать --prefix=/usr/local или checkinstall
Пакет из PPA конфликтуетppa-purge или вручную откатить