对于做操作系统的开发者来讲,一个干净的环境尤为重要。就我所接触的,能够实现自己的环境不被其他人“打扰”,有容器,chroot和mock环境了。前面两个超级简单,一个直接run镜像,一个就是chroot到某个文件系统,稍微复杂一点就是如何搭建属于自己的mock环境了,接下来就实操一下。
操作系统环境
[root@localhost ~]# cat /etc/.productinfo
KYLIN Linux Advanced Server
Release V10(SP1)/(Tercel)-sw64-Build22.1-20210702-JUN
[root@localhost ~]#
mock版本
[root@localhost ~]# rpm -q mock
mock-1.4.14-1.p02.ky10.noarch
[root@localhost ~]#
装完mock这个安装包之后,我们只需要准备一个cfg文件,默认自带有一个cfg文件
[root@localhost ~]# rpm -ql mock|grep cfg
/etc/mock/site-defaults.cfg
这里过于复杂,我这里有一个模板,直接拿来套用即可
[root@localhost ~]# cat /etc/mock/leechm.cfg
config_opts['package_manager'] = 'yum'
config_opts['chroothome'] = '/builddir'
config_opts['use_host_resolv'] = False
config_opts['basedir'] = '/var/lib/mock'
config_opts['rpmbuild_timeout'] = 86400
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
keepcache=1
install_weak_deps=0
strict=1
# repos
[NeoKylin-Base]
name=NeoKylin-Base
priority=1
failovermethod=priority
#baseurl=http://10.1.82.10/kojifiles/repos/ns7.4-build/latest/mips64el/
baseurl=http://172.25.130.201/kojifiles/repos/swky10-build/latest/sw_64
[NeoKylin-Fedoradd]
name=NeoKylin-Fedora
priority=11
failovermethod=priority
baseurl=http://172.25.130.201/kojifiles/internal-repos/
"""
#config_opts['chroot_setup_cmd'] = 'install bash bzip2 coreutils cpio diffutils findutils gawk gcc gcc-c++ glibc-all-langpacks grep gzip info fedora-release kylin-rpm-config make patch rpm rpm-build sed shadow-utils tar unzip util-linux which xz vim wget lrzsz'
config_opts['chroot_setup_cmd'] = 'install @build'
config_opts['target_arch'] = 'sw_64'
config_opts['root'] = 'leechm'
config_opts['plugin_conf']['root_cache_enable'] = False
config_opts['plugin_conf']['yum_cache_enable'] = False
config_opts['plugin_conf']['ccache_enable'] = False
config_opts['macros']['%_host'] = 'sw_64-koji-linux-gnu'
config_opts['macros']['%_host_cpu'] = 'sw_64'
config_opts['macros']['%vendor'] = 'KylinSoft'
config_opts['macros']['%distribution'] = 'KylinSoft'
config_opts['macros']['%_topdir'] = '/builddir/build'
config_opts['macros']['%_rpmfilename'] = '%%{NAME}-%%{VERSION}-%%{RELEASE}.%%{ARCH}.rpm'
config_opts['macros']['%packager'] = 'Kylin Linux'
[root@localhost ~]#
1. repo改成自己仓库的地址
2. 红色字体根据自己宿主机的情况修改
3. 其他不变
mock编译过程最好不要用root身份,先建立一个普通的用户。
[root@localhost ~]# useradd leechm
[root@localhost ~]# usermod -a -G mock leechm
[root@localhost ~]# su - leechm
使用mock配置文件来进行编译
[leechm@localhost ~]$ mock -r leechm --init #初始化,不需要加.cfg后缀,第一步必须先init一下
[leechm@localhost ~]$mock -r leechm shell #进入到mock环境中
[leechm@localhost~]$ mock -r leechm --rebuild package-1.2-3.src.rpm #开始搭建环境并编译,使用此命令每次都会清空原有环境,重新搭建编译环境。
[leechm@localhost~]$ mock -r leechm --no-clean --rebuild package-1.2-3.src.rpm # 不对环境进行清理,检测并安装依赖的包后,进行编译。
[leechm@localhost~]$ mock -r leechm --install yum --no-clean #在mock环境中装包,当然也可以shell进去之后直接yum装
其实mock环境跟chroot环境类似,在/var/lib/mock/leechm/root下其实就是一个chroot环境
[leechm@localhost ~]$ mock -r leechm shell
INFO: mock.py version 1.4.14 starting (python version = 3.7.4)...
Start: init plugins
INFO: selinux disabled
Finish: init plugins
Start: run
Start: chroot init
INFO: calling preinit hooks
INFO: enabled HW Info plugin
Finish: chroot init
Start: shell
sh: /sbin/ip: No such file or directory
Welcome to 4.19.90-25.0.v2101.ky10.sw_64
System information as of time: 2021年 10月 08日 星期五 20:22:02 CST
System load: 0.21
Processes: 681
Memory used: 5.2%
Swap used: 0.0%
Usage On: 89%
IP address:
Users online: 0
<mock-chroot> sh-5.0# ls
bin etc lib mnt root sys var
boot grafana-6.7.4-1.ky10.ky10.src.rpm maude-2.7.1 mpir-3.0.0-12.fc34.src.rpm run tamarin-prover yum
builddir home Maude-2.7.1.tar.gz opt sbin tmp
dev leveldbjni-1.8-20.ky10.src.rpm media proc srv usr
<mock-chroot> sh-5.0#
[root@localhost root]# ls
bin etc lib mnt root sys var
boot grafana-6.7.4-1.ky10.ky10.src.rpm maude-2.7.1 mpir-3.0.0-12.fc34.src.rpm run tamarin-prover yum
builddir home Maude-2.7.1.tar.gz opt sbin tmp
dev leveldbjni-1.8-20.ky10.src.rpm media proc srv usr
[root@localhost root]#
总结一下:
总的来说,就是一个cfg文件,放到/etc/mock/下,然后就是绑定普通用户属性,进入普通用户先init初始化,然后shell进入mock环境中,在mock环境中就可以放飞自我了。