SUSE 12环境编译glusterfs 6

GlusterFS官方文档 GlusterFS Install Guide 介绍了gluster官方软件仓库中提供了主流发行版的安装软件包。其中Red Hat/CentOS和Ubuntu/Debian提供软件仓库方式自动安装,SUSE发行版则通过 SUSE Open Build Service (OBS) 的下载仓库提供了不同SUSE版本的安装软件包。

不过,SUSE的 SUSE Open Build Service (OBS) 只提供了较新发布版本对应的 GlusterFS SUSE安装包 ,例如 Tumbleweed, SLES 15, and OpenSUSE Leap 15.1。

但是实际上线上生产环境,依然运行着非常古老的SUSE Linux版本,例如 SELS 12 SP3,官方下载仓库只提供了非常陈旧的已经不再维护的发行包。为了能够在实际生产环境稳定运行,需要自己编译安装GlusterFS稳定版本。

备注

我在SUSE Enterprise Linux Server SELS 12 SP3版本上折腾了很久才完成GlusterFS的软件包编译,过程曲折,也迫使我对SUSE Linux比较深入的学习和探索,积累了一些经验。整个探索过程我记录在 SUSE编译glusterfs尝试 ,不过太冗长了,所以我重新在这里整理一个完整的正确方法,提供一个简明指南。如果你对为何我采用这个步骤有疑问,也可以参考原始记录 SUSE编译glusterfs尝试

编译准备工作

我的SUSE SLES 12 SP3环境是在 KVM Atlas 虚拟环境中采用 创建KVM虚拟机 方法,创建了SLES 12 SP3环境,所有编译工作都在这个虚拟机中完成。最后再将编译得到的rpm包复制到 SUSE本地软件仓库 中提供在线服务器安装。

在开始编译之前,首先要对编译工作环境进行配置:

SUSE SDK

要在 SUSE Linux 环境编译软件,首先需要 SUSE 开发SDK。对于企业内部大规模批量部署,建议采用 SUSE部署SMT服务器 。不过,suse SMT需要订购服务,所以还是采用 直接下载 SUSE Linux enterprise Software Development Kit Downloads ,将 下载 SLE SDK iso镜像,然后通过 使用SUSE的DVD iso构建安装仓库 方式添加到主机repo后,就可以通过 zypper安装依赖软件包。

  • 根据编译安装依赖包,添加以下本地iso仓库 使用SUSE的DVD iso构建安装仓库

    # 安装盘
    zypper ar -c -t yast2 "iso:/?iso=/home/SLE-12-SP3-Server-DVD-x86_64-GM-DVD1.iso" "SLES 12 SP3"
    # SDK盘
    zypper ar -c -t yast2 "iso:/?iso=/home/SLE-12-SP3-SDK-DVD-x86_64-GM-DVD1.iso" "SLES 12 SP3 SDK-1"
    zypper ar -c -t yast2 "iso:/?iso=/home/SLE-12-SP3-SDK-DVD-x86_64-GM-DVD2.iso" "SLES 12 SP3 SDK-2"
    

然后检查仓库:

zypper repos

显示如下:

# | Alias             | Name              | Enabled | GPG Check | Refresh
--+-------------------+-------------------+---------+-----------+--------
1 | SLES 12 SP3       | SLES 12 SP3       | Yes     | (r ) Yes  | Yes
2 | SLES 12 SP3 SDK-1 | SLES 12 SP3 SDK-1 | Yes     | ( p) Yes  | No
3 | SLES 12 SP3 SDK-2 | SLES 12 SP3 SDK-2 | Yes     | ( p) Yes  | No
4 | SLES12-SP3-12.3-0 | SLES12-SP3-12.3-0 | No      | ----      | ----

接下来就可以安装所有编译GlusterFS所依赖的开发库以及开发工具了。

安装开发库和工具

  • 根据GlusterFS官方 Building GlusterFS 文档,在SUSE SELS 12 SP3的安装和Red Hat RHEL编译环境相似的软件包:

    zypper in -y autoconf automake bison flex gcc gettext-tools \
        libasan0 libatomic1 libgomp1 libitm1 libopenssl-devel libtsan0 \
        linux-glibc-devel python-netifaces python-simplejson python-xattr \
        rpm-build systemd-rpm-macros zlib-devel sqlite3 \
        fdupes libtool pkgconfig python3 fuse glibc-devel libaio-devel
    

备注

当后续在编译GlusterFS执行 ./configure 时会提示某些头文件缺失,则对应安装软件包 xxxx-devel

GlusterFS的编译依赖 userspace-rcu-devel ,这个软件包仅见于 SUSE SELS 15 ,对于早期SUSE发行版对应软件包名是 liburcu-devel ,不过需要修订spec文件。见下文。

  • 根据编译经验,还需要安装以下开发库:

    zypper in -y libuuid-devel acl-devel libxml2-devel liburcu-devel
    
    zypper in -y python2-devel libtirpc-devel \
      libcurl-devel fuse-devel libibverbs-devel librdmacm-devel
    

备注

在后续编译过程中,执行 ./configure 时会提示某些头文件缺失,则对应安装软件包 xxxx-devel

下载代码库

  • 下载代码:

    git clone git@github.com:gluster/glusterfs.git
    
  • 检查软件代码仓库提供的所有release分支:

    cd glusterfs
    git branch -a | grep release
    
  • 生产环境中,服务器端使用的RHEL/CentOS 7.x,部署的是GlusterFS 6.10版本,所以这里编译SUSE版本也同样使用 release-6 分支:

    git checkout release-6
    

编译准备

  • 编译配置:

    ./autogen.sh
    ./configure --enable-fusermount
    

配置输出:

GlusterFS configure summary
===========================
FUSE client          : yes
Infiniband verbs     : yes
epoll IO multiplex   : yes
fusermount           : yes
readline             : yes
georeplication       : yes
Linux-AIO            : yes
Enable Debug         : no
Enable ASAN          : no
Enable TSAN          : no
Use syslog           : yes
XML output           : yes
Unit Tests           : no
Track priv ports     : yes
POSIX ACLs           : yes
SELinux features     : yes
firewalld-config     : no
Events               : yes
EC dynamic support   : x64 sse avx
Use memory pools     : yes
Nanosecond m/atimes  : yes
Server components    : yes
Legacy gNFS server   : no
IPV6 default         : no
Use TIRPC            : yes
With Python          : 3.4
Cloudsync            : yes

备注

一些有用的 configure 参数:

  • --enable-debug 对于开发过程调试特别有用

  • --enable-gnfs 用于支持传统的gNFS

  • --enable-asan 如果要帮助修复内存问题

  • 编译准备:

    make dist
    

编译

  • 编译:

    make
    
  • 在SuSE SLES12 SP3上虽然编译可以顺利完成,但是源代码中缺少一个对应SuSE脚本,所以会导致 sudo make install 执行失败中断。由于SuSE运行环境接近RedHat,所以借用Redhat版本复制脚本:

    cp extras/init.d/glustereventsd-Redhat extras/init.d/glustereventsd-SuSE
    cp extras/init.d/glustereventsd-Redhat.in extras/init.d/glustereventsd-SuSE.in
    

上述fix步骤重要,否则会导致安装不完整,会无法正常运行

  • 安装:

    sudo make install
    
  • 将编译后的 glusterfs 源代码目录复制到相同操作系统环境中,并且按照上文方式安装了所有依赖库,就可以同样执行 sudo make install 进行安装。

运行库问题

我发现有些服务器上按照上文方法安装了glusterfs之后,执行 gluster 命令会出现库文件找不到报错:

gluster: error while loading shared libraries: libglusterfs.so.0: cannot open shared object file: No such file or directory

在正常的服务器上执行 ldd /usr/local/sbin/gluster 可以看到库文件:

...
        libglusterfs.so.0 => /usr/local/lib/libglusterfs.so.0 (0x00007f6f29573000)
...

观察了报错服务器,实际上也已经安装成功了 /usr/local/lib/libglusterfs.so.0 。这说明是动态库加载没有刷新。

检查 /etc/ld.so.conf 内容已经包含了 /usr/local/lib/ 目录,所以只需要刷新一次就可以:

ldconfig

然后就可以正常运行

编译RPM(尚未完全成功)

备注

实际上目前在SUSE SLES12 SP3上编译RPM还是遇到了尚未克服的困难,我还需要继续探索,以下步骤是目前探索比较可行的步骤记录,供参考。

在 SUSE SLES 12 SP3 环境下编译RPM还需要做一些修订

  • GlusterFS源代码中 glusterfs.spec 配置了 BuildRequires:    userspace-rcu-devel >= 0.7 ,这个依赖需要修改成 SELS 12 SP3对应的 liburcu-devel (版本是 0.8),所以修改源代码根目录下 glusterfs.spec.in ,将:

    BuildRequires:    userspace-rcu-devel >= 0.7
    

修改成:

BuildRequires:    liburcu-devel >= 0.7

上述修改可以避免后续 make glusterrpms 出现以下报错:

error: Failed build dependencies:
        userspace-rcu-devel >= 0.7 is needed by glusterfs-6.10-0.0.x86_64

suse12编译glusterfs6的Makefile错误解决尝试

  • 设置 autoconf 环境变量:

    export ac_cv_build=x86_64-suse-linux-gnu
    export ac_cv_host=x86_64-suse-linux-gnu
    

备注

在源代码根目录下有autoconf所依赖的 config.guess 脚本用来判断编译环境,执行 ./config.guess 可以看到输出:

x86_64-suse-linux-gnu

配置上述 autoconf 环境变量是因为我发现在源代码根目录下执行 ./autoconf 是正确生成了 Makefile 中的配置:

build_triplet = x86_64-suse-linux-gnu
host_triplet = x86_64-suse-linux-gnu

但是在执行 cd extras/LinuxRPM/;make glusterrpms 生成的RPM源代码根目录 extras/LinuxRPM/rpmbuild/BUILD/glusterfs-6.10Makefile ( Makefile.in )中没有正确替换,依然是:

build_triplet = @build@
host_triplet = @host@

配置上述两个环境变量 ac_cv_buildac_cv_host 可以正确生成RPM源代码根目录 extras/LinuxRPM/rpmbuild/BUILD/glusterfs-6.10Makefile.inMakefile ,也避免了 make glusterrpms 报错:

configure: WARNING: cache variable ac_cv_build contains a newline
configure: WARNING: cache variable ac_cv_host contains a newline

这个报错实际上就会导致 extras/LinuxRPM/rpmbuild/BUILD/glusterfs-6.10Makefile.inMakefile 错误生成:

build_triplet = It is not expected to execute this script. When you are building from a
released tarball (generated with 'make dist'), you are expected to pass
--build=... and --host=... to ./configure or replace this config.sub script in
the sources with an updated version.
host_triplet = It is not expected to execute this script. When you are building from a
released tarball (generated with 'make dist'), you are expected to pass
--build=... and --host=... to ./configure or replace this config.sub script in
the sources with an updated version.
  • 执行RPM编译:

    cd extras/LinuxRPM
    make glusterrpms
    

目前上述 make glusterrpms 还是会遇到有关 glusterd-geo-rep 错误:

Processing files: glusterfs-geo-replication-6.10-0.0.x86_64
error: File not found: /home/huatai/glusterfs/extras/LinuxRPM/rpmbuild/BUILDROOT/glusterfs-6.10-0.0.x86_64/usr/com/glusterd/hooks/1/gsync-create/post/S56glusterd-geo-rep-create-post.sh

RPM build errors:
    File not found: /home/huatai/glusterfs/extras/LinuxRPM/rpmbuild/BUILDROOT/glusterfs-6.10-0.0.x86_64/usr/com/glusterd/hooks/1/gsync-create/post/S56glusterd-geo-rep-create-post.sh
Makefile:561: recipe for target 'rpms' failed
make: *** [rpms] Error 1

但是在 configure 增加 --disable-georeplication 还是不能解决,我预计需要修订 glusterfs-geo-replicatio.spec 配置来fix。

待实践…

参考