-
-
Notifications
You must be signed in to change notification settings - Fork 563
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Make AppImages run on Alpine #1015
Comments
Documentation says:
|
Would a statically linked binary (e.g., using musl internally) work on every system? Can we safely assume that? I mean, we have a dependency on FUSE, but that's more API than ABI, and any FUSE client should be able to talk to any distro, no matter what libc they use. |
CC #877 |
There is a library named libgcompat that provides most of the additional (non-standard) features in glibc for musl-based systems. I think the optimal solution will eventually be to build things against musl (ideally statically) and package all the deps in the appimage. |
That's a fairly safe assumption. ABI incompatibilities are a thing, as well as kernel headers, but I've done some fairly extreme things in the past (such as statically linked shells and utilities for use in a system that hasn't been updated in about a decade). |
The problem with glibc is that we need the right I think we need to finally extract and separate the runtime from the rest of the code, then we can create the regular builds with their semi-static linking and also experiment with truly static runtime builds. |
Some instinct tells me that sooner or later we'll end up making the runtime a version of ld-linux, so that it doesn't have to rely on one from the system... (musl's is even MIT licensed) |
That gcompat project I mentioned provides a linker (compatibility stub*) too, but yes, that's part of it.
Both of these sound interesting. I'm fairly busy, but knowing where and what to poke at to understand the codebase would be useful as well, if possible (as much as I abhor C). |
@5paceToast thanks for your offer. We've already found enough reasons to make a AppImage type 3, in which we intend to solve a lot of problems. Your input will be welcome. |
I've started a draft, comments welcome: https://github.com/TheAssassin/type3-runtime (Please continue the discussion there, here it's off topic.) |
I don't think we need a new type in order to address the points mentioned in this thread; this imho all can be achieved by a new runtime for type 2 images (i.e., a squashfs or other filesystem appended to an ELF binary). |
The AppImage is known to fail on musl-based systems, see AppImage/AppImageKit#1015
The AppImage is known to fail on musl-based systems, see AppImage/AppImageKit#1015
About one year now, any progress here to support musl ? |
Looks like no one is working on it. |
Has anyone tried with this? https://github.com/sgerrand/alpine-pkg-glibc |
Hi @vinniec! Thank you for the link. Yes! It works! I've made a test with the xonsh shell and report the successfull result - sgerrand/alpine-pkg-glibc#153 (comment) |
There is also https://github.com/mensinda/libRuntime, which will give you a statically linked runtime that can be passed to appimagetool with However, this won't really make a difference if the actual packaged program also depends on glibc, since the host version of the c library is used in general. The way I work around this is by also packaging musl or glibc (including |
@mensinda do you have such an AppImage for download somewhere? I'd like how it fares on helloSystem (FreeBSD). |
@probonopd Yes, I have some "AppImages" here. For reference, they are as a demonstration for mesonbuild/meson#7518. I am not sure if they really are AppImages according to the spec, since I am packaging python3, ninja, pkgconf, and Meson. Also, the "AppImage" self extracts when an actual Meson project is configured. These binaries are built in the latest Alpine docker container and the complete c library is packaged (including the musl I have successfully tested the 64bit binary on Ubuntu 10.04 (not that you can actually do anything useful there). |
Any reason why this doesn't work? I'm missing a package or something like that?
Unlike libc6-compat, gcompat defines gnu_dev_makedev, so why it doesn't work? |
Great question. I don't know the answer, sorry. |
Is this like a well known alpine issue? |
This is a well known linux issue. However, in this case, it's likely using the original stub, which dynamically links to glibc (which is obviously not present), which is indeed what this (unresolved, unlikely to be resolved) bug is about. |
I get this when not using gcompat. Using gcompat i get the error shown above. |
When running an AppImage under [gcompat][0] (e.g. on Alpine Linux), `fopen("/proc/self/exe", "rb")` opens the dynamic linker (e.g. `/lib/ld-musl-x86_64.so.1`) instead of the AppImage itself. However, `readlink("/proc/self/exe", ...)` does give the path to the AppImage as expected, even under gcompat. This commit fixes this problem by always using the link target for `/proc/self/exe` in places that read the AppImage instead of the link itself. Without this commit, running an AppImage under gcompat results in [the error message "This doesn't look like a squashfs image." from squashfuse][1]. With this commit, AppImages run as expected under gcompat. In order to make `--appimage-help` and `--appimage-portable-{home,config}` work under gcompat, I also move the calculation of the `fullpath` variable in `main()` to earlier in the function and change `print_help()` and `portable_option()` to use it instead of calculating the fullpath separately. (When `$TARGET_APPIMAGE` is set, since `realpath()` is (already) used instead of `readlink()` in that case, this change could result in a different path being used in help output and when _creating_ the portable home and config directories with the respective command line options, but `fullpath` is already being used to find existing portable directories when running an AppImage, so this should not affect existing portable installations.) For consistency, I also rename the `fullpath` variable in `main()` and the corresponding arguments in `print_help()` and `portable_option()` to `appimage_fullpath`. Fixes AppImage#1015 on Alpine Linux systems with gcompat installed, for AppImages made with this changeset applied. Tested on Alpine Linux edge x86_64 and postmarketOS (based on Alpine) edge aarch64. [0]: https://git.adelielinux.org/adelie/gcompat/ [1]: https://github.com/vasi/squashfuse/blob/e51978cd6bb5c4d16fae9eee43d0b258f570bb0f/util.c#L81-L82
When running an AppImage under [gcompat][0] (e.g. on Alpine Linux), `fopen("/proc/self/exe", "rb")` opens the dynamic linker (e.g. `/lib/ld-musl-x86_64.so.1`) instead of the AppImage itself. However, `readlink("/proc/self/exe", ...)` does give the path to the AppImage as expected, even under gcompat. This commit fixes this problem by always using the link target for `/proc/self/exe` in places that read the AppImage instead of the link itself. Without this commit, running an AppImage under gcompat results in [the error message "This doesn't look like a squashfs image." from squashfuse][1]. With this commit, AppImages run as expected under gcompat. In order to make `--appimage-help` and `--appimage-portable-{home,config}` work under gcompat, I also move the calculation of the `fullpath` variable in `main()` to earlier in the function and change `print_help()` and `portable_option()` to use it instead of calculating the fullpath separately. (When `$TARGET_APPIMAGE` is set, since `realpath()` is (already) used instead of `readlink()` in that case, this change could result in a different path being used in help output and when _creating_ the portable home and config directories with the respective command line options, but `fullpath` is already being used to find existing portable directories when running an AppImage, so this should not affect existing portable installations.) For consistency, I also rename the `fullpath` variable in `main()` and the corresponding arguments in `print_help()` and `portable_option()` to `appimage_fullpath`. Fixes AppImage#1015 on Alpine Linux systems with gcompat installed, for AppImages made with this commit applied. Tested on Alpine Linux edge x86_64 and postmarketOS (based on Alpine) edge aarch64. [0]: https://git.adelielinux.org/adelie/gcompat/ [1]: https://github.com/vasi/squashfuse/blob/e51978cd6bb5c4d16fae9eee43d0b258f570bb0f/util.c#L81-L82
I've also opened https://git.adelielinux.org/adelie/gcompat/-/issues/349 for this. |
If I understand it right, it Looks like https://github.com/eth-cscs/spack-batteries-included is providing a solution for this. Should we backport these changes into the AppImage runtime?
Reference: |
I believe the AppImages from https://github.com/probonopd/go-appimage/releases/tag/continuous which are using the experimental static runtime might work on Alpine (if fusermount is installed and the fuse kernel module is loaded) but I fail to get DHCP and internet access running when booting into https://dl-cdn.alpinelinux.org/alpine/v3.12/releases/x86_64/alpine-standard-3.12.0-x86_64.iso Does anyone know how to test this? |
On v3.12, Also, you may want to setup repositories: |
And |
Discussion continues in |
It uses the same method as flatpaks, runtimes contain a small Linux system... In this case, it contains gtar, python3, binutils and other misc programs and libraries that were compiled against glibc but then modified to link against a local glibc (a glibc installed inside of the runtime) |
If only the guides for packaging AppImages told developers to ALWAYS TRY to statically link using musl-gcc or an Alpine container or install... AppImages would be smaller and would be actually portable. |
Everything has upsides and downsides. But yes, I like the approach you suggest. |
Alpine has
libc6-compat
which provides ld-linux, so in theory it should run there, but in practice we are getting:The text was updated successfully, but these errors were encountered: