在进行编包的时候大多数人会使用rpmbuild命令在本机进行编译,这样可以使一些依赖及本地相关包的修改可以生效,但在开发过程中必须模拟用户的环境或是构建一个“干净的”环境(既没有任何其他依赖的改动,直接从yum下载构建一个纯用户环境),这样我们就需要
在进行编包的时候大多数人会使用rpmbuild命令在本机进行编译,这样可以使一些依赖及本地相关包的修改可以生效,但在开发过程中必须模拟用户的环境或是构建一个“干净的”环境(既没有任何其他依赖的改动,直接从yum下载构建一个纯用户环境),这样我们就需要mock命令来构建这样一个编译的纯环境来进行编译软件包。
1,安装mock
mock的安装方法比较简单,请参照这篇文章即可。
2,mock使用方法
mock编译过程最好不要用root身份,先建立一个普通的用户。
[root@test ~]# useradd mockbuilder
[root@test ~]# usermod -a -G mock mockbuilder
[root@test ~]# su - mockbuilder
使用内置的mock配置文件来进行编译
mock 的配置文件在/etc/mock/目录下,系统默认内置了fedora、epel-5、epel-6等系统的配置文件,通过查看这些.cfg的配置文件,可以了解到Mock的原理,即软件使用yum来下载一个最小化的系统,并放入chroot环境中。
下面以编译fedora 15 64位系统的软件包来举例(对应的配置文件为fedora-15-x86_64.cfg)
[root@test ~]# mock -r fedora-15-x86_64 init #初始化,不需要加.cfg后缀
[root@test ~]# mock -r fedora-15-x86_64 rebuild package-1.2-3.src.rpm #开始编译过程
初始化以后的chroot环境位于:/var/lib/mock/fedora-19-x86_64/root目录下,可以用chroot命令切换此最小化环境。
编译后的信息和软件包会保存在:/var/lib/mock/fedora-19-x86_64/result。
3,自定义配置文件来编译
要定义自己的配置文件,首先需要指定一个yum源(.xml文件),并且该yum源中必须含有sysbuild分组。
这里先创建一个1.xml文件,指定sysbuild分组包含的软件包。然后根据1.xml生成repodata目录
在Yum源服务器上作些准备工作
[root@os1 os]# yum install createrepo
[root@os1 os]# ls
drpms Packages repodata
[root@os1 os]# mv repodata repodata-bak
[root@os1 os]# vim 1.xml 内容如下:
sysbuild
sysbuild
true
false
bash
bzip2
coreutils
cpio
diffutils
findutils
gawk
gcc
gcc-c++
grep
gzip
info
make
patch
sed
shadow-utils
tar
unzip
util-linux-ng
which
curl
git
gnupg
make
shadow-utils
redhat-release-server
redhat-rpm-config
rpm-build
?
sysbuild
sysbuild
mock mini require
60
sysbuild
在Yum源服务器上使用1.xml创建repodata
[root@os1 os]# createrepo -g 1.xml ./ #在./下生成新的repodata目录
[root@os1 os]# ls
1.xml drpms Packages repodata repodata-bak
在Mock服务器上创建自己的配置文件
[root@test ~]# cd /etc/mock
[root@test ~]# vim mock123.cfg 内容如下
config_opts['root'] = 'mock123-x86_64'
config_opts['target_arch'] = 'x86_64'
config_opts['chroot_setup_cmd'] = 'groupinstall sysbuild' #sysbuild要和1.xml文件定义的group标签中的name字段一致
config_opts['dist'] = 'mock123' #only useful for --resultdir variable subst
config_opts['plugin_conf']['ccache_enable'] = False
config_opts['yum.conf'] = """
?
[main]
cachedir=/var/cache/yum
debuglevel=1
logfile=/var/log/yum.log
reposdir=/dev/null
retries=20
obsoletes=1
gpgcheck=0
assumeyes=1
?
[local]
name=local
baseurl=http://localhost/x86_64/os #填写repodata目录的上一级目录
cost=2000
enabled=1
"""
拷贝过去的时候需要注意去掉注释,否则python会报SyntaxError: Non-ASCII的错误。
在Mock服务器上使用自己的配置文件进行编绎
[root@test ~]# su - mockbuilder
[mockbuilder@test ~]# mock -r mock123 --init
[mockbuilder@test ~]# mock -r mock123 --rebuild packages-1.2.3.src.rpm
如果修改了/etc/mock/mock123.cfg文件,则需要重新初始化chroot环境
[mockbuilder@test ~]# mock -r mock123 --clean all
[mockbuilder@test ~]# mock -r mock123 --init