本文使用的环境为CentOS5.5 32位.
首先要做的是最小化安装CentOS,就是安装过程中选择要安装包的时候使用自定义,然后去除所有要安装的包,系统就会默认最小化安装系统.
装完系统会再root的根目录下生成3个文件,我们用到两个:
anaconda-ks.cfg : kisckstart脚本,记录安装过程的配置,包括选择语言,选择键盘,分区,root密码等等等等
install.log : 记录安装过程中所安装的包
我们首先要做的就是建立我们的自己发行版的目录,在一个剩余大小大于4G的分区创建自己发行版的目录,比如我的发行版叫ColdOS,然后挂载DVD光盘,把光盘上的内容复制到自己发行版的目录:
01 |
mkdir /usr/cold # 创建发行版目录 |
02 |
mount /dev/hdc /mnt # 挂载IDE光驱 |
03 |
# 或 |
04 |
mount /dev/cdrom /mnt |
05 |
# 如挂载本地ISO镜像使用下面命令 |
06 |
mount -o loop iso路径 /mnt |
07 |
08 |
# 然后使用 tar命令把光盘的内容复制到/usr/cold |
09 |
# 都说这个命令比cp快,在256内存的虚拟机测试也就快了几十秒,个人觉得最大的用处 |
10 |
# 就是解决了cp无法复制隐藏文件的问题 |
11 |
( cd /mnt/ && tar -cf - . ) ¦ (cd /usr/cold && tar -xvfp - ) # tar -p选项是保留原有权限 |
复制完成后发行版目录应该是:
01 |
ls -la /usr/cold |
02 |
total 511 |
03 |
drwxr-xr-x 7 root root 6144 Apr 30 2010 . |
04 |
drwxr-xr-x 21 root root 4096 Dec 13 18:07 .. |
05 |
drwxrwxr-x 2 501 501 421888 Apr 30 2010 CentOS |
06 |
-rw-r--r-- 1 root root 112 Apr 30 2010 .discinfo |
07 |
-rw-r--r-- 1 root root 212 Jun 15 2008 EULA |
08 |
-rw-r--r-- 1 root root 18009 Jun 15 2008 GPL |
09 |
drwxr-xr-x 4 root root 2048 Apr 30 2010 images |
10 |
drwxr-xr-x 2 root root 2048 Apr 30 2010 isolinux |
11 |
drwxr-xr-x 2 root root 22528 Apr 27 2010 NOTES |
12 |
-rw-r--r-- 1 root root 655 Apr 27 2010 RELEASE-NOTES-cs |
13 |
-rw-r--r-- 1 root root 1401 Apr 27 2010 RELEASE-NOTES-cs.html |
14 |
-rw-r--r-- 1 root root 839 Apr 27 2010 RELEASE-NOTES-de |
15 |
-rw-r--r-- 1 root root 1571 Apr 27 2010 RELEASE-NOTES-de.html |
16 |
-rw-r--r-- 1 root root 694 Apr 27 2010 RELEASE-NOTES-en |
17 |
-rw-r--r-- 1 root root 1367 Apr 27 2010 RELEASE-NOTES-en.html |
18 |
-rw-r--r-- 1 root root 694 Apr 27 2010 RELEASE-NOTES-en_US |
19 |
-rw-r--r-- 1 root root 1367 Apr 27 2010 RELEASE-NOTES-en_US.html |
20 |
-rw-r--r-- 1 root root 788 Apr 27 2010 RELEASE-NOTES-es |
21 |
-rw-r--r-- 1 root root 1619 Apr 27 2010 RELEASE-NOTES-es.html |
22 |
-rw-r--r-- 1 root root 852 Apr 27 2010 RELEASE-NOTES-fr |
23 |
-rw-r--r-- 1 root root 1641 Apr 27 2010 RELEASE-NOTES-fr.html |
24 |
-rw-r--r-- 1 root root 766 Apr 27 2010 RELEASE-NOTES-ja |
25 |
-rw-r--r-- 1 root root 1565 Apr 27 2010 RELEASE-NOTES-ja.html |
26 |
-rw-r--r-- 1 root root 706 Apr 27 2010 RELEASE-NOTES-nl |
27 |
-rw-r--r-- 1 root root 1433 Apr 27 2010 RELEASE-NOTES-nl.html |
28 |
-rw-r--r-- 1 root root 752 Apr 27 2010 RELEASE-NOTES-pt_BR |
29 |
-rw-r--r-- 1 root root 1480 Apr 27 2010 RELEASE-NOTES-pt_BR.html |
30 |
-rw-r--r-- 1 root root 801 Apr 27 2010 RELEASE-NOTES-ro |
31 |
-rw-r--r-- 1 root root 1473 Apr 27 2010 RELEASE-NOTES-ro.html |
32 |
drwxr-xr-x 2 root root 2048 Apr 30 2010 repodata |
33 |
-rw-r--r-- 1 root root 1512 Jun 15 2008 RPM-GPG-KEY-beta |
34 |
-rw-r--r-- 1 root root 1504 Jun 15 2008 RPM-GPG-KEY-CentOS-5 |
35 |
-r--r--r-- 1 root root 7048 Apr 30 2010 TRANS.TBL |
36 |
-rw-r--r-- 1 root root 413 Apr 30 2010 .treeinfo |
现在对系统进行精简:
1 |
rm -f RELEASE-NOTES-* |
2 |
rm -rf NOTES/ |
3 |
rm -f RPM-GPG-KEY-* |
4 |
rm -f EULA |
5 |
rm -f GPL |
6 |
rm -f CentOS/* # 删除所有rpm包,等会根据install.log复制过来,保证系统最小化 |
精简完后应该是这样子的:
01 |
s -la /usr/cold/ |
02 |
total 20 |
03 |
drwxr-xr-x 6 root root 4096 Dec 13 19:39 . |
04 |
drwxr-xr-x 16 root root 4096 Dec 13 23:14 .. |
05 |
drwxrwxr-x 3 501 501 172032 Dec 14 02:23 CentOS |
06 |
-rw-r--r-- 1 root root 112 Apr 30 2010 .discinfo |
07 |
drwxr-xr-x 4 root root 4096 Apr 30 2010 images |
08 |
drwxr-xr-x 2 root root 4096 Dec 14 00:36 isolinux |
09 |
drwxr-xr-x 2 root root 4096 Dec 14 01:42 repodata |
10 |
-r--r--r-- 1 root root 7048 Apr 30 2010 TRANS.TBL |
11 |
-rw-r--r-- 1 root root 413 Apr 30 2010 .treeinfo |
现在根据install.log创建packages.list,用来安装所需要的rpm包:
01 |
# 根据install.log,提取其中的rpm包名, |
02 |
cat install.log ¦ grep Installing ¦ awk '{print $2}' ¦ awk -F':' '{ if (NF==2){ print $2} else {print $1}}' > packages.list |
03 |
# 如果仅仅最小化安装就失去了定制自己的发行版的意义 |
04 |
# 向packages.list添加几个常用的工具,需要先用yum安装一遍记住包的依赖关系 |
05 |
# 把依赖关系的包也放入packages.list |
06 |
# 比如man依赖bzip2 groff |
07 |
vi packages.list |
08 |
# 末尾添加如下内容: |
09 |
setuptool |
10 |
lszrz wget |
11 |
kernel-devel |
12 |
kernel-headers |
13 |
libgomp |
14 |
cpp |
15 |
glibc-headers |
16 |
glibc-devel |
17 |
gcc |
18 |
make |
19 |
which |
20 |
bzip2 |
21 |
groff |
22 |
man |
23 |
# 根据packages.list进行复制 |
24 |
for i in `cat packages.list `;do cp -p -f /mnt/CentOS/"$i"* /usr/cold/CentOS/;done |
复制完所需的RPM包之后我们如何来让系统安装的时候安装我们自定义添加的包呢?
首先我们需要编辑repodata/comps.xml,但是comps.xml文件内容太杂,大概 2万多行,所以我们需要对comps.xml进行一个预处理:
1 |
# comps.xml包含最多的是各国语言 |
2 |
# 我们先去除不需要的语言,这里我只需要英文, |
3 |
sed -ri '/xml:lang/ {/en_GB/!d}' comps.xml # 如果需要保留其他语言比如中文,在en_GB后添加"¦zh_CN" |
去除了各国语言的comps.xml大概包含2000多行,现在我们要进一步处理,删除除了id为core的group的其他节点,删除完后comps.xml大概只剩下73行.现在我们要把我们自己添加的包顶一个group节点,在紧跟id为core的group节点(也就是</group>后面)添加如下内容:
01 |
< group > |
02 |
< id >useful</ id > |
03 |
< name >Useful</ name > |
04 |
< name xml:lang = "en_GB" >Useful</ name > |
05 |
< description >Useful tools for administartor </ description > |
06 |
< description xml:lang = "en_GB" >Useful tools for administartor</ description > |
07 |
< default >true</ default > |
08 |
< uservisible >false</ uservisible > |
09 |
< packagelist > |
10 |
< packagereq type = "default" >setuptool</ packagereq > |
11 |
< packagereq type = "default" >lszrz</ packagereq > |
12 |
< packagereq type = "default" >wget</ packagereq > |
13 |
< packagereq type = "default" >kernel-headers</ packagereq > |
14 |
< packagereq type = "default" >libgomp</ packagereq > |
15 |
< packagereq type = "default" >cpp</ packagereq > |
16 |
< packagereq type = "default" >glibc-headers</ packagereq > |
17 |
< packagereq type = "default" >glibc-devel</ packagereq > |
18 |
< packagereq type = "default" >gcc</ packagereq > |
19 |
< packagereq type = "default" >make</ packagereq > |
20 |
< packagereq type = "default" >which</ packagereq > |
21 |
< packagereq type = "default" >bzip2</ packagereq > |
22 |
< packagereq type = "default" >groff</ packagereq > |
23 |
< packagereq type = "default" >man</ packagereq > |
24 |
</ packagelist > |
25 |
</ group > |
上面添加了一个id为useful的group节点,下面把这两个节点放到一个类别里:
01 |
< category > |
02 |
< id >cold</ id > |
03 |
< name >Cold</ name > |
04 |
< name xml:lang = "en_GB" >Cold</ name > |
05 |
< description >Cold Linux</ description > |
06 |
< description xml:lang = "en_GB" >Cold Linux</ description > |
07 |
< display_order >92</ display_order > |
08 |
< grouplist > |
09 |
< groupid >core</ groupid > |
10 |
< groupid >useful</ groupid > |
11 |
</ grouplist > |
12 |
</ category > |
然后根据我们的comps.xml创建源:
1 |
# 安装所需要的工具 |
2 |
yum -y install createrepo anaconda anaconda-runtime |
3 |
# 创建源 |
4 |
createrepo -g /usr/cold/repodata/comps.xml /usr/cold/CentOS |
5 |
# 完成后会有如下提示: |
6 |
224/224 - kudzu-1.2.57.1.24-1.el5.centos.i386.rpm |
7 |
Saving Primary metadata |
8 |
Saving file lists metadata |
9 |
Saving other metadata |
由于我们编辑了comps.xml,所以comps.xml的sha值会改变,这样就会导致跟repomd.xml中所记录的不同,安装的时候会报错:An error occurred umounting the CD. Please make sure you’are not accessing /mnt/source from the shell on tty2 an the click OK retry.
所以我们更改完comps.xml要计算comps.xml的sha值
1 |
# 计算comps.xml的sha值 |
2 |
sha1sum repodata/comps.xml |
3 |
c1d304cae50f969370a72d95e3cd2f71087fc73a repodata/comps.xml |
然后更新到repomd.xml中编辑repodata/repomd.xml找到location href=”repodata/comps.xml”/的一个data节点把sha值更新为刚刚计算的
1 |
< data type = "group" > |
2 |
< location href = "repodata/comps.xml" /> |
3 |
< checksum type = "sha" >c1d304cae50f969370a72d95e3cd2f71087fc73a</ checksum > |
4 |
< timestamp >1272586365</ timestamp > |
5 |
</ data > |
comps.xml里新加了一个咱们的useful 组,怎么使系统安装我们定义的包呢?怎么自定义安装过程呢?下面将讲解根据anaconda-ks.cfg文件定义安装过程:
首先复制anaconda-ks.cfg到我们的发行版目录:
01 |
cp ~/anaconda-ks.cfg /usr/cold/isolinux/ks.cfg # 复制到isolinux下并命名为ks.cfg |
02 |
cd /usr/cold |
03 |
# 编辑kickstart脚本 |
04 |
vi isolinux/ks.cfg |
05 |
install # 定义安装 |
06 |
cdrom # 从光盘安装 |
07 |
lang en_US.UTF-8 # 安装语言为英文 |
08 |
keyboard us # 定义键盘布局 |
09 |
rootpw --iscrypted $1$OKNHES6P$tPdz9HxIp6.QUvulqxNwa. # 定义root密码(你安装的时候提供的密码) |
10 |
firewall --disable # 禁用防火墙 |
11 |
authconfig --enableshadow --enablemd5 # 使用md5加密 |
12 |
selinux --disabled # 禁用selinux |
13 |
timezone --utc Asia/Chongqing # 定义时区 |
14 |
bootloader --location=mbr --driveorder=sda # 在一块硬盘上安装mbr |
15 |
# The following is the partition information you requested |
16 |
# Note that any partitions you deleted are not expressed |
17 |
# here so unless you clear all partitions first, this is |
18 |
# not guaranteed to work |
19 |
# 如果想安装过程中手动分区就把下面几行注释掉 |
20 |
clearpart --linux --drives=sda # 格式化sda |
21 |
part / --fstype ext3 --size=1 --grow --maxsize=4096 # 创建/分区大小为4个G |
22 |
part /usr --fstype ext3 --size=1 --grow # 创建/usr分区,大小为剩余空间 |
23 |
part swap --size=1 --grow --maxsize=512 # 创建swap大小为512M |
24 |
25 |
%packages # 定义安装时安装的包 |
26 |
@core # 最小化安装的包 |
27 |
@useful # 自定义的包 |
然后就要修改配置文件使安装时使用ks.cfg的配置来安装,修改isolinux.cfg:
01 |
vi isolinux/isolinux.cfg |
02 |
default linux # 默认启动的label |
03 |
prompt 1 |
04 |
timeout 10 # 等待时间为1秒钟 |
05 |
display boot.msg |
06 |
F1 boot.msg |
07 |
F2 options.msg |
08 |
F3 general.msg |
09 |
F4 param.msg |
10 |
F5 rescue.msg |
11 |
label linux |
12 |
kernel vmlinuz |
13 |
append ks=cdrom:/isolinux/ks.cfg initrd=initrd.img text #修改默认linux的label,ks使用自定义的ks,并文本启动 |
14 |
label text |
15 |
kernel vmlinuz |
16 |
append initrd=initrd.img text |
17 |
label ks |
18 |
kernel vmlinuz |
19 |
append ks initrd=initrd.img |
20 |
label local |
21 |
localboot 1 |
22 |
label memtest86 |
23 |
kernel memtest |
24 |
append - |
到这里配置就基本完成,下面就是制作iso镜像进行安装测试:
1 |
# 首先安装工具 |
2 |
yum -y install mkisofs |
3 |
# 创建iso镜像: |
4 |
cd /usr/cold |
5 |
mkisofs -R -J -T -r -l -d -allow-multidot -allow-leading-dots -no-bak -o /usr/ColdOS-0.1-i386.iso -b isolinux/isolinux.bin -c isolinux/boot. cat -no-emul-boot -boot-load-size 4 -boot-info-table . |
然后就可以把镜像下载下来进行安装测试了…下一篇就会介绍如何把之前一篇文章介绍的cfengine集成到自己的发行版
所有评论(0)