1. 程式人生 > 其它 >製作Centos7自動安裝映象(二)

製作Centos7自動安裝映象(二)

技術標籤:雜項linuxcentosrpm自動化安裝

文章總覽:製作Centos7自動安裝映象

RPM安裝包製作

Linux映象的標準安裝方式是將待安裝的軟體製作成RPM包,然後將RPM包解壓並複製到指定的目錄中去(據說除此之外還可以將帶安裝的軟體做成tar包,直接用來做安裝。關於如果把tar包做到映象裡面來實現自動安裝,這個我還沒有嘗試。有機會嘗試話再完善一下這篇文章)。

鑑於我們專案的情況,一開始只考慮把開發出來的JAVA應用製作成RPM包。但是後來,在實際製作的時候發現,除了JAVA應用之外,我們還有一些配置檔案如 /etc/profile /etc/my.cnf /etc/rc.d/rc.local 這些系統檔案,我們也做了修改。為了能讓這些配置檔案也能做到自動化安裝,我們另外製作了一個RPM包,將這些配置檔案也做成RPM包,然後裝到一個指定的位置,然後再用ks.cfg的post指令碼複製到系統路徑下覆蓋系統的配置檔案,從而實現自動安裝。

至於為什麼不直接安裝到系統路徑下? 那是由於我嘗試過一次,結果得到了一個錯誤:安裝衝突。估計是不允許直接在安裝過程中覆蓋系統檔案吧。 所以只能採用迂迴的方式:先裝到別的位置,然後在複製到目標路徑下。

廢話不多說了,開始整體。

1. 安裝製作工具

製作RPM包,需要安裝RPM包製作的安裝工具,通常是兩個,使用yum方式安裝yum -y install rpm-buildrpmdevtools

2.初始化目錄

安裝完RPM工具之後,直接執行rpmdev-setuptree 這個命令(我用的是root使用者),執行完成之後,在/root/下面會建立一個 rpmbuild的目錄, 在這幾個目錄下面會有如下的子目錄,其中幾個我們後續要用到:

rpmbuild目錄結構

3.準備安裝包的內容

按照以下的方式準備安裝包:

1.建立一個目錄,帶上版本號

如果,你打算安裝的應用叫做 DeviceController-1.0.0,就建立一個目錄叫做DeviceController-1.0.0

2.將要安裝的內容全部copy到DeviceController-1.0.0目錄下

假設我們的應用,包含一個 deviceController-1.0.0-Release.jar 一個 config 目錄 一個 run.sh 以及一個 data目錄, 則需要按照安裝後的目錄結構複製到DeviceController-1.0.0目錄下

3. 準備makefile檔案

在DeviceController-1.0.0目錄下,建立一個makefile檔案,內容如下:

install: 
    mkdir -p ${RPM_BUILD_ROOT}/opt/wedo/deviceController/
    cp deviceController-1.0.0-relese.jar ${RPM_BUILD_ROOT}/opt/wedo/deviceController/deviceController-1.0.0-relese.jar 
    cp -r config ${RPM_BUILD_ROOT}/opt/wedo/deviceController/config
    cp -r data ${RPM_BUILD_ROOT}/opt/wedo/deviceController/data
    cp run.sh ${RPM_BUILD_ROOT}/opt/wedo/deviceController/run.sh

注意:針對目錄要用 -r 複製, mkdir 要加上-p 保證能夠建立多級目錄, ${RPM_BUILD_ROOT}是必須的

另外提醒大家一下,install: 後面需要有一個空格,然後再回車,另外每一行前面需要有一個tab作為命令的開始(這些都是makefile的規則,只是在提醒一下大家)

4. 製作source tar.gz包

以上都準備完成之後,回到DeviceController-1.0.0的上級目錄,輸入如下命令:

tar cvf DeviceController.tar DeviceController.tar-1.0.0;gzip DeviceController.tar.tar

注意中間的DeviceController-1.0.0 要和目錄名一致

5.複製source安裝包

執行上述命令之後,你將會得到一個叫做DeviceController.tar.gz的檔案,將這個檔案cp到 /root/rpmbuild/SOURCES/ 目錄下

6.製作SPCE檔案

進入/root/rpmbuild/SPECS目錄下,編制DeviceController.spec檔案,檔案內容如下:

%global __os_install_post %{nil}
Name:	    controller-rpm  	
Version:    1.0.0	
Release:	1
Summary:	DEVICE-CONTROLLER

Group:		DEVICE
License:	WEDO
Source0:	DeviceController.tar.gz

%description

%prep
%setup -q

%build

%install
make install

%files
%defattr(-,root,root)
/opt/wedo/deviceController/deviceController-1.0.0-release.jar
/opt/wedo/deviceController/config
/opt/wedo/deviceController/run.sh
/opt/wedo/deviceController/data

%changelog

%define __debug_install_post   \
   %{_rpmconfigdir}/find-debuginfo.sh %{?_find_debuginfo_opts} "%{_builddir}/%{?buildsubdir}"\
%{nil}

注意: 關於這段程式碼,有幾點說明:

1.%global __os_install_post %{nil}

這是一個可選的引數,主要的目的是通知RPM構建程式不要對 二進位制檔案進行壓縮。 設定這個引數的目的是,我們的jar為了防止被人篡改,進行了加密。在執行的時候會進行加密校驗。而RPM預設會對原始檔中的二進位制檔案進行二次壓縮。 結果就是通過rpm安裝之後,得到的jar包的尺寸和原始檔案不一致,從而導致加密校驗失敗。 所以我們加上了這個引數,保證rpm不會再對二進位制檔案進行壓縮。 當然,如果你沒有這方面的需求的話,可以不需要加入此引數。 關於rpm的一些引數,可以參考Disable Binary stripping in rpmbuild這篇文章

2. 保持 NAME VERSION 與你的原始目錄中的資訊一致

3.%files 段 描述的是你打算把你的檔案安裝到那個目標路徑下的,檔名和原始目錄一致。檔案數量也需要保持一致。可以少,不能多。

7.構建RPM檔案

完成以上操作之後,執行構建命令(在/root/rpmbuild/SPECS目錄下執行):

rpmbuil -bb DeviceController.spec

執行完成後,你將會在/root/rpmbuild/RPMS/x86_64 下得到你的安裝包(注意x86_64取決於你作業系統的CPU架構,未必都是這個名字)