这是一篇关于在 Linux 上实现可移植包的技术文章,主要内容如下:
- 魔法技巧示例:安装 Brioche 后,运行
brioche build -r curl -o./output
可获取 curl 副本,将其放入Dockerfile
中可在scratch
环境中运行,展示了可移植包的能力。 为何这样做:
- 无需 root 权限安装 Brioche 或新包,需使包可移植,可在文件系统任何位置运行。
- Brioche 应能打包使用 glibc 的软件,虽 musl 更易进行静态构建,但它不是 glibc 的替代品。
- Brioche 包在运行时不应使用容器,已有 snap、Flatpak 和 AppImage 用容器,而作者希望专注于面向开发者的 CLI 工具,避免容器带来的文件系统视图问题和沙盒难题。
创建自己的可移植包:
- 以 Rust 程序为例,通过
cargo new lil-demo
创建项目,ldd
查看依赖,创建lil-demo-portable
目录,复制程序和动态库,编写run.sh
脚本设置环境变量,使程序可从便携式目录运行。 - 进一步处理动态链接器
ld-linux.so
,通过设置$LD_LIBRARY_PATH
让程序加载便携式目录中的动态库,直接调用ld-linux.so
并传递lil-demo
作为参数。 - 解决
/proc/self/exe
问题,通过“userland exec”技术在 Rust 中处理,使用userland-execve
crate 直接跳转到程序的起始地址执行,避免execve()
调用导致的路径问题。
- 以 Rust 程序为例,通过
- 秘密揭示:
./output/bin/curl
实际上是一个替代程序,类似于run
程序,真正的 curl 在./output/brioche-resources.d
中,从外部看它像 curl 一样运行,即使程序关心/proc/self/exe
也不会出错。 - 总结:介绍了 Brioche 中“打包可执行文件”在 Linux 上的工作原理,展示了可移植包的优势,如无需 root 权限安装、可在不同环境中运行等,还给出了使用 Brioche 直接构建可移植包的配置示例。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。