Report forwarded
to bug-guix@gnu.org: bug#76850; Package guix.
(Sat, 08 Mar 2025 03:47:02 GMT) (full text, mbox, link).
Acknowledgement sent
to Reepca Russelstein <reepca@russelstein.xyz>:
New bug report received and forwarded. Copy sent to bug-guix@gnu.org.
(Sat, 08 Mar 2025 03:47:02 GMT) (full text, mbox, link).
Or perhaps it would be more accurate to say that it is nondeterministic.
This is because it currently succeeds more or less by accident: the
AppRun symlink points to ./gnu/store/...-profile/bin/hello, which points
to /gnu/store/...-hello-2.12.1/bin/hello (note: absolute path!). There
shouldn't be any reason for that to exist inside the chroot, except that
the daemon's reference scanner has noticed that some of the inputs to
the appimage-building derivation *may* have their hashes visible in the
built appimage. I say "may" because the appimage is compressed with
squashfs, so it's a matter of luck whether a hash is actually directly
visible. Currently, in the master branch, it happens to be visible, but
in my local repository it isn't, and so it fails for me.
To demonstrate this without relying on the fickle compression, find the
store path of the appimage built during the tests/pack.scm "appimage"
test case after running "make check TESTS=tests/pack.scm" (the
"check-appimage" derivation is printed into tests/pack.log, from there
you can find the appimage derivation and its output path), and call it
$IMAGE. Then:
$ IMAGE=/gnu/store/2c8m9in2pkgkf8p9qgv17dqz19jfxmmm-hello-appimage.AppImage
$ mkdir test-root
$ mkdir test-root/proc
$ mkdir test-root/tmp
$ cp "$IMAGE" test-root/test-image
$ unshare --user --mount --map-root-user
then, in the subshell spawned by unshare:
$ mount --bind /proc test-root/proc
$ chroot ./test-root /test-image --appimage-extract-and-run
you should see "Failed to run
/tmp/appimage_extracted_e331827d4eb2f579cccf6fb79143c261/AppRun: No such
file or directory" or something like it.
- reepca
Hello,
Thanks for the bug report, Reepca.
Noé, could you take a look?
Thanks,
Ludo’.
Reepca Russelstein <reepca@russelstein.xyz> skribis:
> Or perhaps it would be more accurate to say that it is nondeterministic.
> This is because it currently succeeds more or less by accident: the
> AppRun symlink points to ./gnu/store/...-profile/bin/hello, which points
> to /gnu/store/...-hello-2.12.1/bin/hello (note: absolute path!). There
> shouldn't be any reason for that to exist inside the chroot, except that
> the daemon's reference scanner has noticed that some of the inputs to
> the appimage-building derivation *may* have their hashes visible in the
> built appimage. I say "may" because the appimage is compressed with
> squashfs, so it's a matter of luck whether a hash is actually directly
> visible. Currently, in the master branch, it happens to be visible, but
> in my local repository it isn't, and so it fails for me.
>
> To demonstrate this without relying on the fickle compression, find the
> store path of the appimage built during the tests/pack.scm "appimage"
> test case after running "make check TESTS=tests/pack.scm" (the
> "check-appimage" derivation is printed into tests/pack.log, from there
> you can find the appimage derivation and its output path), and call it
> $IMAGE. Then:
>
> $ IMAGE=/gnu/store/2c8m9in2pkgkf8p9qgv17dqz19jfxmmm-hello-appimage.AppImage
> $ mkdir test-root
> $ mkdir test-root/proc
> $ mkdir test-root/tmp
> $ cp "$IMAGE" test-root/test-image
> $ unshare --user --mount --map-root-user
>
> then, in the subshell spawned by unshare:
>
> $ mount --bind /proc test-root/proc
> $ chroot ./test-root /test-image --appimage-extract-and-run
>
> you should see "Failed to run
> /tmp/appimage_extracted_e331827d4eb2f579cccf6fb79143c261/AppRun: No such
> file or directory" or something like it.
>
> - reepca
Information forwarded
to bug-guix@gnu.org: bug#76850; Package guix.
(Sat, 05 Apr 2025 22:30:02 GMT) (full text, mbox, link).
Ludovic Courtès <ludo@gnu.org> writes:
> Hello,
>
> Thanks for the bug report, Reepca.
>
> Noé, could you take a look?
>
> Thanks,
> Ludo’.
>
Hi Reepca and Ludo,
Thanks for sending this to me Ludo.
This bug report is very well detailed, thank you.
> Reepca Russelstein <reepca@russelstein.xyz> skribis:
>
>> Or perhaps it would be more accurate to say that it is nondeterministic.
>> This is because it currently succeeds more or less by accident: the
>> AppRun symlink points to ./gnu/store/...-profile/bin/hello, which points
>> to /gnu/store/...-hello-2.12.1/bin/hello (note: absolute path!). There
>> shouldn't be any reason for that to exist inside the chroot, except that
>> the daemon's reference scanner has noticed that some of the inputs to
>> the appimage-building derivation *may* have their hashes visible in the
>> built appimage. I say "may" because the appimage is compressed with
>> squashfs, so it's a matter of luck whether a hash is actually directly
>> visible. Currently, in the master branch, it happens to be visible, but
>> in my local repository it isn't, and so it fails for me.
So you’re saying that the daemon is scanning through the files to find
references to add? As we see here that is unreliable, do you know what
is the reasoning for this?
Indeed, there are no reasons for that absolute path to exist, since we
have not yet entered the AppImage’s chroot/usermount. This is a
weakness in our current AppImage design, the contents are always
designed to be ran with a store in /gnu/store but this is handled only
by the AppImage runtime (without --appimage-extract).
--appimage-extract bypasses this and we then rely on the --relocatable
binaries, but ideally there would be no need for relocatable.
This is where our issue lies: in our tests we use #:relocatable? on the
self-contained-appimage function but the profile we give it has not
been made relocatably.
>>
>> To demonstrate this without relying on the fickle compression, find the
>> store path of the appimage built during the tests/pack.scm "appimage"
>> test case after running "make check TESTS=tests/pack.scm" (the
>> "check-appimage" derivation is printed into tests/pack.log, from there
>> you can find the appimage derivation and its output path), and call it
>> $IMAGE. Then:
>>
>> $ IMAGE=/gnu/store/2c8m9in2pkgkf8p9qgv17dqz19jfxmmm-hello-appimage.AppImage
>> $ mkdir test-root
>> $ mkdir test-root/proc
>> $ mkdir test-root/tmp
>> $ cp "$IMAGE" test-root/test-image
>> $ unshare --user --mount --map-root-user
>>
>> then, in the subshell spawned by unshare:
>>
>> $ mount --bind /proc test-root/proc
>> $ chroot ./test-root /test-image --appimage-extract-and-run
>>
>> you should see "Failed to run
>> /tmp/appimage_extracted_e331827d4eb2f579cccf6fb79143c261/AppRun: No such
>> file or directory" or something like it.
>>
>> - reepca
I’m sending a patch with the updated tests. Sorry for the long wait!
Have a nice day,
Noé
Hi Noé,
Noé Lopez <noelopez@free.fr> skribis:
> As reported in #76850, the tested AppImages were not actually relocatable and
> would rely on items being available on the environment’s store (apart from
> glibc).
>
> * guix/scripts/pack.scm (wrapped-manifest): New function.
> (guix-pack): Extract relocatable manifest to wrapped-manifest.
> * tests/pack.scm: Use relocatable profiles in AppImage tests.
>
> Change-Id: Ib3123054913fce903d215dc0629d806e9fceebc7
Please add a “Fixes” line and a “Reported-by” tag as is usually done.
> +(define*-public (wrapped-manifest manifest #:rest args)
Simply ‘define*’.
Otherwise LGTM, thanks for fixing it!
Ludo’.
Information forwarded
to bug-guix@gnu.org: bug#76850; Package guix.
(Tue, 08 Apr 2025 19:12:02 GMT) (full text, mbox, link).
Ludovic Courtès <ludo@gnu.org> writes:
> Hi Noé,
>
> Noé Lopez <noelopez@free.fr> skribis:
>
>> As reported in #76850, the tested AppImages were not actually relocatable and
>> would rely on items being available on the environment’s store (apart from
>> glibc).
>>
>> * guix/scripts/pack.scm (wrapped-manifest): New function.
>> (guix-pack): Extract relocatable manifest to wrapped-manifest.
>> * tests/pack.scm: Use relocatable profiles in AppImage tests.
>>
>> Change-Id: Ib3123054913fce903d215dc0629d806e9fceebc7
>
> Please add a “Fixes” line and a “Reported-by” tag as is usually done.
>
>> +(define*-public (wrapped-manifest manifest #:rest args)
>
> Simply ‘define*’.
>
Then how do I use it in the test? @@ won’t work, I think because the
module is declarative and guile is inlining it.
Or did you mean I should use define* and add it to the module exports in
define-module?
> Otherwise LGTM, thanks for fixing it!
>
> Ludo’.
Thanks for the review,
Noé
Debbugs is free software and licensed under the terms of the
GNU Public License version 2. The current version can be
obtained from https://bugs.debian.org/debbugs-source/.