定製linux鏡像並自動化安裝

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

原本想法是打算把須要的依賴包全找出來打包發給實施人員本身安裝去,後來考慮到系統安裝人員的安裝方式不一致,分區及安裝包的不統一會對以後的維護形成負擔,乾脆就決定作個自動化安裝的鏡像,並把須要的業務依賴包全打包進去linux

ok,首先咱們來看看環境準備:c++

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

二、新裝系統的/root 目錄下 install.log 和 anaconda-ks.cfg 文件,以後會用到sql

三、須要添加的安裝包express

四、CentOS 6.5鏡像文件或者光盤vim

五、安裝工具包centos

 

 ####如下爲在服務器A上的操做,即鏡像製做服務器####bash

1、安裝必要的工具包,建立對應目錄服務器

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包依賴關係的目錄

 

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

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

3、centos系統在安裝包時,包名都記錄在root目錄install.log文件裏,咱們能夠從中提取出來

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

4、執行下面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 
複製代碼

5、把鏡像須要的其餘文件也拷貝到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
複製代碼

6、執行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,咱們這裏再也不多作解釋。

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

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

8、將須要更新的包及依賴關係下載到本地

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

9、將下載到本地的包收集起來傳到服務器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上的操做,即鏡像製做服務器####

10、由於/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} 
複製代碼

 

11、製做 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
複製代碼

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

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

12、製做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

 

新鮮出爐的自動安裝鏡像就完事了,以後刻盤,安裝系統時只須要放入光盤就好了,簡單吧

 

http://www.cnblogs.com/dengtr/p/5543820.html

相關文章
相關標籤/搜索