.制作环境的准备


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镜像文件

Wgethttp://mirrors.loosefoot.com/centos/6.0/isos/x86_64/CentOS-6.0-x86_64-bin-DVD1.iso

Wgethttp://mirrors.loosefoot.com/centos/6.0/isos/x86_64/CentOS-6.0-x86_64-bin-DVD2.iso


.创建定制系统(MediaCentOS基于 CentOS6.0-64 Base server


1.光盘主要结构及文件简介

*isolinux目录存放光盘启动时的安装界面信息

*images目录包括了必要的启动映像文件

*Packages目录存放安装软件包及信息

*.discinfo文件是安装价质的识别信息

 

MediaCentOS目录存放媒体中心安装包

Repodata目录存放rpm包依赖信息

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 -p /disk/Packages

[shell]# mkdir –p /disk/MediaCentOS

4.拷贝 MediaCentOS系统所需rpm

a.从Base server模式下安装CentOS6.0-64系统root目录下拷贝anaconda-ks.cfg,install.log到定制系统主机 disk 目录下

b. [shell]#cd /disk; awk '/Installing/{print $2}' install.log | xargs –i cp /mnt/cdrom/Packages/{}.rpm Packages/.

5.定制安装控制文件ks.cfg

ks文件主要分为三个部分:

a)系统安装及配置

b)自定义安装准备(%post --nochroot)

c)用户自定义安装(%post)

系统安装及配置一般写在ks.cfg文件最前面,系统安装设置以%post --nochroot为结束标志,接着是用户自定义安装准备部分,以“%post --nochroot”作为开始,以“%post”作为结束,自定义安装部分以“%post”作为开始。一般方便可以直接由root下面的 anaconda-ks.cfg修改。

可用vim直接进行修改也可以用system-config-kickstart图形化工具进行修改

[shell]# vim ks.cfg

修改后内容如下

#platform=x86, AMD64,或 Intel EM64T

#version=DEVEL

# Firewall configuration关闭防火墙

firewall --disabled

# Install OS instead of upgrade覆盖安装

install

# Use CDROM installation media从光驱安装

cdrom

repo --name="CentOS" --baseurl=file:///mnt/source --cost=100

# Root password

rootpw --iscrypted $1$Ro9DjGl8$6bU7DsgPlc9YSAjs1Jj4s1

# System authorization information

auth --useshadow --passalgo=sha512 --enablefingerprint

# Use graphical mode install //图形化安装

graphical

firstboot --disable

# System keyboard //美式键盘

keyboard us

# System language //美式英语

lang en_US

# SELinux configuration //关闭SELinux

selinux --disabled

# Installation logging level

logging --level=info

# Reboot after installation //安装完成后重启

reboot

# System timezone //时区

timezone America/New_York

# Network information设置静态ip

network --bootproto=static --device=eth0 --gateway=192.168.1.1 --ip=192.168.1.2 --netmask=255.255.255.0 --onboot=on

# System bootloader configuration

bootloader --location=mbr --append="crashkernel=auto rhgb quiet"

# Clear the Master Boot Record清除mbr

zerombr

# Partition clearing information //删除所有分区 初始化卷标

clearpart --all --initlabel

# Disk partitioning information系统分区

part /boot --asprimary --fstype="ext4" --ondisk=sda --size=100

part swap --asprimary --fstype="swap" --ondisk=sda --size=2048

part / --asprimary --fstype="ext4" --grow --ondisk=sda --size=1

part /var --fstype="ext4" --ondisk=sda --size=20480

#安装后运行脚本

%post

#RecData格式化硬盘并挂载到/RecData目录下

disk_num=`parted -l | grep "Disk /dev/" | wc -l`

disk1=`parted -l | awk '/Disk \/dev/{print $2}'|sed 's/://g'|sed -n '1p'`

disk2=`parted -l | awk '/Disk \/dev/{print $2}'|sed 's/://g'|sed -n '2p'`

sda_num=`parted $disk1 -s print | awk '/^ /{print $1}'| wc -l`

sdb_num=`parted $disk2 -s print | awk '/^ /{print $1}'| wc -l`

if [ "$disk_num" -gt 1 ]; then

       if [ "$sda_num" -eq 0 ]; then

               parted $disk1 -s mklabel gpt

               parted $disk1 -s -- mkpart primary 0 -1

               mkfs.ext4 ${disk1}1

      sda_num=1

       fi

       if [ "$sdb_num" -eq 0 ]; then

               parted $disk2 -s mklabel gpt

               parted $disk2 -s -- mkpart primary 0 -1

               mkfs.ext4 ${disk2}1

      sdb_num=1

       fi

   

       if [ "$sda_num" -eq 1 ]; then

               uuid=`blkid ${disk1}1 | awk '/dev/{print $2}'|sed 's/"//g'`

      if [ -z "$uuid" ]; then

          uuid=${disk1}1

          fsck.ext4 -y ${disk1}1 &

          sleep 60

           killall -9 fsck.ext4

      fi

               mkdir -p /RecData

      mount ${disk1}1 /RecData

      mkdir -p /RecData/{Rec,RecN}

      echo "$uuid /RecData ext4 defaults 0 0" >> /etc/fstab

   fi

       if [ "$sdb_num" -eq 1 ]; then

               uuid=`blkid ${disk2}1 | awk '/dev/{print $2}'|sed 's/"//g'`

       if [ -z "$uuid" ]; then

          uuid=${disk2}1

          fsck.ext4 -y ${disk2}1 &

          sleep 60

          killall -9 fsck.ext4

      fi

               mkdir -p /RecData

      mount ${disk2}1 /RecData

      mkdir -p /RecData/{Rec,RecN}

      echo "$uuid /RecData ext4 defaults 0 0" >> /etc/fstab

   fi

