Linux 制作 snap 包
Snap 是 Canonical(科能公司)开发的通用 Linux 软件包格式,可以在任何支持 snap 的 Linux 发行版上运行。Snap 包是自包含的,包含了应用程序及其所有依赖项,提供了更好的安全性和隔离性。
什么是 snap 包
Snap 是开发者打包应用的新途径,它相对于传统包格式(如 .deb、.rpm)带来了许多优点。Snap 的主要特点包括:
- 安全性:使用沙盒隔离,应用彼此隔离
- 跨发行版:一个 snap 包可以在所有支持 snap 的 Linux 发行版上运行
- 自包含:包含所有依赖,无需担心依赖冲突
- 自动更新:支持自动更新机制
- 回滚支持:可以回滚到之前的版本
- 事务性:安装和更新是原子操作
适用场景:
- 跨发行版软件分发
- 需要沙盒隔离的应用
- 需要自动更新的应用
- 包含复杂依赖的应用
必备知识
在开始制作 snap 包之前,你需要了解:
- Linux 基础知识:熟悉命令行操作
- YAML 语法:snapcraft.yaml 使用 YAML 格式
- 应用程序结构:了解你的应用程序的文件结构
- Snap 概念:了解 snap、snapd、snapcraft 的概念
准备工作
安装 snapd
snapd 是运行 snap 包的后台服务,默认内置于 Ubuntu 16.04 及更高版本。
# Ubuntu(通常已预装)
# 检查是否已安装
snap --version
# 如果未安装
sudo apt update
sudo apt install -y snapd
# CentOS/RHEL 7
sudo yum install -y epel-release
sudo yum install -y snapd
sudo systemctl enable --now snapd.socket
# CentOS/RHEL 8+ / Fedora
sudo dnf install -y snapd
sudo systemctl enable --now snapd.socket
# 创建符号链接(某些系统需要)
sudo ln -s /var/lib/snapd/snap /snap
安装 snapcraft
snapcraft 是创建 snap 包的工具:
# Ubuntu
sudo apt install -y snapcraft
# 或使用 snap 安装
sudo snap install snapcraft --classic
# 验证安装
snapcraft --version
snap 包结构
snap 包的基本结构:
snap/
├── snapcraft.yaml # Snap 包定义文件(必需)
└── ...
构建后的 snap 包是一个 .snap 文件,实际上是一个压缩的 squashfs 文件系统。
制作 snap 包
创建项目目录
# 创建项目目录
mkdir myapp-snap
cd myapp-snap
# 创建 snap 目录
mkdir snap
创建 snapcraft.yaml
snapcraft.yaml 是 snap 包的核心配置文件:
snapcraft.yaml
name: myapp
version: '1.0.0'
summary: A simple application
description: |
This is a simple application used to demonstrate
snap package creation.
grade: stable
confinement: strict
apps:
myapp:
command: myapp
plugs: []
parts:
myapp:
plugin: dump
source: .
organize:
myapp: bin/myapp
基本配置说明
- name:snap 包名(必须唯一,只能包含小写字母、数字和连字符)
- version:版本号
- summary:简短描述(最多 79 个字符)
- description:详细描述
- grade:质量等级(
stable或devel) - confinement:安全模式(
strict、devmode或classic) - apps:定义应用程序入口点
- parts:定义构建部分
构建 snap 包
# 在项目根目录执行
snapcraft
# 构建完成后会生成
ls -lh myapp_1.0.0_amd64.snap
安装和测试
# 安装 snap 包
sudo snap install myapp_1.0.0_amd64.snap --dangerous
# 运行应用
myapp
# 查看已安装的 snap
snap list
# 卸载
sudo snap remove myapp