Chinaunix首页 | 论坛 | 博客
  • 博客访问: 184231
  • 博文数量: 65
  • 博客积分: 2283
  • 博客等级: 大尉
  • 技术积分: 715
  • 用 户 组: 普通用户
  • 注册时间: 2008-09-18 17:00
文章分类

全部博文(65)

文章存档

2011年(5)

2010年(20)

2009年(24)

2008年(16)

分类: LINUX

2011-02-22 14:30:15

最近在做定制版的centos,网上查了很多资料,最后觉得还是下面这个哥们做的最对我的胃口,在此表示感谢,你的文档就作为我做定制centos的起步资料了。:)

工欲善其事,必先利其器。在制作发行版之前,需要安装一些软件,最简单的方法当然是用CentOS的yum来安装啦!

#yum -y install anaconda-runtime createrepo yum-utils anaconda anaconda-help busybox-anaconda mkisofs

工具安装完成了,可以开始制作linux了。

要想做好一个机遇CentOS发行版的linux,继续要安装一次CentOS,安装时,将必要的包选中,比如,base,develop-tools,text-internet等等,其他的,用不到的东西最好不要选,这样做出来的系统,可以保证体积。

我是在vmware workstation上完成第一次CentOS安装的。安装完成之后,可以在/root/目录下,找到anaconda-ks.cfg这个文件,可以用cat命令看一下这个文件的内容,就大体知道之前装了那些软件包了。

# cat anaconda-ks.cfg
# Kickstart file automatically generated by anaconda.

install
cdrom
lang en_US.UTF-8
keyboard us
network --device eth0 --bootproto dhcp
rootpw --iscrypted $1$mrG7rARX$2zkvd4WLl2Lh5sD9aNP5Q.
firewall --enabled --port=22:tcp
authconfig --enableshadow --enablemd5
selinux --enforcing
timezone --utc Asia/Shanghai
bootloader --location=mbr --driveorder=sda
# The following is the partition information you requested
# Note that any partitions you deleted are not expressed
# here so unless you clear all partitions first, this is
# not guaranteed to work
#clearpart --all --drives=sda
#part /boot --fstype ext3 --size=100 --ondisk=sda
#part pv.2 --size=0 --grow --ondisk=sda
#volgroup VolGroup00 --pesize=32768 pv.2
#logvol swap --fstype swap --name=LogVol01 --vgname=VolGroup00 --size=1024 --grow --maxsize=2048
#logvol / --fstype ext3 --name=LogVol00 --vgname=VolGroup00 --size=1024 --grow

%packages
@development-libs
@editors
@text-internet
@legacy-network-server
@dialup
@core
@base
@network-server
@admin-tools
@development-tools
kexec-tools
device-mapper-multipath
imake

有了上述信息,制作linux的时候就有底了。

在完成上述动作之后,我们可以在/目录下创建一些目录,用来存放linux发行版需要的文件,比如,我将我的系统命名为RiceOS,则,我在/目录下创建一个rice的目录,用来存放linux发行版制作时需要的文件。

p.s.这里的系统因为可以算是再发行版了,所以,可以自己定义,不必死板。

#mkdir /rice

我们需要将CentOS的dvd光盘挂载到linux上来,可以通过挂载光驱,也可以通过挂载iso文件,在挂载之前,我们先在/mnt/目录下创建一个目录,用来挂载。

#mkdir /mnt/cdrom

#mount -t iso9660 -o loop /dev/cdrom /mnt/cdrom      //挂载光驱

#mount -t iso9660 -o loop /xxx/CentOS-5.3-i386-bin-DVD.iso /mnt/cdrom      //挂载iso文件,此处的xxx是CentOS-5.3-i386-bin-DVD.iso文件所在的绝对路径。

挂载完成之后,利用tar命令将光驱中所有的文件复制至/rice目录:

#cd /mnt/cdrom

#tar -cf - . | ( cd /rice ; tar -xvpf - )

复制完成之后,进入rice目录,ls -al一下:

# ls -al

