EOS 是欧洲核子中心开发的专门用来提供可靠的 PB 级数据存储技术的软件解决方案, 目前在 LHC 和其他一些场景都有实例在运行. EOS 的核心是 XrootD 框架, 其提供了非常多的远程访问协议。本文是 EOS 的一个简单安装配置过程。


Table of Contents

  1. 准备工作
  2. 安装 EOS
    1. 从源中安装 EOS
    2. 手动编译 EOS RPM 包
      1. 安装依赖库
      2. 安装 devtoolset-7
      3. 编译 eos-folly
      4. 编译 eos-rocksdb
      5. 编译 EOS
  3. 配置 EOS 服务
    1. 配置 MGM
      1. 更改 /etc/sysconfig/eos[_env]
      2. 修改 /etc/xrd.cf.mgm
      3. 生成 eos.keytab
      4. 设置 Master/Slave
      5. 启动 EOS
      6. NTP 时间同步
    2. 配置 FST
      1. 修改 /etc/sysconfig/eos[_env]
      2. 启动 FST
      3. 设置存储位置
      4. 启用 FST
    3. 配置 FED
    4. 配置 QuarkDB NS
  4. EOS 故障分析与解决
    1. 配置

下图展示了 EOS 的发展历史:

准备工作

为了要创建我们的 EOS 服务, 我们至少需要两个服务器节点, 一个作为 EOS MGM 主节点, 一个为 EOS MGM 从节点。这里我们将 CentOS7 作为我们的服务器操作系统。

安装 EOS

Cern 提供已经编译好的 EOS 安装包和依赖包, 我们也可以自己编译 EOS 安装包和依赖包。

从源中安装 EOS

从 Cern 的 EOS 源中安装 EOS 是最方便的。 创建一个 yum repo, 内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
[eos-citrine]
name=EOS binaries from EOS project, citrine branch
baseurl=http://cern.ch/storage-ci/eos/citrine/tag/el-$releasever/$basearch/
enabled=1
gpgcheck=0
priority=10

[eos-citrine-deps]
name=EOS dependencies from EOS project, citrine branch
baseurl=http://cern.ch/storage-ci/eos/citrine-depend/el-$releasever/$basearch/
enabled=1
gpgcheck=0
priority=10

并复制到 /etc/yum.repos.d/

1
2
$ sudo yum makecache && sudo yum update
$ sudo yum install -y eos-folly eos-server eos-client eos-fuse eos-fusex

目前 EOS 稳定版本是 citrine, 版本号为 4.3.12

手动编译 EOS RPM 包

安装依赖库

1
2
3
4
5
6
7
8
9
10
$ sudo yum install -y yum-utils rpm-build rpm-build-libs yum-plugin-priorities
$ sudo yum install -y zlib-static zlib-devel bzip2-devel bzip2-devel
#### Download from cern
$ sudo yum install -y http://linuxsoft.cern.ch/cern/centos/7/cern/x86_64/Packages/protobuf3-3.3.1-2.el7.cern.x86_64.rpm
$ sudo yum install -y http://linuxsoft.cern.ch/cern/centos/7/cern/x86_64/Packages/protobuf3-compiler-3.3.1-2.el7.cern.x86_64.rpm
$ sudo yum install -y http://linuxsoft.cern.ch/cern/centos/7/cern/x86_64/Packages/protobuf3-devel-3.3.1-2.el7.cern.x86_64.rpm
#### eos-server dependence
$ sudo yum install -y openldap-devel e2fsprogs-devel libmicrohttpd libmicrohttpd-devel
#### libmicrohttpd dependence
$ sudo yum install -y graphviz graphviz-devel libgcrypt-devel gnutls-devel

安装 devtoolset-7

1
2
3
4
5
6
7
8
9
10
#### centos
$ sudo yum install -y centos-release-scl.noarch
#### scientific linux
$ sudo yum install -y yum-conf-repos
$ sudo yum install -y yum-conf-softwarecollections
####--------------------------------------------
$ sudo yum install -y devtoolset-7-gcc devtoolset-7-gcc-c++.x86_64 devtoolset-7-gcc-plugin-devel.x86_64
$ sudo yum install -y devtoolset-7-gcc-gfortran.x86_64 devtoolset-7-gdb.x86_64 devtoolset-7-strace.x86_64 devtoolset-7.x86_64
#### enable devltoolset
$ scl enable devtoolset-7 bash

编译 eos-folly

