轉載自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集成到自己的發行版