定制Linux发行版:向CentOS6安装镜像添加自定义软件包

时间:2021-12-12 06:31:05

定制Linux发行版的一个重要步骤,是向安装程序添加自定义的软件包,这里简要记录一下过程。本文的实验环境基于CentOS 6.4 64bit。

首先需要明白一下概念,通常来讲,一个package指一个软件包,一个group里包含了若干个package,一个category里则包含了若干个group。只要明白这点,下面就简单多了。在使用Linux安装光盘安装系统的时候,有一个自定义软件包的步骤。在此步骤中,左侧显示的是category,右则显示的是group。它们之间对应关系记录于repodata/xxx-comps.xml文件中。

首先我们需要编辑repodata/xxx-comps.xml,但是xxx-comps.xml文件内容太杂,大概 2万多行,所以我们需要对xxx-comps.xmll进行一个预处理:

#
comps.xml包含最多的是各国语言
#
我们先去除不需要的语言,这里我只需要英文,
sed
-ri '/xml:lang/ {/en_GB/!d}' comps.xml  
# 如果需要保留其他语言比如中文,在en_GB后添加"¦zh_CN"

repodata/xxx-comps.xml文件的写法:

<?xml version='1.0' encoding='UTF-8'?><!DOCTYPE comps PUBLIC "-//CentOS//DTD Comps info//EN" "comps.dtd"><comps>   <group>   <id>组1的ID,非数字</id>   <name>组1的名字</name>   <description>组1的描述</description>   <default>是否预安装,true或者false</default>   <uservisible>是否可见,true或者false</uservisible>   <langonly>zh</langonly>  #仅在某个语系的安装界面中显示,可选项   <packagelist>      <packagereq requires="依赖包" type="conditional">软件包1</packagereq>      <packagereq type="default">软件包2</packagereq>      <packagereq type="default">软件包3</packagereq>   </packagelist>  </group>  <group>   <id>组2的ID,非数字</id>   <name>组2的名字</name>   <description>组2的描述</description>   <default>是否预安装,true或者false</default>   <uservisible>是否可见,true或者false</uservisible>   <packagelist>      <packagereq requires="依赖包" type="conditional">软件包1</packagereq>      <packagereq type="default">软件包2</packagereq>      <packagereq type="default">软件包3</packagereq>   </packagelist>  </group>……   <category>   <id>分类1的名字,非数字</id>   <name>将显示在左侧列表里</name>   <description>将显示在下面的描述栏里</description>   <grouplist>    <groupid>组1的ID</groupid>    <groupid>组2的ID</groupid>    <groupid>组3的ID</groupid>   </grouplist>  </category>  <category>   <id>分类2的名字,非数字</id>   <name>将显示在左侧列表里</name>   <description>将显示在下面的描述栏里</description>   <grouplist>    <groupid>组4的ID</groupid>    <groupid>组5的ID</groupid>    <groupid>组6的ID</groupid>   </grouplist>  </category> </comps>

下面,我们试着来操作以下,向CentOS 6.4的安装光盘中添加一个category及group。

[root@bear ~]# yum install createrepo[root@bear ~]# mkdir /root/image[root@bear ~]# mount /dev/cdrom /mnt[root@bear ~]# cp -pa /mnt/* /root/image/注意:复制的时候必须加上参加-a,因为光盘下有隐藏的文件.treeinfo和.discinfo,如果不加-a参数,会导致这两个文件的遗漏[root@bear ~]# cd /root/image/[root@bear image]# cp repodata/*-comps.xml ./comps.xml    #把原有group信息复制到光盘根目录并重命名为comps.xml[root@bear image]# vi comps.xml    #向其中添加自定义的category及group内容
在第三行的<comps>之后,添加以下内容  <group>   <id>inspur-security-group</id>   <name>Inspur Security Group</name>   <description>Some security packages provided by Inspur company.</description>   <default>true</default>   <uservisible>true</uservisible>   <packagelist>      <packagereq type="default">httpd</packagereq>      <packagereq type="default">mysql</packagereq>   </packagelist>  </group>   <group>   <id>inspur-optimization-tools</id>   <name>Inspur Optimization Tools</name>   <description>Some optimization packages provided by Inspur company.</description>   <default>true</default>   <uservisible>true</uservisible>   <packagelist>      <packagereq type="default">php</packagereq>      <packagereq type="default">php-mysql</packagereq>   </packagelist>  </group> 在最后一行的</comps>之前,添加以下内容  <category>   <id>inspur-extra</id>   <name>Inspur Extra</name>   <description>Inspur extra Packages</description>   <grouplist>    <groupid>inspur-security-group</groupid>    <groupid>inspur-optimization-tools</groupid>   </grouplist>  </category>
[root@bear image]# declare -x discinfo=`head -1 .discinfo`[root@bear image]# createrepo -u "media://$discinfo" -g comps.xml ./[root@bear image]# rm comps.xml

最后,把这些文件重新打包成iso文件:

[root@bear image]# cd /root/image/  #确保自己在镜像根目录中[root@bear image]# mkisofs -R -l -r -T -no-emul-boot -J -c isolinux/boot.cat -b isolinux/isolinux.bin -o /root/k-ux.iso -boot-load-size 4 -boot-info-table -no-bak .

注意:参数一个都不能少,否则生成的iso将会无法引导,或者可能在引导的过程中报出各种各样的错误。

可能产生的错误:
1,执行mkisofs命令时,提示boot image ‘./isolinux/isolinux.bin’ has not an allowable size.
解决办法:因为默认用的是软驱,加入: -hard-disk-boot 或者 -no-emul-boot 即可。

2,制作以后的Linux镜像在引导的时候提示:”ISOLINUX 3.86 2010-04-01 ETCDisolinux: Image checksum error, sorry…
Boot failed: press a key to retry…”
解决办法:在执行mkisofs命令时,加入 -boot-info-table 参数。

然后拿到虚拟机里安装一下试试,发现已经可以在自定义软件包的选项中,找到我们刚才加入的category和group内容了。

定制Linux发行版:向CentOS6安装镜像添加自定义软件包

如果细心一点,我们会发现,该内容只在自定义软件包的过程中显示,如果不选择自定义的话,系统会默认显示下面的内容:

定制Linux发行版:向CentOS6安装镜像添加自定义软件包
如果想修改此界面的信息,请参考http://www.zhukun.net/archives/7017

参考资料:
centos定制(CentOS 5)
制作CentOS6.2定制系统的基本步骤整理
CentOS6.4 X86_64系统定制文档详细版