需要自定义Linux发行版光盘的原因有很多,例如:想学习、想自己发布产品、为管理方便、更新Bug软件包等等。而最近由于工作的需要,也研究了一下Linux发行光盘的构造。这里主要是对沿用红帽发行方式的版本,例如CentOS等。他们都是使用anaconda安装环境的。下面的说明也只针对该环境,以
组合红旗两CD光盘为1张DVD光盘为例说明。
另外,网上也有很多可以参考的资料,在附录中有链接。不过,若完全按照这些资料的步骤,会在最后执行buildinstall时出现很多的rpm依赖问题。所以,我绕过了这个脚本,使用更简单、更简单的方式处理。
一、架构 以红旗 5.0 SP2发行版为例,其使用的也是anaconda安装环境。安装光盘架构如下:
引用
# ll
total 14
drwxr-sr-x 5 root root 2048 Jan 11 06:10 Asianux <-安装向导镜像及rpm包
drwxr-sr-x 2 root root 2048 Jan 11 06:18 Documents <-License协议及相关说明文档
-r--r--r-- 1 root root 1319 Jan 11 06:19 TRANS.TBL <-当前目录的列表
drwxr-sr-x 7 root root 4096 Jan 11 06:10 dosutils <-为Dos下特殊安装准备的工具
drwxr-sr-x 4 root root 2048 Jan 11 06:19 images <-其他引导img镜像及额外驱动
drwxr-sr-x 2 root root 2048 Jan 11 06:10 isolinux <-光盘引导程序及msg提示信息
需要留意的,其实只有
Asianux目录及isolinux目录。其他目录及文件在一般情况下是不需要修改的。
另外,还需要留意Asianux/base目录的内容:
引用
# pwd
/mnt/disk/Asianux/base
# ll stage2.img comps.xml
-rw-r--r-- 2 root root 368715 Jan 11 06:05 comps.xml <-软件包组
-rw-r--r-- 2 root root 77488128 Jan 11 06:10 stage2.img <-stage2.img是CD介质安装的镜像文件
stage2.img是光盘引导的镜像文件,如果自定义安装过程中的说明(个性化),需要修改它。而该目录下的其他文件则是硬盘等安装方式的镜像文件:
引用
hdstg1.img、hdstg2.img:都是硬盘介质安装的镜像文件
netstg1.img、netstg2.img:都是FTP、NFS等介质安装方式的镜像文件
而comps.xml是安装时候在“定制安装”中可以选择的组,如要增加“定制组”,则需要编辑该文件。
二、准备 首先,把原始介质准备好,以红旗DC 5.0 for x86为例说明。
1、准备anaconda运行环境如果您的系统中没有安装下述的软件,请安装上:
rpm -qa|grep anaconda
busybox-anaconda-1.00-4
anaconda-runtime-10.1.1.13-1.21AX
anaconda-10.1.1.13-1.21AX
另外,我使用的是简化方式,不直接运行buildinstall命令,所以,其他的软件包可以不用安装。而如果您想重新生成stage2.img等文件,请参考附录的信息。
2、获取介质假设我们已经把两张红旗安装光盘做成.iso文件:
引用
redflag-dc5.0-sp2-x86-release-disc1.iso
redflag-dc5.0-sp2-x86-release-disc2.iso
通过下面的命令,挂载CD1并释放到/data/disk/install目录中:
mkdir /mnt/disk
mkdir -p /data/disk/install
mount -o loop redflag-dc5.0-sp2-x86-release-disc1.iso /mnt/disk
cd /mnt/disk
tar cf - ./|tar xf - -C /data/disk/install
用同样的方式处理CD2:
cd -
umount /mnt/disk
mount -o loop redflag-dc5.0-sp2-x86-release-disc2.iso /mnt/disk
cd /mnt/disk
tar cf - ./|tar xf - -C /data/disk/install
※说明一下:为什么使用tar?而不使用cp等命令?
原因是,在光盘的根目录下会有写隐含的文件,例如.discinfo,而这些文件使用cp命令是比较麻烦的,但这些文件又是很重要的文件,所以,使用tar比较安全。
.discinfo是记录光盘发行信息的文件,若丢失,在安装的时候会提示找不到安装介质。3、删除多于的文件TRANS.TBL文件会在后面使用mkisofs的时候自动生成,这里可以删掉:
cd /data/disk/install/
find ./ -name 'TRANS.TBL' -exec rm {} \;
三、修改光盘内容1、修改光盘内容正如前面说到的,接下来您可以根据自己的情况,添加或删除Asianux/RPMS中的rpm包。
而这里的依赖关系必须自行解决的。您可以先在正规系统中尝试后再更新或放入该目录中。
2、修改comps.xml文件根据前面的架构分析,如果您添加了新rpm文件,则需要修改comps.xml的信息。其中需要增加或删除您的rpm文件,或增加新的组和成员包等。
该文件使用XML架构,很容易明白,简单的方式用手工修改即可。若修改比较复杂的,可通过编程解决。
因我只是把两CD合并,没有增加或删除rpm,所以,不需要修改该文件。
3、修改.discinfo当前该文件的内容是CD2的,把第四行的“2”改为“1”,表示只从第一张光盘获取内容。
引用
# cat .discinfo
1168466978.826122
Asianux 2.0 SP2
i386
1 <-修改这里
Asianux/base
Asianux/RPMS
Asianux/pixmaps
四、生成新光盘一切准备妥当后,就可以生成新光盘了。
1、运行环境设置好命令和库的路径:
export PYTHONPATH=/usr/lib/anaconda:/usr/lib/anaconda-runtime:$PYTHONPATH
export PATH="$PATH:/usr/lib/anaconda-runtime"
2、更新光盘的文件树信息
genhdlist --productpath "Asianux" /data/disk/install/
会生成Asianux/base目录下的新hdlist和hdlist2文件
3、生成pkgfile文件
pkgorder --product Asianux /data/disk/install/ Asianux > /data/disk/pkgorder.txt
该文件会分析rpm的运行脚本,并生成rpm list表。
4、划分光盘这一步通常是发行CD版本的时候必须做的。因为1张CD不够空间存放整一套系统,所以要分开多张CD。
当然,在这个例子中,是不需要的:
splittree.py --arch=i386 --total-discs=1 --bin-discs=1 \
--src-discs=0 --release-string="Asianux" --productpath=Asianux \
--pkgorderfile=/data/disk/pkgorder.txt --distdir=/data/disk/install \
--srcdir=/data/disk/install/pool/SRPMS
5、使用pkgfile再更新一次文件树信息
genhdlist --withnumbers --fileorder /data/disk/pkgorder.txt \
--productpath "Asianux" /data/disk/install/
这样做的目的,是为了让hdlist和hdlist2中反应rpm对应的光盘号。在这里不是必须的,但建议运行。而如果您运行了splittree.py脚本,则是必须的。
6、生成光盘
mkisofs -b isolinux/isolinux.bin -no-emul-boot -boot-load-size 4 \
-boot-info-table -c isolinux/boot.cat -l -J \
-o /data/disk/Asianux_2.0.iso -R -T -V "Asianux 2.0" /data/disk/install/
至此,新光盘完成。