Skip to content

[zstd:chunked, rootless] staging a partially-pulled layer: checksum mismatch #2332

Closed
@gucci-on-fleek

Description

@gucci-on-fleek

I'm unable to pull zstd:chunked container images built on a composefs host onto a non-composefs host. Non-zstd:chunked container images work fine, and the zstd:chunked images work fine on the composefs host. I started getting this issue around the same time that #2191 was opened; I assumed that #2194 would fix it, but it didn't.

Reproduction

Build the images

$ mount | grep 'on / '
composefs on / type overlay (ro,relatime,seclabel,lowerdir+=/run/ostree/.private/cfsroot-lower,datadir+=/sysroot/ostree/repo/objects,redirect_dir=on,metacopy=on)

$ podman --version
podman version 5.4.2

$ cat > Containerfile <<EOF
FROM scratch
COPY /usr/bin/busybox /usr/bin/busybox
CMD ["/usr/bin/busybox", "echo", "Hello, World!"]
EOF

$ podman build --no-cache --disable-compression --file=./Containerfile --tag=maxchernoff.ca/composefs-zstd-chunked /
$ skopeo copy --dest-tls-verify=false --dest-compress-format=zstd:chunked containers-storage:maxchernoff.ca/composefs-zstd-chunked:latest docker://localhost:23719/composefs-zstd-chunked:zstd-chunked

$ podman build --no-cache --disable-compression --file=./Containerfile --tag=maxchernoff.ca/composefs-zstd-chunked /
$ skopeo copy --dest-tls-verify=false --dest-compress-format=zstd containers-storage:maxchernoff.ca/composefs-zstd-chunked:latest docker://localhost:23719/composefs-zstd-chunked:zstd

$ podman build --no-cache --disable-compression --file=./Containerfile --tag=maxchernoff.ca/composefs-zstd-chunked /
$ skopeo copy --dest-tls-verify=false --dest-compress-format=gzip containers-storage:maxchernoff.ca/composefs-zstd-chunked:latest docker://localhost:23719/composefs-zstd-chunked:gzip

My container registry is public, so feel free to pull from it.

Run the images on composefs

$ mount | grep 'on / '
composefs on / type overlay (ro,relatime,seclabel,lowerdir+=/run/ostree/.private/cfsroot-lower,datadir+=/sysroot/ostree/repo/objects,redirect_dir=on,metacopy=on)

$ podman --version
podman version 5.4.2

$ podman run --pull=newer -it --rm maxchernoff.ca/composefs-zstd-chunked:zstd-chunked
Trying to pull maxchernoff.ca/composefs-zstd-chunked:zstd-chunked...
Getting image source signatures
Copying blob f10b285e2625 skipped: already exists
Copying config 66342d349b done   |
Writing manifest to image destination
Hello, World!

$ podman run --pull=newer -it --rm maxchernoff.ca/composefs-zstd-chunked:zstd
Trying to pull maxchernoff.ca/composefs-zstd-chunked:zstd...
Getting image source signatures
Copying blob 3b2700f8dc1a skipped: already exists
Copying config 26e0464471 done   |
Writing manifest to image destination
Hello, World!

$ podman run --pull=newer -it --rm maxchernoff.ca/composefs-zstd-chunked:gzip
Trying to pull maxchernoff.ca/composefs-zstd-chunked:gzip...
Getting image source signatures
Copying blob ed4c195b07bd skipped: already exists
Copying config c814e33ebf done   |
Writing manifest to image destination
Hello, World!
podman info
host:
  arch: amd64
  buildahVersion: 1.39.4
  cgroupControllers:
  - cpu
  - memory
  - pids
  cgroupManager: systemd
  cgroupVersion: v2
  conmon:
    package: conmon-2.1.13-1.fc42.x86_64
    path: /usr/bin/conmon
    version: 'conmon version 2.1.13, commit: '
  cpuUtilization:
    idlePercent: 96.63
    systemPercent: 1.54
    userPercent: 1.82
  cpus: 4
  databaseBackend: sqlite
  distribution:
    distribution: fedora
    variant: iot
    version: "42"
  eventLogger: journald
  freeLocks: 2047
  hostname: maxchernoff.ca
  idMappings:
    gidmap:
    - container_id: 0
      host_id: 1000
      size: 1
    - container_id: 1
      host_id: 524288
      size: 65536
    uidmap:
    - container_id: 0
      host_id: 1000
      size: 1
    - container_id: 1
      host_id: 524288
      size: 65536
  kernel: 6.14.5-300.fc42.x86_64
  linkmode: dynamic
  logDriver: journald
  memFree: 2463440896
  memTotal: 8309497856
  networkBackend: netavark
  networkBackendInfo:
    backend: netavark
    dns:
      package: aardvark-dns-1.14.0-1.fc42.x86_64
      path: /usr/libexec/podman/aardvark-dns
      version: aardvark-dns 1.14.0
    package: netavark-1.14.1-1.fc42.x86_64
    path: /usr/libexec/podman/netavark
    version: netavark 1.14.1
  ociRuntime:
    name: crun
    package: crun-1.21-1.fc42.x86_64
    path: /usr/bin/crun
    version: |-
      crun version 1.21
      commit: 10269840aa07fb7e6b7e1acff6198692d8ff5c88
      rundir: /run/user/1000/crun
      spec: 1.0.0
      +SYSTEMD +SELINUX +APPARMOR +CAP +SECCOMP +EBPF +CRIU +LIBKRUN +WASM:wasmedge +YAJL
  os: linux
  pasta:
    executable: /usr/bin/pasta
    package: passt-0^20250507.geea8a76-1.fc42.x86_64
    version: ""
  remoteSocket:
    exists: true
    path: /run/user/1000/podman/podman.sock
  rootlessNetworkCmd: pasta
  security:
    apparmorEnabled: false
    capabilities: CAP_CHOWN,CAP_DAC_OVERRIDE,CAP_FOWNER,CAP_FSETID,CAP_KILL,CAP_NET_BIND_SERVICE,CAP_SETFCAP,CAP_SETGID,CAP_SETPCAP,CAP_SETUID,CAP_SYS_CHROOT
    rootless: true
    seccompEnabled: true
    seccompProfilePath: /usr/share/containers/seccomp.json
    selinuxEnabled: true
  serviceIsRemote: false
  slirp4netns:
    executable: ""
    package: ""
    version: ""
  swapFree: 16898842624
  swapTotal: 16898842624
  uptime: 0h 29m 11.00s
  variant: ""