drwxr-xr-x 7 root root    6144 03-21 23:05 .
drwxr-xr-x 4 root root    4096 08-12 22:03 ..
drwxr-xr-x 2 ossec ossec 407552 03-21 23:05 CentOS
-rw-r--r-- 1 root root     112 03-21 23:05 .discinfo
-rw-r--r-- 7 root root     212 2008-06-15 EULA
-rw-r--r-- 7 root root   18009 2008-06-15 GPL
drwxr-xr-x 4 root root    2048 03-21 23:04 images
drwxr-xr-x 2 root root    2048 03-21 22:46 isolinux
drwxr-xr-x 2 root root   12288 03-17 09:30 NOTES
-rw-r--r-- 2 root root     655 03-09 11:12 RELEASE-NOTES-cs
-rw-r--r-- 2 root root    1401 03-09 11:12 RELEASE-NOTES-cs.html
-rw-r--r-- 2 root root     839 03-09 11:12 RELEASE-NOTES-de
-rw-r--r-- 2 root root    1571 03-09 11:12 RELEASE-NOTES-de.html
-rw-r--r-- 2 root root     694 03-09 11:12 RELEASE-NOTES-en
-rw-r--r-- 2 root root    1367 03-09 11:12 RELEASE-NOTES-en.html
-rw-r--r-- 2 root root     694 03-09 11:12 RELEASE-NOTES-en_US
-rw-r--r-- 2 root root    1367 03-09 11:12 RELEASE-NOTES-en_US.html
-rw-r--r-- 2 root root     788 03-09 11:12 RELEASE-NOTES-es
-rw-r--r-- 2 root root    1619 03-09 11:12 RELEASE-NOTES-es.html
-rw-r--r-- 2 root root     852 03-09 11:12 RELEASE-NOTES-fr
-rw-r--r-- 2 root root    1641 03-09 11:12 RELEASE-NOTES-fr.html
-rw-r--r-- 2 root root     766 03-09 11:12 RELEASE-NOTES-ja
-rw-r--r-- 2 root root    1565 03-09 11:12 RELEASE-NOTES-ja.html
-rw-r--r-- 2 root root     706 03-09 11:12 RELEASE-NOTES-nl
-rw-r--r-- 2 root root    1433 03-09 11:12 RELEASE-NOTES-nl.html
-rw-r--r-- 2 root root     752 03-09 11:12 RELEASE-NOTES-pt_BR
-rw-r--r-- 2 root root    1480 03-09 11:12 RELEASE-NOTES-pt_BR.html
-rw-r--r-- 2 root root     801 03-09 11:12 RELEASE-NOTES-ro
-rw-r--r-- 2 root root    1473 03-09 11:12 RELEASE-NOTES-ro.html
drwxr-xr-x 2 root root    2048 03-21 22:35 repodata
-rw-r--r-- 7 root root    1512 2008-06-15 RPM-GPG-KEY-beta
-rw-r--r-- 2 root root    1504 2008-06-15 RPM-GPG-KEY-CentOS-5
-r--r--r-- 1 root root    7048 03-21 23:05 TRANS.TBL
-rw-r--r-- 2 root root     413 03-21 23:04 .treeinfo

这些文件中,有需要的仅仅是显示结果中标红的文件或者目录,其余可以全部删除,顺便说一下,在CentOS这个目录下存放的是rpm包,在此处操作时,CentOS这个目录下所有的内容删除(CentOS这个目录保留,之后有用)。

删除一些不必要的文件之后,再ls -al一下,看看/rice/目录的结构:

#ls -al

drwxr-xr-x 2 ossec ossec 155648 09-03 01:44 CentOS
-rw-r--r-- 1 root root     112 03-21 23:05 .discinfo
drwxr-xr-x 4 root root    4096 03-21 23:04 images
drwxr-xr-x 2 root root    4096 09-03 19:51 isolinux
drwxr-xr-x 2 root root    4096 09-03 19:47 repodata
-rw-r--r-- 1 root root    1318 2009-09-04 TRANS.TBL
-rw-r--r-- 1 root root     413 03-21 23:04 .treeinfo

文件这样看起来就舒服多了。

在CentOS系统安装完成之后,会将所有rpm包的安装信息记录在/root/目录下的install.log文件中,我们可以将这个文件输出为我们想要的格式,在通过一些脚本,将需要的rpm包复制到/rice/CentOS/目录下。

#cd /root/

#cat install.log | grep Installing | sed 's/Installing //g'|sed 's/^[0-9]\+://g' > packages.list //生成packages.list,以便之后复制rpm包。

创建自动提取相关rpm脚本:

#vi cprpms.sh

