什么是"AppImage"?我该如何安装它?

我刚刚阅读了Meet Etcher, 一个时尚的开源USB镜像写入工具。它讲述了下载AppImage的内容。

是的,是Linux;Linux软件包以.appimage的形式分发,适用于32位和64位发行版,并且应该可以在所有主要Linux发行版上运行而无需任何问题。目前团队没有提供本地.deb(或.rpm)安装程序的计划。

什么是AppImages?它们与Snaps有何不同?

8个回答

基本信息

关于安装

以下是从appImage项目页面引用的内容:

AppImages可以下载并运行,无需安装或需要root权限。

使其可执行

您可以按照以下步骤使appImage可执行:

chmod a+x exampleName.AppImage

执行它

您可以按照以下步骤执行一个AppImage:

./exampleName.AppImage

附加信息

关于appImage

你可以在这里找到一些关于appImage的一般信息here

我在这里引用了appImage项目页面的内容:

AppImage格式的关键思想是一个应用程序=一个文件。每个AppImage都包含一个应用程序以及应用程序运行所需的所有文件。换句话说,每个AppImage除了目标基本操作系统中包含的内容外,没有其他依赖项。

维基百科补充道

AppImage(以及其前身klik和portablelinuxapps)不是以传统意义上的方式安装软件(即它不会在系统中随处放置文件)。
它使用每个应用程序一个文件的方式。每个文件都是自包含的:它包含了应用程序所依赖的所有库,而这些库并不属于基本系统的一部分。在这方面,它类似于“应用程序虚拟化”。即使没有超级用户权限或者使用的是光盘启动的操作系统,也可以使用AppImage文件。与编译和安装应用程序相比,AppImage文件通常更简单,因为实际上没有进行任何安装。AppImage文件是一个压缩的映像文件,临时挂载以允许访问程序,但无需提取程序或修改底层系统。 AppImageKit-project的README.md提供了很多额外的信息,如使用案例、问题领域和目标。
使用案例
作为用户,我希望能够访问上游下载页面,从原始作者那里下载一个应用程序,并在我的Linux桌面系统上运行它,就像我在Windows或Mac应用程序上所做的一样。
作为测试人员,我希望能够从持续构建服务器获取最新的开发版本,并在我的系统上进行测试,而无需编译,也不必担心可能会损坏我的系统。
作为应用程序作者或ISV,我希望能够为Linux桌面系统提供软件包,就像我为Windows和OS X所做的那样,而无需将其“整合”到一个发行版中,并且无需为众多不同的发行版进行构建。
目标:
1. 简单易懂。AppImage旨在成为一种非常简单的格式,易于理解、创建和管理。 2. 保持二进制兼容性。AppImage是一种用于二进制软件分发的格式。作为AppImage打包的软件应尽可能与尽可能多的系统具有二进制兼容性。应大大减少(重新)编译软件的需求。 3. 发行版无关。一个AppImage应该可以运行于它所创建的所有基本操作系统(发行版)上(包括后续版本)。例如,您可以同时针对Ubuntu 9.10、openSUSE 11.2和Fedora 13(以及后续版本)进行开发,而无需为每个目标系统创建和维护单独的软件包。 4. 消除安装的需要。AppImages包含以一种格式打包的应用程序,使其可以直接从存档中运行,无需先安装。这类似于Live CD。在Live CD出现之前,必须先安装操作系统才能使用它们。 5. 始终保持应用程序压缩状态。由于应用程序始终保持打包状态,因此在硬盘上不会解压缩。计算机在访问时动态解压缩应用程序。由于在大多数系统上,解压缩速度比从硬盘读取快,因此除了节省空间外,这还具有速度优势。此外,完全消除了安装所需的时间。 6. 允许将应用程序放在任何地方。AppImages是“可重定位”的,因此允许用户从任何位置(包括CD-ROM、DVD、可移动磁盘、USB存储器)存储和执行它们。 7. 使应用程序只读。由于AppImages是按设计只读的,用户可以合理地确定应用程序在运行期间不会修改自身。 8. 不需要重新编译。必须可以从已经存在的二进制文件创建AppImages,而无需重新编译。这大大加快了AppImage创建过程,因为不需要涉及编译器。这也允许第三方将闭源应用程序打包为AppImages。(然而,对于上游应用程序开发人员来说,为特别生成AppImage而从源代码构建可能是有益的。) 9. 保持基本操作系统不变。由于AppImages旨在在未经管理员特殊准备的纯净系统上运行,因此可能不需要对基本操作系统进行任何不寻常的准备。因此,它们不能依赖于特殊内核补丁、内核模块或任何默认情况下不随目标发行版一起提供的应用程序。 10. 不需要root权限。由于AppImages旨在由最终用户运行,因此不应需要管理员账户(root)来安装或使用它们。但是,如果需要,它们可以由管理员(例如,在多用户场景中)安装。