plugins:
  authorization: null
  log:
  - k8s-file
  - none
  - passthrough
  - journald
  network:
  - bridge
  - macvlan
  - ipvlan
  volume:
  - local
registries:
  localhost:23719:
    Blocked: false
    Insecure: true
    Location: localhost:23719
    MirrorByDigestOnly: false
    Mirrors: null
    Prefix: localhost:23719
    PullFromMirror: ""
  maxchernoff.ca:
    Blocked: false
    Insecure: true
    Location: localhost:23719
    MirrorByDigestOnly: false
    Mirrors: null
    Prefix: maxchernoff.ca
    PullFromMirror: ""
  search:
  - registry.fedoraproject.org
  - registry.access.redhat.com
  - docker.io
store:
  configFile: /var/home/max/.config/containers/storage.conf
  containerStore:
    number: 1
    paused: 0
    running: 0
    stopped: 1
  graphDriverName: overlay
  graphOptions: {}
  graphRoot: /var/home/max/.local/share/containers/storage
  graphRootAllocated: 261466619904
  graphRootUsed: 139354480640
  graphStatus:
    Backing Filesystem: btrfs
    Native Overlay Diff: "true"
    Supports d_type: "true"
    Supports shifting: "false"
    Supports volatile: "true"
    Using metacopy: "false"
  imageCopyTmpDir: /var/tmp
  imageStore:
    number: 24
  runRoot: /run/user/1000/containers
  transientStore: false
  volumePath: /var/home/max/.local/share/containers/storage/volumes
version:
  APIVersion: 5.4.2
  BuildOrigin: Fedora Project
  Built: 1743552000
  BuiltTime: Tue Apr  1 18:00:00 2025
  GitCommit: be85287fcf4590961614ee37be65eeb315e5d9ff
  GoVersion: go1.24.1
  Os: linux
  OsArch: linux/amd64
  Version: 5.4.2

Run the images on not composefs

$ mount | grep 'on / '
/dev/nvme1n1p3 on / type btrfs (rw,noatime,seclabel,compress=zstd:1,ssd,discard=async,space_cache=v2,subvolid=5,subvol=/)

$ podman --version
podman version 5.4.2

$ podman run --pull=newer -it --rm maxchernoff.ca/composefs-zstd-chunked:zstd-chunked
Trying to pull maxchernoff.ca/composefs-zstd-chunked:zstd-chunked...
Getting image source signatures
Error: partial pull of blob sha256:f10b285e2625d1374b4383ebd7caaa9ab7557e1f5b5337bab4cb490c009a02df: staging a partially-pulled layer: checksum mismatch for "/usr/bin/busybox" (got "sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" instead of "sha256:ac4814e3ed58c1d53367f0705f7026bd0bb672a536cb07cb5c9d96f9d3fcfaed")

$ podman run --pull=newer -it --rm maxchernoff.ca/composefs-zstd-chunked:zstd
Trying to pull maxchernoff.ca/composefs-zstd-chunked:zstd...
Getting image source signatures
Copying blob 3b2700f8dc1a done   |
Copying config 26e0464471 done   |
Writing manifest to image destination
Hello, World!

