内网环境离线编译源码步骤

由于本人存在特殊情况需要在内网环境中去编译源码,期间遇到很多小坑,现在分享一下自己离线编译源码的步骤。之前的部署是通过obd部署的1-1-1架构。

由于Oceanbase编译的脚本需要联网下载相关依赖,那么如果有内网环境进行编译的需要的话可能会比较困难,现尝试一下在离线环境进行编译。资源环境如下

角色 IP
中控机 xxx.xxx.xxx.51
OBServer xxx.xxx.xxx.52\xxx.xxx.xxx.53\xxx.xxx.xxx.54
OBProxy xxx.xxx.xxx.51
ob版本:oceanbase master分支
Linux版本:Red Hat Enterprise Linux Server release 7.6 (Maipo)
内核:3.10.0-957.el7.x86_64

1、github上下载oceanbase源码zip包,拷贝至内网环境机器中控机,并解压至/tmp/oceanbase-master

2、通过可连接外网的操作系统下载所需要的包

yumdownloader git wget rpm* cpio make glibc-devel glibc-headers binutils m4  --resolve --destdir=/tmp/obym

3、将这些包通过优盘拷贝到内网环境机器中控机/tmp/obym,并在/tmp/obym中执行rpm安装指令

rpm -ivh --force --nodeps *.rpm

4、之后需要把 /tmp/oceanbase-master/src/sql/parser/ 中的 gen_parser.sh 和 gen_type_name.sh 的执行权限打开

cd src/sql/parser/
sudo chmod 744 gen_parser.sh
sudo chmod 744 gen_type_name.sh

5、将/tmp/oceanbase-master/deps/init/xxxxxxxx.deps(查看匹配自己操作系统环境的.deps文件)中涉及的依赖包准备好。

[target-default]
os=7
arch=x86_64
repo=http://mirrors.aliyun.com/oceanbase/development-kit/el/7/x86_64/


[target-community]
os=7
arch=x86_64
repo=http://mirrors.aliyun.com/oceanbase/community/stable/el/7/x86_64/

[deps]
devdeps-gtest-1.8.0-132022101316.el7.x86_64.rpm
devdeps-isa-l-static-2.22.0-22022092915.el7.x86_64.rpm
devdeps-libcurl-static-7.29.0-32022093010.el7.x86_64.rpm
devdeps-libunwind-static-1.6.2-222022100410.el7.x86_64.rpm
devdeps-mariadb-connector-c-3.1.12-12022100422.el7.x86_64.rpm
devdeps-libaio-0.3.112-12022092915.el7.x86_64.rpm
devdeps-relaxed-rapidjson-1.0.0-52023011719.el7.x86_64.rpm
devdeps-openssl-static-1.0.1e-12022100422.el7.x86_64.rpm
devdeps-libxml2-2.10.3-32022111420.el7.x86_64.rpm
devdeps-mxml-2.12.0-12022090616.el7.x86_64.rpm
devdeps-apr-1.6.5-32022090616.el7.x86_64.rpm
devdeps-xz-5.2.2-42022090615.el7.x86_64.rpm
devdeps-lua-5.4.3-92022090614.el7.x86_64.rpm
devdeps-oss-c-sdk-3.9.2-182022100412.el7.x86_64.rpm
devdeps-zlib-static-1.2.7-132022100815.el7.x86_64.rpm
devdeps-ncurses-static-6.2-72022100815.el7.x86_64.rpm
devdeps-boost-1.74.0-22022110914.el7.x86_64.rpm
devdeps-s2geometry-0.9.0-42022111116.el7.x86_64.rpm
devdeps-icu-69.1-72022112416.el7.x86_64.rpm

[tools]
obdevtools-binutils-2.30-12022100413.el7.x86_64.rpm
obdevtools-bison-2.4.1-12022100413.el7.x86_64.rpm
obdevtools-ccache-3.7.12-12022100417.el7.x86_64.rpm
obdevtools-cmake-3.22.1-22022100417.el7.x86_64.rpm
obdevtools-flex-2.5.35-12022100417.el7.x86_64.rpm
obdevtools-gcc9-9.3.0-52022092914.el7.x86_64.rpm
obdevtools-llvm-11.0.1-312022092921.el7.x86_64.rpm

[tools-deps]
devdeps-oblogmsg-1.0-52022113019.el7.x86_64.rpm
devdeps-rocksdb-6.22.1.1-52022100420.el7.x86_64.rpm

[test-utils]
ob-deploy-1.6.0-41.el7.x86_64.rpm target=community
obclient-2.0.2-3.el7.x86_64.rpm target=community
libobclient-2.0.2-2.el7.x86_64.rpm target=community

这些包的准备方法是先尝试编译,登录到可连接外网的机器上,执行如下命令。

bash build.sh debug --init --make

此次编译可能会失败也可能成功,这并不要紧,但是会发现deps/中多了deps/3rd/pkg,此时pkg文件夹中已经有了上述的依赖包,将这些依赖包拷贝到内网环境。

clean本次失败的编译

bash build.sh clean

在内网的机器上手动创建deps/3rd/pkg文件夹,将这些包拷贝到deps/3rd/pkg文件夹。

6、修改deps/init/dep_create.sh脚本,将rm -rf xxxxxx注释掉。因为这句会清空deps/3rd/pkg,就白拷贝了。同时修改function get_os_release() 方法使得编译通过,case中添加下段代码,因为默认不支持红帽,不添加代码会编译报错,但是可以让脚本认为rhel与centos有依赖关系即可通过校验。

 rhel)
        version_ge "7.6" && compat_centos7 && return

7、进入/tmp/oceanbase-master,执行编译。

debug mode

bash build.sh debug --init --make

release mode

bash build.sh release --init --make

8、通过obd停止集群

obd cluster stop xxxx

9、在中控机中编译出来的observer( build_debug(或者build_release)/src/observer )文件覆盖1-1-1集群中的每一个observer文件,该observer的路径如下(覆盖前请先做一个原observer文件的备份)。

/home/admin/.obd/repository/oceanbase-ce/4.1.0.0/xxxxxxxxx/bin/observer

10,回到中控机,重启集群。

obd cluster start xxxx

11、再次通过obclient登录,可见版本变化。

12、之后在修改源码后的编译就不需要build init 了,可通过下面命令进行编译.-j后边的参数可根据自己的cpu核数适当调整以加快编译速度。

bash build.sh debug --make -j 64
15 个赞

niubility

2 个赞

学习了,非常不错!

666 :grin:初学者受用了

厉害了

真厉害

学习了

/home/admin/.obd/repository/oceanbase-ce/4.1.0.0/xxxxxxxxx/bin/observer 

cp 是可以的。集群建立的时候会做hash校验,后面不需要做做了吗、

666,编译一次要多久

我也是有看到github wiki里有 直接替换observer 的这样一种方法。hash校验这块还请赐教.

这个就得看机子的性能了。。。我自己的本子,初始化得快30分钟了。

不容易啊