ubuntu
Ubuntu across all supported LTS versions (20.04, 22.04, 24.04, 26.04): apt/dpkg/snap package management, Netplan declarative networking, cloud-init, UFW firewall, AppArmor, Ubuntu Pro/ESM/Livepatch, S
SKILL.mdplugins/os/skills/ubuntu/SKILL.md
GitHubUbuntu
This skill covers Ubuntu across all supported LTS versions (20.04, 22.04, 24.04, and 26.04), covering both Desktop and Server editions. It provides deep knowledge of:
- apt/dpkg package management, PPAs, deb822 format, and pinning
- snap packaging, confinement, interfaces, refresh scheduling, and Snap Store
- Netplan declarative networking (systemd-networkd and NetworkManager backends)
- cloud-init multi-stage initialization, datasources, and user-data formats
- UFW (Uncomplicated Firewall) with nftables backend
- AppArmor path-based mandatory access control
- Ubuntu Pro, ESM (Extended Security Maintenance), and Livepatch
- Subiquity server installer with autoinstall YAML
- ZFS root filesystem support (pools, datasets, snapshots)
- LXD/Incus system containers and VMs
- MicroK8s lightweight Kubernetes distribution
For generic Linux kernel internals and systemd fundamentals, see the rhel skill. This skill focuses on Ubuntu-specific tooling and approaches.
When a question is version-specific, read the relevant file under references/versions/. When the version is unknown, provide general guidance and note where behavior differs across versions.
How to Approach Tasks
Route by request type: troubleshooting → references/diagnostics.md; optimization → references/best-practices.md; architecture → references/architecture.md; edition selection → references/editions.md; administration → the guidance below.
Identify the Ubuntu LTS version first — package format, kernel features, and default tooling shift between releases. Apply Ubuntu-specific reasoning, not generic Linux advice. Validate with systemctl, journalctl, apt queries, and snap checks.
Core Expertise
apt / dpkg Package Management
apt is the high-level package resolver; dpkg is the low-level installer. Ubuntu uses the Debian .deb format.
# Package operations
apt update -q
apt install nginx -y
apt full-upgrade -y # upgrade + allow removals for deps
apt autoremove --purge -y # remove orphans and config files
apt list --upgradable 2>/dev/null # pending upgrades
# Package queries
dpkg -l 'nginx*' # list packages matching pattern
dpkg -L nginx # files owned by package
dpkg -S /usr/bin/curl # which package owns file
apt-cache policy nginx # installed vs available versions
apt-cache rdepends --installed nginx # reverse dependencies
# Repair
dpkg --configure -a # configure partially installed
apt --fix-broken install # resolve broken dependencies
Repository configuration evolved across versions:
- Pre-24.04:
/etc/apt/sources.listone-liner format - 24.04+:
/etc/apt/sources.list.d/ubuntu.sourcesdeb822 format (multi-value,Signed-Byfield)
Archive components: main (Canonical-supported), restricted (proprietary drivers), universe (community FOSS), multiverse (non-free).
PPAs: add-apt-repository ppa:owner/name adds a Launchpad-hosted repo. Store keys in /etc/apt/keyrings/ with Signed-By in the source definition.
snap Packaging
snap delivers self-contained, sandboxed applications with automatic updates.
# Snap lifecycle
snap install firefox # install from Snap Store
snap install code --classic # classic confinement (full access)
snap refresh --hold=48h firefox # defer updates
snap revert firefox # rollback to previous revision
snap remove --purge firefox # remove with all data
# Inspection
snap list # installed snaps
snap info firefox # channels, confinement, version
snap connections firefox # interface plug/slot connections
# Administration
snap set system refresh.timer="mon-fri,02:00-04:00" # set refresh window
snap list --all | awk '/disabled/{print $1, $3}' # old revisions
Confinement: strict (AppArmor + seccomp sandbox), classic (full system access), devmode (violations logged only). Snap data lives in /var/snap/ and ~/snap/.
Netplan Networking
Netplan is Ubuntu's declarative network configuration layer. It generates backend configs for systemd-networkd (server) or NetworkManager (desktop).
netplan apply # apply configuration
netplan try # apply with 120s auto-revert
netplan generate # write backend config only
netplan status # interface status (1.0+)
netplan get # current effective config
Configuration in /etc/netplan/*.yaml:
network:
version: 2
renderer: networkd
ethernets:
eth0:
addresses: [192.168.1.10/24]
routes:
- to: default
via: 192.168.1.1
nameservers:
addresses: [8.8.8.8, 1.1.1.1]
cloud-init
cloud-init initializes instances across five stages: generator, local, network, config, final. Datasources include EC2, Azure, GCE, OpenStack, and NoCloud.
cloud-init status --wait # block until complete
cloud-init query -a # dump all instance metadata
cloud-init schema --config-file user-data.yaml # validate syntax
cloud-init clean --logs # reset for re-run
Network config written to /etc/netplan/50-cloud-init.yaml. Disable with:
/etc/cloud/cloud.cfg.d/99-disable-network-config.cfg containing network: {config: disabled}.
UFW Firewall
UFW is Ubuntu's default firewall frontend (iptables/nftables backend).
ufw status verbose # current rules and defaults
ufw default deny incoming
ufw default allow outgoing
ufw allow 22/tcp
ufw allow 'OpenSSH'
ufw allow from 10.0.0.0/8 to any port 22
ufw limit ssh # rate-limit (6 per 30s)
ufw enable
ufw logging medium
Application profiles in /etc/ufw/applications.d/. Ubuntu does not use firewalld by default.
AppArmor
AppArmor is Ubuntu's default MAC system (path-based profiles, unlike RHEL's SELinux label-based model).
aa-status # all profiles and modes
aa-enforce /etc/apparmor.d/usr.sbin.nginx
aa-complain /etc/apparmor.d/usr.sbin.nginx
journalctl -k | grep -i "apparmor.*denied" # view denials
aa-genprof /usr/sbin/myapp # generate profile
aa-logprof # update profiles from audit log
Modes: enforce (block + log), complain (log only), unconfined (no profile).
Ubuntu Pro / ESM / Livepatch
Ubuntu Pro extends LTS security maintenance from 5 to 10 years. Free for up to 5 machines.
pro attach <token> # attach subscription
pro status # show enabled services
pro enable esm-infra # extended main repo patches
pro enable esm-apps # extended universe patches
pro enable livepatch # kernel live patching
pro enable usg # CIS/STIG hardening
pro fix CVE-2024-XXXXX # check and fix a CVE
ESM-infra covers main packages; ESM-apps covers universe (23,000+ packages). Livepatch applies critical kernel CVE patches in-memory without reboots via canonical-livepatch.
Subiquity / Autoinstall
Subiquity is Ubuntu's server installer (replaced debian-installer in 20.04). Autoinstall YAML enables unattended provisioning.
#cloud-config
autoinstall:
version: 1
identity:
hostname: myserver
username: ubuntu
password: $6$...
storage:
layout:
name: lvm
ssh:
install-server: true
packages:
- nginx
late-commands:
- curtin in-target -- systemctl enable nginx
Key sections: identity, storage, network, ssh, packages, snaps, late-commands.
ZFS Support
Ubuntu provides first-class ZFS root filesystem support (not available on RHEL):
zpool status # pool health
zpool scrub rpool # integrity check
zfs list # datasets
zfs list -t snapshot # snapshots
zfs snapshot rpool/ROOT/ubuntu@backup # create snapshot
zfs rollback rpool/ROOT/ubuntu@backup # restore snapshot
Default server install uses LVM (ubuntu-vg/ubuntu-lv); ZFS is an installer option since 20.04.
LXD / Incus
System container and VM manager. Canonical's LXD (snap) and community fork Incus (deb, 24.04+).
lxc launch ubuntu:24.04 mycontainer # create container
lxc launch ubuntu:24.04 myvm --vm # create VM
lxc exec mycontainer -- bash # shell into container
lxc snapshot mycontainer snap0 # snapshot
lxc restore mycontainer snap0 # restore
lxc list # list instances
lxc storage list # storage pools
MicroK8s
Canonical's lightweight Kubernetes, packaged as a strict-confined snap.
snap install microk8s --classic --channel=1.32/stable
microk8s status # cluster status
microk8s kubectl get nodes # standard kubectl
microk8s enable dns storage ingress # enable add-ons
microk8s add-node # generate HA join token
microk8s inspect # diagnostic report
HA requires 3+ nodes with Dqlite (distributed SQLite) replacing etcd.
Common Pitfalls
1. Editing /etc/apt/sources.list on 24.04+ instead of deb822 .sources files
Ubuntu 24.04 defaults to /etc/apt/sources.list.d/ubuntu.sources (deb822 format). The legacy sources.list may be empty or absent. Always check which format is in use before editing.
2. Using apt-key instead of Signed-By keyrings
apt-key is deprecated since 22.04 and removed in 24.04. Import keys with gpg --dearmor -o /etc/apt/keyrings/<name>.gpg and reference via Signed-By in the source definition.
3. Not enabling UFW after adding rules
UFW rules are inactive until ufw enable is run. Adding rules without enabling the firewall provides no protection.
4. Ignoring snap disk accumulation
Old snap revisions accumulate. By default, 2 revisions are kept per snap. Run snap list --all and remove disabled revisions to reclaim space.
5. Running without Ubuntu Pro after 20.04 standard EOL Ubuntu 20.04 standard support ended April 2025. Without Pro ESM enrollment, systems receive zero security updates. Attach immediately or plan an upgrade.
6. Using firewalld on Ubuntu instead of UFW
Installing firewalld on Ubuntu conflicts with UFW. Stick with UFW unless there is a specific multi-zone requirement.
7. Forgetting needrestart after apt upgrades
After apt full-upgrade, services using updated libraries need restarting. Install and run needrestart to detect stale processes. Configure automatic restart in /etc/needrestart/needrestart.conf.
8. Not using netplan try for remote network changes
netplan apply is immediate and can lock you out of a remote system. Always use netplan try which auto-reverts in 120 seconds if not confirmed.
9. Disabling AppArmor instead of fixing profile denials
AppArmor profiles are easier to fix than SELinux policies. Use aa-complain for learning mode, aa-logprof to update profiles, and journalctl -k | grep apparmor to find denials.
10. Missing cloud-init network disable file
cloud-init regenerates /etc/netplan/50-cloud-init.yaml on each boot. Manual netplan edits are overwritten unless cloud-init network config is disabled via /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg.
Version-Specific Guidance
| Version | Reference | What's version-specific |
|---|---|---|
| 20.04 | references/versions/20.04.md |
ZFS root (zsys), WireGuard in-kernel, snap matured, LXD 4.0, ESM-only migration, Multipass, cloud-init v2 network |
| 22.04 | references/versions/22.04.md |
Wayland default, GNOME 42, real-time kernel (Pro), Active Directory integration (adsys), nftables default, LXD 5.0, OpenSSL 3.0 |
| 24.04 | references/versions/24.04.md |
Netplan 1.0, AppArmor user namespaces, deb822 sources, TPM-backed FDE (experimental), frame pointers default, GNOME 46, Firefox/Thunderbird snap-only |
| 26.04 | references/versions/26.04.md |
Kernel 7.0, GNOME 50 Wayland-only, dracut (replaces initramfs-tools), sudo-rs, APT 3.1, cgroup v2 mandatory, Chrony (replaces timesyncd), post-quantum SSH |
Reference Files
Load these when you need deep knowledge for a specific area:
references/architecture.md-- apt/dpkg/snap internals, Netplan, cloud-init, ZFS, LXD/Incus, MicroK8s, Ubuntu Pro overlay, Subiquity/autoinstall. Read for "how does X work" questions.references/diagnostics.md-- apport, apt troubleshooting, snap debugging, Netplan diagnostics, systemd-resolved DNS, UFW log analysis, performance tools, sosreport. Read when troubleshooting errors.references/best-practices.md-- CIS hardening (USG), UFW configuration, unattended-upgrades, AppArmor, Livepatch, snap management, backup/recovery, Landscape. Read for design and operations questions.references/editions.md-- Ubuntu variants, flavours, Pro vs free tier, lifecycle, Desktop vs Server, cloud images, Ubuntu Core, edition selection guide. Read for edition and licensing questions.