初涉定制linux系統之——自動化安裝Centos系統鏡像制作


最近碰到個需求:要在內網環境安裝centos6.5系統並搭建服務,但由於自動部署腳本里安裝依賴包使用的是yum安裝,而服務器無法連接外網,實施人員也不會本地yum源搭建…..

本來想法是打算把需要的依賴包全找出來打包發給實施人員自己安裝去,后來考慮到系統安裝人員的安裝方式不一致,分區及安裝包的不統一會對之后的維護造成負擔,干脆就決定做個自動化安裝的鏡像,並把需要的業務依賴包全打包進去

ok,首先我們來看看環境准備:

1、兩台剛安裝好的、符合業務要求的系統(博主選擇的是minimal 最小化安裝,這個看個人需求了)

2、新裝系統的/root 目錄下 install.log 和 anaconda-ks.cfg 文件,之后會用到

3、需要添加的安裝包

4、CentOS 6.5鏡像文件或者光盤

5、安裝工具包

 

 ####以下為在服務器A上的操作,即鏡像制作服務器####

一、安裝必要的工具包,創建對應目錄

1 [root@localhost ~]# yum -y install anaconda createrepo mkisofs rsync
 
3 [root@localhost ~]# mkdir -p /root/iso/Packages      #創建存放當前系統里已安裝的包的目錄
 
5 [root@localhost ~]# mkdir -p /root/iso/repodata      #創建存放rpm包依賴關系的目錄

 

二、插入光盤,掛載DVD鏡像

1 [root@localhost ~]# mount /dev/cdrom /mnt            #掛載光盤鏡像
mount: block device /dev/sr0 is write-protected, mounting read-only #有這提示是正常的

三、centos系統在安裝包時,包名都記錄在root目錄install.log文件里,我們可以從中提取出來

1 [root@localhost ~]# awk '/Installing/{print $2}' /root/install.log | sed 's/^[0-9]*://g' >/root/package.txt

四、執行下面test.sh的腳本,從掛載的光盤鏡像中提取出需要的安裝包,放到/root/iso/Packages目錄里。腳本內容如下:

 1 [root@localhost ~]# cat test.sh 
#!/bin/bash
Packages='/mnt/Packages'             #掛載的光盤鏡像中存放安裝包的路徑
 i='/root/iso/Packages/'              #新鏡像存放安裝包的路徑
 while read line
 do
 cp ${Packages}/${line}*.rpm  /${i} || echo "$line don't cp......."
 done < /root/package.txt
 
 2 [root@localhost ~]# sh test.sh 

五、把鏡像需要的其他文件也拷貝到iso目錄下

[root@localhost ~]# rsync -a --exclude=Packages --exclude=repodata /mnt/  /root/iso
[root@localhost ~]# ll iso/
total 112
-rw-------. 1 root root  1539 May 30 01:18 anaconda-ks.cfg
-r--r--r--. 1 root root    14 Nov 29  2013 CentOS_BuildTag
dr-xr-xr-x. 3 root root  4096 Nov 29  2013 EFI
-r--r--r--. 1 root root   212 Nov 28  2013 EULA
-r--r--r--. 1 root root 18009 Nov 28  2013 GPL
dr-xr-xr-x. 3 root root  4096 Nov 29  2013 images
dr-xr-xr-x. 2 root root  4096 May 29 23:16 isolinux
drwxr-xr-x. 2 root root  4096 May 30 01:17 MyPackages
drwxr-xr-x. 2 root root 36864 May 30 19:55 Packages
-r--r--r--. 1 root root  1354 Nov 28  2013 RELEASE-NOTES-en-US.html
-r--r--r--. 1 root root  1706 Nov 28  2013 RPM-GPG-KEY-CentOS-6
-r--r--r--. 1 root root  1730 Nov 28  2013 RPM-GPG-KEY-CentOS-Debug-6
-r--r--r--. 1 root root  1730 Nov 28  2013 RPM-GPG-KEY-CentOS-Security-6
-r--r--r--. 1 root root  1734 Nov 28  2013 RPM-GPG-KEY-CentOS-Testing-6
-r--r--r--. 1 root root  4060 May 30 01:18 TRANS.TBL

