构建XenServer编译环境

社区版XenServer是一款开源产品。那么拿到这款社区版首先想到的是怎么把它build出来,然后怎么把它部署起来,最后才是巴拉巴拉吧啦。。。

我们先来解决第一步,编译源码,编译之前需要先构建编译环境,构建好编译环境后以xapi为例进行编译。xapi是用OCaml这种语言写的,本人对这种语言一窍不通。这儿就不讨论了 ……

准备

本人打算使用容器进行编译xapi,所以你得先有个docker环境,然后呢编译的是xapi代码也得自己下好吧。

具体操作,巴拉巴拉吧啦。

构建编译环境

拉取xenserver-build-env

使用docker pull xenserver/xenserver-build-env命令拉取镜像,这是个漫长的过程还有可能失败,镜像还挺大。

喝杯茶,慢慢等吧。。。

启动编译容器

走到这里,说明你的镜像拉取成功了,那么我们需要启动镜像,本人推荐使用下列方法启动镜像

1
$ docker run -i -t -v /home/{xxxx}/labs/xen-api:/mnt/repos --name xapi-builder xenserver/xenserver-build-env /usr/local/bin/init-container.sh

别傻乎乎的copy直接用啊,里面的路径要根据实际情况自己调整,我懒了你不能懒。

网上坛子里有人推荐加参数-u builder,的确build的过程不推荐使用root用户;我用root是因为我要把它装到容器里,用builder会引入一些权限和环境问题。所以我用root了,您根据自己的情况而定。别盲从!!!

配置编译环境

你是否以为下载好了镜像,并且成功的启动的容器,就可以顺理成章的编译了?哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈,别做梦了。哪有那么简单,社区版不给你点儿坑你都觉得不过瘾。

安装dep包

1
# yum-buiddep xapi

我是root,不是root自己加sudo去。

初始化opam

卧槽,opam什么东西,一脸的懵B啊!?不用太深究,就是一个类似pip的包管理器;想深究的可以自己研究OPAM

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# opam init

...

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

1. To configure OPAM in the current shell session, you need to run:

eval `opam config env`

2. To correctly configure OPAM for subsequent use, add the following
line to your profile file (for instance ~/.profile):

. /root/.opam/opam-init/init.sh > /dev/null 2> /dev/null || true

3. To avoid issues related to non-system installations of `ocamlfind`
add the following lines to ~/.ocamlinit (create it if necessary):

let () =
try Topdirs.dir_directory (Sys.getenv "OCAML_TOPLEVEL_PATH")
with Not_found -> ()
;;

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
...
#

看到这段英文了吧,1、2、3,乖乖的照做,要不管保你编不过。

最后切记,将eval \opam config env`加到~/.bashrc~/.profile`中。

使用opam安装包ocamlfind, cmdliner, jbuilder

1
2
3
4
# opam depext conf-m4.1
...
# opam install ocamlfind cmdliner jbuilder
...

安装过程中有需要点确认的授权的,改给就给,千万别搞事情!

到此为止环境的搭建算是完成了,记住这个session不要退,再开一个session去做编译一会儿有惊喜。。。

编译xapi

使用docker exec -it xapi-builder /bin/bash登录进你的容器,像上文说到的你可以使用-u builder参数。

废话不多说直接编译

1
2
3
4
5
$ cd /mnt/repo/
$ ./configure
...
$ make
...

别急,会报错的,看到了吧。stack overflow,去网上搜吧,一搜返回一堆stack overflow的网站,哈哈哈!!!

别急,还记得之前保留的那个session吗,对,就是那个session。输入ulimit -a看看里面的stack size;再对比看看报错的那个session的stack size。是不是有一种恍然大悟的感觉。没错设置一下报错session的stack size就可以了ulimit -s 16384


你刚刚经历了一个华丽的分割线。。。


如果你使用xenserver-build-env创建编译环境,可以省去很多步骤。

创建编译容器

1
2
3
$ git clone git://github.com/xenserver/xenserver-build-env
$ cd xenserver-build-env
$ ./build.sh

编译xapi

1
2
3
4
5
6
7
8
$ ./run.py -p xapi --rm

# --- you are now inside the docker container ---

$ git clone git://github.com/xapi-project/xen-api
$ cd xen-api
$ ./configure
$ make

制作RPM Package

在Centos系统中制作RPM包,需要用到rpmbuild,所以你要用yum安装好。当然上面的编译容器已经将rpmbuild安装好了。那么的接下来的重点在于SPEC文件编写,SPEC用来告诉rpmbuild,制作的每一个过程需要做哪些动作。

SPEC文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
Name:   xen-api     
Version: 1.60.2
Release: 1%{?dist}
Summary: rpm xen-api modify

Group: Application/test
License: Share
Source: $RPM_SOURCE_DIR/xen-api-1.60.2_m.tar.gz


%description
print xen-api


%prep
rm -rf $RPM_BUILD_DIR/xen-api-1.60.2
zcat $RPM_SOURCE_DIR/xen-api-1.60.2_m.tar.gz | tar xvf -

%build
cd $RPM_BUILD_DIR/xen-api-1.60.2
./configure
make %{?_smp_mflags}


%install
cd $RPM_BUILD_DIR/xen-api-1.60.2
make install DESTDIR=%{buildroot}


%files
/etc
/var
/usr
/opt
%doc

创建目录SOURCESPECSBUILDRPMSSRPMS,将SPEC文件放入到SPECS文件件中,然后将源代码做成xen-api-1.60.2_m.tar.gz拷贝到SOURCE目录。最后执行rpmbuild -ba {SPEC文件}。执行完毕后,在RPM目录中生成我们需要的RPM包

参考&鸣谢