Snap简介

Snap 是 Canonical 开发的包管理系统,默认安装于 Ubuntu 16.04 及其后的发行版本中。

优势:

  • 自包含:不受限于发行版的系统库版本,且每个包之间不存在运行库依赖。
  • 只读挂载:应用程序不能修改或删除,且不会污染系统应用程序或库。
  • 回退:内置回退旧版本。
  • 快照:内置备份和恢复应用数据。
  • 版本新:相比发行版更新缓慢,其应用程序版本都比较新。

劣势主要为安装包占用较多存储空间。

以下主要以 LXD 的 snap 包为例。

一、安装 snapd

sudo apt install -y snapd

查看版本

snap version

二、安装 snap 包

为避免系统可能存在旧版本 LXD 与 snap 安装的最新版 LXD 冲突:

sudo apt remove --purge lxd lxd-client

然后:

sudo snap install lxd

默认 stable 频道,也可以指定 edge 频道:

sudo snap install --channel=edge lxd

安装后,可切换频道。

sudo snap switch --channel=stable lxd

相比 RPM 和 Debian 包需手动更新,snap 包将在后台自动更新。若需手动更新,则

用ACE实现One Loop Per Thread

one loop per thread 即每个线程运行一个独立的事件循环 (event loop),或称为 one event loop per thread 更准确。而且事件循环线程之间通常不存在同步或互斥的关系, 并发连接的处理能力随CPU核心数而扩展 (scalable)。

ACE 拥有多种实现的Reactor:

  • ACE_Select_Reactor : 基于 select 的实现。
  • ACE_Dev_Poll_Reactor : 基于 Linux epoll 或 BSD /dev/poll 的实现。
  • ACE_WFMO_Reactor : 基于 Windows WaitForMultipleObjects 的实现

它们都可用于实现 one loop per thread 模式。 相比 ACE_TP_Reactor

  • ACE_TP_Reactor 继承于 ACE_Select_Reactor加锁 保证多线程竞争同一 Reactor 的安全。并行可扩展能力受限,且最大支持 1024 个描述符。
  • 基于 ACE_Dev_Poll_Reactor 的 one loop er thread,每个线程拥有独立的 Reactor,线程之间不存在竞争。充分发挥并行能力,且最大支持几十万甚至百万个描述符。

以下以 ACE_Select_Reactor 为例浅析实现的关键代码。更完备示例代码请参看我的 ace_echod

安全远程访问Docker

Docker服务端(dockerd)默认监听在Unix套接口 /var/run/docker.sock 。仅能本地或SSH至Docker运行的主机访问,不利于自动化开发测试。

若需远程访问,得配置它同时监听在TCP端口(默认2376)。

然而,Docker不支持用户认证。 可通过配置TLS客户端和服务端认证,规避非法客户端远程访问服务端。

一、创建CA

openssl genrsa -out ca-key.pem 4096
openssl req -new -x509 -days 365 -key ca-key.pem -sha256 -out ca.pem

交互式输入各种选项,其中

Common Name (e.g. server FQDN or YOUR name) []: <HOST>

<HOST> 为Docker远程服务端域名(允许不存在的域名)。

二、创建远程服务端证书

创建 extfile.cnf

subjectAltName = DNS:<HOST>,IP:<IP>,IP:127.0.0.1
extendedKeyUsage = serverAuth
  • <HOST> 与上同。
  • <IP> 为Docker远程服务端IP

然后:

openssl genrsa -out server-key.pem 4096
openssl req -subj "/CN=<HOST>" -sha256 -new -key server-key.pem -out server.csr
openssl x509 -req -days 365 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out server-cert.pem -extfile extfile.cnf

三、创建客户端证书

创建 extfile-client.cnf

rbenv简介——Debian/Ubuntu中管理多版本Ruby

一、安装

git clone git://github.com/rbenv/rbenv.git ~/.rbenv
git clone git://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build

在国内,为了加速下述安装:

git clone https://github.com/andorchen/rbenv-taobao-mirror.git ~/.rbenv/plugins/rbenv-taobao-mirror

激活rbenv

eval "$(~/.rbenv/bin/rbenv init)"

为了每次登录后自动激活rbenv,需将NMV_DIRnvm.sh和补齐加入bash的~/.bashrc(或zsh的~/.zshrc)

export PATH=~/.rbenv/shims:~/.rbenv/bin:$PATH
eval "$(rbenv init -)"

验证是否安装正确:

curl -fsSL https://github.com/rbenv/rbenv-installer/raw/master/bin/rbenv-doctor | bash

wget -qO- https://github.com/rbenv/rbenv-installer/raw/master/bin/rbenv-doctor | bash

输出类似:

Checking for `rbenv' in PATH: /root/.rbenv/bin/rbenv
Checking for rbenv shims in PATH: OK
Checking `rbenv install' support: /root/.rbenv/plugins/ruby-build/bin/rbenv-install (ruby-build 20190615-9-gf3f4193)
Counting installed Ruby versions: none
  There aren't any Ruby versions installed under `/root/.rbenv/versions'.
  You can install Ruby versions like so: rbenv install 2.2.4
Checking RubyGems settings: OK
Auditing installed plugins: OK

二、常用命令

列表可安装的Ruby版本

rbenv install -l

除了Ruby官方版本,还支持RBX和JRuby等。

Shadowsocks-Rust简介

在《Shadowsocks简介》中,我介绍了如何使用Shadowsocks。但它不具备负载均衡集群能力,而结合HAProxy的集群配置复杂。

shadowsocks-rust是Shadowsocks的Rust语言实现,它不仅具有传统Shadowsocks特性,而且还具有:

  • 负载均衡 多个Shadowsocks服务器的能力。
  • 探测Shadowsocks服务器 延迟 的能力。

安装

Shadowsocks-Rust未提供DEB安装包。为了方便安装,可下载其静态链接版本

sudo tar atf shadowsocks-v1.7.0-nightly.x86_64-unknown-linux-musl.tar.xz -C /usr/local/bin

配置

以root用户创建目录/etc/shadowsocks-rust,编辑/etc/shadowsocks-rust/config.json:

{
    "servers": [
        {
            "address": "127.0.0.1",
            "port": 1080,
            "password": "hello-world",
            "method": "aes-256-cfb"
            "timeout": 300
        },
        {
            "address": "127.0.0.1",
            "port": 1081,
            "password": "hello-kitty",
            "method": "aes-256-cfb"
        }
    ],
    "local_port": 8388,
    "local_address": "127.0.0.1"
}
  • address为服务端地址。
  • server_port为服务端监听端口。
  • password为客户端和服务端预设的共享密码,它最好由安全密码生成器生成(如LastPassKeePass),且长度不小于6个字符。
  • timeout为连接超时时间。
  • method为加密算法,aes-256-cfb的安全性较好。
  • 每个servers元素为一个Shadowsocks服务器配置。

因Ubuntu 14.04过保,下面仅以Ubuntu 16.04及以后版本为例。

以root用户创建/etc/systemd/system/shadowsocks-rust-local.service:

[Unit]
Description=Shadowsocks-Rust Custom Client Service.
Documentation=sslocal -h
After=network.target

[Service]
Type=simple
CapabilityBoundingSet=CAP_NET_BIND_SERVICE
AmbientCapabilities=CAP_NET_BIND_SERVICE
User=nobody
Group=nogroup
ExecStart=/usr/local/bin/sslocal --log-without-time -c /etc/shadowsocks-rust/config.json

[Install]
WantedBy=multi-user.target

注册并启动服务:

在Docker容器中创建GlusterFS

本文展示如何在一台Linux物理机/虚拟机上,创建GlusterFS集群。目的在于测试和学习GlusterFS,而非将GlusterFS应用生产环境。

下载节点容器镜像

docker pull gluster/gluster-centos

创建节点容器实例

for i in `seq 1 3`; do
        docker run -d --privileged=true --name gluster$i --hostname=gluster$i \
                -v /etc/glusterfs$i:/etc/glusterfs:z \
                -v /var/lib/glusterd$i:/var/lib/glusterd:z \
                -v /var/log/glusterfs$i:/var/log/glusterfs:z \
                -v /srv/glusterfs$i:/srv/glusterfs:z \
                -v /sys/fs/cgroup:/sys/fs/cgroup:ro \
                -v /dev:/dev \
                gluster/gluster-centos
done

组建集群

docker exec -ti gluster1 /bin/bash
gluster peer probe <gluster2 ip addr>
gluster peer probe <gluster3 ip addr>

创建卷

冗余卷 (replica)

gluster peer volume create v1 replica 3 172.17.0.{2,3,4}:/srv/glusterfs/v1 force

条带卷 (stripe)

gluster peer volume create v2 strip 3 172.17.0.{2,3,4}:/srv/glusterfs/v2 force

纠删码卷 (disperse)

gluster peer volume create e3 disperse 3 redundancy 1 172.17.0.{2,3,4}:/srv/glusterfs/v3 force
  • 由于这些容器实例的/srv/glusterfst与/在同一个分区,故需要指定force参数。
  • 创建容器时,将host的/srv/glusterfs相关目录绑定至容器/srv/glusterfs是为了避免no xattr support in Docker #1070

挂载卷

通过FUSE挂载

mount -t glusterfs 172.17.0.2:/v1 /mnt/glusterfs/

脚本化

为了便于测试,我将上述诸多过程归纳成脚本:gluster_docker