$ podman run --pull=newer -it --rm maxchernoff.ca/composefs-zstd-chunked:gzip
Trying to pull maxchernoff.ca/composefs-zstd-chunked:gzip...
Getting image source signatures
Copying blob ed4c195b07bd done   |
Copying config c814e33ebf done   |
Writing manifest to image destination
Hello, World!
podman info
host:
  arch: amd64
  buildahVersion: 1.39.4
  cgroupControllers:
  - cpu
  - io
  - memory
  - pids
  cgroupManager: systemd
  cgroupVersion: v2
  conmon:
    package: conmon-2.1.13-1.fc42.x86_64
    path: /usr/bin/conmon
    version: 'conmon version 2.1.13, commit: '
  cpuUtilization:
    idlePercent: 97.11
    systemPercent: 0.89
    userPercent: 2
  cpus: 16
  databaseBackend: sqlite
  distribution:
    distribution: fedora
    variant: workstation
    version: "42"
  eventLogger: journald
  freeLocks: 2048
  hostname: max-new-laptop
  idMappings:
    gidmap:
    - container_id: 0
      host_id: 1000
      size: 1
    - container_id: 1
      host_id: 100000
      size: 65536
    uidmap:
    - container_id: 0
      host_id: 1000
      size: 1
    - container_id: 1
      host_id: 100000
      size: 65536
  kernel: 6.14.5-300.fc42.x86_64
  linkmode: dynamic
  logDriver: journald
  memFree: 1220481024
  memTotal: 32949731328
  networkBackend: netavark
  networkBackendInfo:
    backend: netavark
    dns:
      package: aardvark-dns-1.14.0-1.fc42.x86_64
      path: /usr/libexec/podman/aardvark-dns
      version: aardvark-dns 1.14.0
    package: netavark-1.14.1-1.fc42.x86_64
    path: /usr/libexec/podman/netavark
    version: netavark 1.14.1
  ociRuntime:
    name: crun
    package: crun-1.21-1.fc42.x86_64
    path: /usr/bin/crun
    version: |-
      crun version 1.21
      commit: 10269840aa07fb7e6b7e1acff6198692d8ff5c88
      rundir: /run/user/1000/crun
      spec: 1.0.0
      +SYSTEMD +SELINUX +APPARMOR +CAP +SECCOMP +EBPF +CRIU +LIBKRUN +WASM:wasmedge +YAJL
  os: linux
  pasta:
    executable: /usr/bin/pasta
    package: passt-0^20250507.geea8a76-1.fc42.x86_64
    version: ""
  remoteSocket:
    exists: true
    path: /run/user/1000/podman/podman.sock
  rootlessNetworkCmd: pasta
  security:
    apparmorEnabled: false
    capabilities: CAP_CHOWN,CAP_DAC_OVERRIDE,CAP_FOWNER,CAP_FSETID,CAP_KILL,CAP_NET_BIND_SERVICE,CAP_SETFCAP,CAP_SETGID,CAP_SETPCAP,CAP_SETUID,CAP_SYS_CHROOT
    rootless: true
    seccompEnabled: true
    seccompProfilePath: /usr/share/containers/seccomp.json
    selinuxEnabled: true
  serviceIsRemote: false
  slirp4netns:
    executable: ""
    package: ""
    version: ""
  swapFree: 42949029888
  swapTotal: 42949660672
  uptime: 15h 3m 26.00s (Approximately 0.62 days)
  variant: ""
plugins:
  authorization: null
  log:
  - k8s-file
  - none
  - passthrough
  - journald
  network:
  - bridge
  - macvlan
  - ipvlan
  volume:
  - local
registries:
  search:
  - registry.fedoraproject.org
  - registry.access.redhat.com
  - docker.io
store:
  configFile: /home/max/.config/containers/storage.conf
  containerStore:
    number: 0
    paused: 0
    running: 0
    stopped: 0
  graphDriverName: overlay
  graphOptions: {}
  graphRoot: /home/max/.local/share/containers/storage
  graphRootAllocated: 1985756528640
  graphRootUsed: 1291860529152
  graphStatus:
    Backing Filesystem: btrfs
    Native Overlay Diff: "true"
    Supports d_type: "true"
    Supports shifting: "false"
    Supports volatile: "true"
    Using metacopy: "false"
  imageCopyTmpDir: /var/tmp
  imageStore:
    number: 13
  runRoot: /run/user/1000/containers
  transientStore: false
  volumePath: /home/max/.local/share/containers/storage/volumes
version:
  APIVersion: 5.4.2
  BuildOrigin: Fedora Project
  Built: 1743552000
  BuiltTime: Tue Apr  1 18:00:00 2025
  GitCommit: be85287fcf4590961614ee37be65eeb315e5d9ff
  GoVersion: go1.24.1
  Os: linux
  OsArch: linux/amd64
  Version: 5.4.2

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions