# The APT package manager
## Table of contents
1. [TL;DR](#tldr)
1. [Automate security upgrades](#automate-security-upgrades)
1. [Configuration](#configuration)
1. [Version pinning](#version-pinning)
1. [Troubleshooting](#troubleshooting)
1. [Fix a "Problem with MergeList" or "status file could not be parsed" error](#fix-a-problem-with-mergelist-or-status-file-could-not-be-parsed-error)
1. [A package is not upgraded to the release and/or version I pinned](#a-package-is-not-upgraded-to-the-release-andor-version-i-pinned)
1. [Further readings](#further-readings)
1. [Sources](#sources)
## TL;DR
Non-interactive mode: `DEBIAN_FRONTEND='noninteractive' apt`.
```sh
# Check for broken dependencies.
sudo apt-get check
# Update the packages lists.
sudo apt update
# Upgrade the system.
sudo apt upgrade
sudo apt dist-upgrade
# Look for packages.
apt search 'ansible'
apt search --names-only 'python'
# Show details of packages.
apt show 'vlc'
# List a package's dependencies.
apt depends 'ufw'
# Install packages.
sudo apt install 'nano' 'python3-zstd/stable' 'gparted=0.16.1-1'
sudo apt install --no-install-recommends --assume-yes 'curl'
# Remove packages.
sudo apt remove 'dhclient' 'sudo'
sudo apt remove --purge 'bluez'
sudo apt purge 'crda'
# Remove orphaned packages.
sudo apt autoremove --purge
# List packages.
apt list
apt list --upgradable
apt list --installed
# Show changelogs for packages.
apt changelog 'git'
# List explicitly installed packages only.
sudo apt-mark showmanual
# Mark packages as explicitly installed.
sudo apt-mark manual 'vim' 'unattended-upgrades'
# List non-explicitly installed packages only.
sudo apt-mark showauto
# Mark packages as non-explicitly installed.
sudo apt-mark auto 'zsh' 'bash-completion'
sudo apt-mark auto $(sudo apt-mark showmanual)
# Check package priorities.
apt-check policy
apt-check policy 'boinc-client'
# Reconfigure packages.
sudo dpkg-reconfigure 'mariadb-server'
sudo dpkg-reconfigure -p 'low' 'unattended-upgrades'
# Stop installing recommended and suggested packages.
cat > /etc/apt/apt.conf.d/99norecommend << EOF
APT::Install-Recommends "0";
APT::Install-Suggests "0";
EOF
```
## Automate security upgrades
Leverage `unattended-upgrades` for this.
```sh
# Install the tool.
sudo apt install 'unattended-upgrades'
# Configure self updating.
sudo dpkg-reconfigure -p 'low' 'unattended-upgrades'
# Check what packages would be installed or upgraded.
sudo unattended-upgrade --debug --dry-run
# Run manually.
sudo unattended-upgrade
```
## Configuration
See [Apt configuration] for more information.
```txt
# /etc/apt/apt.conf.d/90default-release
APT::Default-Release "stable";
```
```txt
# /etc/apt/apt.conf.d/99norecommend
APT::Install-Recommends "0";
APT::Install-Suggests "0";
```
```txt
# /etc/apt/apt.conf.d/99parallel-fetch
APT::Acquire::Queue-Mode "access";
APT::Acquire::Retries 3;
```
## Version pinning
See [`apt_preferences`'s man page][apt_preferences man page] for more information.
```txt
# /etc/apt/preferences.d/99perl
Package: perl
Pin: version 5.20*
Pin-Priority: 1001
```
```txt
# /etc/apt/preferences.d/90debian-release
Package: *
Pin: release a=testing
Pin-Priority: 990
Package: *
Pin: release a=stable
Pin-Priority: 500
Package: *
Pin: release a=unstable
Pin-Priority: -1
```
```txt
# /etc/apt/preferences.d/boinc
Package: boinc boinc-client boinc-manager libboinc7
Pin: release a=unstable
Pin-Priority: 995
```
## Troubleshooting
### Fix a "Problem with MergeList" or "status file could not be parsed" error
> E: Encountered a section with no Package: header
> E: Problem with MergeList /var/lib/apt/lists/deb.debian.org_debian_dists_bullseye_main_i18n_Translation-en
> E: The package lists or status file could not be parsed or opened.
```sh
sudo rm -vrf '/var/lib/apt/lists/'*
sudo apt update
```
### A package is not upgraded to the release and/or version I pinned
1. The effective priority of the package might be lower than expected.
Check the package's priority is the one you wanted **and** is higher than the release's one.
```sh
$ apt-cache policy 'boinc-client'
boinc-client:
Installed: 7.16.16+dfsg-1
Candidate: 7.20.5+dfsg-1.1
Version table:
7.20.5+dfsg-1.1 990 <-- wanted candidate, with its pinned priority
490 http://deb.debian.org/debian testing/main arm64 Packages
-1 http://deb.debian.org/debian unstable/main arm64 Packages
*** 7.16.16+dfsg-1 500 <-- usable candidate, with its effective priority
500 http://deb.debian.org/debian bullseye/main arm64 Packages
100 /var/lib/dpkg/status
```
1. The package might depend on other packages which are not upgradable at the moment, i.e. their current version might
be required by other packages.
Try installing/upgrading it specifying the desired release and version of the package:
```sh
$ sudo apt upgrade boinc-client/testing
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
Selected version '7.20.5+dfsg-1.1' (Debian:testing, Debian:unstable [arm64]) for 'boinc-client'
Selected version '7.20.5+dfsg-1.1' (Debian:testing, Debian:unstable [arm64]) for 'libboinc7' because of 'boinc-client'
Selected version '2.36-9' (Debian:testing, Debian:unstable [arm64]) for 'libc6' because of 'libboinc7'
Selected version '3.0.8-1' (Debian:testing, Debian:unstable [arm64]) for 'libssl3' because of 'libboinc7'
Selected version '12.2.0-14' (Debian:testing, Debian:unstable [arm64]) for 'libstdc++6' because of 'libboinc7'
Calculating upgrade... Done
Some packages could not be installed. This may mean that you have
requested an impossible situation or if you are using the unstable
distribution that some required packages have not yet been created
or been moved out of Incoming.
The following information may help to resolve the situation:
The following packages have unmet dependencies:
libc-bin : Depends: libc6 (< 2.32) but 2.36-9 is to be installed
libc-dev-bin : Depends: libc6 (< 2.32) but 2.36-9 is to be installed
libc6-dbg : Depends: libc6 (= 2.31-13+rpt2+rpi1+deb11u5) but 2.36-9 is to be installed
libc6-dev : Depends: libc6 (= 2.31-13+rpt2+rpi1+deb11u5) but 2.36-9 is to be installed
E: Broken packages
```
## Further readings
- [Apt configuration]
- [Configuring Apt sources]
- [Unattended Upgrades]
- [`apt_preferences`'s man page][apt_preferences man page]
- [`dpkg`][dpkg]
- [`apt-file`][apt-file] to look for files in packages
- [`netselect-apt`][netselect-apt] to select the fastest APT mirror
## Sources
All the references in the [further readings] section, plus the following:
- [cheat.sh]
- [Fix a "Problem with MergeList" or "status file could not be parsed" error]
[further readings]: #further-readings
[apt-file]: apt-file.md
[dpkg]: dpkg.md
[netselect-apt]: netselect-apt.md
[apt configuration]: https://wiki.debian.org/AptConfiguration
[apt_preferences man page]: https://manpages.debian.org/testing/apt/apt_preferences.5.en.html
[configuring apt sources]: https://wiki.debian.org/SourcesList
[unattended upgrades]: https://wiki.debian.org/UnattendedUpgrades
[cheat.sh]: https://cheat.sh/apt
[fix a "problem with mergelist" or "status file could not be parsed" error]: https://askubuntu.com/questions/30072/how-do-i-fix-a-problem-with-mergelist-or-status-file-could-not-be-parsed-err#30199