本站以分享各种运维经验和运维所需要的技能为主
《python零基础入门》:python零基础入门学习
《python运维脚本》: python运维脚本实践
《shell》:shell学习
《terraform》持续更新中:terraform_Aws学习零基础入门到最佳实战
《k8》暂未更新
《docker学习》暂未更新
《ceph学习》ceph日常问题解决分享
《日志收集》ELK+各种中间件
《运维日常》运维日常
《linux》运维面试100问
《DBA》db的介绍使用(mysql、redis、mongodb...)
ceph手动编译进行代码层面修复
一、ceph编译
前言:
由于编译环境还是有要求的,建议在虚拟机或者容器下去编译,方便以后自己debug,容器也好做成镜像存储,方便以后更换机器也可以更好地去编译环境。
docker pull centos:7 docker run -itd --name my_container -v /your_ml:/container_ml centos:7 docker commit my_container my_new_image #导出导入 docker save -o /path/to/save/my_image.tar my_image docker load -i /path/to/my_image.tar
拉取代码进行编译
git clone /ceph/ git fetch --tags git checkout tags/v14.2.22 编译过程: ./ # --- 看下面补充依赖 ./do_cmake.sh -DWITH_MANPAGE=OFF -DWITH_BABELTRACE=OFF -DWITH_MGR_DASHBOARD_FRONTEND=OFF -DCMAKE_BUILD_TYPE=release -DWITH_CCACHE=ON cd build nohup make -j20 > # 如果想单独编译某个二进制:make ceph-osd -j20
添加编译时需要的依赖: ./ 在执行./时,提示“Error: No Package found for python-scipy”, 先跳过: cd /ceph-build/ceph sed -i -e '/BuildRequires: python%{_python_buildid}-scipy/d' 补充依赖: yum -y install libaio-devel openssl-devel expat-devel liboath-devel lttng-ust-devel libbabeltrace-devel python36-Cython fuse-devel libnl3-devel librabbitmq-devel libcap-ng-devel gperf librabbitmq-devel librdkafka-devel nss python-sphinx rdma-core-devel systemd-devel libblkid-devel keyutils-libs-devel openldap-devel leveldb-devel snappy-devel lz4-devel curl-devel nss-devel.x86_64 python-devel.x86_64 Cython.x86_64 ncurses-devel ccache
换ceph-osd bin文件后osd起不来:
0、缺ceph-common,ldd ceph-osd看一下,看下集群原本的ldd ceph-osd-bak的common路径,然后用这个common路径做个软链接放在当前目录下(ceph-osd在哪儿,软链接common就在哪儿)
1、load dlopen(/usr/local/lib64/ceph/erasure-code/libec_jerasure.so): /usr/local/lib64/ceph/erasure-code/libec_jerasure.so: cannot open shared object file: No such file or directory
修改方式:编译时build目录的修改条目为 去掉 /local CMAKE_INSTALL_PREFIX:PATH=/usr/local _GNUInstallDirs_LAST_CMAKE_INSTALL_PREFIX:INTERNAL=/usr/local
改完后:
cd build sed -i 's/CMAKE_INSTALL_PREFIX:PATH=\/usr\/local/CMAKE_INSTALL_PREFIX:PATH=\/usr/g' sed -i 's/_GNUInstallDirs_LAST_CMAKE_INSTALL_PREFIX:INTERNAL=\/usr\/local/_GNUInstallDirs_LAST_CMAKE_INSTALL_PREFIX:INTERNAL=\/usr/g' [ build]$ cat -n | egrep "CMAKE_INSTALL_PREFIX|_GNUInstallDirs_LAST_CMAKE_INSTALL_PREFIX" 212 CMAKE_INSTALL_PREFIX:PATH=/usr 1911 //CMAKE_INSTALL_PREFIX during last run 1912 _GNUInstallDirs_LAST_CMAKE_INSTALL_PREFIX:INTERNAL=/usr
2、ceph-osd: 2023-01-04 15:18:11.277 7f448d846a80 -1 load: jerasure expected plugin /usr/lib64/ceph/erasure-code/libec_lrc.so version IT-NOTFOUND but it claims to be 14.2.22 instead
修改方式:src/
就是先把检查版本给OFF掉,然后在后面强制将版本设置为14.2.22。
180 option(ENABLE_GIT_VERSION "build Ceph with git version string" OFF)# ON ---> OFF 181 if(${ENABLE_GIT_VERSION}) 182 get_git_head_revision(GIT_REFSPEC CEPH_GIT_VER) 183 git_describe(CEPH_GIT_NICE_VER --always) 184 #if building from a source tarball via make-dist 185 if(${CEPH_GIT_VER} STREQUAL "GITDIR-NOTFOUND") 186 message(STATUS "Ceph/.git directory not found, parsing ${CMAKE_CURRENT_SOURCE_DIR}/.git_version for CEPH_GIT_VER and CEPH_GIT_NICE_VER") 187 file(STRINGS ${CMAKE_CURRENT_SOURCE_DIR}/.git_version CEPH_GIT_SHA_AND_TAG) 188 list(GET CEPH_GIT_SHA_AND_TAG 0 CEPH_GIT_VER) 189 list(GET CEPH_GIT_SHA_AND_TAG 1 CEPH_GIT_NICE_VER) 190 endif(${CEPH_GIT_VER} STREQUAL "GITDIR-NOTFOUND") 191 # remove 'v' prefix from raw git version 192 string(SUBSTRING ${CEPH_GIT_NICE_VER} 1 -1 CEPH_GIT_NICE_VER) 193 else(${ENABLE_GIT_VERSION}) 194 set(CEPH_GIT_VER "no_version") 195 set(CEPH_GIT_NICE_VER "Development") 196 endif(${ENABLE_GIT_VERSION}) 197 set(CEPH_GIT_NICE_VER "14.2.22") # --- 添加变量直接覆盖你当下版本
这个错误表明你当前使用的 GCC 版本低于 Ceph 所需的最低版本。Ceph 14.2.22 需要 GCC 7 或者更高版本,因为它使用了 C++17 的一些特性。 你可以使用以下命令来查看你当前的 GCC 版本: ```bash gcc --version ``` 如果你的 GCC 版本低于 7,你需要升级你的 GCC。在 CentOS 7 上,你可以使用以下命令来安装 GCC 7: ```bash sudo yum install centos-release-scl sudo yum install devtoolset-7-gcc* ``` 安装完成后,你需要启用新安装的 GCC。你可以使用以下命令来启用: ```bash scl enable devtoolset-7 bash ``` 这将会在新的 shell 会话中启用 GCC 7。你可以再次使用 `gcc --version` 命令来确认你的 GCC 版本。 注意,`scl enable` 命令只会在当前的 shell 会话中启用 GCC 7。如果你退出了 shell 会话,或者在新的 shell 会话中编译 Ceph,你需要再次运行 `scl enable` 命令。
二、将编译后bin下的二进制cp到集群下node进行替换
我的集群二进制都在 /usr/bin/下,其他看自己情况。
替换完之后重启即可