Jun 21

[原]自定义Linux发行版光盘 晴

linuxing , 18:01 , 基础知识 » RPM , 评论(6) , 引用(0) , 阅读(29911) , Via 本站原创 | |
   需要自定义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文件,或增加新的组和成员包等。
引用
Asianux/bas/comps.xml

该文件使用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/

至此,新光盘完成。
内文分页: [1] [2]
Tags: , ,
yorks Email
2009/09/07 14:38
请问一下
tar cf - ./|tar xf - -C /data/disk/install

解压出来的东西可以不放到光盘根目录吗?如果可以是要修改.discinfo吗?不是很明白.discinfo的编写是如何?
linuxing 回复于 2009/09/11 10:50
必须放在光盘的根目录,因为这是由安装程序固定的。至于.discinfo,你打开该文件看看就明白了,最主要是首两行的内容。
test
2008/12/25 17:54
个性化那篇文章在哪里呢?sweat
linuxing 回复于 2008/12/26 20:58
晕倒,就在后面咯。
http://www.linuxfly.org/read.php/136.htm
路过者
2008/04/02 15:55
大虾。。
有个问题要麻烦你下。。
关于anaconda程序执行到 writeconfiguration的时候
它是怎么执行的呢?能不能帮我描述下写入配置的过程??
比如它从哪里读取数据,然后调用到哪里的安装包来安装。。等等。。。
linuxing 回复于 2008/04/08 15:30
不好意思,我也没详细去看anaconda的运行过程。只知道他是根据xml的结构顺序来安装rpm的。若要增加rpm、组,看看个性化那篇里面有写到。
路过者
2008/03/30 20:06
大虾,问个关于stage2.img的问题,就是你一般在mount它的时候使用什么操作命令阿?还有更改某些文件之后重新做成stage2.img又是什么命令阿?
我用mount -t squashfs stage2.img /mnt/img来挂载它
然后在cbe环境下用mksquashfs  ./   stage2.img来把文件夹做成stage2.img
但是我这样做完后重新制作的*.iso有问题。运行时不读取光盘内容。。而进入网络安装选择界面。。我用排除法排除了其他出错的可能。。大虾帮看下这上面两部的命令对不对阿?是不是我命令错了造成的问题阿?
linuxing 回复于 2008/03/30 22:59
我用的是这个:
mkcramfs stage2/ stage2.img
路过者
2008/03/28 19:46
大虾更新挺快阿grin
那个问题我自己解决了。哈哈。还是谢谢哈。
路过者
2008/03/28 13:09
sweatsweatsweat
大虾。你在前面说关于重新生成stage2.img在附录里说明。。
但是你在附录里又说,关于这点以后另外说明。。。
这不是忽悠人么。。。sweat
linuxing 回复于 2008/03/28 15:09
当时想写到一篇文档里面,但后来发现太长了。所以,把其分开到了个性化那篇中,里面有较详细的描述的。底层的修改需要有python的知识,可先看看相关的知识。
分页: 1/1 第一页 1 最后页
发表评论
表情
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
打开HTML
打开UBB
打开表情
隐藏
记住我
昵称   密码   游客无需密码
网址   电邮   [注册]