Chinaunix首页 | 论坛 | 博客
  • 博客访问: 454255
  • 博文数量: 144
  • 博客积分: 5675
  • 博客等级: 大校
  • 技术积分: 1512
  • 用 户 组: 普通用户
  • 注册时间: 2008-10-20 10:46
文章分类

全部博文(144)

文章存档

2014年(1)

2013年(1)

2012年(12)

2011年(39)

2010年(48)

2009年(29)

2008年(14)

我的朋友

分类: LINUX

2012-02-16 00:40:20

一. 制作环境的准备

1. 安装制作发行版的工具:
[shell]# yum -y install anaconda repodata createrepo mkisofs
[shell]# yum -y install anaconda-runtime createrepo yum-utils anacondaanaconda-help busybox-anaconda mkisofs

2. 安装Centos6.0系统
由于方便制作,我们可以在VMware、vbox、xen等虚拟环境中进行安装,这里我们选用了VMware作为制作环境。
(1) 在官方网站上下载CentOS-6.0-x86_64-bin-DVD.iso镜像文件
Wget
Wget

(2) 创建VM虚拟机
CPU:2 core / MEM:4G / HD:20G
由于在制作过程中需要拷贝大量数据,所以硬盘尽量保持20G以上。

(3) 生成packages.list软件清单
(由于install.log文件在root目录,所以该操作在root目录进行)
[英文版centos执行此命令]
[shell]# cat install.log | grep Installing | sed 's/Installing //g' > /root/packages.list
[中文版centos执行此命令]
[shell]# cat install.log | grep 安装 | sed 's/安装 //g' > /root/packages.list
生成后,需要仔细看该文件,一般会在某些文件开始部分如“1:”这样的字符,需要删除这些字符,否在后面执行copy动作会报错。

二. 创建定制系统(My4399OS)目录
1. 光盘结构及文件简介
*isolinux 目录存放光盘启动时的安装界面信息
*images 目录包括了必要的启动映像文件
*Packages 目录存放安装软件包及信息
*.discinfo 文件是安装价质的识别信息
*lnmp 目录存放定制系统配置文件及LNMP安装脚本

2. 创建设/disk目录,挂载光盘
[shell]# mkdir /disk
[shell]# mkdir /mnt/cdrom
[shell]# mount –o loop /dev/cdrom /mnt/cdrom

3. 拷贝光盘目录
[shell]# cd /mnt/cdrom
[shell]# ls -a .|grep –v “Packages”|xargs -i cp -rp {} /disk
//将所有文件和文件夹拷贝到/disk,除了Packages目录
[shell]# mkdir /disk/Packages

