snap 是什么?
Snap 是一种软件打包和分发格式,用于在不同的 Linux 操作系统上安装和运行应用程序。
它不仅包括应用程序本身,还包括其依赖项和运行环境,因此可以保证在任何支持 Snap 的 Linux 系统中都能够以相同的方式运行。
Snap 还具有自动更新功能,使得应用程序可以快速而轻松地得到最新版本的更新。
包安装过程
- 从 snap-store 查找、下载包并校验签名
- 调用 unsquashfs 解压包到临时目录
- 生成包自动挂载的 systemd 服务并启动
- 调用 snap-seccomp 编译系统调用过滤规则为二进制文件
- 调用 apparmor_parser 配置 apparmor 规则
- 其它配置操作
snap 包挂载服务示例:
[Unit]
Description=Mount unit for hello-world, revision 29
After=snapd.mounts-pre.target
Before=snapd.mounts.target
Before=local-fs.target
[Mount]
What=/var/lib/snapd/snaps/hello-world_29.snap
Where=/snap/hello-world/29
Type=squashfs
Options=nodev, ro,x-gdu.hide,x-gvfs-hide
LazyUnmount=yes
[Install]
WantedBy=snapd.mounts.target WantedBy=multi-user.target
包卸载的过程
- 备份压缩数据文件
- 调用 /snap/snapd/19993/usr/lib/snapd/snap-discard-ns 退出命名空间
2.1 进入到 /run/snapd/ns 目录,找到目标包的 .mnt 文件
2.2 umount xxx.mnt 然后删除此文件及其它关联文件 - 卸载挂载点
- 禁用挂载服务,移除相关内容
snap 二进制程序执行的过程
- 将可执行程序名做为参数,使用 snap 命令执行
- 在 /tmp 下生成一 snap.rootfs_XXX 目录使用 core 基础组件目录与部分宿主机目录挂载新的根文件系统后执行 privt_root 切根
- 调用 snap-confine 命令执行目标命令配置运行模式
- 调用 snap-update-ns 更新命名空间
- 设置 seccomp filter 规则
- snap-exec 命令执行目标命令