.. _build_glusterfs_11_for_suse_12:
==============================
SUSE 12环境编译glusterfs 11
==============================
GlusterFS官方文档 `GlusterFS Install Guide `_ 介绍了gluster官方软件仓库中提供了主流发行版的安装软件包。其中Red Hat/CentOS和Ubuntu/Debian提供软件仓库方式自动安装,SUSE发行版则通过 :ref:`suse_obs` 的下载仓库提供了不同SUSE版本的安装软件包。
SUSE的 :ref:`suse_obs` 只提供了较新发布版本对应的 `GlusterFS SUSE安装包 `_ ,例如 Tumbleweed, SLES 15, and OpenSUSE Leap 15.1。
.. note::
本文实践是在 :ref:`suse_linux` 12 SP5环境,编译最新的 GlusterFS 11,以配合 :ref:`build_glusterfs_11_for_centos_7` 所部署的 :ref:`deploy_sles12sp5_gluster11_client`
但是实际上线上生产环境,依然运行着非常古老的SUSE Linux版本,例如 SELS 12 SP3,官方下载仓库只提供了非常陈旧的已经不再维护的发行包。为了能够在实际生产环境稳定运行,需要自己编译安装GlusterFS稳定版本。
.. note::
我在SUSE Enterprise Linux Server SELS 12 SP3版本上折腾了很久才完成GlusterFS的软件包编译,过程曲折,也迫使我对SUSE Linux比较深入的学习和探索,积累了一些经验。整个探索过程我记录在 :ref:`build_glusterfs_scratch` ,不过太冗长了,所以我重新在这里整理一个完整的正确方法,提供一个简明指南。如果你对为何我采用这个步骤有疑问,也可以参考原始记录 :ref:`build_glusterfs_scratch` 。
编译准备工作
=============
在服务器上安装完 :ref:`suse_linux` 12 SP5
在开始编译之前,首先要对编译工作环境进行配置:
SUSE SDK
-------------
要在 :ref:`suse_linux` 环境编译软件,首先需要 SUSE 开发SDK。对于企业内部大规模批量部署,建议采用 :ref:`suse_deploy_smt` 。不过,suse SMT需要订购服务,所以还是采用 直接下载 `SUSE Linux enterprise Software Development Kit Downloads `_ ,将 下载 SLE SDK iso镜像,然后通过 :ref:`suse_iso_repo` 方式添加到主机repo后,就可以通过 zypper安装依赖软件包。
- 根据编译安装依赖包,添加以下本地iso仓库 :ref:`suse_iso_repo` :
.. literalinclude:: build_glusterfs_11_for_suse_12/mount_sles12_iso
:caption: 挂载SUSE Linux 安装光盘和SDK光盘的ISO镜像
然后检查仓库:
.. literalinclude:: build_glusterfs_11_for_suse_12/zypper_repos
:caption: 执行 ``zypper repos`` 检查添加的ISO仓库
显示如下:
.. literalinclude:: build_glusterfs_11_for_suse_12/zypper_repos_output
:caption: 执行 ``zypper repos`` 检查添加的ISO仓库
接下来就可以安装所有编译GlusterFS所依赖的开发库以及开发工具了。
安装开发库和工具
-------------------
- 根据GlusterFS官方 `Building GlusterFS `_ 文档,在SUSE SELS 12 SP5的安装和Red Hat RHEL编译环境相似的软件包:
.. literalinclude:: build_glusterfs_11_for_suse_12/zypper_install_build_tools
:caption: 执行 ``zypper install`` 安装必要编译依赖
.. note::
使用 ``zypper in`` 执行会提示一些在CentOS上软件包名找不到对应软件包,则通过搜索尽可能找到兼容包:
.. literalinclude:: build_glusterfs_11_for_suse_12/zypper_install_build_tools_commit
:caption: ``zypper install`` 安装依赖的一些调整说明
当后续在编译GlusterFS执行 ``./configure`` 时会提示某些头文件缺失,则对应安装软件包 ``xxxx-devel``
GlusterFS的编译依赖 ``userspace-rcu-devel`` ,这个软件包仅见于 SUSE SELS 15 ,对于早期SUSE发行版对应软件包名是 ``liburcu-devel`` ,不过需要修订spec文件。见下文。
.. note::
之前 :ref:`build_glusterfs_6_for_suse_12` 实践经验有所调整::
'rdma-core-devel' providing 'libibverbs-devel' is already installed.
'rdma-core-devel' providing 'librdmacm-devel' is already installed.
也就是说在 12SP5 只要安装一个 ``rdma-core-devel`` 就可以取代 ``libibverbs-devel`` 和 ``librdmacm-devel``
.. note::
在后续编译过程中,执行 ``./configure`` 时会提示某些头文件缺失,则对应安装软件包 ``xxxx-devel``
下载代码库
============
- `GlusterFS官方下载 `_ 源代码包 ``glusterfs-11.0`` :
.. literalinclude:: build_install_glusterfs/download_glusterfs_11_tgz
:caption: 下载 ``glusterfs-11.0`` 源代码tgz包
编译准备
===========
- 编译配置:
.. literalinclude:: build_install_glusterfs/config_glusterfs
:caption: 配置glusterfs
.. literalinclude:: build_install_glusterfs/config_glusterfs_output
:caption: 配置glusterfs
编译
========
- 编译::
make
编译报错 ``error: field 'available' has incomplete type``
-----------------------------------------------------------
编译报错:
.. literalinclude:: build_install_glusterfs/make_error1
:caption: 编译出错,不兼容类型 error: field 'available' has incomplete type
这个问题在 `compiling on SLES 12-SP5 fails : glusterfs/async.h error: field available has incomplete type #1515 `_ 有说明,原因似乎需要将 ``urcu`` 升级到更高版本(可能需要 0.10 以上版本),而SLES 12.5提供的 ``liburcu-devel`` 是 ``0.8.8``
从 `Userspace RCU `_ 下载最新版本:
.. literalinclude:: build_install_glusterfs/build_liburcu
:caption: 自行编译安装 ``Userspace RCU``
.. note::
编译 ``Userspace RCU`` 需要C++11 feature支持,所以 :ref:`upgrade_gcc_on_suse12.5` 完成后在执行上述 `Userspace RCU `_ 编译
完成 ``Userspace RCU`` 编译安装之后,重新完成一次 ``GlusterFS`` 的 ``.configure`` 和 ``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
.. note::
安装后可能需要执行一次 ``ldconfig`` 确保动态库加载,否则直接执行 ``gluster`` 可能会报找不到库文件,参见 :ref:`build_glusterfs_6_for_suse_12`
- 将编译后的 ``glusterfs`` 源代码目录复制到相同操作系统环境中,并且按照上文方式安装了所有依赖库,就可以同样执行 ``sudo make install`` 进行安装。
编译RPM
======================
- 参考 :ref:`build_glusterfs_11_for_centos_7` ,在构建rpm包之前,首先安装必要的依赖包:
.. literalinclude:: build_glusterfs_11_for_suse_12/install_rpm-build
:caption: 参考 :ref:`build_glusterfs_11_for_centos_7` 安装SUSE构建rpm的依赖软件包
.. note::
:ref:`build_glusterfs_11_for_centos_7` 依赖的 ``mock`` rpm包在SUSE平台对应是 ``python-mock`` ,不过这个包 `pyton-mock安装包 `_ 只在OpenSUSE12提供,位于 `python-mock from Cloud:Tools project `_ (实际上就是 :ref:`openstack` 项目提供的工具包) 提供了仓库安装方法
- 执行rpm构建:
.. literalinclude:: build_install_glusterfs/glusterrpms_centos7
:caption: 执行构建GlusterFS RPMs
编译RPM报错 ``error: Bad owner/group``
------------------------------------------
- 执行 ``make glusterrpms`` 报错:
.. literalinclude:: build_glusterfs_11_for_suse_12/make_glusterrpms_error1
:caption: 执行 ``make glusterrpms`` 报错 ``error: Bad owner/group``
检查 ``/home/glusterfs-11.0/extras/LinuxRPM/rpmbuild/SOURCES/glusterfs-11.0.tar.gz`` 文件叔主就会看到系统缺少一个 ``1001`` 对应的 ``group`` :
.. literalinclude:: build_glusterfs_11_for_suse_12/tgz_owners
:caption: ``glusterfs-11.0.tar.gz`` 文件属主group缺失
:emphasize-lines: 2
原来这个软件包目录上是我从其他服务器上复制过来的 ``tar`` 包,所以解压缩以后属主group依然是另一个系统的用户group,在本地不存在。简单修复一下整个源代码目录属主为当前用户属主的组即可。
编译RPM报错 ``error: Failed build dependencies``
---------------------------------------------------
在 SUSE SLES 12 环境下编译RPM会有依赖错误:
.. literalinclude:: build_glusterfs_11_for_suse_12/make_glusterrpms_error2
:caption: 执行 ``make glusterrpms`` 报错 ``error: Failed build dependencies``
所以编译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
- 我尝试修改 ``extras/LinuxRPM`` 目录下的 ``Makefile.am`` 在 ``autogen:`` 段落将 ``./configure --enable-gnfs --with-previous-options`` 修订为 ``./configure --disable-linux-io_uring`` (注意,不是修改 ``Makefile.in`` ,这个 ``Makefile.in`` 和 ``Makefile`` 会被 ``Makefile.am`` 覆盖):
.. literalinclude:: build_glusterfs_11_for_suse_12/Makefile
:caption: 修改 ``Makefile`` 设置 ``configure`` 参数
:emphasize-lines: 5
不过,比较奇怪,虽然这里 ``autoconfig`` 输出信息已经是 ``./configure --disable-linux-io_uring`` ,但实际报错依旧
.. warning::
实在没有时间和精力折腾了,虽然还是没能搞成SUSE的rpm包(其他折腾见 :ref:`try_fix_build_glusterfs_6_for_suse_12_makefile` ),但是项目工作还是能完成的(因为我通过源代码编译能 ``make install`` ),暂时就这样吧...
参考
======
- `File glusterfs.spec of Package glusterfs `_
- `Building GlusterFS `_