centos定製

轉載自cold night's Linux Blog

根據CentOS定製自己的發行版

本文使用的環境爲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集成到自己的發行版

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章