1
2
3
4
5
6
$ git clone https://gitlab.cern.ch/eos/eos-folly && cd eos-folly
$ mkdir -p ~/rpmbuild/SOURCES
$ cp SConstruct.double-conversion ~/rpmbuild/SOURCES/
$ sudo yum install python2-scons openssl-devel libevent-devel cmake3 cmake devtoolset-6
$ sed -i "s|devtoolset-6|devtoolset-7|g" eos-folly.spec
$ rpmbuild --undefine=_disable_source_fetch -ba eos-folly.spec

编译 eos-rocksdb

1
2
$ git clone https://gitlab.cern.ch/eos/eos-rocksdb && cd eos-rocksdb
$ rpmbuild --undefine=_disable_source_fetch -ba eos-rocksdb.spec

编译 EOS

下载源码包:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#### Download eos from github
$ git clone https://gitlab.cern.ch/eos/eos
$ mv eos eos-citrine-4.3.12-1
$ tar cvzf eos-citrine-4.3.12-1.tar.bz2 eos-citrine-4.3.12-1
$ mv eos-citrine-4.3.12-1.tar.gz ~/rpmbuild/SOURCES/
$ cd eos-citrine-4.3.12-1 && cp eos.spec.in eos.spec
$ sed -i -e "s|@CPACK_PACKAGE_RELEASE@|1|g" -e "s|@CPACK_PACKAGE_VERSION_MAJOR@|4|g" eos.spec
$ sed -i -e "s|@CPACK_PACKAGE_NAME@|eos-citrine|g" -e "s|@CPACK_PACKAGE_VERSION|4.3.12|g" eos.spec
#### depends
$ sed -i "s|2017.09.18.00-4|2017.09.18.00-5|g" eos.spec
#### without server
$ rpmbuild --undefine=_disable_source_fetch --with server -ba eos.spec
#### with server
## build libmicrohttpd
$ cd microhttpd
$ cp vmem.patch epoll.patch fdshift.patch ~/rpmbuild/SOURCES/
$ rpmbuild --undefine=_disable_source_fetch -ba libmicrohttpd.spec
$ sudo rpm -ivhU ~/rpmbuild/RPMS/x86_64/libmicrohttpd-* && cd ..
## build eos with server
$ rpmbuild --undefine=_disable_source_fetch --with server -ba eos.spec

编译好后, 安装相应的包即可.

配置 EOS 服务

EOS 有三个基本守护进程, 作为 OFS 插件跑在 xrootd 服务内.

  1. MGM - 管理服务器 (名字空间, 存储池配置, 布局与读取调度)
  2. MQ - 无状态异步消息传递服务器
  3. FST - 文件存储服务器, 根据文件 ID 存储文件

对于 名字空间和配置有副本的情况, 还有第四个守护进程
4. SYNC - 变更日志与配置文件同步服务器

复制一份配置文件到 /etc/sysconfig/eos[_env]

1
2
3
4
### for SL 6
$ cp /etc/sysconfig/eos.example /etc/sysconfig/eos
### for SL 6
$ cp /etc/syconfig/eos_env.example /etc/sysconfig/eos_env

配置 MGM

更改 /etc/sysconfig/eos[_env]

修改如下相应的量变:

1
2
3
4
5
6
7
8
9
10
11
12
13
### define roles of daemons to run on this node
### here for management, message broker, sync and fed serfice
XRD_ROLES="mq mgm fed sync global-mq"
### EOS instance name
EOS_INSTANCE_NAME=eostest

########################
EOS_MGM_HOST=localhost
EOS_BROKER_URL=root://localhost:1097//eos/
EOS_MGM_MASTER1=eos01.amito.me
EOS_MGM_MASTER2=eos02.amito.me
EOS_MGM_ALIAS=eos01.amito.me
EOS_FUSE_MGM_ALIAS=eos01.amito.me

修改 /etc/xrd.cf.mgm

按需修改 /etc/xrd.cf.mgm 中如下的配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# sec.protocol krb5
# sec.protocol gsi
sec.protocol unix
sec.protocol sss -c /etc/eos.keytab -s /etc/eos.keytab
# sec.protocol krb5 -exptkn:/var/eos/auth/krb5#<uid> host/<host>@CERN.CH
# sec.protocol krb5 host/<host>@CERN.CH
sec.protbind localhost.localdomain unix sss
sec.protbind localhost unix sss
sec.protbind * unix sss
### if using quarkdb as ns
mgmofs.cfgtype quarkdb
mgmofs.nslib libEosNsQuarkdb.so
mgmofs.qdbcluster ceph0:7777 ceph1:7777 ceph2:7777 ceph3:7777
###### if quarkdb using password
###### /etc/quarkdb.passwd.eos permission 400
mgmofs.qdbpassword_file /etc/quarkdb.passwd.eos

生成 eos.keytab

不然会出问题:

1
2
3
$ test -f /etc/eos.keytab && rm -f /etc/eos.keytab
$ yes | xrdsssadmin -k eos -u daemon -g daemon add /etc/eos.keytab >& /dev/null
$ chown daemon:daemon /etc/eos.keytab >& /dev/null ; chmod 400 /etc/eos.keytab

设置 Master/Slave

1
2
3
4
5
6
7
8
9
### Master
$ systemctl enable --now eos@master.service
### Slave
$ systemctl enable --now eos@slave.service
### on master and slave nodes
$ systemctl enable --now eos.service
$ systemctl enable --now eos@mgm.service
### enable compact
$ eos -b ns compact on 1 86400

启动 EOS

1
2
3
4
5
6
### start
$ systemctl start eos
### status
$ systemctl status eos@*
### stop
$ systemctl kill eos

NTP 时间同步

增加定时任务, 每半个小时同步一次时间:

1
*/30 * * * * /usrsbin/ntpdate -s pool.ntp.org >/dev/null 2>&1

配置 FST

FST 节点的配置相对简单一点.

修改 /etc/sysconfig/eos[_env]

1
2
3
4
5
6
7
8
9
### define roles of daemons to run on this node
### here for management, message broker, sync and fed serfice
XRD_ROLES="fsd"
########################
EOS_BROKER_URL=root://eos01.amito.me:1097//eos/
EOS_MGM_MASTER1=eos01.amito.me
EOS_MGM_MASTER2=eos02.amito.me
EOS_MGM_ALIAS=eos01.amito.me
EOS_FUSE_MGM_ALIAS=eos01.amito.me

启动 FST

1
2
3
$ systemctl enable --now eos
$ systemctl enable --now eos@fst
$ systemctl status eos@fst

设置存储位置

1
$ mkdir /data01 && chown -R daemon:daemon /data01

启用 FST

在 MGM 上,进入 EOS 控制台

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$ eos
EOS Console [root://localhost]|/> node set fst01.amito.me on
### make sure fst01.amito.me is on
EOS Console [root://localhost]|/> node ls
### a3bxxx is uuid of the partition
EOS Console [root://localhost]|/> fs add -m 1 a3b0d210-4cce-413f-91ed-13ee9a5b9dc4 fsd01.amito.me:1095 /data01
#### EOS 认证
EOS Console [root://localhost]|/> vib enable unix
EOS Console [root://localhost]|/> vib enable sss
#### FUSE 配置
EOS Console [root://localhost]|/> vid set map -tident "*@fs.amito.me" vuid:0
EOS Console [root://localhost]|/> vid set map -tident "*@fs.amito.me" vgid:0
EOS Console [root://localhost]|/> vid add gateway login* unix
EOS Console [root://localhost]|/> vid add gateway vm* unix
#### 启动 FST
EOS Console [root://localhost]|/> fs boot 1
EOS Console [root://localhost]|/> fs config 1 configstatus rw
EOS Console [root://localhost]|/> group set default on

配置 FED

1
2
$ mkdir -p /var/spool/xrootd/fed
$ sudo chown -R daemon:daemon /var/spool/xrootd/fed

配置 QuarkDB NS

参考 配置 EOS 使用 QuarkDB 作为 NS

EOS 故障分析与解决

配置

  1. Unable process keytable /etc/eos.keytab; No such file or directory
1
$ chmod 600 /etc/eos.keytab 2>/dev/null; unlink /etc/eos.keytab 2>/dev/null; yes | xrdsssadmin -k eos -u daemon -g daemon add /etc/eos.keytab >& /dev/null; chown daemon:daemon /etc/eos.keytab >& /dev/null ; chmod 400 /etc/eos.keytab;"
  1. 主从 MGM 节点通信出现 Decrypt key not found, 可能是 /etc/eos.keytab 不一致导致的。
1
[root@mgm-master-node ~]$ scp /etc/eos.keytab mgm-slave-node:/etc
  1. eos vid ls 出现如下权限错误的问题:
1
error: errc=3010 msg="Unable to execute proc command - you don't have the requested permissions for that operation (2) /proc/admin/; Operation not permitted"

通过查看用户 ID,

1
2
$ eos whoami
Virtual Identity: uid=99 (99) gid=99 (99) [authz:unix] host=ceph1

发现 host 不是 localhost/etc/hosts 中对 127.0.0.1 做了修改

1
2
3
$ cat /etc/hosts
127.0.0.1 ceph1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 ceph1 localhost localhost.localdomain localhost6 localhost6.localdomain6

去掉 ceph1, 将其改回来,就可以了。
4. /var/log/eos/tx/transfer-archive.log not found

1
$ mkdir -p /var/log/eos/tx && chown -R daemon:daemon /var/log/eos