4. 拷贝packages.list软件清单
编写复习脚本copyrpms.sh,脚本的功能是为了从packages.list获取软件清单,然后将其逐一地拷贝到/disk/Packages目录下。

 
        
  1. #!/bin/bash
  2.     
  3. ############################################################
  4.     
  5. # 生成RPM包packages.list列表、拷贝packages.list中RPM包列表
  6.     
  7. ############################################################
  8.     
  9. prog=copyrpm.sh
  10.     
  11. ###拷贝光盘内容到/disk,排除Packages目录
  12.     
  13. #cd /mnt/cdrom
  14.     
  15. #ls -a|grep -v "Packages"|xargs -i cp -rp {} /disk/
  16.     
  17. ###生成RPM包packages.list列表
  18.     
  19. build_packages_list(){
  20.     
  21. poin_file=$2
  22.     
  23. cat /root/install.log | grep Installing | sed 's/Installing //g' > $poin_file
  24.     
  25. }
  26.     
  27. ###拷贝packages.list中RPM包列表到指定位置
  28.     
  29. copy_packages_list(){
  30.     
  31. DEBUG=0
  32.     
  33. DVD_CD=$3 #/disk/Packages
  34.     
  35. ALL_RPMS_DIR=$2 #/mnt/cdrom/Packages/
  36.     
  37. DVD_RPMS_DIR=$DVD_CD
  38.     
  39. packages_list=$4 #/root/packages.list
  40.     
  41. number_of_packages=`cat $packages_list | wc -l`
  42.     
  43. i=1
  44.     
  45. while [ $i -le $number_of_packages ] ; do
  46.     
  47. line=`head -n $i $packages_list | tail -n -1`
  48.     
  49. name=`echo $line | awk '{print $1}'`
  50.     
  51. version=`echo $line | awk '{print $3}' | cut -f 2 -d :`
  52.     
  53. if [ $DEBUG -eq "1" ] ; then
  54.     
  55. echo $i: $line
  56.     
  57. echo $name
  58.     
  59. echo $version
  60.     
  61. fi
  62.     
  63. if [ $DEBUG -eq "1" ] ; then
  64.     
  65. ls $ALL_RPMS_DIR/$name-$version*
  66.     
  67. if [ $? -ne 0 ] ; then
  68.     
  69. echo "cp $ALL_RPMS_DIR/$name$version* "
  70.     
  71. fi
  72.     
  73. else
  74.     
  75. echo "cp $ALL_RPMS_DIR/$name-$version* $DVD_RPMS_DIR/"
  76.     
  77. cp $ALL_RPMS_DIR/$name$version* $DVD_RPMS_DIR/
  78.     
  79. # in case the copy failed
  80.     
  81. if [ $? -ne 0 ] ; then
  82.     
  83. echo "cp $ALL_RPMS_DIR/$name$version* "
  84.     
  85. cp $ALL_RPMS_DIR/$name* $DVD_RPMS_DIR/
  86.     
  87. fi
  88.     
  89. fi
  90.     
  91. i=`expr $i + 1`
  92.     
  93. done
  94.     
  95. }
  96.     
  97.  
  98.     
  99. ###模糊查找rpm包,并拷贝指定文件夹
  100.     
  101. find_packages_list() {
  102.     
  103. root_dir=$2 #源目录
  104.     
  105. decs_dir=$3 #目标目录
  106.     
  107. load_file=$4 #检查列表
  108.     
  109. xorg_dim=$5 #通配规则
  110.     
  111.  
  112.     
  113. for i in `cat $load_file|sort|uniq -c|awk '{print$2}'`
  114.     
  115. do
  116.     
  117. if [ $decs_dir = "--test" ];then
  118.     
  119. case "$xorg_dim" in
  120.     
  121. --fr)
  122.     
  123. echo "=====================$i(fr)========================"
  124.     
  125. echo `/bin/find $root_dir -name "*$i"`
  126.     
  127. echo "==============================================="
  128.     
  129. ;;
  130.     
  131. --br)
  132.     
  133. echo "=====================$i(br)========================"
  134.     
  135. echo `/bin/find $root_dir -name "$i*"`
  136.     
  137. echo "==============================================="
  138.     
  139. ;;
  140.     
  141. --all)
  142.     
  143. echo "=====================$i(all)========================"
  144.     
  145. echo `/bin/find $root_dir -name "*$i*"`
  146.     
  147. echo "==============================================="
  148.     
  149. ;;
  150.     
  151. *)
  152.     
  153. echo "=====================$i(default)==============="
  154.     
  155. echo `/bin/find $root_dir -name "*$i*"`
  156.     
  157. echo "==============================================="
  158.     
  159. ;;
  160.     
  161. esac
  162.     
  163.  
  164.     
  165. elif [ -d $decs_dir ];then
  166.     
  167. case "$decs_dir" in
  168.     
  169. --fr)
  170.     
  171. find $root_dir -name "*$i" -type f -exec cp -rf {} $decs_dir \;
  172.     
  173. echo $i
  174.     
  175. ;;
  176.     
  177. --br)
  178.     
  179. find $root_dir -name "$i*" -type f -exec cp -rf {} $decs_dir \;
  180.     
  181. echo $i
  182.     
  183. ;;
  184.     
  185. --all)
  186.     
  187. find $root_dir -name "*$i*" -type f -exec cp -rf {} $decs_dir \;
  188.     
  189. echo $i
  190.     
  191. ;;
  192.     
  193. *)
  194.     
  195. find $root_dir -name "*$i*" -type f -exec cp -rf {} $decs_dir \;
  196.     
  197. echo $i
  198.     
  199. ;;
  200.     
  201. esac
  202.     
  203. else
  204.     
  205. echo "Usage: {--test|destination_dir}"
  206.     
  207. exit 1
  208.     
  209. fi
  210.     
  211. done
  212.     
  213. }
  214.     
  215.  
  216.     
  217. case "$1" in
  218.     
  219. -b)
  220.     
  221. if [ $2 ];then
  222.     
  223. build_packages_list -b $2
  224.     
  225. else
  226.     
  227. echo "Nothing input!!! "
  228.     
  229. fi
  230.     
  231. ;;
  232.     
  233. -c)
  234.     
  235. if [ $2 -a $3 -a $4 ];then
  236.     
  237. copy_packages_list -c $2 $3 $4
  238.     
  239. else
  240.     
  241. echo "Nothing input!!! "
  242.     
  243. fi
  244.     
  245. ;;
  246.     
  247. -f)
  248.     
  249. if [ $2 -a $3 -a $4 -a $4 -a $5 ];then
  250.     
  251. find_packages_list -f $2 $3 $4 $5
  252.     
  253. else
  254.     
  255. echo "Nothing input!!! "
  256.     
  257. fi
  258.     
  259. ;;
  260.     
  261. --h|--help)
  262.     
  263. echo "==============================================================="
  264.     
  265. echo "这个脚本主要用在定制linux_base系时,将install.log文件中安装的rpm包"
  266.     
  267. echo "导到一个文件列表中;然后再将该导出的文件中的rpm包列表全部拷贝到将要"
  268.     
  269. echo "定制的base版系统的Packages文件夹中.这些rpm包为裁剪原版系统后所得的"
  270.     
  271. echo "基本包."
  272.     
  273. echo "使用方法:"
  274.     
  275. echo " 1、生成RPM列表:$prog -b {export_file}"
  276.     
  277. echo " 例子:$prog -b /root/soft.list"
  278.     
  279. echo " 2、拷贝RPM包:$prog -c {source_dir} {destination_dir} {inport_file}"
  280.     
  281. echo " 例子:$prog -c /mnt/cdrom/ /disk/ /root/soft.list"
  282.     
  283. echo " 3、查找并拷贝rpm包:"
  284.     
  285. echo " $prog -f {source_dir} {destination_dir} {inport_file} {fr,br,all}"
  286.     
  287. echo " $prog -f /mnt/cdrom/ /disk/ /root/soft.list --all"
  288.     
  289. echo " 4、只测试不拷贝文件:"
  290.     
  291. echo " $prog -f {source_dir} --test {inport_file} {fr,br,all}"
  292.     
  293. echo " $prog -f /mnt/cdrom/ --test /root/soft.list --all"
  294.     
  295. echo " =============================================================="
  296.     
  297. ;;
  298.     
  299. *)
  300.     
  301. echo $"Usage: $prog {-b|-c|--h|--help}"
  302.     
  303. exit 1
  304.     
  305. esac

 

