容器技术之村网通[2018/02/02 更新]

“Ciel,这是先进的”

其实图片上的这个 ciel 的解释是我自己随便拆分的,当时狮子取名的时候也没考虑太多,
于此就不照应试答题去揣测作者意图了。 Ciel 的正式提出是在 2017 年暑期的
AOSCC 上,
距今已经有些年头了(都 8102 了,所以才给这篇起了个村网通的名字。

先说到容器技术最先想到的应该就是 docker 了,之前 AOSC OS 也使用过 docker 来打包。
丰富的镜像资源以及简单的管理使得它成为一个很多人都亲睐的“软件”。

再后来发现 systemd 也参了一脚,有了 systemd-nspwan,通过引入容器技术,
解决和避免了以前 chroot 一把梭的各种管理不便问题,
目前 archlinux 的主要打包工作环境都是由它来构建的。

而至于 Ciel
则是一个针对 AOSC OS 打包需求可以更简易构建出干净环境的集成化工具,
集成了多层文件系统和容器控制功能,其容器也是 systemd 来负责管理和创建的。

这里各建一个简易的容器将三种工具进行对比。

Docker

Docker 中文教程

设置 /etc/docker/daemon.json为国内镜像缓存。

1
2
3
{
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn/"]
}

将自己添加到 docker 组之后就可以不用 sudo 来执行 docker 命令。

1
2
# gpasswd -a user docker
$ newgrp docker # 临时套用新权限

启动 docker

1
$ sudo systemctl start docker

拉取一个镜像,以 base/archlinux为例:

1
2
$ docker pull base/archlinux
$ docker images # 查看已有镜像

运行容器

1
$ docker run -ti base/archlinux

如果有无法建立虚拟网卡的错误提示有可能和宿主机的 arch 刚滚过内核有关,需要重启一下电脑。

这里提一下,由于 base/archlinux 基本什么软件都没有,所以当时在修改源的时候把各路编辑器都试了一遍,什么 vi, vim, nano 一个都没有。

后来用echo 'Server=...' > /etc/pacman.d/mirrorlist解决了换源的问题。

在群里吐槽的时候有 dalao 提到pacman -U是可用 url 来安装包的,我之前还真不知道有这种操作,估计是各种源用得太舒服了。

Systemd-nspwan

Arch Wiki

因为 Arch Container 和 Debian Container 的创建略有不同,所以分开来写初始化部分,具体设置可以参见 Arch Wiki。

Archlinux

创建一个用于存放 container 的目录arch_container

1
# pacstrap -icd arch_conatiner base base-devel

启动容器

1
$ sudo systemd-nspwan -bD arch_container

Debian

创建 Debian Container,Debian 的具体版本和源地址可以自行更换。

1
2
3
4
$ sudo pacman -S debootstrap debian-archive-keyring
$ mkdir debian_container
$ cd debian_container
$ debootstrap stable debian_container https://mirrors.ustc.edu.cn/debian/

启动容器方式和 Arch 一样

1
$ sudo systemd-nspwan -bD debian_container

Ciel

因为 AOSC OS 新的 tarball 将近期上线,所以暂时不用老版本的 tarball 来演示了,等更新了之后再回来填坑…(TBC)

随着最新 tarball(20180128) 释出,可以开始对 Ciel 进行一个简单的测试了。

tarball 获取地址

用户手册

安装 Ciel

需要手动安装依赖,就常见的发行版而言基本都有systemdtar工具,所以需要安装的就是gitmakego了。

编译:

  • git
  • make
  • Go

运行:

  • systemd’s container components
  • overlayfs (kernel module)
  • coreutils
  • tar
1
2
3
4
5
6
7

```bash
$ git clone https://github.com/AOSC-Dev/ciel
$ cd ciel
$ git submodule update --init --recursive
$ make
$ sudo make install

如果是使用 Archlinux 的用户这里我简单的写了个 AUR:ciel-git

1
$ yaourt ciel-git

创建并运行

1
2
3
$ mkdir {path} # 创建一个用于存放容器的目录
$ cd {path}
$ ciel init aosc-os_base_20180128_amd64.tar.xz # 初始化,这里我下载的是 base tarball

至此容器已经运行了,ciel 工具本身没有提供状态显示,但是因为其底层容器实现利用的是systemd-nspwan,所以同样可以使用命令工具查看状态,不过还是希望狮子之后能加上这一功能。

1
$ sudo machinectl status ciel

使用 ciel shell 登陆,如果不带参数的话就是默认以 root 账户登陆到系统中。

1
2
$ cd {path}
$ sudo ciel shell

如果创建用户之后也可以用machinectl登陆,但是仅仅能够起到容器的功能。

1
$ sudo machinectl login ciel

后来想起可以直接用systemd-nspwan来启动容器并以rootanthon登陆(但是据 jeffbai 说默认 root 是没有密码的 —— 具体情况目前不下定论,登陆就不用太纠结了),00-stub就是被压到最底层的 tarball。

订正:nspawn 进了 init 出来的 tarball(底层),而设置密码的时候更改的文件在 99-,ciel 启动的时候会挂载这几个 overlay,而直接 nspawn 不会,所以推荐还是直接用 ciel 工具进入命令行。

1
$ sudo systemd-nspawn -bD {path}/cielfs/00-stub/

最后预览如下:

小结

简单介绍了一下两种主要容器技术的创建和启动方法,Ciel 其本身像是个为 AOSC OS 特别定制的打包工具链,但这里只抽出其中的容器功能做简单介绍,如有兴趣可以在用户手册看到这一整个打包工具链是如何工作的,也算是一种对打包流程的了解(也欢迎你成为开发者的一员~