定製自己的eversecOS
一:要求:利用CentOS-5.5-i386-bin-DVD.iso定製自己的發行版。
效能要求:安裝過程要求能選擇安裝公司的哪些組件,哪些RPM包,並且安裝過程中,可通過特定的介面來配置公司開發軟體的設定檔。
介面要求: 文字圖片需是公司的內容或logo。
二:完成的工作:
效能部分,配置好ks.cfg後,只能在text方式下可選安裝組件與RPM包。
介面部分,安裝完成部分CentOS的圖片不知道怎麼替換。
三:製作方法:
1.在製作發行版之前,需要安裝一些軟體,安裝方法如下:
#yum -y install anaconda-runtime createrepo yum-utils anaconda anaconda-help busybox-anaconda mkisofs
2. 要想做好一個基於CentOS發行版的linux,繼續要在虛擬機器中安裝一次CentOS,安裝時,將必要的包選中,比如,base,develop-tools,text-internet等等,其他的,用不到的東西最好不要選,這樣做出來的系統,可以保證體積。
3. 執行完第二步後,進入第二步安裝好的系統,在根目錄下建立一些目錄,用來存放linux發行版需要的檔案,比如,我將我的系統命名為eversecOS,則,我在/目錄下建立一個eversecOS的目錄,用來存放linux發行版製作時需要的檔案。
#mkdir /eversecOS
4. 我們需要將CentOS的dvd光碟片掛載到linux上來,可以通過掛載光碟機,也可以通過掛載iso檔案,在掛載之前,我們先在/mnt/目錄下建立一個目錄,用來掛載。
#mkdir /mnt/cdrom
//dvd
#mount -t iso9660 -o loop /dev/cdrom /mnt/cdrom //掛載光碟機
//iso檔案
#mount -t iso9660 -o loop /mnt/hgfs/centos_data1/CentOS-5.5-i386-bin-DVD.iso /mnt/cdrom
5. 掛載完成之後,利用tar命令將光碟機中所有的檔案複製至/eversecOS目錄:
#cd /mnt/cdrom
#tar -cf - . | ( cd /eversecOS ; tar -xvpf - )
6. 進入/eversecOS/CentOS 刪除全部檔案(rpm包)
# cd /eversecOS/CentOS
#rm –f *
7.進入/eversecOS ,刪除部分檔案(夾)。刪除後ls –al 只留下一下內容:
#rm XXX XXX
#ls –al
drwxr-xr-x 2 ossec ossec 155648 09-03 01:44 CentOS
-rw-r--r-- 1 root root 112 03-21 23:05 .discinfo
drwxr-xr-x 4 root root 4096 03-21 23:04 images
drwxr-xr-x 2 root root 4096 09-03 19:51 isolinux
drwxr-xr-x 2 root root 4096 09-03 19:47 repodata
-rw-r--r-- 1 root root 1318 2009-09-04 TRANS.TBL
-rw-r--r-- 1 root root 413 03-21 23:04 .treeinfo
8. 在CentOS系統安裝完成之後,會將所有rpm包的安裝資訊記錄在/root/目錄下的install.log檔案中,我們可以通過一些指令碼對這個檔案及/mnt/cdrom檔案的操作,將需要的rpm包複製到/eversecOS/CentOS/目錄下。
#cd /root/
//產生packages.list,以便之後複製rpm包。
#cat install.log | grep Installing | sed 's/Installing //g'|sed 's/^[0-9]\+://g' >packages.list
建立自動提取相關rpm指令碼:
#vi cprpms.sh
#!/bin/bash
DEBUG=0
LT_CD=/mnt/cdrom
#掛載光碟片存放的目錄
ALL_RPMS_DIR=/mnt/cdrom/CentOS
#存放RPM包的目錄
LT_RPMS_DIR=/eversecOS/CentOS
packages_list=/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* $LT_RPMS_DIR/"
cp $ALL_RPMS_DIR/$name-$version* $LT_RPMS_DIR/
# in case the copy failed
if [ $? -ne 0 ] ; then
echo "cp $ALL_RPMS_DIR/$name-$version* "
cp $ALL_RPMS_DIR/$name* $LT_RPMS_DIR/
fi
fi
i=`expr $i + 1`
done
執行以上指令碼將定製eversecOS-0-1必要的rpm複製到/eversecOS/CentOS目錄
#chmod u+x cprpms.sh
#./cprpms.sh
9. 這個時候,在/eversecOS/CentOS下,有上次安裝centOS的所有需要的.rpm包了。
如果需要添加自己的.rpm包,現在需要手動添加到這個檔案夾了。例如:假若上次安裝,沒有選擇安裝ftp,而自己定製的eversecOS-0-1.iso 需要安裝vsftpd,那麼請把vsftpd-2.0.5-16.el5_4.1.i386.rpm放入/eversecOS/CentOS
10. 準備rpm包完成之後,返回到/eversecOS目錄下,執行createrepo程式生repodata下的comps.xml檔案
#cd /eversecOS
#createrepo -g repodata/comps.xml .
11. 產生comps.xml之後,就要開始建立kickstart指令碼了,可以通過anaconda-ks.cfg來完成對kickstart指令碼的定製:
#cd ~
# cp anaconda-ks.cfg /eversecOS/isolinux/ks.cfg
用vi修改ks.cfg成如下:
#vi /eversecOS/isolinux/ks.cfg
# Kickstart file automatically generated by anaconda.
install
text
cdrom
lang en_US.UTF-8
keyboard us
skipx
network --device eth0 --bootproto dhcp --hostname eversecOS
#這兒密碼加密了,必須與anaconda-ks.cfg的一致
rootpw --iscrypted $1$g.aM7xrn$XviIYCTu8r51cm91dgQOG/
authconfig --enableshadow --enablemd5
selinux --disabled
timezone --utc Asia/Shanghai
bootloader --location=mbr
zerombr yes
mouse generic3ps/2
clearpart --all --initlabel
reboot
%packages
@base
@core
@dns-server
@development-libs
@development-tools
@dialup
@editors
@gnome-desktop
@games
@graphical-internet
@graphics
@office
@printing
@sound-and-video
@text-internet
@base-x
keyutils
trousers
fipscheck
device-mapper-multipath
imake
java-1.6.0-openjdk
libsane-hpaio
xorg-x11-server-Xnest
xorg-x11-server-Xvfb
vsftpd
#post後面可以安裝tar.gz 程式
%post
mkdir -p /yin/hai/long #實驗成功語句
mount /dev/cdrom /mnt #實驗失敗語句
cp /mnt/test.jpg /yin/hai/long/test.jpg #實驗失敗語句
12. kickstart指令碼寫完之後,需要修改linux的預設安裝方式,這裡,修改/eversecOS/isolinux/isolinux.cfg這個檔案,達到我們的目標,值得注意的是,isolinux.cfg檔案是唯讀,要想修改,需要為其賦予可寫入權限:
#chmod +w /eversecOS/isolinux/isolinux.cfg
#cd /eversecOS/isolinux/
#vi isolinux.cfg
default ks
prompt 1
timeout 600
display boot.msg
F1 boot.msg
F2 options.msg
F3 general.msg
F4 param.msg
F5 rescue.msg
label linux
kernel vmlinuz
append initrd=initrd.img
label text
kernel vmlinuz
append initrd=initrd.img text
label ks
kernel vmlinuz
append ks=cdrom:/isolinux/ks.cfg initrd=initrd.img
label local
localboot 1
label memtest86
kernel memtest
append –
13. 修改畫面:
安裝啟動畫面用的是一種比較奇怪的格式lss16,它限制圖片使用16種顏色,除去前景和背景色只能有14種顏色。我們需要ppmtolss16 giftopnm等程式,系統一般預設都安裝了。
一般用gimp產生一個index模式的gif圖形,顏色限制為14, 然後通過如下的辦法進行轉:
#yum -y install syslinux
先產生高品質的gif圖:
用photoshop開啟圖片,然後在檔案的下拉式功能表裡,儲存的時候選擇“儲存為WEB和裝置使用格式“,再然後選擇gif再選擇16色儲存,就得到splash.gif
仍後利用giftopnm < splash.gif | ppmtolss16 > splash.lss 轉換即可.
然後把新產生的splash.lss替換/eversecOS/isolinux裡的同名檔案。
另外修改isolinux/boot.msg檔案,做一些個人化的提示.
修改images/stage2.img 定製安裝過程圖片。
stage2.img 使用的是squashfs 檔案系統直接掛在即可
我們建立兩個目錄一個使用者掛載一個用於修改檔案
mkdir /tmp/stage{1..2}
mount -o loop -t squashfs stage2.img /tmp/stage1
拷貝檔案到stage2
cd /tmp/stage1
tar xzf - . |(cd /tmp/stage1 ; tar -xvpf -)
注意如果是直接cp
這個檔案/tmp/stage1/.buildstamp 一定要拷貝到stage2 的相關目錄去,否則
在安裝的時候會出現"no centos cd was found which matches your boot
media"
cd /tmp/stage2/usr/share/anaconda/pixmaps
更換此目錄下的圖片即可
產生新的stage2.img
cd /tmp/stage2/
mksquashfs . ../stage2.img -all-root -no-fragments
14. 去掉安裝過程中的CentOS字樣,用EversecOS 替代:
在安裝光碟片裡面有兩個.buildstamp檔案,一個位於stage2.img中,一個位於initrd.img中,安裝光碟片運行時讀取的是initrd.img中的那個.buildstamp檔案,所以只要把initrd.img檔案改了就可以了。
解壓initr.dimg檔案:
2.6核心中的initrd.img採用cpio壓縮,不再是2.4核心使用的ext2格式,無法使用mount -o loop 掛載。需要使用gunzip解壓縮,然後再使用
利用cpio給img解包
# cd /eversecOS/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改為EversecOS即可.
製作initrd.img檔案:
#假設目前的目錄位於準備好的initrd檔案系統的根目錄下
# find . | cpio -c -o > ../initrd.img
# gzip ../initrd.img
# mv initrd.img.gz initrd.img
# cp initrd.img /eversecOS/isolinux/
仍後將initrd.img複製到/eversecOS/isolinux/
15. 如何替換安裝以後的grub ?
(1) 將備一張640 x 480 16色grub.gif圖片,檔案類型為JPG的格式
(2)convert grub.gif -colors 14 -geometry 640x480! splash.xpm && gzip -9 splash.xpm
(3) 把產生的splash.xpm.gz直接替換/boot/grup/splash.xpm.gz 檔案即可.(在安裝光碟片的ks.cfg檔案%post語句後面寫shell指令碼.)
16. 如何去掉啟動過程中的"CentOS release 5 (Final)"
在安裝光碟片裡的ks.cfg檔案裡寫好指令碼,直接替換/etc/redhat-release /etc/issue /boot/grub/grub.conf即可。
if [ -f /etc/issue ];then sed -i 's/CentOS release 5.5 (Final)/EversecOS 0.1/' /etc/issue; fi >/dev/null 2>&1
if [ -f /boot/grub/grub.conf ];then sed -i 's/CentOS/EversecOS 0.1 /' /boot/grub/grub.conf; fi >/dev/null 2>&1
echo "eversecOS 0.1" > /etc/redhat-release
17. 在完成以上工作之後,就可以使用mkisofs發布iso檔案,不能將/eversecOS這個目錄直接複製到windows用UltraISO這樣的軟體直接製作,因為這樣做出來,不能夠引導
#cd /eversecOS
#mkisofs -R -J -T -r -l -d -allow-multidot -allow-leading-dots -no-bak -o /mnt/hgfs/centos_data1/eversecOS-0-1.iso -b isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table
.
結束:
製作iso完成之後,即可將iso下載至windows,使用VMware安裝看看,若能夠安裝成功,則iso製作成功。
/////////////////////////////////////////////////////////////////////////////////////
例子:
%post --nochroot
# Mount CDROM
mkdir -p /mnt/cdrom
mount -r -t iso9660 /tmp/cdrom /mnt/cdrom
# Copy our file
unalias cp
cp -f /mnt/cdrom/splash.xpm.gz /mnt/sysimage/ > /dev/null
cp -f /mnt/cdrom/default.jpg /mnt/sysimage/ > /dev/null
#cp -f /mnt/cdrom/default.jpg / > /dev/null
cp /mnt/cdrom/splash.xpm.gz / > /dev/null
umount /mnt/cdrom
%post
if [ -f /etc/issue ];then sed -i 's/CentOS release 5.5 (Final)/EversecOS 0.1/' /etc/issue; fi >/dev/null 2>&1
if [ -f /boot/grub/grub.conf ];then sed -i 's/CentOS/EversecOS 0.1 /' /boot/grub/grub.conf; fi >/dev/null 2>&1
echo "eversecOS 0.1" > /etc/redhat-release
unalias cp > /dev/null
cp -f /default.jpg /usr/share/backgrounds/images/ > /dev/null
#unalias cp > /dev/null
rm -f /boot/grub/splash.xpm.gz > /dev/null
cp -f /splash.xpm.gz /boot/grub/ > /dev/null
startx > /dev/null
// 對CentOS 的修改還有: /var/log/boot.log
http://bbs.linuxtone.org/thread-2448-1-1.html