Snap packages aren’t the first choice for everyone on the RHEL family, but some applications only ship as snaps (Chromium, Canonical’s Multipass, certain developer tools) and Rocky Linux 10 supports them cleanly through the snapd daemon in EPEL. This guide walks through enabling snap support on Rocky Linux 10 and AlmaLinux 10 from scratch: install the daemon, wire up the classic /snap directory symlink, bring the socket online, and install your first snap. Before you dive in, make sure your Rocky 10 base is set up correctly by following our Rocky Linux 10 post-install checklist and that Docker isn’t fighting with snapd for the same cgroup scope.
Tested April 2026 on Rocky Linux 10.1 with snapd 2.70-1.el10_1 from EPEL, kernel 6.12.0-124.8.1
Step 1: Enable EPEL
snapd is only packaged in EPEL for the RHEL 10 family. The EPEL release metapackage is in the extras repo that ships with Rocky and Alma, so installing it is a single command:
sudo /usr/bin/crb enable
sudo dnf install -y epel-release
You also need CRB (CodeReady Builder) enabled because several EPEL packages depend on libraries from it. The crb enable command is the Rocky/Alma way to flip CRB on.
Step 2: Install snapd
With EPEL enabled, install the snapd package from the EL 10 branch:
sudo dnf install -y snapd
This pulls in snap-confine (the sandbox isolation helper), snapd-selinux (the SELinux policy module so the daemon works with Rocky 10’s enforcing policy), squashfs-tools, squashfuse, and xdelta. On a fresh Rocky 10 minimal image this is around 7 MB of download:
snap-confine-2.70-1.el10_1.x86_64 snapd-2.70-1.el10_1.x86_64
snapd-selinux-2.70-1.el10_1.noarch squashfs-tools-4.6.1-6.el10.x86_64
squashfuse-0.5.2-2.el10_0.x86_64 squashfuse-libs-0.5.2-2.el10_0.x86_64
xdelta-3.1.0-22.el10_0.x86_64
Step 3: Enable and start the snapd socket
snapd uses systemd socket activation: the socket starts on boot, and the main snapd.service unit only fires when an actual request comes in. Enable and start the socket:
sudo systemctl enable --now snapd.socket
Confirm both the socket and the service state:
sudo systemctl is-active snapd.socket
sudo systemctl is-active snapd
The socket should report active and snapd itself may report inactive initially. That’s expected: snapd starts on demand when the first snap command is issued.
Step 4: Create the classic /snap symlink
Snaps that are published as “classic confinement” (the ones that need access to the entire host filesystem) expect the snap store to be mounted at /snap. Rocky 10 puts it at /var/lib/snapd/snap, so a symlink fixes the mismatch:
sudo ln -sf /var/lib/snapd/snap /snap
ls -la /snap
The symlink should point at the real snapd state directory:
lrwxrwxrwx. 1 root root 19 Apr 12 03:05 /snap -> /var/lib/snapd/snap
Without this symlink, running a classic snap like Multipass or the snap install --classic command for some editors will fail to launch. Do it now and move on.
Step 5: Confirm snap is operational
Check the snap CLI and daemon versions. Both should match the package you installed:
snap --version
The output lists snap, snapd, series, the host distro, and the running kernel:
snap 2.70-1.el10_1
snapd 2.70-1.el10_1
series 16
rocky 10.1
kernel 6.12.0-124.8.1.el10_1.x86_64
If the snap command reports snapd as missing or “cannot communicate with server”, wait a few seconds and retry. On first boot, the socket takes a moment to accept connections.
Step 6: Install your first snap
Every snap install needs the core base snap, which is the minimal root filesystem snaps run against. It’s installed automatically with the first app you pull, but you can install it explicitly first:
sudo snap install core
Then list what’s installed:
snap list
From here, install any snap you want. A few examples worth trying:
sudo snap install hello-world
sudo snap install htop
sudo snap install chromium
sudo snap install code --classic
The --classic flag is only needed for snaps that declare classic confinement. For everything else, the default strict confinement applies automatically.
Troubleshooting
Error: “system does not fully support snapd: cannot mount squashfs”
This shows up on nested virtualization and some minimal kernels where the squashfs filesystem module isn’t loaded. On a baremetal Rocky 10 install the squashfs module is in the default kernel and works without configuration. For a nested VM, load the module manually and retry:
sudo modprobe squashfs
lsmod | grep squashfs
If the module isn’t available at all, the kernel was built without squashfs support (unusual on Rocky 10 stock kernels) and snapd is effectively unusable until you rebuild with CONFIG_SQUASHFS=m.
AppArmor warnings from snapd
On Ubuntu, snapd uses AppArmor to enforce confinement. On Rocky 10 there’s no AppArmor, so snapd falls back to SELinux and the delta mount is managed by the snapd-selinux policy module the package drops in. You’ll see a log message on startup about AppArmor being disabled. This is informational and can be ignored.
Keeping snaps up to date
snapd automatically refreshes installed snaps a few times a day. Check the next scheduled refresh:
snap refresh --time
To run a refresh immediately across everything:
sudo snap refresh
For applications where you want to defer updates (shell in progress, long-running service), use snap refresh --hold to pause auto-updates for that snap for up to 90 days.
Wrap up
snapd on Rocky Linux 10 is a single install and a single symlink away. It does not replace DNF — stay with native RPMs for anything the base repos, EPEL, RPM Fusion, or Remi provide. Reach for snap only when a specific upstream distributes that way, typically for GUI apps or IDE tooling. For broader sysadmin hygiene on Rocky 10, our post-install tips guide covers EPEL, SELinux, firewalld, and SSH hardening in one pass. For keeping /tmp out of the way of snap mounts on constrained servers, see our /tmp on a separate filesystem reference. And for a modern text viewer to inspect snap YAML config files, check out the bat command guide.