辛苦楼主去扒源码。我昨晚重新构建了一下,desktop又正常了,后面又重构了几次,都没再出现问题,也许是偶发性事件。
7分钟之后更新:
活见鬼,昨晚我试了几次都没问题,睡觉之前,最后构建了一次,早上来办公室安装,快捷方式依然有问题。。。
还是想不明白这种路径是怎么产生的,能否给一下这些信息
- 玲珑版本
ll-cli --version
- 出问题时的项目文件夹下
linglong/filesystem/diff/usr/share/applications
中对应的原始desktop内容 linglong/output/binary/share/applications
中对应的desktop内容- 出问题的layer文件
也可以整个工程压缩了传上来
ll-killer-go - 玲珑杀手Go
前言
本项目是 Linglong Killer Self-Service (ll-killer 玲珑杀手) 的Go语言重构版本,将原本构建阶段的shell脚本重新用Go实现以更可靠地在 本地离线运行 ,并添加了许多增强功能。
项目主页:https://github.com/System233/ll-killer-go
ll-killer-go是什么
本文主要包括
ll-killer-go
的简单介绍和一个Ubuntu源的GIMP
应用的迁移示例教程。v1.4.x 革命性更新 : 新增的
layer
子命令详解项目简介
ll-killer-go
是一款专为解决玲珑容器应用构建问题而设计的命令行工具。它帮助开发者快速创建、构建和生成玲珑容器应用项目,同时提供一整套辅助构建与调试功能。使用该工具,用户可以在玲珑容器中获得与传统容器(如docker
)类似的构建体验,包括对特权命令的支持和apt
安装等功能,免去了手动解压软件包(如deb
)和修复依赖库查找路径的繁琐操作。ll-killer-go
通过重建自由的容器环境,确保构建过程的一致性与可靠性,极大地提高了开发效率和可维护性。特色功能
apt install
),但无需担心安全问题。build-aux
中提供的一系列修复脚本能够自动处理图标/快捷方式和 相对目录符号链接OpenAtom-Linyaps/linyaps#1039 问题。ldd-check/ldd-search
检查工具,可以自动扫描缺失的运行时库文件,并查找所在的包名并安装,确保应用能够正常运行。/dev
设备文件,可以直接在容器环境中访问设备(该行为作为自由的容器环境的一部分体现,可以在entrypoint.sh
中取消)。架构支持
ptrace
功能支持。目录
ll-killer
ll-killer
(可选)ifovl
模式fuse-overlayfs
模式merge
模式(默认回退)命令概览
ll-killer-go
提供了一些核心命令来帮助构建和管理玲珑容器应用:apt
:进入隔离的 APT 环境。build
:构建或进入构建环境。exec
:进入运行时环境。run
:启动容器,执行应用。commit
:提交构建内容到玲珑容器。clean
:清除构建内容。build-aux
:创建辅助构建脚本。ptrace
:修正系统调用(目前仅支持chown
调用)。script
:执行自定义构建流程。help
:显示帮助信息。提示: ll-killer的每个子命令都内置了详尽的帮助信息,推荐查看。
快速打包教程
本章节将展示如何使用
ll-killer
快速打包Ubuntu
源中GIMP
软件包,希望能够结合实际案例让大家更直观地了解ll-killer
打包过程。整个过程无需配置库文件的环境变量,或对库文件进行修补,一切交给包管理器。[]~( ̄▽ ̄)~*
** 提示:** 本教程默认使用merge
模式进行根文件系统挂载,在文件冲突严重的情况下会显著增加启动时间,如需更佳的性能请在完成本教程后继续查看 高级进阶内容 章节。v1.2.0更新: 从v1.2.0版本开始,ll-killer默认启用fuse-overlayfs挂载模式,无需再提供外部二进制来启用。
1. 获取与配置
ll-killer
首先,确保系统已安装必要的依赖:
然后,下载最新版本的
ll-killer
并赋予执行权限(当前最新为v1.1.1):以上脚本下载的是
amd64
架构,ll-killer-go
还支持arm64
和loong64
架构,可以修改链接中的amd64
至其他版本,或进入项目Releases页手动下载。如果上面的链接下不动,可以网上搜索github release 下载加速,然后把链接粘进去加速下载,再把文件放入相应位置。
⚠警告:从第三方地址加速下载时,注意文件的安全性。Releases页面提供了各个文件的sha1校验码,在文件下载完成后务必使用
sha1sum
校验文件的完整性。全局安装
ll-killer
(可选)为了方便使用,可将
ll-killer
安装到~/.local/bin
:如果
~/.local/bin
未添加至PATH
,或提示找不到ll-killer命令,请执行:2. 开始打包 GIMP 示例应用
接下来的步骤默认
ll-killer
已全局安装(加入PATH
环境变量)。创建工作目录
此文件夹将作为玲珑工程文件夹。
配置软件源
创建
sources.list
并填充 Ubuntu 24.04 noble 的软件源(也可以使用记事本创建此文件):创建 linglong.yaml 项目文件
此步骤将
gimp
包的元数据输出到pkg.info
,再由ll-killer
通过元数据创建项目,并指定包名为gimp.linyaps
。进入构建环境并使用APT安装软件包
使用
ll-killer build
命令进入Rootless构建环境(虚拟root身份),其中--ptrace
参数可以解决Rootless安装deb包时出现的文件所有权问题。重要提示:
ll-killer build --ptrace -- bash
可以进入交互式shell环境。ll-killer build
命令反复进入构建环境,不会像ll-builder build
那样每次运行都重置环境。ll-killer build
命令默认启用--strict
严格模式,确保构建环境与运行时环境完全一致,不会出现ll-builder build
中引入构建依赖的问题。构建依赖属于幽灵依赖,会在运行时消失,因此有必要消除隐患。检查并修复幽灵依赖
此脚本执行以下步骤:
ldd-check.sh
工具来检查环境中的缺失依赖,缺失文件名输出到ldd-check.log
。ldd-search.sh
工具查找ldd-check.log
中列出的文件,并将找到的包写入ldd-found.log
,仍然找不到的文件输出至ldd-notfound.log
。导出layer文件
将文件导入
ll-builder
的构建容器,同时使用--skip-output-check
跳过ll-builder
自带的ldd检查,使用--skip-strip-symbols
跳过二进制的strip
,最后导出layer文件。注意:玲珑版本>=v1.7.x才支持
--skip-output-check
和--skip-strip-symbols
参数,在此之前的版本无需传入此参数。此步骤完成后,最终会生成两个
.layer
文件,仅需保留*_binary.layer
。提示
ll-killer commit
命令是ll-builder build
的别名。ll-killer export
命令是ll-builder export
的别名。--
双横线后传递ll-builder
的参数。(v1.2.0之前)测试构建结果
此命令进入容器环境的shell,请结合desktop中的Exec指令来测试程序。
如需进入原始玲珑容器环境,请运行:
可以看到根目录下有
ll-killer
和entrypoint.sh
文件,同时bin目录下出现了gimp文件,我们运行gimp命令:可见正常运行,轻松秒杀。
提示
/opt/apps/APPID/files/entrypoint.sh
入口点,因此ll-killer run
/ll-builder run
/ll-cli run
不会启动具体的应用,具体的应用启动由desktop中的Exec指令指定。ll-killer run
命令是ll-builder run
的别名。--
双横线后传递ll-builder
的参数。(v1.2.0之前)安装构建结果
程序正常运行,但关于页面显示是2.10.36,不是检测到的2.10.38。这是由于我主机上也安装了gimp,deepin源中的GIMP版本为2.10.38,在创建项目时生成了本地安装的
2.10.38
版本的pkg.info
。但我们打包的是Ubuntu源中的GIMP,指定的是Ubuntu的源,里面的版本只更新到2.10.36
,因此实际打包了2.10.36
版本。此问题仅在主机上也安装了该应用时出现。ll-builder build
环境已安装而跳过安装(如librsvg2-2
),从而引起运行时的幽灵依赖,造成GIMP图标主题不能正常显示。[BUG] 桌面同名desktop文件与/var/lib/linglong/entries/share/applications的desktop冲突 · Issue #704 · OpenAtom-Linyaps/linyaps
命令汇总
以下脚本包含了本章节中的所有命令。
Makefile
中,如果你希望使用make
来管理构建流程,可以使用以下命令代替上面的全部:高级进阶内容
1. 定制根文件系统与挂载模式
你可以在
build-aux/entrypoint.sh
中观察到如下代码,这些代码展示了ll-killer
的默认根文件系统是如何构建的。--mount
选项支持常见的挂载标志和文件系统类型,比如tmpfs
/devpts
/overlay
等,并额外支持fuse-overlayfs
和merge
挂载模式。你可以在 System233/ll-killer-go#挂载相关功能 中找到详细的说明。
提示:
ll-killer exec
本身作为一个简化版的容器,支持在没有玲珑的情况下独立运行,并创建独立的文件系统,它只是不使用基于文件的OCI
配置以增强命令行的调用能力。2. 根文件系统挂载模式
ll-killer
运行时默认使用fuse-overlayfs
和merge
两种挂载模式进行根文件系统的挂载。在未经额外配置的情况下,仅使用**merge
**模式。具体的挂载规则请查看
build-aux/entrypoint.sh
入口点文件。v1.2.0更新: 从v1.2.0版本开始,ll-killer默认启用fuse-overlayfs挂载模式,无需再提供外部二进制来启用。
ifovl
模式 (internal-fuse-overlayfs) (自v1.2.0起)内置的
fuse-overlayfs
命令,可取代外部fuse-overlayfs
二进制。fuse-overlayfs
模式fuse-overlayfs
为 静态编译 或能直接在容器中运行。(v1.2.0前)fuse-overlayfs
二进制文件复制到build-aux
目录以启用。(v1.2.0前)ifovl
模式实现,当指定外部二进制时,使用外部实现 (自v1.2.0起)fuse
内核模块。merge
模式(默认模式)fuse-overlayfs
和fuse
内核模块不可用或运行失败,则自动回退至merge
模式。模式对比
fuse
ifovl
fuse-overlayfs
merge
3. 使用ll-killer辅助处理deb依赖但不安装
本案例的目的是方便传统手工打包者搜索和处理依赖,利用apt缓存功能自动下载某个包在base环境下所依赖的包。
由于操作在容器环境中进行,因此在多个打包操作同时进行的情况下,不会出现
ll-pica
中的冲突情况。此外,由于使用的是base中的原生apt功能,搜索结果比ll-pica
的aptly
模糊匹配更加可靠,下载速度也更快。apt install
的安装结果,只要它下载完成就行。4. 使用ll-killer辅助处理幽灵依赖
本案例展示如何单独使用
ll-killer
的幽灵依赖检查功能,来帮助手工打包者查找deb包中未声明的依赖包名。前提条件
apt-file
软件包。sources.list
中指定的仓库具有Contents
索引。结尾
更多信息和用法请查看命令帮助或项目主页:https://github.com/System233/ll-killer-go
更新日志
v1.4.x (2025-03-11)
代码调整
兼容性更改
新增功能
构建系统
错误修复
v1.3.0 (2025-03-10)
代码重构
兼容性更改
新增功能
错误修复
v1.2.x
run
/export
/commit
三个ll-builder的别名命令将删除参数中的--
分隔符,如果遇到不识别--
的问题请删除此符号。v1.2.0
overlay
子命令,实现了内置fuse-overlayfs
支持,并添加了ifovl
挂载类型选项。当指定fuse-overlayfs
挂载时,若指定了fuse-overlayfs
的二进制文件,则使用该文件,否则使用 内置的ifovl
挂载。fuse-overlayfs
挂载,无需再额外提供fuse-overlayfs
二进制文件,merge
挂载的性能问题得到彻底解决。systemd
用户级服务单元支持,/etc/systemd
下的所有服务单元将会被自动处理。不过目前玲珑1.7.x版本并不会自动启动服务,且容器内无法拉起服务,需等待玲珑后续版本改进情况;目前来看玲珑的systemd
功能与应用卸载功能存在冲突。其他改动
commit
/export
别名命令无需再使用双横线。下一步计划
使用命名空间切换取代pty。(不可行)