定製centos6.0

一. 製作環境的準備
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目錄下。

 
        
  1. #!/bin/bash    
  2. ############################################################    
  3. # 生成RPM包packages.list列表、拷貝packages.list中RPM包列表    
  4. ############################################################    
  5. prog=copyrpm.sh    
  6. ###拷貝光盤內容到/disk,排除Packages目錄    
  7. #cd /mnt/cdrom    
  8. #ls -a|grep -v "Packages"|xargs -i cp -rp {} /disk/    
  9. ###生成RPM包packages.list列表    
  10. build_packages_list(){    
  11. poin_file=$2    
  12. cat /root/install.log | grep Installing | sed 's/Installing //g' > $poin_file    
  13. }    
  14. ###拷貝packages.list中RPM包列表到指定位置    
  15. copy_packages_list(){    
  16. DEBUG=0    
  17. DVD_CD=$3 #/disk/Packages    
  18. ALL_RPMS_DIR=$2 #/mnt/cdrom/Packages/    
  19. DVD_RPMS_DIR=$DVD_CD    
  20. packages_list=$4 #/root/packages.list    
  21. number_of_packages=`cat $packages_list | wc -l`    
  22. i=1    
  23. while [ $i -le $number_of_packages ] ; do    
  24. line=`head -n $i $packages_list | tail -n -1`    
  25. name=`echo $line | awk '{print $1}'`    
  26. version=`echo $line | awk '{print $3}' | cut -f 2 -d :`    
  27. if [ $DEBUG -eq "1" ] ; then    
  28. echo $i: $line    
  29. echo $name    
  30. echo $version    
  31. fi    
  32. if [ $DEBUG -eq "1" ] ; then    
  33. ls $ALL_RPMS_DIR/$name-$version*    
  34. if [ $? -ne 0 ] ; then    
  35. echo "cp $ALL_RPMS_DIR/$name$version* "    
  36. fi    
  37. else    
  38. echo "cp $ALL_RPMS_DIR/$name-$version* $DVD_RPMS_DIR/"    
  39. cp $ALL_RPMS_DIR/$name$version* $DVD_RPMS_DIR/    
  40. # in case the copy failed    
  41. if [ $? -ne 0 ] ; then    
  42. echo "cp $ALL_RPMS_DIR/$name$version* "    
  43. cp $ALL_RPMS_DIR/$name* $DVD_RPMS_DIR/    
  44. fi    
  45. fi    
  46. i=`expr $i + 1`    
  47. done    
  48. }    
  49.      
  50. ###模糊查找rpm包,並拷貝指定文件夾    
  51. find_packages_list() {    
  52. root_dir=$2 #源目錄    
  53. decs_dir=$3 #目標目錄    
  54. load_file=$4 #檢查列表    
  55. xorg_dim=$5 #通配規則    
  56.      
  57. for i in `cat $load_file|sort|uniq -c|awk '{print$2}'`    
  58. do    
  59. if [ $decs_dir = "--test" ];then    
  60. case "$xorg_dim" in    
  61. --fr)    
  62. echo "=====================$i(fr)========================"    
  63. echo `/bin/find $root_dir -name "*$i"`    
  64. echo "==============================================="    
  65. ;;    
  66. --br)    
  67. echo "=====================$i(br)========================"    
  68. echo `/bin/find $root_dir -name "$i*"`    
  69. echo "==============================================="    
  70. ;;    
  71. --all)    
  72. echo "=====================$i(all)========================"    
  73. echo `/bin/find $root_dir -name "*$i*"`    
  74. echo "==============================================="    
  75. ;;    
  76. *)    
  77. echo "=====================$i(default)==============="    
  78. echo `/bin/find $root_dir -name "*$i*"`    
  79. echo "==============================================="    
  80. ;;    
  81. esac    
  82.      
  83. elif [ -d $decs_dir ];then    
  84. case "$decs_dir" in    
  85. --fr)    
  86. find $root_dir -name "*$i" -type f -exec cp -rf {} $decs_dir \;    
  87. echo $i    
  88. ;;    
  89. --br)    
  90. find $root_dir -name "$i*" -type f -exec cp -rf {} $decs_dir \;    
  91. echo $i    
  92. ;;    
  93. --all)    
  94. find $root_dir -name "*$i*" -type f -exec cp -rf {} $decs_dir \;    
  95. echo $i    
  96. ;;    
  97. *)    
  98. find $root_dir -name "*$i*" -type f -exec cp -rf {} $decs_dir \;    
  99. echo $i    
  100. ;;    
  101. esac    
  102. else    
  103. echo "Usage: {--test|destination_dir}"    
  104. exit 1    
  105. fi    
  106. done    
  107. }    
  108.      
  109. case "$1" in    
  110. -b)    
  111. if [ $2 ];then    
  112. build_packages_list -b $2    
  113. else    
  114. echo "Nothing input!!! "    
  115. fi    
  116. ;;    
  117. -c)    
  118. if [ $2 -a $3 -a $4 ];then    
  119. copy_packages_list -c $2 $3 $4    
  120. else    
  121. echo "Nothing input!!! "    
  122. fi    
  123. ;;    
  124. -f)    
  125. if [ $2 -a $3 -a $4 -a $4 -a $5 ];then    
  126. find_packages_list -f $2 $3 $4 $5    
  127. else    
  128. echo "Nothing input!!! "    
  129. fi    
  130. ;;    
  131. --h|--help)    
  132. echo "==============================================================="    
  133. echo "這個腳本主要用在定製linux_base系時,將install.log文件中安裝的rpm包"    
  134. echo "導到一個文件列表中;然後再將該導出的文件中的rpm包列表全部拷貝到將要"    
  135. echo "定製的base版系統的Packages文件夾中.這些rpm包爲裁剪原版系統後所得的"    
  136. echo "基本包."    
  137. echo "使用方法:"    
  138. echo " 1、生成RPM列表:$prog -b {export_file}"    
  139. echo " 例子:$prog -b /root/soft.list"    
  140. echo " 2、拷貝RPM包:$prog -c {source_dir} {destination_dir} {inport_file}"    
  141. echo " 例子:$prog -c /mnt/cdrom/ /disk/ /root/soft.list"    
  142. echo " 3、查找並拷貝rpm包:"    
  143. echo " $prog -f {source_dir} {destination_dir} {inport_file} {fr,br,all}"    
  144. echo " $prog -f /mnt/cdrom/ /disk/ /root/soft.list --all"    
  145. echo " 4、只測試不拷貝文件:"    
  146. echo " $prog -f {source_dir} --test {inport_file} {fr,br,all}"    
  147. echo " $prog -f /mnt/cdrom/ --test /root/soft.list --all"    
  148. echo " =============================================================="    
  149. ;;    
  150. *)    
  151. echo $"Usage: $prog {-b|-c|--h|--help}"    
  152. exit 1    
  153. 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. install //指定開始全新安裝系統    
  3. cdrom //光驅方式    
  4. text //文本界面安裝    
  5. lang en_US.UTF-8 //系統語言設定    
  6. keyboard us //鍵盤設置    
  7. skipx //跳過X桌面    
  8. network --device eth0 --bootproto dhcp //設置系統的IP地址信息    
  9. rootpw --iscrypted $1$sXpmDpgD$IOEYOpdpXtxXgw7RmjtZS/ //經過加密的root密碼    
  10. firewall --enabled //關閉防火牆    
  11. authconfig --enableshadow --enablemd5 //系統驗證方式,這裏啓用默認md5加密    
  12. selinux –disabled //關閉Selinux    
  13. timezone Asia/Shanghai //系統時區設置    
  14. bootloader --location=mbr //引導選項    
  15. clearpart --all --initlabel //全部格式化系統磁盤所有分區,下面開始進行分區設置    
  16. part / --bytes-per-inode=4096 --fstype="ext4" --size=1000 --grow    
  17. part /boot --bytes-per-inode=4096 --fstype="ext4" --size=100    
  18. part swap --bytes-per-inode=4096 --fstype="swap" --size=12000    
  19. reboot //這個reboot必須寫在系統分區之後    
  20.      
  21. %packages //系統需要安裝的軟件包    
  22. @chinese-support    
  23. @core    
  24. rsyslog    
  25. patch    
  26. gcc    
  27. gcc-c++    
  28. libXft    
  29. make    
  30. autoconf    
  31. automake    
  32. ntp    
  33. sysstat    
  34. rsync    
  35. dstat    
  36. ncurses    
  37. ncurses-devel    
  38. net-snmp    
  39. net-snmp-libs    
  40.  

除了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鏡像安裝即可測試定製系統的正確性,如果沒問題就可以進行光盤刻錄。

發佈了18 篇原創文章 · 獲贊 22 · 訪問量 17萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章