[TOC]

0x00 前言说明

描述:在大多数应用场景下Ubuntu借助包管理器apt-get安装软件包很方便,前提是服务器要能够联网;但是如果在。政府或企业内网的服务器,通常是不与互联网连通的,这时候部署软件只能借助文件拷贝的方式,感觉回到了原始时代。而且更为严重的问题是软件包部署过程中的相互依赖的问题;

Q:如何解决?

在离线部署方面确实Windows比Linux做得好,Windows软件包通常会将软件所需的依赖打包,部署时只需拷贝一个软件安装包即可运行(缺陷:体积太大);
当然此时Linux中也有类似Windows软件安装包,即snap软件包机制可以用来简化离线部署。

Q:什么是Snap?
答:它的安装包扩展名是.snap类似于一个容器,完全独立于系统,它包含一个应用程序需要用到的所有文件和库(Snap包含一个私有的root文件系统里面包含依赖的软件包),他们安装在独立的目录中且各个应用之间相互隔离,互不影响,而且安装快捷简单,运行容易管理;主要支持的主流发行版Ubuntu和Debian;
简单的说:它类似于windows的软件安装包将所需的依赖都统一打包到软件包中部署时只需拷贝snap文件即可,俨然就是一个镜像容器。

Snap前身是由 Canonical 进行开发和管理的snappy演变而来用的是和 Flatpak 对抗,在Ubuntu 20.04 TLS的focal的发行版本中默认自带;

Snap优缺点:

  • 优点:
    • 安装简单、稳定、自动升级以及自带配置环境无需自行配置;
    • 得益于 Canonical 在中国大陆的运营,下载速度还是可以的,好像是有 CDN 的
  • 缺点:
    • 配置不灵活
    • 软件包巨大,好像运行一个软件包都需要挂载一个镜像,说是为了解决依赖问题,但……
    • 字体渲染支持很烂
    • 启动速度巨慢,了解后发现这个 Snap 果然还是把软件全部打包并压缩做成镜像,每次都要解压缩再挂载……那速度

注意事项:

  • 从`Ubuntu 16.04起snap环境是自带的意味着您无需安装它,但是如果是早于16.04的版本且服务器不能联网,安装snap环境很困难,你只能自求多福了

0x01 安装卸载

(1) 安装

描述:由于在Ubuntu 20.04 TLS 默认已经安装了snap,下面流程讲述的是没有安装该软件的系统流程:


(2) 卸载

描述:由于系统使用了docker容器不采用snap进行安装软件方式,则此时snap在系统中显得多余并且我是一个强迫症患者看到这么多挂载目录就忍不住了;

1
2
3
4
5
6
7
8
$ df -hT
Filesystem Type Size Used Avail Use% Mounted on
/dev/loop1 squashfs 69M 69M 0 100% /snap/lxd/14804
/dev/loop4 squashfs 28M 28M 0 100% /snap/snapd/7264
/dev/loop5 squashfs 55M 55M 0 100% /snap/core18/1705
/dev/loop0 squashfs 71M 71M 0 100% /snap/lxd/16926
/dev/loop3 squashfs 30M 30M 0 100% /snap/snapd/8790
/dev/loop2 squashfs 56M 56M 0 100% /snap/core18/1885

卸载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
# (1) snap 信息以及运行状态查看
[email protected]:~$ dpkg --list | grep "snap"
ii snapd 2.46.1+20.04 amd64 Daemon and tooling that enable snap packages

[email protected]:~$ ps aux | grep "snap"
root 848 0.0 0.7 773992 28520 ? Ssl 13:17 0:01 /usr/lib/snapd/snapd

[email protected]:~$ systemctl status snapd
● snapd.service - Snap Daemon # 正常情况下是绿色的
Loaded: loaded (/lib/systemd/system/snapd.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 2020-10-28 13:10:44 UTC; 12min ago
TriggeredBy: ● snapd.socket # 正常情况下是绿色的
Main PID: 853 (snapd)
Tasks: 13 (limit: 4620)
Memory: 226.7M
CGroup: /system.slice/snapd.service
└─853 /usr/lib/snapd/snapd

# (2) 停止snapd相关的进程服务
sudo systemctl stop snapd snapd.socket snapd.*

# (3) 从服务器或者桌面卸载snapd
sudo apt autoremove --purge -y snapd # --purge 参数非常重要
sudo apt-get remove --purge gnome-software-plugin-snap # gnome 桌面插件

# (4) 守护进程重载
systemctl daemon-reload

清除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
# 1.删掉所有的已经安装的 Snap 软件
for p in $(snap list | awk '{print $1}'); do
sudo snap remove $p
done

# 2.停止snpad并且取消core18挂载的文件系统
sudo systemctl stop snapd
for m in /snap/core18/*; do
sudo umount $m
done

# 干掉 Snap 的 Core 文件,很大哟。
sudo snap remove core

# 3.干掉 Snap 的管理工具。
sudo apt autoremove --purge snapd

# 4. 干掉 Snap 的目录。
sudo rm -rf ~/snap /snap /var/snap /var/lib/snapd /var/cache/snapd
sudo rm -rf /snap
sudo rm -rf /var/snap
sudo rm -rf /var/lib/snapd
sudo rm -rf /var/cache/snapd


# 5.干掉 Snap 的目录。
sudo bash -c "cat > /etc/apt/preferences.d/no-snapd.pref" << EOL
Package: snapd
Pin: origin ""
Pin-Priority: -1
EOL


0x01 基础配置

加速拉取

描述:对于国外的一些应用确实由于国内的网络原因,导致Snap拉取下载只跳几十KB真的十分感人;
因为snap一直没有国内的镜像而且开启普通代理也无法为它加速通过配置snapd为它提提速

方式1:systemd设置snap代理
描述:由于直接设置 http_proxy 环境变量无法设置上, 所以需要在 snapd 启动文件中直接设置 proxy, 方法如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# (1) 前置操作, 修改  systemctl edit 使用的编辑器为 VIM, 如果不介意 Nano 可以跳过这一步
$ sudo tee -a /etc/profile <<-'EOF'
export SYSTEMD_EDITOR="/bin/vim"
EOF
$ source /etc/profile

# (2) 开始设置代理编辑snapd的systemd,此时会在snapd的启动文件夹下新建立一个配置文件,用于复写snapd启动配置;
$ sudo systemctl edit snapd
#添加如下
[Service]
Environment="http_proxy=http://127.0.0.1:port"
Environment="https_proxy=http://127.0.0.1:port"
#保存退出
$ sudo systemctl daemon-reload
$ sudo systemctl restart snapd

方式2:离线snap文件
描述:为了扩展解决办法我们可以采用国外的VPS先拉取下载应用的snap文件,这算是下载snap包的另外一种方式;

操作流程:
Step1.在能联网的Ubuntu上使用snap download命令下载

1
2
3
4
5
[email protected]:~# snap download docker
Fetching snap "docker"
Install the snap with:
snap ack docker_423.assert
snap install docker_423.snap

Step2.上命令将会得到.assert和.snap两类文件:

  • .assert:是软件包的元数据信息,包括签名和权限控制信息
  • .snap:是实际的安装文件

Step3.另外一种方法是到uApp Explorer网站上下载,可惜现在 uappexplorer 已经下线, 我们无法从 uappexplorer 中获取 SnapApp 的 .snap 文件,在后续或有更好的解决方法;:

  • 好处:是不需要有Ubuntu环境
  • 缺点:是只能下载.snap文件,无法下载.assert文件。

Step4.假如您下载好.snap文件先进行安装,常规的我们需要将软件包拷贝到服务器上,安装时首先注册.assert,然后再安装.snap包;

1
2
3
4
5
6
7
#1) 存在.assert文件时候
$ sudo snap ack docker_321.assert
$ sudo snap install docker_321.snap

#2) 不存在.assert文件时候(注意使用该方式一定要保证官方下载,危险参数下意味着软件不是在“沙盒”环境下执行的,运行过程不受控)
$ sudo snap install xxxxx.snap --dangerous
$ sudo snap install docker.snap --dangerous

注意事项:

  • core软件包是snap的核心运行时,几乎所有的snap包都依赖core运行时,如果您Ubuntu 发行版本低于 18.04 您可能需要在安装其它的软件包的时候先安装core,

snap镜像搜索: https://snapcraft.io/search?q=nextcloud
下载后执行此命令安装:

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
```

- `--dangerous所提示的是,这种模式有些“危险”。这是因为缺少.assert文件所描述的签名信息和权限控制信息,意味着软件不是在“沙盒”环境下执行的,运行过程不受控。




#### snap 命令

```bash
$ snap whoami
email: -

[email protected]:~$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
loop0 7:0 0 55M 1 loop /snap/core18/1705
loop1 7:1 0 55.3M 1 loop /snap/core18/1885
loop2 7:2 0 69M 1 loop /snap/lxd/14804
loop3 7:3 0 70.6M 1 loop /snap/lxd/16926
loop4 7:4 0 29.9M 1 loop /snap/snapd/8790
loop5 7:5 0 27.1M 1 loop /snap/snapd/7264
sda 8:0 0 80G 0 disk
├─sda1 8:1 0 1M 0 part
├─sda2 8:2 0 1G 0 part /boot
└─sda3 8:3 0 79G 0 part
└─ubuntu--vg-ubuntu--lv 253:0 0 4G 0 lvm /
sr0 11:0 1 1024M 0 rom

入坑出坑

1.Snap安装docker后的相关使用问题

问题描述:创建容器时候无法指定非/home/xxx目录,以及docker-compose构建时必须在home目录之下
解决办法:

1
2
3
4
5
# 挂载持久化数据
/home/public/data/

# docker-compose.yaml
/home/public/project/docker-compose.yaml