最近碰到個需求:要在內網環境安裝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
新鮮出爐的自動安裝鏡像就完事了,之后刻盤,安裝系統時只需要放入光盤就行了,簡單吧