[shell]# ./copyrpms.sh -c /mnt/cdrom/Packages /disk/Packages /root/packages.list
//从光盘中拷贝packages.list里的软件清单到/disk/Packages目录里

这 里已经拷贝了定制centos系统最基本的rpm包,但实际上我们的应用环境还需用到更多的rpm包。这种情况我们应该做的是先找出我们还需要的软件包, 如:gcc、gd、vnstat等,然后一个一个手动将它们拷贝到/disk/Packages目录里。但这里要注意的是,这些包中很可能存在依赖关系, 如果你没有把它们相依赖的rpm包同时拷贝到/disk/Packages目录里,那在安装过程中将会提示找不到所需依赖包。
我们可以使用yum install命令找出它们的依赖包,然后将其依赖包记录到一个文本文件中,如add_soft.txt,再使刚才的脚本;
[shell]# ./copyrpms.sh -f /mnt/cdrom/Packages --test /root/soft.txt --all
//这条命令是在光盘中找出soft.txt中对应的软件清单,只显示不拷贝,--all为匹配规则,fr,br分别表示为“*str”、“str*”,all为“*str*”。
[shell]# ./copyrpms.sh -f /mnt/cdrom/Packages /disk/Packages /root/soft.txt –all
//在光盘中找出soft.txt中对应的软件清单,直接拷贝到/disk/Packages

经过一系列的复制就完成了你要定制的RPM包(在/Disk/Packages/目录下)。

5. 定制安装控制文件ks.cfg
ks文件主要分为三个部分:
a) 系统安装及配置
b) 自定义安装准备(%post --nochroot)
c) 用户自定义安装(%post)
系 统安装及配置一般写在ks.cfg文件最前面,系统安装设置以%post --nochroot为结束标志,接着是用户自定义安装准备部分,以“%post --nochroot”作为开始,以“%post”作为结束,自定义安装部分以“%post”作为开始。一般方便可以直接由root下面的 anaconda-ks.cfg修改。
[shell]# cp /root/anaconda-ks.cfg /disk/isolinux

ks.cfg基本的书写样式:

 
        
  1. # Kickstart file automatically generated by anaconda.
  2.     
  3. install //指定开始全新安装系统
  4.     
  5. cdrom //光驱方式
  6.     
  7. text //文本界面安装
  8.     
  9. lang en_US.UTF-8 //系统语言设定
  10.     
  11. keyboard us //键盘设置
  12.     
  13. skipx //跳过X桌面
  14.     
  15. network --device eth0 --bootproto dhcp //设置系统的IP地址信息
  16.     
  17. rootpw --iscrypted $1$sXpmDpgD$IOEYOpdpXtxXgw7RmjtZS/ //经过加密的root密码
  18.     
  19. firewall --enabled //关闭防火墙
  20.     
  21. authconfig --enableshadow --enablemd5 //系统验证方式,这里启用默认md5加密
  22.     
  23. selinux –disabled //关闭Selinux
  24.     
  25. timezone Asia/Shanghai //系统时区设置
  26.     
  27. bootloader --location=mbr //引导选项
  28.     
  29. clearpart --all --initlabel //全部格式化系统磁盘所有分区,下面开始进行分区设置
  30.     
  31. part / --bytes-per-inode=4096 --fstype="ext4" --size=1000 --grow
  32.     
  33. part /boot --bytes-per-inode=4096 --fstype="ext4" --size=100
  34.     
  35. part swap --bytes-per-inode=4096 --fstype="swap" --size=12000
  36.     
  37. reboot //这个reboot必须写在系统分区之后
  38.     
  39.  
  40.     
  41. %packages //系统需要安装的软件包
  42.     
  43. @chinese-support
  44.     
  45. @core
  46.     
  47. rsyslog
  48.     
  49. patch
  50.     
  51. gcc
  52.     
  53. gcc-c++
  54.     
  55. libXft
  56.     
  57. make
  58.     
  59. autoconf
  60.     
  61. automake
  62.     
  63. ntp
  64.     
  65. sysstat
  66.     
  67. rsync
  68.     
  69. dstat
  70.     
  71. ncurses
  72.     
  73. ncurses-devel
  74.     
  75. net-snmp
  76.     
  77. net-snmp-libs
  78.     
  79.  

除了cdrom安装方式外,还可以使用网络或硬盘安装方式;其示例如下:
url --url
nfs --server=192.168.2.62 --dir=/centos6
harddrive --partition=sda1 --dir=/centos6 //sda1是像文件所在的硬盘标识
以上ks.cfg示例属于系统安装及配置部份,另外的%post和%post –nochroot作用是当系统初始化安装完毕后需要执行的工作。例如:
%post --nochroot
# Mount CDROM
mkdir -p /mnt/cdrom
mount -r -t iso9660 /tmp/cdrom /mnt/cdrom
cp /mnt/cdrom/lnmp.tar.gz /mnt/sysimage/tmp/lnmp.tar.gz> /dev/null
cd /mnt/sysimage/tmp/
tar -zxvf lnmp.tar.gz > /dev/null
cp -R /mnt/sysimage/tmp/boot/* /mnt/sysimage/boot/ >/dev/null 2>/dev/null
cp -R /mnt/sysimage/tmp/etc/* /mnt/sysimage/etc/ >/dev/null 2>/dev/null
# Unmount CDROM
umount /mnt/cdrom
%post --nochroot 表示允许你指定你想在chroot环境之外运行的命令,由Linux系统安装进程在系统安装完成后,会卸载光盘,因此,象复制安装介质中的文件或RPM之类的任务将不能被执行。此时就需要用“%post --nochroot”选项。
[备注:经过测试在centos6.x系统无法在%post --nochroot环境下挂载光盘,所以这里只适合在centos5.x系列。其centos6.x的挂载方式在下面的%post中说明。]
%post 表示系统安装完成后,要运行的脚本,相当于在root环境下进行的操作,与在真实linux系统下进行操作完全一致。此时光盘已经被系统安装程序自动卸载。一般这里做一些系统的优化调整。
%post
chkconfig sendmail off
chkconfig --level 3 iptables on
chkconfig --level 2345 nfslock off
chkconfig --level 2345 portmap off
chkconfig --level 2345 crond on
[备注:由于centos6.x系统无法在--nochroot环境下挂载,只能在%post下挂载,挂载方式跟在真实linux环境下一致,命令和挂载路径也一致。]
Tips:手册后面附件为:本My4399_6.0系统的配置文件ks.cfg,重命为my4399.cfg。

6. 修改isolinux.cfg文件
将/Disk/isolinu/目录下的isolinux.cfg修改如下:
default auto
label auto
kernel vmlinuz
append ks=cdrom:/isolinux/ks.cfg initrd=initrd.img
append指定ks文件的读取路径,如果ks.cfg更名为其他名称,即在此修改。
append ks=cdrom:/isolinux/my4399.cfg

7. 修改安装界面文本标题
这 里我们可以去掉安装过程中的CentOS字样,在安装光盘里面有两个.buildstamp文件,一个位于stage2.img中,一个位于 initrd.img中,安装光盘运行时读取的是initrd.img中的那个.buildstamp文件,所以只要把initrd.img文件改了就可 以了。
(1) 解压initr.dimg文件
2.6内核中的initrd.img采用cpio压缩,不再是2.4内核使用的ext2格式,无法使用mount-o loop 挂载。需要使用gunzip解压缩,然后再利用cpio给img解包。
# cd /disk/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即可.

(2) 制作initrd.img文件
假设当前目录位于准备好的initrd文件系统的根目录下;
# find . | cpio -c -o >../initrd.img
# cp initrd.img /disk/isolinux/
Tips1:安装界面文本修改后如《图例一》所示,“Welcome to My4399 os for x86_64”。

8. 生成comps.xml
comps.xml 文件中包含了安装时用户所见到的与rpm相关的所有内容,它会检查Packages下的RPM包的依赖关系,安装时如果缺少依赖包,它会提示您哪个RPM 包需要哪些依赖库。同时它的角色就是相当于图形安装时选择软件包那个环节。主要由三部分组成,首先是组列表,它描述了在安装过程中需要的不同的组(或组 件),包括组名、组的描述和包含的RPM包;其次是组的层次结构,它将组分成不同的类,并定义了组的一个顺序,从而可以决定哪些组需要先安装;最后为一系 列RPM包以及它们之间的依赖关系。
下面先进入/disk/repodata 目录,将“*-x86_64-comps.xml”文件改为“comps.xml”,并且将其他文件删除。由于centos6.0下的comps.xml文件名很长,这里“*”为省略符,实际操作时输入完整文件名。
[shell]# cd /disk/ repodata
[shell]# mv *-comps.xml comps.xml
[shell]# ls .|grep -v “comps.xml”|xargs -i rm -f {}
然后返回到/disk根目录,就可以重新开始生成comps.xml文件了。
[shell]# cd /disk/
[shell]# createrepo -g repodata/comps.xml ./
[shell]# declare -x discinfo=`head -1 .discinfo`
[shell]# createrepo -u "media://$discinfo" -g repodata/comps.xml /disk/
到这里,comps.xml文件和其他相关联的文件已被重新生成到repodata目录下。
Tips2:如果你新增或删除了Packages目录的RPM包,请重新生成comps.xml文件。

三. 制作ISO文件
到了这一步,实际定制配置系统的工作已经完成了。下面就是生成一个ISO镜像文件,便于刻录到光盘中进行安装。
[shell]# cd /disk/
[shell]# mkisofs -o My4399.iso -b isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table -R -J -v -T /disk/
/disk/ 目录下产生的My4399.iso是生成的ISO文件。我们可以测试这个iso的正确性,通过VM的iso镜像安装即可测试定制系统的正确性,如果没问题就可以进行光盘刻录。
更加准确内容 请参考:
阅读(4521) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~