fi

#mount cdrom挂载光驱

mkdir -p /media/cdrom

mount -o loop /dev/cdrom /media/cdrom

#install media center从光碟拷贝媒体中心安装包并进行安装

cp -rf /media/cdrom/MediaCentOS/MediaCenterInstall*.tar.gz /opt/.

cd /opt

chmod 755 -R *

tar xfv MediaCenterInstall*.tar.gz

cd /opt/MediaCenterInstall*/MediaCenter

sh install.sh

cd /opt/MediaCenterInstall*/LiveNode

sh install.sh

rm -rf /opt/MediaCenterInstall*

#boot echo定制系统启动信息(将CentOS字样替换成MediaCentOS)

echo "MediaCentOS Linux release 6.0 (Based on CentOS 6.0)" > /etc/centos-release

sed -i 's/CentOS Linux release 6.0 (Final)/MediaCentOS Linux release 6.0 (Based on CentOS 6.0)/g' /etc/issue

sed -i 's/CentOS Linux release 6.0 (Final)/MediaCentOS Linux release 6.0 (Based on CentOS 6.0)/g' /etc/issue.net

sed -i 's/localhost.localdomain/MediaCentOS/g' /etc/sysconfig/network

sed -i 's/CentOS/MediaCentOS/g' /etc/rc.d/rc.sysinit

sed -i 's/rhgb/ /g' /boot/grub/grub.conf

#close cdrom安装完成弹出光碟

eject

#reboot一切执行完毕后重启

reboot -f

%end

#安装包信息

%packages

@base

@console-internet

@core

@debugging

@directory-client

@hardware-monitoring

@java-platform

@large-systems

@network-file-system-client

@performance

@perl-runtime

@server-platform

@server-policy

certmonger

krb5-workstation

nscd

nss-pam-ldapd

oddjob

pam_krb5

pam_ldap

pax

perl-DBD-SQLite

sgpio

 

%end

6.修改isolinux.cfg文件

将/Disk/isolinu/目录下的isolinux.cfg修改如下:

default vesamenu.c32

#prompt 1

timeout 600

 

display boot.msg

 

menu background splash.jpg

menu title Welcome to MediaCentOS 6.0!

menu color border 0 #ffffffff #00000000

menu color sel 7 #ffffffff #ff000000

menu color title 0 #ffffffff #00000000

menu color tabmsg 0 #ffffffff #00000000

menu color unsel 0 #ffffffff #00000000

menu color hotsel 0 #ff000000 #ffffffff

menu color hotkey 7 #ffffffff #ff000000

menu color scrollbar 0 #ffffffff #00000000

 

label linux

 menu label ^Install an existing system

 kernel vmlinuz

 append initrd=initrd.img ks=cdrom:/ks.cfg

label Manually

 menu label Manually set ^partition install an existing system

 kernel vmlinuz

 append initrd=initrd.img ks=cdrom:/mks.cfg

label USB

 menu label ^Use the U dish to install an existing system

 kernel vmlinuz

 append initrd=initrd.img ks=hd:sda1:/mks.cfg

label rescue

 menu label ^Rescue installed system

 kernel vmlinuz

 append initrd=initrd.img rescue

label local

 menu label Boot from ^local drive

 menu default

 localboot 0xffff

label memtest86

 menu label ^Memory test

 kernel memtest

 append –

7.修改安装界面文本标题

这里我们可以去掉安装过程中的CentOS字样,在安装光盘里面有两个.buildstamp文件,一个位于stage2.img中,一个位于 initrd.img中,安装光盘运行时读取的是initrd.img中的那个.buildstamp文件,所以只要把initrd.img文件改了就可以了。

(1)解压initrd.img文件

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

# rm –f initrd.img

这是网上流传的方法,可能有问题,如果在执行“# gunzip initrd.img.gz”这个命令时出现:gzip: initrd.img.gz: not in gzip format

请使用:# xz -dc initrd.img | cpio -id   解压

然后修改.buildstamp文件,将CentOS改为MediaCentOS即可.

(2)制作initrd.img文件

假设当前目录位于准备好的initrd文件系统的根目录下;

# find . | cpio -c -o | xz -9 --format=lzma > initrd.img 

# cp initrd.img /disk/isolinux/

 

8.修改安装光盘背景图片

1.grub 背景图片为/disk/isolinux/splash.jpg

2.安装rpm包时背景图片在/disk/images/install.img镜像文件中

   A.建立install.img镜像挂载目录

   # mkdir /media/intall

   B.挂载install.img镜像

# mount –o loop /disk/images/install.img /media/intall

C.拷贝/media/intall目录到/tmp目录下

# rsync –av /media/intall /tmp

D.修改背景图

/tmp/install/usr/share/anaconda/pixmaps/progress_first.png

E. install.img封装并替换/disk/images/install.img

#cd /tmp

# mksquashfs install install.img

#cp –fv install.img /disk/images/

 

9.生成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文件。

10.将媒体中心安装包拷贝到/disk/ MediaCentOS/


.制作ISO文件


到了这一步,实际定制配置系统的工作已经完成了。下面就是生成一个ISO镜像文件,便于刻录到光盘中进行安装。

[shell]# cd /disk/

[shell]# mkisofs -o MediaCentOS.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/ 目录下产生的MediaCentOS.iso是生成的ISO文件。我们可以测试这个iso的正确性,通过VMiso镜像安装即可测试定制系统的正确性,如果没问题就可以进行光盘刻录。