六、執行xml.sh腳本,生成repodata下的comps.xml文件(重要),comps.xml 文件中包含了安裝時用戶所見到的與rpm相關的所有內容,它會檢查Packages下的RPM包的依賴關系,安裝時如果缺少依賴包,它會提示哪個RPM 包需要哪些依賴庫。腳本內容如下:

 1 [root@localhost ~]# cat xml.sh 
 #!/bin/bash 
 
 ISO_DIR=/root/iso
 cd  ${ISO_DIR} 
 declare -x discinfo=$(head -1 .discinfo) 
 cp  /mnt/repodata/*-comps.xml ${ISO_DIR}/repodata/
 createrepo  -g  ${ISO_DIR}/repodata/*-comps.xml  ${ISO_DIR} 
 createrepo -u "media://$discinfo" -g ${ISO_DIR}/repodata/*-comps.xml ${ISO_DIR} 

     執行結果如下:

 1 [root@localhost ~]# sh xml.sh 
 2 Spawning worker 0 with 209 pkgs
 3 Workers Finished
 4 Gathering worker results
 5 
 6 Saving Primary metadata
 7 Saving file lists metadata
 8 Saving other metadata
 9 Generating sqlite DBs
10 Sqlite DBs complete
11 Spawning worker 0 with 209 pkgs
12 Workers Finished
13 Gathering worker results
14 
15 Saving Primary metadata
16 Saving file lists metadata
17 Saving other metadata
18 Generating sqlite DBs
19 Sqlite DBs complete

 

上面對定制系統的精簡已經完成,如果不需要添加自定義或者其他不在原系統鏡像中的rpm包的話,可直接跳到第十一步即可,下面是對定制系統安裝包的更新和增加

 

####以下為在服務器B上的操作####

部署環境有時候需要更新版本的軟件,而上面我們定制的鏡像中往往只有很舊的版本,這時候就需要我們對里面的rpm包進行更新,首先我們需要將所需的包及依賴下載下來但不安裝,這就需要yum-plugin-downloadonly模塊,相關說明可以看該博客http://www.cnblogs.com/dengtr/p/6518622.html,我們這里不再多做解釋。

七、安裝yum插件yum-plugin-downloadonly和epel第三方yum源

1 [root@192 ~]# yum install yum-plugin-downloadonly
 
3 [root@localhost ~]# yum install epel-release

八、將需要更新的包及依賴關系下載到本地

1 [root@localhost ~]# yum install --downloadonly gcc gcc-c++ libtool autoconf automake imake libxml2-devel expat-devel ncurses-devel cmake zlib.i686 libstdc++.i686 unzip wget vim ntpdate unzip

九、將下載到本地的包收集起來傳到服務器A的/root/iso/Packages目錄下

 1 [root@localhost 6]# find /var/cache/yum/x86_64/6/ -name "*.rpm" >>/root/rpm.txt     #將下載的rpm包絕對路徑寫到文件里
 
 2 [root@localhost ~]# mkdir /root/tmp                                                 #建立臨時存放目錄
 
 3 [root@localhost ~]# cat cp.sh                                                       #執行該腳本將下載的rpm包復制到tmp目錄下
   #!/bin/bash
   while read line
   do
   cp $line  /root/tmp/ || echo "$line don't cp......."
   done < /root/rpm.txt
 
 4 [root@localhost ~]# yum install openssh-clients                                     #安裝scp命令
 5 [root@localhost ~]# scp /root/tmp/*.rpm root@192.168.1.92:/root/iso/Packages/       #將收集到的rpm包遠程傳輸到服務器A的/root/iso/Packages/目錄上

rpm包及依賴關系的收集就完了,接着就需要回到服務器A上進行操作。

 

 ####以下為在服務器A上的操作,即鏡像制作服務器####

十、因為/root/iso/Packages/目錄下的包變動了,需要我們再回到上面第六步,執行xml.sh腳本,重新生成repodata下的comps.xml文件。這步主要是更新rpm包的依賴關系

 1 [root@localhost ~]# cat xml.sh 
 #!/bin/bash 
 
 ISO_DIR=/root/iso
 cd  ${ISO_DIR} 
 declare -x discinfo=$(head -1 .discinfo) 
 cp  /mnt/repodata/*-comps.xml ${ISO_DIR}/repodata/
 createrepo  -g  ${ISO_DIR}/repodata/*-comps.xml  ${ISO_DIR} 
 createrepo -u "media://$discinfo" -g ${ISO_DIR}/repodata/*-comps.xml ${ISO_DIR} 

 

十一、制作 anaconda-ks.cfg 腳本

 anaconda-ks.cfg記錄了在安裝系統時填寫的參數和選項,即你在安裝系統時選擇分區、時區、設置用戶密碼等一系列操作,存放在/root目錄,我們直接對由系統安裝所創建的 anaconda-ks.cfg進行修改,當然也可以用system-config-kickstart工具制作而成

1 [root@localhost ~]# cp anaconda-ks.cfg  /root/iso         #復制到我們的定制鏡像目錄里,並進行修改

這里附上一個我在用的ks文件,其中新增的地方有注釋,需要注意的是后面更新和增加的安裝包需要追加到配置的后面

[root@localhost iso]# cat anaconda-ks.cfg
# Kickstart file automatically generated by anaconda.

#version=DEVEL
install
cdrom                                                           
lang en_US.UTF-8                                     
keyboard us
network --onboot yes --device eth0 --bootproto dhcp --noipv6    
rootpw  --iscrypted $6$6u5l74FLeYsJgLRP$HnamRVB2RvRUFB2jEc     
firewall --service=ssh
authconfig --enableshadow --passalgo=sha512
selinux --enforcing
timezone --utc Asia/Shanghai
bootloader --location=mbr --driveorder=sda --append="nomodeset crashkernel=auto rhgb quiet"
zerombr
clearpart --all --initlabel

####下面是系統分區,視個人情況修改,--size=1表示剩余空間全部分給該分區#### part
/boot --asprimary --fstype="ext4" --ondisk=sda --size=300 part swap --asprimary --fstype="swap" --ondisk=sda --size=8192 part / --asprimary --fstype="ext4" --grow --ondisk=sda --size=1 reboot # The following is the partition information you requested # Note that any partitions you deleted are not expressed # here so unless you clear all partitions first, this is # not guaranteed to work #clearpart --none #repo --name="CentOS" --baseurl=cdrom:sr0 --cost=100 %packages @core @server-policy @workstation-policy

#下面的包即是我們在服務器B上更新的包名,相關依賴在第十步的時候就已經做好了 autoconf automake bison cmake expat
-devel gcc gcc-c++ imake libtool libxml2-devel ncurses-devel yasm glibc.i686 libgcc.i686 libstdc++.i686 nss-softokn-freebl.i686 zlib.i686

%post              #這里是系統安裝完后執行的腳本命令,你可以在目錄里放類似redis安裝包、jdk安裝包等,然后把安裝命令都寫在這里,博主這里寫ls -l只是做實例。
ls -l

eject              #安裝完彈出光盤
%end

十一、修改 isolinux.cfg 配置文件,指定anaconda-ks.cfg路徑

1 [root@localhost mnt]# cat /root/iso/isolinux/isolinux.cfg  
2 default linux  ks=cdrom:/anaconda-ks.cfg             #修改第一行

十二、制作iso鏡像,並生成 MD5校驗碼

1 [root@localhost ~]# mkisofs -o CentOS.iso -b isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot -boot-load-size 4  -boot-info-table -R -J -v -T /root/iso/
2 [root@localhost ~]# implantisomd5  CentOS.iso

 

新鮮出爐的自動安裝鏡像就完事了,之后刻盤,安裝系統時只需要放入光盤就行了,簡單吧

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM