Centos7 下 Snap 的安装与使用

Snap 介绍

Snap 是 Ubuntu 母公司 Canonical 于 2016 年 4 月发布 Ubuntu-16.04 时引入的一种全新的、安全的、易于管理的、沙盒化的软件包管理方式,与传统的 dpkg/apt 有着很大的区别,背后主要的动机是解决 Linux 平台的碎片化问题。Snap 的安装包扩展名是 .snap,类似于一个容器,它包含一个应用程序需要用到的所有文件和库(Snap 包里包含一个私有的 root 文件系统,里面包含了依赖的软件包)。不管底层系统如何,Snap 都可轻松安装、升级、降级和移除应用,因此 Snap 的应用程序很容易安装在任何基于 Linux 的系统上,而且支持用户在同一个系统中安装同一应用程序的多个版本。使用 Snap 包的好处就是它解决了应用程序之间的依赖问题,使应用程序之间更容易管理,但是由此带来的问题就是占用更多的磁盘空间。类似的应用程序容器技术还有大名鼎鼎的 FlatpakAppImage。Snap 适用于 CentOS 7.6+ 和 Red Hat Enterprise Linux 7.6+,它很好地弥补了 Centos 桌面软件资源不多的缺点,可以从 Extra Packages for Enterprise Linux(EPEL)存储库安装。Snap 的工作原理如下图所示:

snap-framework

Snap 安装

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# 安装EPEL源
# yum install epel-release

# 添加copr仓库(可选)
# yum install yum-plugin-copr
# yum copr enable ngompa/snapcore-el7

# 安装Snap
# yum install snapd

# 安装Snap的其他组件(可选)
# yum install snapd-glib snapd-qt snapd-qt-qmlg

# 启用通信套接字
# systemctl enable --now snapd.socket

# 创建软链接
# ln -s /var/lib/snapd/snap /snap

# 注销并重新登录,或者重新启动系统
# reboot

# 查看Snap的运行状态
# systemctl status snapd

# 如果Snap处于关闭状态,则手动启动它
# systemctl start snapd

# 添加环境变量
# vim /etc/profile
export PATH=$PATH:/snap/bin

# 使环境变量生效
# source /etc/profile

# 验证是否运行正常
# snap install hello

# 如果运行正常,执行hello会输出"Hello, world!"
# hello

# 或者安装andy-testsnap-py测试工具
# snap install andy-testsnap-py --edge

Snap 常用命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# 列出所有已安装的应用
# snap list

# 查找应用
# snap find hello

# 查询应用的详细信息
# snap info hello

# 安装应用
# snap install hello

# 指定仓库安装应用(可选仓库:edge、beta、candidate、stable)
# snap install hello --channel=stable

# 运行应用(或者直接执行:hello)
# snap run hello

# 卸载应用(包括所有版本)
# snap remove hello

# 卸载特定版本的应用
# snap remove hello --revision 352

# 更新所有应用
# snap refresh all

# 更新特定的应用
# snap refresh hello

# 回滚特定应用到上一个版本
# snap revert hello

# 查看任务执行的历史记录
# snap changes

# 终止正在执行的特定任务
# snap abort task-id

Snap-Store 安装

Snapcraft 应用商店提供了所有 Snap 应用程序,同时 Snap 官方提供了商店应用 Snap-Store,支持在本地使用图形界面的方式管理 Snap 应用程序,包括安装、卸载、搜索 Snap 应用程序等。点击查看 Snap-Store 的实际运行效果图。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 安装
# snap install snap-store

# 创建快捷方式
# vim /usr/share/applications/snap-store.desktop
[Desktop Entry]
Name[zh_CN]=Snap 商店
Name=Snap Store
Comment[zh_CN]=添加、移除或更新计算机软件
Comment=Add, remove or update software on this computer
Icon=/snap/snap/snap-store/current/meta/gui/io.snapcraft.Store.png
Exec=/snap/bin/snap-store %U
Terminal=false
Type=Application
Categories=GNOME;GTK;System;PackageManager;
Keywords=Updates;Upgrade;Sources;Repositories;Preferences;Install;Uninstall;Program;Software;App;Store;Snap;
StartupNotify=true
MimeType=x-scheme-handler/appstream;x-scheme-handler/snap;
X-GNOME-UsesNotifications=true
DBusActivatable=false

# 导航到:应用程序 --> 系统工具 --> Snap 商店,直接点击快捷方式启动应用即可

# 或者直接执行命令(使用普通用户权限)
$ /snap/bin/snap-store

Snap 相关目录介绍

1
2
3
1. 通过snap安装应用程序后,其应用程序的安装文件所在目录为:/var/lib/snapd/snap
2. 普通用户的snap应用文件所在目录:~/snap
3. snapd的安装目录:/var/lib/snapd

Snap 更改默认安装目录

Snap 安装使用后比较占用磁盘空间(默认安装目录为 /var/lib/snapd),如果希望 Snap 安装在特定的目录,此时不能使用创建软链接的方法(ln -s)来关联到新的安装目录,否则 Snap 的应用将无法正常启动。正确的做法是使用 mount --bind 命令将新的安装目录挂载到 /var/lib/snapd 目录,具体可参考以下教程或者 Shell 脚本(建议执行 Shell 脚本之前先关闭 snapd 服务和卸载 snapd 的 /dev/loopxx 设备)。提示,/var/snap 目录千万不要移动,该目录一般情况下不需要做任何处理。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
##############################################################################
# Take Care this section may break the System !!!
##############################################################################

# Move snap folder to Home instead of root

# Create the directory, you can change the location
mkdir /home/$USER/snap/snapd

# Copy the data
sudo rsync -avzP /var/lib/snapd/ /home/$USER/snap/snapd/

# Do backups
sudo cp /etc/fstab /etc/fstab.bak
sudo mv /var/lib/snapd /var/lib/snapd.bak

# Change fstab (Change $USER with your name or change the path totally)
sudo echo "/home/$USER/snap/snapd /var/lib/snapd none bind 0 0" | sudo tee -a /etc/fstab

# remount fstab or reboot.
sudo mkdir /var/lib/snapd
sudo mount -a

if ls /var/lib/snapd/ | grep snaps
then
echo "Re-mounting snapd folder is done successfully !!!!"
sudo rm -rf /etc/fstab.bak
sudo rm -rf /var/lib/snapd.bak
else
echo "WARNING : Re-mounting snapd folder failed, please revert !!!!"

# trying to revert automatically
sudo cp /etc/fstab.bak /etc/fstab

sudo mount -a
sudo umount /var/lib/snapd

sudo mv /var/lib/snapd.bak /var/lib/snapd

echo "Revert automatically is done successfully !!!!"

fi
##############################################################################
# Take Care the pervious section may break the System !!!
##############################################################################

Snap 输出调试信息

1
2
3
4
5
6
7
8
9
10
11
12
13
# 编辑Snap服务的配置文件,添加以下内容(环境变量)
# systemctl edit snapd.service
[Service]
Environment=SNAPD_DEBUG=1 SNAPD_DEBUG_HTTP=7

# 使配置文件生效
# systemctl daemon-reload

# 重启服务
# systemctl restart snapd.service

# 打印Snap服务的日志信息
# journalctl -xeu snapd

解决 Snap 下载网速慢的问题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 方法一(使用代理)

# 编辑Snap服务的配置文件,添加以下内容(环境变量)
# systemctl edit snapd.service
[Service]
Environment=http_proxy=127.0.0.1:1080
Environment=https_proxy=127.0.0.1:1080

# 使配置文件生效
# systemctl daemon-reload

# 重启服务
# systemctl restart snapd.service

# 方法二(离线安装)

# 打开浏览器前往 https://uappexplorer.com/snaps 搜索并下载需要的snap包
# 执行本地安装命令:snap install xxx.snap --dangerous

解决 Snap 应用程序无法卸载的问题

1
2
3
4
5
6
7
8
9
10
11
# 举例说明:假如应用程序core无法卸载,可先取消挂载对应的/dev/loopxx设备,然后再执行卸载操作

# 查看snap设备的挂载情况
# df -h | grep snap
/dev/loop1 90M 90M 0 100% /usr/var/lib/snapd/snap/core/7713

# 取消设备挂载
# umount /dev/loop1

# 卸载应用
# snap remove core

Snapcraft 打包构建 Snap 应用程序

Snapcraft 可以用来构建 Snap 的应用程序,使用也非常的简单,仅仅需要写一个 snapcraft.yaml 的配置文件即可,作用类似 Docker 的 docker-file,具体的打包教程可参考这里

参考博客