snap 可以在其他 UNIX(例如 macOS)上移植吗?

snap 可以在其他 UNIX(例如 macOS)上移植吗?

我喜欢 snap 背后的想法,并在 Ubuntu VM 上试用它。

Snapcraft 概述

Snapcraft 是一款构建和打包工具,可帮助您快速打包软件。它可以轻松整合来自不同来源的组件并构建技术或解决方案。关键概念

Ubuntu Core 系统的 .snap 包包含其所有依赖项。与传统的基于 deb 或 rpm 的依赖项处理相比,这有几个优势,最重要的是,开发人员始终可以确保其应用程序下的系统更改不会触发回归。

Snapcraft 允许您在 snapcraft.yaml 文件中将这些依赖项指定为“部分”,从而使捆绑这些依赖项变得简单。Snappy

Snappy Ubuntu Core 是具有事务更新功能的 Ubuntu 的新版本 - 具有与当今 Ubuntu 相同库的最小服务器映像,但通过更简单的机制提供应用程序。

Snappy 应用程序和 Ubuntu Core 本身可以自动升级,并在需要时回滚。应用程序也受到严格限制和沙盒保护,以保护您的数据和系统。

物联网 ›构建应用程序

snap 基于什么技术?架构和工具包是什么样的?snap 是否依赖于 Linux 内核功能?

我问这个问题是因为我想知道将来我是否也能在 macOS 上使用相同的 snap 包?

第一条评论后的澄清:

我知道 macOS 和 Ubuntu 不兼容二进制文件。需要重新编译。几乎所有适用于 macOS 的开源软件都具有自制。当 snap 将来可用于 macOS 时,开发人员可以在 macOS 上进行开发并在 Ubuntu 上部署。

答案1

是的,得益于 Linux 系统调用接口的稳定性,这是可能的。

Linus Torvalds 对 Linux 用户做出的一项重要承诺是,内核提供的接口集是稳定的。许多人并不了解这一点的价值,也不知道作为一个开放项目的领导者,实现这一承诺有多么困难。例如,相比之下,GNOME API 的变化有多么难以预测!当您在邮件列表中听到 Linus 变得激烈时,几乎总是因为内核的某些提交者决定更改此类接口“因为他们有更好的想法”。Linus 说,您可以在内核内部进行大胆创新,但请不要破坏依赖现有系统调用的“用户空间”应用程序。

由于这种稳定性,其他内核可以提供相同的系统调用,从而允许在 Linux 上构建的应用程序在其他内核上运行。

其中一个例子就是 Joyent Triton 项目,它在 SmartOS(IllumOS 的后代,Solaris 的后代)上的容器中提供与 Linux 兼容的系统调用。

一个更广为人知的例子是新的Windows 中的 Linux 子系统

当然,真正的问题是提供了多少个系统调用,以及它们与错误之间的兼容性如何。至少目前,还没有另一个环境可以实现所有必要的系统调用,因为 snap 使用的系统调用相对较新,而且在内核对其管理的事物的思考方式上还很深奥。

但随着时间的流逝,它们肯定会出现,因此我认为快照将在广泛的环境中得到应用。

这非常酷,欢迎补丁:)

答案2

虽然我找不到有关 macOS 的任何信息,但天哪!Ubuntu本文引用了 Mark Shuttleworth 的一段有趣话语:

至于在 Windows 10 上运行 Snaps?“这绝对是可行的”,Shuttleworth 说。

“Snap 使用 Linux 内核中的现代功能来实现安全限制、设置文件系统访问等,所有这些都涉及在内核中使用现代机制。Canonical 领导了这项工作。微软需要一段时间才能 [加入进来]。”

如果在 Windows 上运行它是“可行的”,那么我会说 macOS 也是如此,只不过微软似乎正在与 Canonical 合作,而我从未听说过苹果在做这样的事情。


文档Snap 安全策略和沙盒Arch Wiki 上关于 snapd 的条目信息丰富:

来自 Arch Wiki:

请注意,snap-confine 是使用 --disable-confinement 选项构建的;完整的限制依赖于启用 AppArmor 的内核和 snap 的相关配置文件。

从政策上看:

启动器的内部结构如下:

  • 设置各种环境变量:[…]
  • 将硬件分配给 snap 后,使用默认设备(例如 /dev/null、/dev/urandom 等)和任何分配给此 snap 的设备设置一个设备 cgroup。
  • 使用每个命令专用的挂载命名空间设置私有的 /tmp,并在 /tmp 上挂载每个命令的目录
  • 设置每个命令 devpts 的新实例
  • 为命令设置 seccomp 过滤器
  • 在默认 nice 值下,根据特定于命令的 AppArmor 配置文件执行命令

这种限制性 AppArmor 配置文件(用于调解文件访问、应用程序执行、Linux 功能 (7)、mount、ptrace、IPC、信号、粗粒度网络)、明确定义的特定于应用程序的文件系统区域、通过 seccomp 进行的白名单系统调用过滤、私有 /tmp、新实例 devpts 和设备 cgroups 的组合提供了强大的应用程序限制和隔离。

虽然 AppArmor 和 seccomp 仅适用于 Linux,但看起来限制可以设为可选,因此我们可以忽略这一点。然后是 devpts、cgroups 和 mount 命名空间的使用。如果有任何阻止,我认为会是针对这些的。我对 BSD 不够熟悉,无法说出等效项是什么。

snapd应用程序本身是用 Go 编写的,因此应该具有相当好的跨平台性。事实上,有些文件有非常有趣的构建目标

osutil/group_other.go

// -*- Mode: Go; indent-tabs-mode: t -*-
// +build !linux,!darwin,!freebsd

osutil/group_linux.go

// -*- Mode: Go; indent-tabs-mode: t -*-
// +build darwin freebsd linux
// +build cgo

看起来有人对此感兴趣。

答案3

截至目前,snap可以在 MacOS 上安装但无法使用。

$ brew install snap
$ snap install ./some-app.snap --devmode
Interacting with snapd is not yet supported on darwin.
This command has been left available for documentation purposes only.

相关内容