#!/bin/bash
DEBUG=0
LT_CD=/mnt/cdrom
ALL_RPMS_DIR=/mnt/cdrom/CentOS #挂载光盘存放的目录
LT_RPMS_DIR=/rice/CentOS #存放RPM包的目录
packages_list=/root/packages.list
number_of_packages=`cat $packages_list | wc -l`
i=1
while [ $i -le $number_of_packages ] ; do
line=`head -n $i $packages_list | tail -n -1`
name=`echo $line | awk '{print $1}'`
version=`echo $line | awk '{print $3}' | cut -f 2 -d :`
if [ $DEBUG -eq "1" ] ; then
echo $i: $line
echo $name
echo $version
fi
if [ $DEBUG -eq "1" ] ; then
ls $ALL_RPMS_DIR/$name-$version*
if [ $? -ne 0 ] ; then
echo "cp $ALL_RPMS_DIR/$name-$version* "
fi
else
echo "cp $ALL_RPMS_DIR/$name-$version* $LT_RPMS_DIR/"
cp $ALL_RPMS_DIR/$name-$version* $LT_RPMS_DIR/
# in case the copy failed
if [ $? -ne 0 ] ; then
echo "cp $ALL_RPMS_DIR/$name-$version* "
cp $ALL_RPMS_DIR/$name* $LT_RPMS_DIR/
fi
fi
i=`expr $i + 1`

done

执行以上脚本将定制ltos必要的rpm复制到/rice/CentOS目录

#./cprpms.sh //若无法执行,使用chmod +x cprpms.sh为该脚本添加执行权限。

复制rpm包完成之后,返回到/rice目录下,执行createrepo程序生成repodata下的comps.xml文件

#cd /rice
#createrepo -g repodata/comps.xml .

生成comps.xml之后,就要开始创建kickstart脚本了,可以通过anaconda-ks.cfg来完成对kickstart脚本的定制:

#cd

#cp anaconda-ks.cfg /rice/isolinux/ks.cfg    //将anaconda-ks.cfg复制到/rice/isolinux/并将其改名为ks.cfg

然后,使用vi编辑器对ks.cfg进行编辑

#vi /rice/isolinux/ks.cfg

以下是我的ks.cfg文件内容:

install     
text           //文本模式安装
cdrom       //从光盘安装
lang en_US.UTF-8          //设置默认字符集为美国英语UTF-8
keyboard us             //美式键盘
skipx                 //跳过xwindows
network --device eth0 --bootproto dhcp --hostname RiceOS      //默认开启网卡0,并让其自动获得ip,同时,计算机的hostname命名为RiceOS
rootpw --iscrypted $1$jPZf0P0r$JRe7pd.5wq9k.VZEMOgdq/      //root账号的密码,根据首次安装CentOS时使用的密码不同而不同,这里显示的密码是经过加密处理之后的字符。
authconfig --enableshadow --enablemd5      //密码使用md5加密
selinux --disabled                  //不启用selinux
timezone --utc Asia/Shanghai          //设置时区为亚洲/上海
bootloader --location=mbr           //读取mbr信息
zerombr yes                        //初始化//mbr
mouse generic3ps/2                     //鼠标为三键ps/2接口鼠标
clearpart --all --initlabel                    //初始化分区信息,这里考虑到每一台计算机的硬件情况不同,因此,将分区过程设置为手动,其他过程全为自动。
reboot                  //安装完成之后重启
%packages             //这一行之后,均为安装rpm包信息。
@development-libs
@editors
@text-internet
@legacy-network-server
@dialup
@core
@base
@network-server
@admin-tools
@development-tools
kexec-tools
device-mapper-multipath
imake

kickstart脚本写完之后,需要修改linux的默认安装方式,这里,修改/rice/isolinux/isolinux.cfg这个文件,达到我们的目标,值得注意的是,isolinux.cfg文件是只读的,要想修改,需要为其赋予可写权限:

#chmod +w /rice/isolinux/isolinux.cfg

#vi isolinux.cfg

default ks        //此处默认为linux,修改为ks,让linux从ks这个脚本启动
prompt 1
timeout 10          //此处默认600,即等待一分钟,我的耐心不太好,因此,我只想等待1秒,各位看官可以根据自己的喜好,设定此处的数值。
display boot.msg
F1 boot.msg
F2 options.msg
F3 general.msg
F4 param.msg
F5 rescue.msg
label linux
kernel vmlinuz
append initrd=initrd.img
label text
kernel vmlinuz
append initrd=initrd.img text
label ks
kernel vmlinuz
append ks=cdrom:/isolinux/ks.cfg initrd=initrd.img
label local
localboot 1
label memtest86
kernel memtest
append -

将isolinux.cfg修改为如上所述即可。

在完成以上工作之后,就可以使用mkisofs发布iso文件了,各位看官注意哦,不能将/rice这个目录直接复制到windows用UltraISO这样的软件直接制作,因为这样做出来,不能够引导……