20一个AppImage如何在启动之间保持设置? - Dan Dascalescu
1你能详细解释一下“只读”功能吗?我能在AppImage中保存更改吗?还是像LiveCD一样关闭后就会丢失? - vstepaniuk
6@DanDascalescu:你的问题值得提升为一个完整的问题在AskUbuntu上,而不仅仅是一个评论。你会提问吗? - Kurt Pfeifle
1@DanDascalescu 我认为这取决于 .AppImage 的开发者。我将我的用户设置写入到特定用户的文件中,路径为 ~/config/appname。 - dufte
这10个项目的来源链接是什么? - Gabriel Staples
1@DanDascalescu 如果你将关于持久化设置的问题作为一个独立的Ask Ubuntu问题提出,能否在这里留下一个链接评论? - gene_wood

在运行AppImage之前,您需要将其设置为可执行文件。这是Linux的一个安全特性。有两种主要的方法可以将AppImage设置为可执行文件:
使用图形界面(GUI)

How to make an AppImage executable

或者

使用命令行

chmod a+x Some.Appimage

现在双击文件运行它或右键单击> 运行

我有一个RSSGuard的AppImage,并且我想将其添加到我的18.04.3 LTS启动程序中。我在命令行中输入了这个(./home/$USER/Programs/RSSGuard/rssguard-3-5-6-linux64.AppImage),但它无法在启动时运行。我应该使用(sh ./$PATH/*.appimage)吗? - Andor Kiss
这对我没有起作用,至少差不多。我还得为其他人添加读写访问权限。如果没有那个,它就无法启动。 - gregthegeek

两个系统的基本思想可能看起来相似,但是Snaps和Appimages之间存在一些设计差异。
我脑海中浮现出一些“重要”的差异,比如:
  1. 安全性, 就 confinement 方面而言:Snap 包在沙盒中运行,不允许逃离沙盒并触及系统的其他部分,这是一个更强大的安全层,与权限系统并行运行。显然,在开始时(以及之后)处理它可能有点令人沮丧,但如果从系统管理的角度来考虑,这正是管理员希望为其用户提供的。

  2. 安全性:从网络上下载的软件的安全性就像在街上舔杆子一样安全。有时候什么都不会发生,有时候会遇到很大的健康问题。Snap 包有自己的存储库,由 Canonical 控制,就像通常的标准 Ubuntu 存储库一样。你可以继续安装来自其他地方的 .deb 文件,但那将是你的选择,而不是设计问题。

  3. 安装:AppImages 相当于“便携式 Windows 可执行文件”。所有的库都是自包含的,任何用户只需下载并执行其中之一即可。另一方面,snap 包是真正的软件包,需要通过适当的软件包管理器(使用 root 或 sudo)进行安装(例如,snap install tic-tac-toe 会抛出错误:需要 sudo!)。

  4. 卸载:要删除 snap 包,您需要使用带有正确权限的软件包管理器 snap remove ... 进行操作。而 AppImages 只是“存在”而已。所以任何用户不想要那个 AppImage?只需删除文件即可。

虽然我强烈建议在使用AppImages时要小心谨慎,但我个人也在使用其中的一些。

我发现它们在我的工作系统上特别有用,因为我没有root访问权限(只有管理员有),但我需要最新版本的特定软件,幸运的是开发者提供了Appimage形式。

我有点担心其中可能包含了一些恶意代码,所以我尽可能地核实了发布者的身份。虽然我不能百分之百确定这个软件是无害的,但我已经尽力了。


4基本上,每个人都在尝试在Linux上实现OSX应用程序打包,但是没有一个完全达到目标。 - OrangeDog
2我对这个如何工作一无所知 :) 可以肯定的是,Snap和Appimages在具有许多依赖关系的软件中效果不佳,这些依赖关系在许多其他软件之间共享。它们在已经自包含的软件或者只有少量依赖关系的软件上表现得很好,但风险是会有许多执行相同任务的相同库的副本,就像在Windows中一样。这个问题应该在Snap软件包中得到解决(一个依赖于Snap库的软件会安装该库的特定版本,然后需要相同库版本的另一个软件可以使用它,就像通常的系统一样)。 - dadexix86
OSX(和iOS)应用程序的工作方式类似于AppImage(只需下载单个文件并运行),但具有snap的沙盒安全性。 - OrangeDog
1OSX 正在努力摆脱这些,并仅允许从他们的商店安装。 - LtWorf
AppImage应该确实包含沙盒选项。希望将来能看到这一点。 - Royi

虽然Snap只专注于Ubuntu,但AppImage是跨发行版的,也可以在Fedora、Debian、OpenSUSE、CentOS等系统上运行。
AppImage不需要Linux发行版提供的运行时或基础设施支持,因此几乎可以在任何地方运行。它使应用程序作者能够直接将其软件发送给Linux用户,就像他们为Windows和OS X做的那样;无需通过Canonical或其他任何中间人。
如果一个应用程序以AppImage格式提供,用户可以访问原始作者的网站下载,例如从https://musescore.org/en/download下载MuseScore。将AppImage设置为可执行(可以使用文件管理器或chmod a+x ./yourAppImage命令),然后只需双击即可运行该应用程序。

那么,如果我想安装Leafpad,我需要点击“Set me up”吗?然后会发生什么?还有,我如何卸载一个AppImage?我在https://bintray.com/probono/AppImages上查看了,但没有找到答案。如果您不介意的话,您可以编辑您的回答,包括相关信息以及您认为用户可能想知道的其他内容。 - DK Bose
2不确定这对你也是个解决方案,但leafpad在16.04的源代码中就可以使用(版本:0.8.18.1)。Bintray提供的leafpad版本仅为0.8.17,所以更旧。 - dufte
1没错,但对于只想试水的人来说,就像网站上所说的那样,这是一种“Hello, World”的体验。 - DK Bose
太棒了!之后你只需要双击就可以了。这正是我所需要的! - Dawoodjee
3Snap 可以在除 Ubuntu 之外的其他发行版上运行,包括 Arch Linux、Fedora、Linux Mint、CentOS、openSUSE 和 Debian。 - Flimm

AppImages需要FUSE来运行。用户空间文件系统(FUSE)是一个允许非root用户挂载文件系统的系统。

安装FUSE

许多发行版已经默认安装了FUSE。但是如果它对您不起作用,您可能需要手动安装和配置FUSE。

例如,在Ubuntu上:

sudo apt-get install fuse
sudo modprobe fuse
sudo usermod -a -G fuse $USER

例如,在openSUSE上:
sudo zypper install fuse

备用方案

如果您不想安装FUSE,您可以选择挂载或提取AppImage。

要挂载AppImage并运行应用程序,只需运行以下命令:

sudo mount -o loop Some.AppImage /mnt
/mnt/AppRun

如果这不起作用,您可能有一个实验性的type 2 AppImage。这些需要您在mount命令中传递-o offset=...。运行AppImage并使用--appimage-offset来找到正确的偏移量数值。

1写完第三行(sudo usermod -a -G fuse)后,跟着我的用户名,我一直收到usermod: group 'fuse' does not exist的错误信息... 你有什么想法为什么会这样? - Martin
嗨@Martin,在Ubuntu中,例如如果你想在x86_64(64位)系统上运行一个i686(32位)的AppImage,除非你安装了32位的库,否则你将会遇到这个错误。下次为了寻求帮助,你可能需要明确指定操作系统和应用程序。 - Leo Gallego
嗨@Leo,这是很久以前的事了,但我刚刚在我的Windows 10 64位系统上输入了sudo apt-get install fusesudo modprobe fusesudo usermod -a -G fuse $USER这几行命令。我正在评论的答案没有提到任何32/64位的规定,我也不知道我应该在哪里指定或为什么要指定... - Martin

现在AppImageLauncher使得启动/创建桌面文件变得非常简单和方便。试一试吧。

感谢您推荐AppImageLauncher! - moi
我能够在https://github.com/TheAssassin/AppImageLauncher/wiki/Install-on-Ubuntu-or-Debian上安装它,这样我就可以打开https://atomicwallet.io/。但是现在我看到这个页面上的其他答案,也许我应该只是将其设置为可执行文件。 - undefined

以上的答案都没有帮到我,因为没有一个真正展示了如何安装AppImage。对于安装,我通常指的是:将可执行文件放在磁盘上通常存储可执行文件的位置,并通过应用程序启动器使其可访问。

以Arduino IDE为例:

  1. 将AppImage设为可执行文件
chmod +x ./arduino-ide_nightly-20230209_Linux_64bit.AppImage

将其移动到应用程序目录中:
引用AppImage文档
重要的一点是,AppImage格式允许您将AppImage文件存储在任何位置。如果您不想将它们留在$HOME/Downloads目录中,那么$HOME/Applications是一个不错的选择。许多第三方工具(尤其是管理桌面集成的工具)也使用这个位置。其他选项包括$HOME/.local/bin和$HOME/bin,主要用于命令行工具。
mv arduino-ide_nightly-20230209_Linux_64bit.AppImage ~/Applications/
  1. 将其添加到应用启动器中:

为了做到这一点,我们需要添加桌面入口(更多信息请点击这里)。

touch ~/.local/share/applications/arduino-ide.desktop

打开你喜欢的文本编辑器,然后添加配置,类似于这样:
[Desktop Entry]
Version=1.0
Name=Arduino IDE
Exec=/home/piotrek/Applications/arduino-ide_nightly-20230209_Linux_64bit.AppImage
Terminal=false
Type=Application
Categories=Utility;Development;

只需记住将“Exec”更改为指向您的AppImage存储位置的地方。
4. 使其可执行。
chmod +x ~/.local/share/applications/arduino-ide.desktop

此时,您应该已经在应用启动器中找到您的应用程序。
如果您使用的是KDE桌面环境,您可能需要在任务栏上右键单击应用启动器图标,选择“编辑应用程序”,然后点击“保存”。KDE将会刷新其缓存,并且应用程序将出现在启动器中。

一旦安装完成,您会想要将其连接到您的桌面菜单上。
为了快速集成到您的桌面菜单中,有一个小技巧是加载较旧的Debian软件源(假设存储库中有较旧的版本),例如,
$ sudo apt-get install digikam

然后完成这一步之后,右键点击您的菜单启动器,并选择 "配置..."。
(这是 Cinnamon 中的样子。您的桌面可能会有所不同。)

enter image description here

然后打开 菜单编辑器

enter image description here

找到应用程序并编辑其属性,然后更新“命令:”将其更改为您的新AppImage文件的路径。

enter image description here

(!!这会在您的磁盘上保留旧版本,浪费空间,而且有办法使其更整洁,但以下方法能快速使您的新AppImage能从菜单中正常工作。)

...现在来整理一下:

你想要删除旧的软件包,但仍然保留其桌面和图标文件。

  1. 找到任何digikam的桌面文件。一种方法是使用locate命令:

    $ locate digikam.desktop
    /usr/share/applications/org.kde.digikam.desktop
    ~/.local/share/applications/org.kde.digikam.desktop

第一个是系统默认值(适用于所有用户),第二个只适用于你自己。如果两者都存在,通常第二个(本地的)会覆盖第一个。

而且,如果你对它们进行比较,你会注意到你只编辑了.local的那个,而没有编辑/usr目录下的那个...

此外,你不需要两个都保留。所以如果你愿意,你可以删除.local的那个,只依赖于/usr目录下的那个。这样会更简单。

修复这个问题最简单的方法是使用移动命令进行覆盖,如下所示:

$ cd /usr/share/applications  
$ sudo mv ~/.local/share/applications/org.kde.digikam.desktop .  

2. 接下来,您需要将此文件重命名,以避免在稍后运行时被软件包清理器删除。请注意,一旦您保存了对桌面文件的编辑或更改,菜单将自动找到您的更改并更新自己。 $ sudo mv org.kde.digikam.desktop org.kde.digikam.appimage.desktop 3. 现在,请查看该文件,以找到它当前使用的图标名称(指向): $ sudo grep Icon org.kde.digikam.appimage.desktop # 注意大写'I' Icon=digikam
4. 然后找到相关的图标文件: $ locate digikam | grep icons /usr/share/icons/hicolor/128x128/apps/digikam.png /usr/share/icons/hicolor/16x16/apps/digikam.png /usr/share/icons/hicolor/22x22/apps/digikam.png /usr/share/icons/hicolor/256x256/apps/digikam.png /usr/share/icons/hicolor/32x32/apps/digikam.png /usr/share/icons/hicolor/48x48/apps/digikam.png /usr/share/icons/hicolor/64x64/apps/digikam.png /usr/share/icons/hicolor/scalable/apps/digikam.svgz /usr/share/icons/oxygen/base/128x128/apps/digikam.png /usr/share/icons/oxygen/base/16x16/apps/digikam.png /usr/share/icons/oxygen/base/22x22/apps/digikam.png /usr/share/icons/oxygen/base/256x256/apps/digikam.png /usr/share/icons/oxygen/base/32x32/apps/digikam.png /usr/share/icons/oxygen/base/48x48/apps/digikam.png /usr/share/icons/oxygen/base/64x64/apps/digikam.png /var/lib/app-info/icons/debian-buster-main/48x48/digikam_digikam.png /var/lib/app-info/icons/debian-buster-main/64x64/digikam_digikam.png
你关心的那些文件在 /usr/share/icons/ 目录下。
重新命名它们很困难。更简单的方法是直接重命名整个目录(将其保存),卸载软件,然后在完成后将目录恢复原样。
$ cd /usr/share  
$ sudo mv icons icons~  # save icons tree  
$ sudo apt-get purge digikam && sudo mv icons~ icons  #uninstall & restore tree