Linux发行光盘(红旗 5.0 SP2发行版,已不使用仅参考)

需要自定义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、增加额外驱动
这可以通过修改isolinux/initrd.img文件,可参考:分析initrd.img文件
2、自定义安装界面
stage2.img保存了安装界面使用的信息,通过修改该文件可个性化安装界面,日后我会另外说明;
3、修改光盘启动画面
光盘的启动画面是isolinux/splash.lss,通过安装syslinux软件包可以修改:

引用
The graphic is in a somewhat odd format, called LSS16. As the name indicates, it is limited to 16 colors. To edit the graphic, first convert it to a PPM:
lss16toppm < splash.lss > splash.ppm
Next, edit the file using The Gimp. Save the resulting file as an indexed gif with no more than 14 colors (plus black and white, for a total of 16). Then, convert the file to a pnm/ppm:
giftopnm < splash.gif &#124; ppmtolss16 > splash.lss
cp splash.lss /data/disk/isolinux/splash.lss
4、关于splittree.py脚本
如果你还是必须分开多张CD光盘,可参考下面的做法: (注意,与上面的例子无关)
RELEASE="Fedora Core 2 (Tettnang) with updates to $(date '+%Y-%M-%d %H:%m')"
rm -rf i386-disc[1-9]
splittree.py --arch=i386 --total-discs=8 --bin-discs=4 --src-discs=4 --release-string="$RELEASE" \ --pkgorderfile=$FCBASE/fedora/pkgfile.`date +%Y-%m-%d` \ --distdir=$FCBASE/fedora/i386 \ --srcdir=$FCBASE/fedora/i386/SRPMS --productpath=Fedora
rm -f $FCBASE/i386-disc1/Fedora/base/hdlist*
$FCBASE/genhdlist --withnumbers --fileorder \ $FCBASE/fedora/pkgfile.`date +%Y-%m-%d` \ $FCBASE/fedora/i386-disc[1234]
刻录:
#!/bin/sh
myname="Joe Blow <[email protected]>"
bootimg="isolinux/isolinux.bin"
bootcat="isolinux/boot.cat"
distname="Tettnang"
distvers="2"
mkisopts="-R -J -T"
bootopts="-no-emul-boot -boot-load-size 4 -boot-info-table"
mydate="$(date '+%d %b %Y')"
mkisofs $mkisopts $bootopts \
-V "Fedora Core $distver ($distname) UPDATED Disk 1" \
-A "Fedora Coret $distver ($distname) update created on $mydate" \
-P "$myname" \
-p "$myname" \
-b "$bootimg" \
-c "$bootcat" \
-x lost+found \
-o "$distname"-i386-disc1.iso \
i386-disc1
for i in 2 3 4 ; do
mkisofs $mkisopts \
-V "Fedora Core $distver ($distname) UPDATED Disk $i" \
-A "Fedora Core $distver ($distname) update created on $mydate" \
-P "$myname" \
-p "$myname" \
-x lost+found \
-o "$distname"-i386-disc${i}.iso \
i386-disc${i}
done
for i in 1 2 3 4 ; do
mkisofs $mkisopts \
-V "Fedora Core $distver ($distname) UPDATED Disk $i" \
-A "Fedora Core $distver ($distname) update created on $mydate" \
-P "$myname" \
-p "$myname" \
-x lost+found \
-o "$distname"-SRPMS-disc${i}.iso \
i386-disc$(( $i + 3 ))
done
5、关于buildinstall脚本
原来,在anaconda安装程序的制作中,buildinstall脚本是运行在mkisofs前的最后一步。它可以自动生成新的stage2.img等镜像文件,以便在安装程序中使用。
但在实际操作中,我发现该脚本必须依赖很多的rpm包,并从其中提取适当的执行脚本生成stage2.img等文件,而要满足依赖要求是比较复杂的事情。可参考下面的链接说明:
Buildinstall package requirements
六、附录
参考资料:
fedora Anaconda
Linux: Updating and Rebuilding Fedora Core 2 Installation CDs
Création de CD d'installation de Fedora avec les mises à jour(法语)
基于centos4.3的linux发行版制作过程

How to make your own distro in 3 not-so simple steps

http://www.linuxfly.org/post/135/1/1/

你可能感兴趣的:(linux)