分类: 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/
chinaunix网友2011-03-05 16:15:58
很好的, 收藏了 推荐一个博客,提供很多免费软件编程电子书下载: http://free-ebooks.appspot.com