Jul 30

[原]使用Mock 实现跨平台跨发行版编译RPM 多云

linuxing , 16:44 , 基础知识 » RPM , 评论(0) , 引用(0) , 阅读(37164) , Via 本站原创 | |
    通常我们都是在现有系统的环境中,对当前硬件平台的软件进行编译为RPM 的工作。但由于各种原因,例如硬件不支持,机器不够,磁盘空间问题等,我们可能需要进行跨平台编译的工作。类似的,为不同发行版进行编译也是常有的问题。Mock 是一套在Fedora 上用于实现跨平台、跨版本编译RPM的工具,其支持Build FC1-6、RH7.3、RH9、RHEL3-5、CentOS 1-5 等平台工作。我现用于在Asianux 3.0 上。

一、关于Mock
Mock 是Fedora Projects 其中一个项目,主要用于实现chroot 环境下,编译RPM 的工作。其原理是通过Yum 获取指定发行版、指定平台的rpm 包,解压后,以chroot 的环境进行编译。因此,可以实现在x86_64 环境下,编译i386 平台软件的功能。
官网地址:这里
下载地址:点击,从此地址可知,1.0 以下版本适用于FC1-6、 EL5平台,1.1 支持F-13+ 和 EL-6 环境。

我的当前环境是:Asianux 3.0 SP4 x86_64,IP:192.168.228.152
CentOS 5 Extras 源有提供mock 0.6 的下载:点击
本地下载:
(已加入Asianux 3.0 x86_64和Asianux i386的配置文件,含源码)
安装:
# rpm -ivh mock-0.6.13-1.AXS3.1.x86_64.rpm

※ Fedroa EPEL 项目中,有1.0.28 的版本,支持FC13+ 以及RHEL6等,但依赖的python 库较多,我没一一测试。

二、使用Mock
1.配置Yum 源环境
1)构建系统软件源
Mock 需要从Yum 源获得软件包,所以,必须有正确可用的Yum 源路径。请参考:[原]使用yum更新红旗Linux 一文的描述。当然,Asianux 3.0 已经带有所需的软件包,不需额外安装。通常只需把光盘镜像挂载到特定的目录(例如Web 根目录)即可:

# mkdir /var/www/html/ax3sp4
# mount -o loop /data/Asianux-30-SP4-ia32-rc-dvddisc-201106011404.iso /var/www/html/ax3sp4/

通过http://192.168.228.152/ax3sp4 访问光盘。Asianux 3.0 的光盘根目录已建好repodata 数据库,不需再创建。

2)实现Chroot 环境的软件源
另外,除了上述RPM 所需要的系统软件包,Mock 还需要用于实现chroot 环境的组。这由 buildsys-build 和 buildsys-macros 软件包提供。在Mock 包中,有一个spec 文件用于生成这两个包:
引用
# rpm -ql mock|grep spec
/usr/share/doc/mock-0.6.13/buildsys-build.spec

更高版本buildsys-build 0.7.2 的spec 可点击这里,而buildsys-macros 的src.rpm ,可到点击这里
Fedora、CentOS 和RHEL 在互联网上直接可用的环境(在配置文件中调用),但Asianux 需要另行编译。我已经编译好两个软件包,本地下载:
下载后,放到特定的目录中,例如:
引用
# ll /var/www/html/buildsys/
总计 12
-rw-r--r-- 1 root root 2769 07-27 16:52 buildsys-build-0.7.2-1.AXS3.noarch.rpm
-rw-r--r-- 1 root root 2689 07-27 17:19 buildsys-macros-5-5.AXS3.noarch.rpm

然后进入该目录,生成依赖数据库:

# cd /var/www/html/buildsys/
# createrepo ./

类似的,通过http://192.168.228.152/buildsys访问,成功即可。
※ 补充:若还有其他软件包是编译后续RPM 包所必须的,这必须采用相同的方法再建立其他组。否则,编译RPM 时,会出现包缺少的问题!

2.创建Mock 配置文件
在/etc/mock 目录中有现成的配置文件,我们找一个最接近的,拷贝后进行修改。以构建Asianux 3.0 SP4 x86环境为例,配置文件/etc/mock/asianux-3-i386.cfg内容如下:


可见,上面通过Yum 引用了之前创建的两个软件源。

3.创建用户
Mock 不能使用root 构建虚拟环境:
引用
# mock
You need to be a member of the mock group for this to work

我们需要创建一个单独的用户,并把其加入到mock 组中,例如:

# useradd mockbuild -G mock

4.编译RPM
一切准备好,就可以开始进行RPM 的编译工作了。切换到普通用户mockbuild后执行:
引用
[root@linuxfly ~]# su - mockbuild
[mockbuild@linuxfly ~]$ mock -r asianux-3-i386 rebuild unifdef-1.171-5.fc6.src.rpm
init
clean
prep
This may take a while
setup
build
ending
done
Results and/or logs in: /var/lib/mock/asianux-3-i386/result

编译将在/var/lib/mock/目录中进行,可关注其中的result 目录,编译结果也将放在该目录中:
引用
[mockbuild@linuxfly ~]$ uname -m
x86_64
[mockbuild@linuxfly ~]$ cd /var/lib/mock/asianux-3-i386/result/
[mockbuild@linuxfly result]$ ll
总计 92
-rw-r--r-- 1 mockbuild mock  3248 07-27 17:24 build.log <--编译日志
-rw-r--r-- 1 mockbuild mock   138 07-27 17:22 mockconfig.log <--配置文件信息
-rw-r--r-- 1 mockbuild mock 25915 07-27 17:24 root.log <--mock 执行日志
-rw-r--r-- 1 mockbuild mock 14538 07-27 17:24 unifdef-1.171-5.AXS3.i386.rpm
-rw-r--r-- 1 mockbuild mock 15678 07-27 17:24 unifdef-1.171-5.AXS3.src.rpm
-rw-r--r-- 1 mockbuild mock 23541 07-27 17:24 unifdef-debuginfo-1.171-5.AXS3.i386.rpm

可见,我在x86_64 的系统平台下,成功编译出i386 的软件包。这非常方便哦!

默认情况下,mock 每次执行编译的工作时,都会清掉旧系统环境(clean 动作),可通过--no-clean 参数禁止,以加快编译速度。(但可能会产生额外的问题)

[mockbuild@linuxfly ~]$ mock --no-clean -r asianux-3-i386 rebuild unifdef-1.171-5.fc6.src.rpm

此外,当不给定-r 参数时,mock 将采用/etc/mock/default.cfg 配置文件。所以,我们可以把该配置文件指向常用的配置,以简化操作:

[root@linuxfly mock]# cd /etc/mock
[root@linuxfly mock]# ln -s asianux-3-i386.cfg /etc/mock/default.cfg
[root@linuxfly mock]# ll default.cfg
lrwxrwxrwx 1 root root 18 07-27 18:51 default.cfg -> asianux-3-i386.cfg
[root@linuxfly mock]# su - mockbuild
[mockbuild@linuxfly ~]$ mock --no-clean rebuild unifdef-1.171-5.fc6.src.rpm

根据这里的说明,如果系统中python为2.4版本,并且mock 版本低于0.8.8,那么在x86_64 环境中编译i386 的软件包,应该使用setarch i386 命令,例如:

setarch i386 mock -r <configfile> --rebuild package-1.2-3.src.rpm

但实际上,我在Asianux 3.0 SP4 x86_64的环境中就是匹配上述的环境的,但并没有使用setarch i386似乎也没问题。不过,反正留意一下吧。

三、附录
1.问题
如果在执行mock 命令时,报:
引用
Could not find useradd in chroot, maybe the install failed

这是因为chroot 环境没搭建成功,除了mock 软件安装的问题,更多的可能是配置文件中没有加入buildsys 组,也就是缺少buildsys-build 和 buildsys-macros 两个软件包。这两个包虽然不是编译RPM 所必须的,但却是mock 构建chroot 环境所必须的!

生成这两个包很简单,通过编译mock 自带的spec 文件以及buildsys-macros 即可。对于Asianux 3.0 环境,需要修改某些地方:
引用
# cat buildsys-build.spec
......
# Asianux block
%if "%{?asianux}" != ""
Requires: asianux-release

Requires: coreutils
Requires: elfutils
Requires: asianux-rpm-config
%endif
......

# cat buildsys-macros.spec
......
%install
rm -rf $RPM_BUILD_ROOT
mkdir -p $RPM_BUILD_ROOT/etc/rpm/
VERSION=%{version}
printf %s%b "%" "rhel $VERSION\n" >> $RPM_BUILD_ROOT/etc/rpm/macros.disttag
printf %s%b "%" "asianux %{asianux}\n" >> $RPM_BUILD_ROOT/etc/rpm/macros.disttag
printf %s%b "%" "dist %{dist}\n" >> $RPM_BUILD_ROOT/etc/rpm/macros.disttag

printf %s%b "%" "el$VERSION 1\n" >> $RPM_BUILD_ROOT/etc/rpm/macros.disttag
printf %s%b "%" "__arch_install_post /usr/lib/rpm/check-buildroot\n" >> $RPM_BUILD_ROOT/etc/rpm/macros.checkbuild
......

源码:
2.参考资料
Using Mock to test package builds
用 Mock 來打包各版本的 Fedora RPMS
Tags:
发表评论
表情
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
打开HTML
打开UBB
打开表情
隐藏
记住我
昵称   密码   游客无需密码
网址   电邮   [注册]