Call for testing: Snapcraft 9.0

On behalf of the Starcraft team, I’m pleased to announce that Snapcraft 9.0 is available in the latest/candidate and 9.x/candidate channels. The tentative release date for the stable channel is 2026-05-19T05:00:00Z.

The major changes in Snapcraft 9 are support for core26 and the removal of core20. Users who still need to build core20 snaps should remain on the 8.x channel.

Compared to the transitions to Snapcraft 7 and 8, this release includes far fewer internal refactorings. As a result, we expect the migration from core24 to core26 to be relatively straightforward for most projects. One important exception is the the removal of Python from the core26 snap.

For a complete overview of the changes in Snapcraft 9, see the release notes.

If you have any feedback or issues, please report them here or open an issue.


Subscribed stakeholders

This section contains users who wish to be automatically notified for future releases. Reply here to be added or removed from the list.

4 Likes

Good work, team :smiley: :sparkling_heart: I look forward to parallel installing a fifth snapcraft.

1 Like

When building from this core26 branch with snapcraft 9.0, I get the following:

$ snapcraft clean && time snapcraft pack
Version has been set to '0+git.3660b5d'
Version has been set to '0+git.3660b5d'
Lint warnings:
- library: bin/ovn-nbctl: missing dependency 'libunbound.so.8'. (https://documentation.ubuntu.com/snapcraft/stable/how-to/debugging/use-the-library-linter)
- library: bin/ovn-sbctl: missing dependency 'libunbound.so.8'. (https://documentation.ubuntu.com/snapcraft/stable/how-to/debugging/use-the-library-linter)
- library: bin/ovs-vsctl: missing dependency 'libunbound.so.8'. (https://documentation.ubuntu.com/snapcraft/stable/how-to/debugging/use-the-library-linter)
Version has been set to '0+git.3660b5d'
Packed lxd_0+git.3660b5d_amd64.snap

real	27m9.451s
user	0m7.595s
sys	0m3.439s

And the libunbound.so is indeed missing from the resulting snap. When building with the older snapcraft, the lib is properly primed and there is no linter warning either.

$ snap list --all snapcraft 
Name       Version  Rev    Tracking          Publisher   Notes
snapcraft  8.14.5   17634  latest/candidate  canonical✓  classic
snapcraft  9.0.0    18124  latest/candidate  canonical✓  disabled,classic

Is libunbound8 in any of the {parts,stage,prime}/ directories? What plugin is the part which should be staging this using?

I had a similar sort of problem with libmalloc not being unpacked into $CRAFT_PART_INSTALL which I still haven’t resolved, maybe they’re related…

@dilyn, let me know if you can make a small reproducer or get more information.

@sdeziel, this is almost certainly a new bug in Snapcraft 9. Core26 switched to a chiseled base, so craft-parts gained support for parsing chisel manifests. This is used for determining the stage-package cutoff. It’s certainly not working as-intended in Snapcraft.

I see the core26 added wall2dpkg a few days ago, which may be an easy path forward for Snapcraft. I’ll need to root cause the current failure first.

@sdeziel, can you submit an issue in snapcraft so we can prioritize it?

1 Like

@mr_cal snapcraft 9.0 doesn't prime files in the same way 8.x did · Issue #6248 · canonical/snapcraft · GitHub Thanks for looking into this!

Thanks! It seems Snapcraft is working as expected (believe it or not), I followed up in the github issue with an upstream issue for core26.

1 Like

Same dependencies problem with python.

  test:
    plugin: nil
    source: .
    stage-packages:
      - python3

with core26

with Snapcraft 8

Fetching stage-packages
Downloading package: python3.14
Downloading package: libffi8
Downloading package: netbase
Downloading package: readline-common
Downloading package: gcc-16-base
Downloading package: libtinfo6
Downloading package: tzdata
Downloading package: python3-minimal
Downloading package: liblzma5
Downloading package: libexpat1
Downloading package: libpython3.14-minimal
Downloading package: debconf
Downloading package: openssl-provider-legacy
Downloading package: libc-gconv-modules-extra
Downloading package: libreadline8t64
Downloading package: libdb5.3t64
Downloading package: python3
Downloading package: libzstd1
Downloading package: libc6
Downloading package: libuuid1
Downloading package: media-types
Downloading package: libpython3.14-stdlib
Downloading package: libsqlite3-0
Downloading package: libpython3-stdlib
Downloading package: libssl3t64
Downloading package: libncursesw6
Downloading package: libbz2-1.0
Downloading package: python3.14-minimal
Downloading package: zlib1g
Downloading package: libgcc-s1

with Snapcraft 9

Fetching stage-packages
Downloading package: python3

This contradicts the statement in dedicated post that nothing has to be done for snaps using python without python plugin:

If it stays this way,

it would require:

    environment:
      PATH: $SNAP/usr/bin:$PATH
  test:
    plugin: nil
    source: .
    stage-packages:
      - python3
      - python3-minimal #required for 'python3' symlink # redundant with python3 package
      - python3.14-minimal #required for python bin # redundant with python3 and python3-minimal packages

(and wouldn’t include minimal python modules as it is the case in core24)

and wouldn’t display any warning or error during build like other linters can do, if the snap is not updated.

I think I largely figured out what’s happening, so I think the issue is mostly a documentation one.

1 Like

@TehAppKiller, it looks like the same bug and root cause - core26 also lists the python packages in it’s manifest.

FYI we’ll be delaying the release of Snapcraft 9.0 to stable until this issue with core26 is resolved. A fix was landed, but hasn’t been released to core26’s stable channel yet.

Hi all,

Snapcraft 9.0 has been released to latest/stable and 9.x/stable.

I’ve been able to successfully use snapcraft 9.0 stable to build my “antennas” snap. I installed it locally on Ubuntu Core 26 (on a raspberry pi 5), and everything appears to be working fine so far.

I’ll need to observe it a bit more, but core 26 appears to have also resolved a longstanding wifi firmware issue. Yay!

2 Likes

oHi,

I could not test everything yet.

I tried with stable Snapcraft 9.0.0 (rev. 18124) and core26 20260531 (rev. 409) (exceptionally core24 20260410 (rev. 1643)) on Ubuntu 24.04.

  • Python plugin is not working at all
  • build-snaps install problems

Several problems with build snaps install

1/ after attempting builds with gpu extension and gpu-2604 plug, mesa-2604 snap was still not installed in snap list , then trying to manually install it:

sudo snap install mesa-2604
error: cannot perform the following tasks:
- Run install hook of "mesa-2604" snap if present (run hook "install":
-----
cannot preserve mount namespace of process 64948 as mesa-2604.mnt: Invalid argument
unexpected eof from helper process
-----)

After reboot, I could install it manually.

2/ fail to detect installed snap (gpu extension / gpu-2604 plug) randomly

e.g. from core24 build:

Installing build-snaps
Error installing snap 'mesa-2404' from channel 'latest/stable'.

manually:

sudo snap install mesa-2404
snap "mesa-2404" is already installed, see 'snap help refresh'

same for core26 and mesa-2604

sometimes it works, just relaunching clean + pack, sometimes not.

  • gpu extension not working

1/ gpu-2604-cleanup removes required libraries

2/ layout error:

cannot update snap namespace: cannot create symlink in "/usr/share/X11/XErrorDB": existing file in the way

3/ build-snaps install problems

(cf. before in this post)

  • 1 snapcraft clean problem

I faced a snapcraft clean error.

I lost the log but it involved a python 3.12 trace error.

Performing a sudo snapcraft clean seems to have fixed the problem.

Thanks

  • Remote build with Snapcraft 9.0.0 + core24 + kde-neon-6 extension lacks default LD_LIBRARY_PATH.

It was working 8days ago with same source code (w/ Snapcraft 8.14.5).

/snap/qbittorrent-desktop-tak/48/usr/bin/qbittorrent: error while loading shared libraries: libtorrent-rasterbar.so.2.0: cannot open shared object file: No such file or directory
ls -l /snap/qbittorrent-desktop-tak/48/usr/lib/x86_64-linux-gnu/
total 7175
lrwxrwxrwx 1 root root      27 Jun 16 08:40 libtorrent-rasterbar.so -> libtorrent-rasterbar.so.2.0
lrwxrwxrwx 1 root root      30 Jun 16 08:40 libtorrent-rasterbar.so.2.0 -> libtorrent-rasterbar.so.2.0.13
-rw-r--r-- 1 root root 7347008 Jun 16 08:40 libtorrent-rasterbar.so.2.0.13

from snap shell:

LD_LIBRARY_PATH=/snap/qbittorrent-desktop-tak/48/kf6/usr/lib/x86_64-linux-gnu:/snap/qbittorrent-desktop-tak/48/kf6/usr/lib:/snap/qbittorrent-desktop-tak/48/lxqt-support-core24/usr/lib/x86_64-linux-gnu::/snap/qbittorrent-desktop-tak/48/gpu-2404/usr/lib/x86_64-linux-gnu:/snap/qbittorrent-desktop-tak/48/gpu-2404/usr/lib/x86_64-linux-gnu/vdpau:/snap/qbittorrent-desktop-tak/48/gpu-2404/usr/lib/i386-linux-gnu:/snap/qbittorrent-desktop-tak/48/gpu-2404/usr/lib/i386-linux-gnu/vdpau:/var/lib/snapd/lib/gl:/var/lib/snapd/lib/gl32:/snap/qbittorrent-desktop-tak/48/kf6/lib/x86_64-linux-gnu:/snap/qbittorrent-desktop-tak/48/kf6/usr/lib/x86_64-linux-gnu:/snap/qbittorrent-desktop-tak/48/kf6/usr/lib:/snap/qbittorrent-desktop-tak/48/kf6/lib:/snap/qbittorrent-desktop-tak/48/kf6/usr/lib/x86_64-linux-gnu/pulseaudio:/snap/qbittorrent-desktop-tak/48/kf6/usr/lib/x86_64-linux-gnu/libproxy:/snap/qbittorrent-desktop-tak/48/kf6/usr/lib/x86_64-linux-gnu/blas:/snap/qbittorrent-desktop-tak/48/kf6/usr/lib/x86_64-linux-gnu/lapack

  • Random install errors
sudo snap install qbittorrent-desktop-tak_5.1.4-v2_amd64.snap --dangerous --name=qbittorrent-desktop-tak_2
error: cannot perform the following tasks:
- Run configure hook of "qbittorrent-desktop-tak_2" snap if present (run hook "configure":
-----
update.go:85: cannot change mount namespace according to change mount (/snap/gtk-common-themes/1535/share/gtk2/Materia-compact /snap/qbittorrent-desktop-tak/x1/data-dir/themes/Materia-compact none bind,ro 0 0): cannot write to "/snap/gtk-common-themes/1535/share/gtk2/Materia-compact" because it would affect the host in "/snap"
update.go:85: cannot change mount namespace according to change mount (/snap/gtk-common-themes/1535/share/gtk2/Materia-dark-compact /snap/qbittorrent-desktop-tak/x1/data-dir/themes/Materia-dark-compact none bind,ro 0 0): cannot write to "/snap/gtk-common-themes/1535/share/gtk2/Materia-dark-compact" because it would affect the host in "/snap"
update.go:85: cannot change mount namespace according to change mount (/snap/gtk-common-themes/1535/share/gtk2/Yaru-MATE-dark /snap/qbittorrent-desktop-tak/x1/data-dir/themes/Yaru-MATE-dark none bind,ro 0 0): cannot use "/snap/gtk-common-themes/1535/share/gtk2/Yaru-MATE-dark" as bind-mount source: not a directory
update.go:85: cannot change mount namespace according to change mount (/snap/gtk-common-themes/1535/share/gtk2/Yaru-MATE-light /snap/qbittorrent-desktop-tak/x1/data-dir/themes/Yaru-MATE-light none bind,ro 0 0): cannot use "/snap/gtk-common-themes/1535/share/gtk2/Yaru-MATE-light" as bind-mount source: not a directory
cannot preserve mount namespace of process 197773 as qbittorrent-desktop-tak_2.mnt: Invalid argument
unexpected eof from helper process
-----)
snap install qbittorrent-desktop-tak_5.1.4-v2_amd64.snap --dangerous --name=qbittorrent-desktop-tak_2
qbittorrent-desktop-tak_2 5.1.4-v2 installed

oHi,

I faced again the snapcraft clean problem

Here is the log:

Checking if LXD is installed.
LXD snap status: active
Converted name 'snapcraft-qbittorrent-desktop-tak-amd64-1702' to instance name 'snapcraft-qbittorrent-desktop-tak-amd64-1702'
snapcraft internal error: ClientConnectionFailed("('Connection aborted.', PermissionError(13, 'Permission denied'))")
Traceback (most recent call last):
  File "/snap/snapcraft/17614/lib/python3.12/site-packages/urllib3/connectionpool.py", line 787, in urlopen
    response = self._make_request(
               ^^^^^^^^^^^^^^^^^^^
  File "/snap/snapcraft/17614/lib/python3.12/site-packages/urllib3/connectionpool.py", line 493, in _make_request
    conn.request(
  File "/snap/snapcraft/17614/lib/python3.12/site-packages/urllib3/connection.py", line 500, in request
    self.endheaders()
  File "/snap/snapcraft/current/usr/lib/python3.12/http/client.py", line 1351, in endheaders
    self._send_output(message_body, encode_chunked=encode_chunked)
  File "/snap/snapcraft/current/usr/lib/python3.12/http/client.py", line 1111, in _send_output
    self.send(msg)
  File "/snap/snapcraft/current/usr/lib/python3.12/http/client.py", line 1055, in send
    self.connect()
  File "/snap/snapcraft/17614/lib/python3.12/site-packages/pylxd/client.py", line 82, in connect
    sock.connect(socket_path)
PermissionError: [Errno 13] Permission denied

During handling of the above exception, another exception occurred:
Traceback (most recent call last):
  File "/snap/snapcraft/17614/lib/python3.12/site-packages/requests/adapters.py", line 644, in send
    resp = conn.urlopen(
           ^^^^^^^^^^^^^
  File "/snap/snapcraft/17614/lib/python3.12/site-packages/urllib3/connectionpool.py", line 841, in urlopen
    retries = retries.increment(
              ^^^^^^^^^^^^^^^^^^
  File "/snap/snapcraft/17614/lib/python3.12/site-packages/urllib3/util/retry.py", line 490, in increment
    raise reraise(type(error), error, _stacktrace)
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/snap/snapcraft/17614/lib/python3.12/site-packages/urllib3/util/util.py", line 38, in reraise
    raise value.with_traceback(tb)
  File "/snap/snapcraft/17614/lib/python3.12/site-packages/urllib3/connectionpool.py", line 787, in urlopen
    response = self._make_request(
               ^^^^^^^^^^^^^^^^^^^
  File "/snap/snapcraft/17614/lib/python3.12/site-packages/urllib3/connectionpool.py", line 493, in _make_request
    conn.request(
  File "/snap/snapcraft/17614/lib/python3.12/site-packages/urllib3/connection.py", line 500, in request
    self.endheaders()
  File "/snap/snapcraft/current/usr/lib/python3.12/http/client.py", line 1351, in endheaders
    self._send_output(message_body, encode_chunked=encode_chunked)
  File "/snap/snapcraft/current/usr/lib/python3.12/http/client.py", line 1111, in _send_output
    self.send(msg)
  File "/snap/snapcraft/current/usr/lib/python3.12/http/client.py", line 1055, in send
    self.connect()
  File "/snap/snapcraft/17614/lib/python3.12/site-packages/pylxd/client.py", line 82, in connect
    sock.connect(socket_path)
urllib3.exceptions.ProtocolError: ('Connection aborted.', PermissionError(13, 'Permission denied'))

During handling of the above exception, another exception occurred:
Traceback (most recent call last):
  File "/snap/snapcraft/17614/lib/python3.12/site-packages/pylxd/client.py", line 501, in __init__
    response = self.api.get()
               ^^^^^^^^^^^^^^
  File "/snap/snapcraft/17614/lib/python3.12/site-packages/pylxd/client.py", line 267, in get
    response = self.session.get(self._api_endpoint, *args, **kwargs)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/snap/snapcraft/17614/lib/python3.12/site-packages/requests/sessions.py", line 602, in get
    return self.request("GET", url, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/snap/snapcraft/17614/lib/python3.12/site-packages/requests/sessions.py", line 589, in request
    resp = self.send(prep, **send_kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/snap/snapcraft/17614/lib/python3.12/site-packages/requests/sessions.py", line 703, in send
    r = adapter.send(request, **kwargs)
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/snap/snapcraft/17614/lib/python3.12/site-packages/requests/adapters.py", line 659, in send
    raise ConnectionError(err, request=request)
requests.exceptions.ConnectionError: ('Connection aborted.', PermissionError(13, 'Permission denied'))

During handling of the above exception, another exception occurred:
Traceback (most recent call last):
  File "/snap/snapcraft/17614/lib/python3.12/site-packages/craft_application/application.py", line 676, in run
    return_code = self._run_inner()
                  ^^^^^^^^^^^^^^^^^
  File "/snap/snapcraft/17614/lib/python3.12/site-packages/snapcraft/application.py", line 183, in _run_inner
    return_code = super()._run_inner()
                  ^^^^^^^^^^^^^^^^^^^^
  File "/snap/snapcraft/17614/lib/python3.12/site-packages/craft_application/application.py", line 653, in _run_inner
    return_code = dispatcher.run() or os.EX_OK
                  ^^^^^^^^^^^^^^^^
  File "/snap/snapcraft/17614/lib/python3.12/site-packages/craft_cli/dispatcher.py", line 564, in run
    return self._loaded_command.run(self._parsed_command_args)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/snap/snapcraft/17614/lib/python3.12/site-packages/craft_application/commands/base.py", line 222, in run
    result = self._run(parsed_args, **kwargs) or result
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/snap/snapcraft/17614/lib/python3.12/site-packages/craft_application/commands/lifecycle.py", line 787, in _run
    self._services.provider.clean_instances()
  File "/snap/snapcraft/17614/lib/python3.12/site-packages/craft_application/services/provider.py", line 362, in clean_instances
    self._clean_instance(provider, self._work_dir, info, self._project.name)
  File "/snap/snapcraft/17614/lib/python3.12/site-packages/craft_application/services/provider.py", line 440, in _clean_instance
    provider.clean_project_environments(instance_name=instance_name)
  File "/snap/snapcraft/17614/lib/python3.12/site-packages/craft_providers/provider.py", line 77, in clean_project_environments
    environment = self.create_environment(instance_name=instance_name)
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/snap/snapcraft/17614/lib/python3.12/site-packages/craft_providers/lxd/lxd_provider.py", line 112, in create_environment
    return LXDInstance(
           ^^^^^^^^^^^^
  File "/snap/snapcraft/17614/lib/python3.12/site-packages/craft_providers/lxd/lxd_instance.py", line 105, in __init__
    self._client = client or pylxd.Client(project=self.project)
                             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/snap/snapcraft/17614/lib/python3.12/site-packages/pylxd/client.py", line 510, in __init__
    raise exceptions.ClientConnectionFailed(str(e))
pylxd.exceptions.ClientConnectionFailed: ('Connection aborted.', PermissionError(13, 'Permission denied'))

required a sudo snapcraft clean to be able to work.

Thanks.

I need to know what changed that would kill LD_LIBRARY_PATH for all kde-neon-6 snaps none of the $SNAP… runtime env is there. I have not changed anything on my end.

Well it seems somehow all runtime env for kde-neon-6 ext was removed. Dunno how or where, but I added it to my launcher script and all is well again. :woman_shrugging:

1 Like

Nope the GPU snap stuff is still very broken for kde-neon-6 extension. Any help appreciated @mr_cal

I think I see what happened. Last year, #5917 added LD_LIBRARY_PATH to the extension’s build-environment. This prevents Snapcraft from setting a default LD_LIBRARY_PATH, so it had to be moved to the launcher script in #6016.

#6016 landed on the hotfix/8.14 branch. When I merged that branch back to main in #6104, the fix in #6016 got partially applied in the merge. Thus, Snapcraft 9.0 never got the fix.

I think the solution is to redo the fix in #6016 on main.

Does this sound related to your problem @scarlettmoore?