Files
micro_servers/lci/extra/qemu_run_appimage
2026-08-02 20:15:07 +08:00
..
2026-08-02 20:15:07 +08:00
2026-08-02 20:15:07 +08:00
2026-08-02 20:15:07 +08:00
2026-08-02 20:15:07 +08:00
2026-08-02 20:15:07 +08:00
2026-08-02 20:15:07 +08:00

qemu_run_appimage是什么?

这个项目源于我想用qemu-user运行AppImage的想法。

qemu-user是一款支持多种架构的能够虚拟化运行单个程序的虚拟机软件,而AppImage是一款能够打包出单文件应用的工具。

跨架构运行的障碍是什么?

Linux系统支持许多架构,这些架构的机器码、汇编语言都是有差异的,所以不同架构的系统在一般情况下是无法混合使用的,qemu虚拟机能够解决这个痛点,但是这需要一些技巧。

通常而言,一个程序除了在编译阶段静态链接了许多库,出于一些原因的考量,它也会在运行时动态地加载一些动态库文件。

使用qemu-user跨架构运行,常常就会出现单个文件能够执行,但是动态链接库找不到的问题。

AppImage起到一个什么作用?

AppImage能够将许多文件打包成一个二进制程序,你双击运行它就能够直接执行,因为关键的动态连接库都包含在里面了,通过一些技术手段让程序能够访问到。

所以我们能够将程序以及动态库打包成单个可执行程序,就有了能够虚拟化运行该程序的先决条件。

如何使用qemu-user运行AppImage

通常而言,AppImage里面会有一个叫AppRun的启动脚本,运行AppImage会使用shell解释器启动它,然后该脚本配置好环境,再由它启动目标程序。

但是qemu-user虚拟出的进程往往无法在宿主机系统中找到与它架构相对应的shell,所以就无法执行常规方式打包的AppImage文件。

那我通过与deepseek的深度交流,最终解决了这个问题。

我的思路有两个,一是打包AppImage时将AppRun编译成二进制文件,这个办法我经过了验证,是可行的。

还有一个办法是再打包一个shell解释器进去,这个我还没有尝试、

在运行时,我采用qemu-user提取出AppImage中的所有的文件,并且放在一个临时文件夹,然后在设置引用环境为该文件夹的方式下通过qemu-user执行其中的AppRun,应该就能够启动程序。

目前已经尝试了在树莓派上运行x86_64架构的一系列工具,包含ls命令、bash解释器、python3解释器,都能够成功,接下来我还会对网络等功能进行测试。

这个方法有哪些缺点?

我像一些朋友展示了这个方式,能够运行测试用例,但是他们说qemu的速度很慢,我了解了一下,qemu-user的性能损耗可能在2倍以内,一般的程序似乎还是可以接受,qemu虚拟机完整情况下的确较慢,性能损耗能够达到8~10倍。

所以一些开发者对常见架构进行了深度优化,成果比如box64(Arm64平台运行X86程序)、LATX(LA64平台运行x86程序),这些程序虽然支持的架构没有qemu-user多,在一些平台上可能也需要单独配置一些东西,但是在它们支持的架构下拥有更好的性能,在这里也推荐大家使用。

我的一些别的想法

既然qemu-user能够进行跨架构的实时翻译,那我们可能也能做到将一个二进制文件直接再编译成其他架构的二进制文件?这是我的一个想法。

项目逻辑与使用方法

项目中的auto-appimage1.sh这是一个打包脚本,能够在要运行的目标架构上打包出包含所有链接库的AppImage文件,且其中的入口程序AppRun是二进制的。

该脚本的使用方式如下:

bash auto-appimage1.sh <filename>

目前这个脚本仅能打包x86的程序,如果要在别的平台打包AppImage,可能需要进行调整。

qemu_run2.sh是在宿主机上的启动脚本,其中使用了qemu-user-static系列工具创建虚拟环境,static后缀的意思是这个工具是静态编译的,如果你的架构上没有这个软件,请安装它的非静态版本qemu-user,然后将其中的qemu--static都改为qemu-

通过一下方式使用它:

bash qemu_run2.sh <filename.AppImage>

ls.AppImage是x86_64架构下的ls命令打包,是测试用例。

该项目的依赖:


打包机器依赖项:

appimagetool需要在github下载制品,并且添加可执行权限放到环境变量里。

apt install fuse libfuse2


宿主机依赖:

apt install qemu-user-static

或者

apt install aemu-user

————————————————

版权声明:本文为CSDN博主「gapcuda」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/gapcuda/article/details/156559857

(这是我自己的csdn账号)