另外,在mkisofs的时候,需要在/rice/目录下进行,呵呵!

[root@localhost rice]#mkisofs -R -J -T -r -l -d -allow-multidot -allow-leading-dots -no-bak -o /glftpd/site/test/RiceOS-0.1-i386.iso -b isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table .

制作iso完成之后,即可将iso下载至windows,使用VMware安装看看,若能够安装成功,则iso制作成功。

p.s.做这个东西我花的时间实际上并不多,中间杂事太多,断断续续做了三周才做出来,不过结果还是好的。各位看官若想对这个iso进行定制,还可以对cat命令生成的packages.list文件进行定制,还可以分析

@development-libs
@editors
@text-internet
@legacy-network-server
@dialup
@core
@base
@network-server
@admin-tools
@development-tools

这些类别中包含的数据包,可以将所有的数据包列出,而不是列出类别,当然,这样是很累的,让我这样的懒人来做,呵呵,可能还要三周!嘎嘎!

不过我想,这样做出来的linux应该很小了。

顺带说一下个性化定制这个linux系统(问答模式):

1.如何定制安装开机画面:


启动画面用的是一种比较奇怪的格式lss16,它限制图片使用16种颜色,除去前景和背景色只能有14种颜色。我们需要ppmtolss16 giftopnm等程序,系统一般默认都安装了。
一般用gimp生成一个index模式的gif图形,颜色限制为14, 然后通过如下的办法进行转:
安装yum -y install syslinux
giftopnm < splash.gif | ppmtolss16 > splash.lss
另外你还需要修改isolinux/boot.msg文件,做一些个性化的提示.
?如何生成高质量的图。
先用photoshop打开任何一张图片,然后在文件的下拉菜单里,保存的时候选择“保存为WEB和设备使用格式“,再然后选择gif再选择16色保存就OK.
仍后利用giftopnm < splash.gif | ppmtolss16 > splash.lss 转换即可.


2.如何生成GRUP的xpm文件?


(1) 将备一张640 x 480 16色图片,档案类型为JPG的格式
(2)convert grub.gif -colors 14 -geometry 640x480! splash.xpm && gzip -9 splash.xpm
(3) 直接替换/boot/grup/splash.xpm.gz 文件即可.
利用上面方法生成的图片可能无法显示,或者质量不高,如何生成高质量的grub图片呢.
利用文中后面我提供的ltospackl.tar.gz里面的grubtool.exe即可在windows平台将jpg,bmp图生成为.xpm.gz格式的文件,直接替换/boot/grup下的文件即可.


3.如何去掉安装过程中的CentOS字样?


在安装光盘里面有两个.buildstamp文件,一个位于stage2.img中,一个位于initrd.img中,
安装光盘运行时读取的是initrd.img中的那个.buildstamp文件,所以只要把initrd.img文件改了就可以了。
如何解压initr.dimg文件:
2.6内核中的initrd.img采用cpio压缩,不再是2.4内核使用的ext2格式,无法使用mount -o loop 挂载。需要使用gunzip解压缩,然后再使用
利用cpio给img解包
# cd /ltos/isolinux/
# cp initrd.img /tmp/initrd.img.gz
# cd /tmp
# gunzip initrd.img.gz
# mkdir initrd
# mv initrd.img initrd
# cd initrd
# cpio -ivmd < initrd.img
仍后修改.buildstamp文件,将CentOS改为LTOS即可.
如何制作initrd.img文件:
#假设当前目录位于准备好的initrd文件系统的根目录下
# find . | cpio -c -o > ../initrd.img
# gzip ../initrd.img
# mv initrd.img.gz initrd.img
# cp initrd.img /ltos/isolinux/
仍后将initrd.img复制到/ltos/isolinux/


3. 如何替换安装以后的grub ?


在安装光盘里的ks.cfg文件里写好替换splash.xpm.gz文件即可.


4. 如何去掉启动过程中的"CentOS release 5 (Final)"


在安装光盘里的ks.cfg文件里写好脚本,直接替换/etc/redhat-release即可.
相关脚本及制作工具下载:
//相关脚本及工具下载.


参考文档(并对以下文章作者表示感谢和致敬!)

1.
2.

3.
4.
5. http://www.ibm.com/developerworks/cn/linux/l-k26initrd/

阅读(2458) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2011-03-05 16:15:58

很好的, 收藏了 推荐一个博客,提供很多免费软件编程电子书下载: http://free-ebooks.appspot.com