一. 製作環境的準備
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 http://mirrors.loosefoot.com/centos/6.0/isos/x86_64/CentOS-6.0-x86_64-bin-DVD1.iso
Wget http://mirrors.loosefoot.com/centos/6.0/isos/x86_64/CentOS-6.0-x86_64-bin-DVD2.iso
(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目錄下。
- #!/bin/bash
- ############################################################
- # 生成RPM包packages.list列表、拷貝packages.list中RPM包列表
- ############################################################
- prog=copyrpm.sh
- ###拷貝光盤內容到/disk,排除Packages目錄
- #cd /mnt/cdrom
- #ls -a|grep -v "Packages"|xargs -i cp -rp {} /disk/
- ###生成RPM包packages.list列表
- build_packages_list(){
- poin_file=$2
- cat /root/install.log | grep Installing | sed 's/Installing //g' > $poin_file
- }
- ###拷貝packages.list中RPM包列表到指定位置
- copy_packages_list(){
- DEBUG=0
- DVD_CD=$3 #/disk/Packages
- ALL_RPMS_DIR=$2 #/mnt/cdrom/Packages/
- DVD_RPMS_DIR=$DVD_CD
- packages_list=$4 #/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* $DVD_RPMS_DIR/"
- cp $ALL_RPMS_DIR/$name$version* $DVD_RPMS_DIR/
- # in case the copy failed
- if [ $? -ne 0 ] ; then
- echo "cp $ALL_RPMS_DIR/$name$version* "
- cp $ALL_RPMS_DIR/$name* $DVD_RPMS_DIR/
- fi
- fi
- i=`expr $i + 1`
- done
- }
- ###模糊查找rpm包,並拷貝指定文件夾
- find_packages_list() {
- root_dir=$2 #源目錄
- decs_dir=$3 #目標目錄
- load_file=$4 #檢查列表
- xorg_dim=$5 #通配規則
- for i in `cat $load_file|sort|uniq -c|awk '{print$2}'`
- do
- if [ $decs_dir = "--test" ];then
- case "$xorg_dim" in
- --fr)
- echo "=====================$i(fr)========================"
- echo `/bin/find $root_dir -name "*$i"`
- echo "==============================================="
- ;;
- --br)
- echo "=====================$i(br)========================"
- echo `/bin/find $root_dir -name "$i*"`
- echo "==============================================="
- ;;
- --all)
- echo "=====================$i(all)========================"
- echo `/bin/find $root_dir -name "*$i*"`
- echo "==============================================="
- ;;
- *)
- echo "=====================$i(default)==============="
- echo `/bin/find $root_dir -name "*$i*"`
- echo "==============================================="
- ;;
- esac
- elif [ -d $decs_dir ];then
- case "$decs_dir" in
- --fr)
- find $root_dir -name "*$i" -type f -exec cp -rf {} $decs_dir \;
- echo $i
- ;;
- --br)
- find $root_dir -name "$i*" -type f -exec cp -rf {} $decs_dir \;
- echo $i
- ;;
- --all)
- find $root_dir -name "*$i*" -type f -exec cp -rf {} $decs_dir \;
- echo $i
- ;;
- *)
- find $root_dir -name "*$i*" -type f -exec cp -rf {} $decs_dir \;
- echo $i
- ;;
- esac
- else
- echo "Usage: {--test|destination_dir}"
- exit 1
- fi
- done
- }
- case "$1" in
- -b)
- if [ $2 ];then
- build_packages_list -b $2
- else
- echo "Nothing input!!! "
- fi
- ;;
- -c)
- if [ $2 -a $3 -a $4 ];then
- copy_packages_list -c $2 $3 $4
- else
- echo "Nothing input!!! "
- fi
- ;;
- -f)
- if [ $2 -a $3 -a $4 -a $4 -a $5 ];then
- find_packages_list -f $2 $3 $4 $5
- else
- echo "Nothing input!!! "
- fi
- ;;
- --h|--help)
- echo "==============================================================="
- echo "這個腳本主要用在定製linux_base系時,將install.log文件中安裝的rpm包"
- echo "導到一個文件列表中;然後再將該導出的文件中的rpm包列表全部拷貝到將要"
- echo "定製的base版系統的Packages文件夾中.這些rpm包爲裁剪原版系統後所得的"
- echo "基本包."
- echo "使用方法:"
- echo " 1、生成RPM列表:$prog -b {export_file}"
- echo " 例子:$prog -b /root/soft.list"
- echo " 2、拷貝RPM包:$prog -c {source_dir} {destination_dir} {inport_file}"
- echo " 例子:$prog -c /mnt/cdrom/ /disk/ /root/soft.list"
- echo " 3、查找並拷貝rpm包:"
- echo " $prog -f {source_dir} {destination_dir} {inport_file} {fr,br,all}"
- echo " $prog -f /mnt/cdrom/ /disk/ /root/soft.list --all"
- echo " 4、只測試不拷貝文件:"
- echo " $prog -f {source_dir} --test {inport_file} {fr,br,all}"
- echo " $prog -f /mnt/cdrom/ --test /root/soft.list --all"
- echo " =============================================================="
- ;;
- *)
- echo $"Usage: $prog {-b|-c|--h|--help}"
- exit 1
- 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基本的書寫樣式:
- # Kickstart file automatically generated by anaconda.
- install //指定開始全新安裝系統
- cdrom //光驅方式
- text //文本界面安裝
- lang en_US.UTF-8 //系統語言設定
- keyboard us //鍵盤設置
- skipx //跳過X桌面
- network --device eth0 --bootproto dhcp //設置系統的IP地址信息
- rootpw --iscrypted $1$sXpmDpgD$IOEYOpdpXtxXgw7RmjtZS/ //經過加密的root密碼
- firewall --enabled //關閉防火牆
- authconfig --enableshadow --enablemd5 //系統驗證方式,這裏啓用默認md5加密
- selinux –disabled //關閉Selinux
- timezone Asia/Shanghai //系統時區設置
- bootloader --location=mbr //引導選項
- clearpart --all --initlabel //全部格式化系統磁盤所有分區,下面開始進行分區設置
- part / --bytes-per-inode=4096 --fstype="ext4" --size=1000 --grow
- part /boot --bytes-per-inode=4096 --fstype="ext4" --size=100
- part swap --bytes-per-inode=4096 --fstype="swap" --size=12000
- reboot //這個reboot必須寫在系統分區之後
- %packages //系統需要安裝的軟件包
- @chinese-support
- @core
- rsyslog
- patch
- gcc
- gcc-c++
- libXft
- make
- autoconf
- automake
- ntp
- sysstat
- rsync
- dstat
- ncurses
- ncurses-devel
- net-snmp
- net-snmp-libs
除了cdrom安裝方式外,還可以使用網絡或硬盤安裝方式;其示例如下:
url --url http://192.168.2.62/centos6
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鏡像安裝即可測試定製系統的正確性,如果沒問題就可以進行光盤刻錄。