Hey
I’m investigating the odd errors that some people reported about snap-confine being unable to mkdir /run/snapd/ns
directory. While we had many theories what may the problem be (and one of those turned out to be true, when snapd runs under LXD with apparmor stacking/confinement disabled) there seems to be more going on still:
I patched my apparmor installation to trace all calls to apparmor_parser and discovered this log after a reboot:
2017-07-10 14:29:03+02:00 apparmor_parser --write-cache --replace --cache-loc=/etc/apparmor.d/cache -- /etc/apparmor.d/lxc-containers /etc/apparmor.d/sbin.dhclient /etc/apparmor.d/snap.core.2312.usr.lib.snapd.snap-confine /etc/apparmor.d/snap.core.2329.usr.lib.snapd.snap-confine /etc/apparmor.d/snap.core.2361.usr.lib.snapd.snap-confine /etc/apparmor.d/usr.bin.evince /etc/apparmor.d/usr.bin.firefox /etc/apparmor.d/usr.bin.lxc-start /etc/apparmor.d/usr.lib.snapd.snap-confine.real /etc/apparmor.d/usr.sbin.cups-browsed /etc/apparmor.d/usr.sbin.cupsd /etc/apparmor.d/usr.sbin.ippusbxd /etc/apparmor.d/usr.sbin.rsyslogd /etc/apparmor.d/usr.sbin.tcpdump
2017-07-10 14:29:04+02:00 apparmor_parser --write-cache --replace --cache-loc=/var/cache/apparmor -O no-expr-simplify -- /var/lib/snapd/apparmor/profiles/snap.atom.atom /var/lib/snapd/apparmor/profiles/snap.canonical-livepatch.canonical-livepatch /var/lib/snapd/apparmor/profiles/snap.canonical-livepatch.canonical-livepatchd /var/lib/snapd/apparmor/profiles/snap.core.hook.configure /var/lib/snapd/apparmor/profiles/snap.hello-world.env /var/lib/snapd/apparmor/profiles/snap.hello-world.evil /var/lib/snapd/apparmor/profiles/snap.hello-world.hello-world /var/lib/snapd/apparmor/profiles/snap.hello-world.sh /var/lib/snapd/apparmor/profiles/snap.http.http /var/lib/snapd/apparmor/profiles/snap.http.man
2017-07-10 14:29:10+02:00 apparmor_parser --replace --write-cache -O no-expr-simplify --cache-loc=/var/cache/apparmor /var/lib/snapd/apparmor/profiles/snap.atom.atom
2017-07-10 14:29:11+02:00 apparmor_parser --replace --write-cache -O no-expr-simplify --cache-loc=/var/cache/apparmor /var/lib/snapd/apparmor/profiles/snap.canonical-livepatch.canonical-livepatch
2017-07-10 14:29:11+02:00 apparmor_parser --replace --write-cache -O no-expr-simplify --cache-loc=/var/cache/apparmor /var/lib/snapd/apparmor/profiles/snap.canonical-livepatch.canonical-livepatchd
2017-07-10 14:29:15+02:00 apparmor_parser --replace --write-cache /etc/apparmor.d/snap.core.2312.usr.lib.snapd.snap-confine --cache-loc /etc/apparmor.d/cache
2017-07-10 14:29:15+02:00 apparmor_parser --replace --write-cache -O no-expr-simplify --cache-loc=/var/cache/apparmor /var/lib/snapd/apparmor/profiles/snap.core.hook.configure
2017-07-10 14:29:16+02:00 apparmor_parser --replace --write-cache -O no-expr-simplify --cache-loc=/var/cache/apparmor /var/lib/snapd/apparmor/profiles/snap.hello-world.env
2017-07-10 14:29:16+02:00 apparmor_parser --replace --write-cache -O no-expr-simplify --cache-loc=/var/cache/apparmor /var/lib/snapd/apparmor/profiles/snap.hello-world.evil
2017-07-10 14:29:16+02:00 apparmor_parser --replace --write-cache -O no-expr-simplify --cache-loc=/var/cache/apparmor /var/lib/snapd/apparmor/profiles/snap.hello-world.hello-world
2017-07-10 14:29:16+02:00 apparmor_parser --replace --write-cache -O no-expr-simplify --cache-loc=/var/cache/apparmor /var/lib/snapd/apparmor/profiles/snap.hello-world.sh
2017-07-10 14:29:18+02:00 apparmor_parser --replace --write-cache -O no-expr-simplify --cache-loc=/var/cache/apparmor /var/lib/snapd/apparmor/profiles/snap.http.http
2017-07-10 14:29:18+02:00 apparmor_parser --replace --write-cache -O no-expr-simplify --cache-loc=/var/cache/apparmor /var/lib/snapd/apparmor/profiles/snap.http.man
Among this log you will find two entries interesting: --cache-loc=/etc/apparmor.d/cache
and --cache-loc=/var/cache/apparmor
So it seems that we use two locations for the cache, depending on who’s calling. Quick inspection of those directories shos that there is no intersection (for whatever reason)
zyga@kaer-morhen:/var/cache/apparmor$ ll /etc/apparmor.d/cache/
razem 1,9M
-rw------- 1 root root 4,1K cze 25 00:14 content-hub-clipboard
-rw------- 1 root root 4,1K cze 25 00:14 content-hub-peer-picker
-rw------- 1 root root 92K cze 25 00:14 lightdm-guest-session
-rw------- 1 root root 119K cze 25 00:14 lxc-containers
-rw------- 1 root root 114K cze 25 00:14 sbin.dhclient
-rw------- 1 root root 53K lip 10 14:29 snap.core.2312.usr.lib.snapd.snap-confine
-rw------- 1 root root 53K lip 10 14:00 snap.core.2329.usr.lib.snapd.snap-confine
-rw------- 1 root root 54K lip 10 13:51 snap.core.2361.usr.lib.snapd.snap-confine
-rw------- 1 root root 4,1K cze 25 00:14 url-dispatcher-bad-url-helper
-rw------- 1 root root 678K cze 25 00:14 usr.bin.evince
-rw------- 1 root root 7,2K cze 25 00:14 usr.bin.lxc-start
-rw------- 1 root root 201K cze 25 00:14 usr.bin.webbrowser-app
-rw------- 1 root root 51K lip 5 07:48 usr.lib.snapd.snap-confine.real
-rw------- 1 root root 221K cze 25 00:14 usr.lib.telepathy
-rw------- 1 root root 23K cze 25 00:14 usr.lib.ubuntu-download-manager.udm-extractor
-rw------- 1 root root 35K cze 25 00:14 usr.sbin.cups-browsed
-rw------- 1 root root 85K cze 25 00:14 usr.sbin.cupsd
-rw------- 1 root root 21K cze 25 00:14 usr.sbin.ippusbxd
-rw------- 1 root root 58K cze 25 00:14 usr.sbin.tcpdump
zyga@kaer-morhen:/var/cache/apparmor$ ll /var/cache/apparmor/
razem 652K
-rw------- 1 root root 4,3K cze 25 00:14 snap.atom.atom
-rw------- 1 root root 87K lip 10 13:56 snap.canonical-livepatch.canonical-livepatch
-rw------- 1 root root 87K lip 10 13:56 snap.canonical-livepatch.canonical-livepatchd
-rw------- 1 root root 75K lip 10 14:12 snap.core.hook.configure
-rw------- 1 root root 61K lip 10 12:46 snap.hello-world.env
-rw------- 1 root root 61K lip 10 12:46 snap.hello-world.evil
-rw------- 1 root root 61K lip 10 12:46 snap.hello-world.hello-world
-rw------- 1 root root 61K lip 10 12:46 snap.hello-world.sh
-rw------- 1 root root 74K lip 5 14:13 snap.http.http
-rw------- 1 root root 59K lip 5 14:13 snap.http.man
It does though begs for the question, why? @jdstrand can you shed some light on this? Should we unify under one specific directory? EDIT: and one more question, how is that cache pruned of stale entires?