Linux源碼包製作RPM包之Apache

來源:互聯網
上載者:User

首先,來看看yum的使用及配置

最近由於伺服器需求,需要在公司內網搭建內網yum源。

搭建內網yum源需要分以下幾個步驟,如下:

1、 yum是什麼

2、 repo檔案是什麼

3、 repo檔案內容詳解

4、 yum伺服器端配置

5、 yum用戶端配置

6、 儲存yum安裝的軟體包

7、 更新rpm包

一、yum是什麼

yum(全稱為Yellowdog Updater Modified)是一個在CentOS、RedHat和Fedora作業系統中使用的Shell前端軟體包管理器。

yum主要管理基於rpm的軟體包,它可以自動升級、安裝、刪除rpm軟體包,同時它還能夠自動尋找並解決rpm包之間的依賴關係,並且無需管理員逐個、手工的去安裝每一個rpm包,使管理員在維護Linux主機時更加輕鬆自如。

yum可以從一個或多個repo檔案中配置的repo倉庫,通過http或ftp協議從repo倉庫獲得必要的資訊,然後下載相關的軟體包。這樣,本機使用者通過建立不同的repo倉庫,在有Internet串連時就能方便進行系統的升級和維護工作。

repo倉庫可以通過createrepo或yum-arch命令進行建立,也能夠用別人已經建立好的repo倉庫作為yum源,在此我們主要探討通過createrepo命令建立的repo倉庫。

有關yum命令的使用協助資訊,我們可以通過man yum命令進行查看,如下:

man yum


二、repo檔案是什麼

通過第一章,我們知道repo檔案是CentOS、RedHat和Fedora作業系統中yum源(軟體倉庫)的設定檔,通常一個repo檔案定義了一個或者多個軟體源。

例如:我們將從哪裡下載需要安裝或者升級的軟體包,repo檔案中都進行了相關的配置,而這些配置將會被yum讀取和應用。

三、repo檔案內容詳解

一個標準的centos的repo檔案內容如下:

[base]

name=CentOS-$releasever - Base

mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os

#baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/

enabled=1

gpgcheck=1

gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6

各個選項說明如下:

[base]

該選項是定義軟體源的名稱,該名稱是可以自訂,同時在該伺服器上所有repo檔案中是唯一的。注意:方括弧裡面不能有空格。

name=CentOS-$releasever - Base

該選項是定義軟體倉庫的名稱,$releasever變數定義了發行版本,通常是5,6,7等數字。

mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os

這是指定鏡像伺服器的地址清單,通常是開啟的。我們可以嘗試,將$releasever和$basearch替換成自己對應的版本和架構,例如6.6和x86_64,在瀏覽器中開啟,我們就能看到一長串鏡可用的鏡像伺服器地址清單。如下:


選擇自己訪問速度較快的鏡像伺服器地址複製並粘貼到repo檔案中的baseurl選項中,我們就能獲得較快的更新速度了。

#baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/

這行第一個字元是#表示該行已經被注釋,將不會被讀取,這一行的意思是指定一個baseurl(源的鏡像伺服器地址)。

baseurl通常有以下四種格式,如下:

baseurl= http://mirrors.aliyun.com/centos/6.6/os/x86_64/

使用http協議鏡像伺服器地址

baseurl= ftp://ftp.sjtu.edu.cn/centos/6.6/os/x86_64/

使用ftp協議鏡像伺服器地址

baseurl= rsync://mirror.zol.co.zw/centos/

使用rsync鏡像伺服器地址

baseurl= file:///ilanni/yum/

使用原生鏡像伺服器地址

其中前兩種是我們使用最多的。有關這個我們可以參考centos官網給出的參考,如下:


enabled=1

該選項表示在這個repo檔案中啟用這個軟體源,預設該選項可以不寫。但是如果enabled的值為0,則表示禁用這個軟體源。

注意:一個repo檔案中可以定義多個軟體源。

gpgcheck=1

該選項表示對通過該軟體源下載的rpm包進行gpg校正,如果gpgcheck的值為0表示不進行gpg校正。

gpgkey= file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6

該選項定義用於校正的gpg密鑰檔案。

通過以上這個repo檔案的說明,相信各位會覺得,其實centos的repo檔案真是很簡單。有了一個初步的認識了之後,我們就可以進行下面的實驗了。

我們現在要求在公司內網搭建一個yum源。該yum源需要配置兩個源:一個是centos的光碟片鏡像源,一個是特殊rpm軟體的鏡像源,並且該yum源是通過http進行訪問。

此次實驗:yum伺服器192.168.1.247 centos,用戶端192.168.1.248 centos。

四、yum伺服器端配置

要達到以上要求,我們首先要搭建yum伺服器,並且在該伺服器配置web伺服器。

在此web伺服器我們使用的是apache,當然使用nginx也是可以的。

4.1 配置web伺服器

在yum伺服器上,我們現在直接使用yum安裝apache。如下:

yum -y install httpd


當然你也可以使用源碼方式安裝apache,有關apache的源碼安裝可以參考《爛泥:源碼安裝apache》。

apache安裝完畢後,我們來啟動apache。如下:

/etc/init.d/httpd start

wget http://192.168.1.247


通過上圖,我們可以很明顯的看到apache伺服器已經正常啟動。

4.2 安裝createrepo

createrepo是什麼?createrepo是linux下建立倉庫的軟體包。create是建立的意思,repo是repository的縮寫,是倉庫的意思。

只有安裝createrepo這個軟體,才能在yum伺服器建立軟體倉庫。

createrepo的安裝很簡單,我們現在通過yum進行安裝,如下:

yum -y install createrepo


createrepo安裝完畢後,我們就可以建立repo倉庫了。

4.3 光碟片鏡像

把本地下載的光碟片鏡像複製到yum伺服器上,我們在此是通過xftp工具複製的,如下:



建立軟體源所在的位置,如下:

mkdir -p /var/www/html/yum

ll /var/www/html/yum/


建立光碟片掛載的目錄,如下:

mkdir /iso

mount -o loop CentOS-6.6-x86_64-minimal.iso /iso/

ll /iso/


複製到光碟片下的所有檔案到/var/www/html/yum/目錄下,如下:

cp -rv /iso/* /var/www/html/yum/


現在我們訪問下該目錄,看看能不能正常顯示,如下:

wget http://192.168.1.247/yum



通過上圖我們可以很明顯的看到,目前該目錄是可以被正常訪問的。

注意:在此我們沒有建立yum資料庫和資訊索引檔案,是因為光碟片已經有yum資料庫和資訊索引檔案,我們不需要再通過createrepo命令在進行。其實yum的資料庫和資訊索引檔案,都在repodata檔案夾下。如下:


為了光碟片鏡像實驗的效果,我們在此以光碟片鏡像軟體包中curl軟體為例。如下:

ll |grep curl


4.4 特殊軟體鏡像

在前面我們還要求一個特殊的yum源用來存放特殊軟體的,在此我們以lrzsz這個軟體為例。

該yum源存放的位置/var/www/html/ilanni/目錄下,然後把lrzsz這個軟體的rpm包放在/var/www/html/ilanni/目錄下,如下:

mkdir -p /var/www/html/ilanni

cp /var/cache/yum/x86_64/6/base/packages/lrzsz-0.12.20-27.1.el6.x86_64.rpm /var/www/html/ilanni/

ll /var/www/html/ilanni/


現在我們來建立該特殊yum源的yum資料庫和資訊索引檔案,切換到/var/www/html/ilanni/目錄下,執行createrepo命令,如下:

createrepo ./

tree repodata/


現在我們訪問下該目錄,看看能不能正常顯示,如下:

wget http://192.168.1.247/ilanni



通過上圖我們可以很明顯的看到,目前該目錄是可以被正常訪問的。

以上的所有配置都是在yum伺服器上進行的,現在我們來切換到yum用戶端上進行操作。

五、yum用戶端配置

yum用戶端的操作就簡單了很多,我們只需要修改用戶端的repo檔案即可。

進入/etc/yum.repos.d/目錄,備份原有的repo檔案,如下:

rename .repo .repo.bak *.repo


然後在該目錄下,建立一個新的repo檔案ilanni.repo,內容如下:

[centos6]

name=centos6

baseurl=http://192.168.1.247/yum/

enabled=1

gpgcheck=0

[ilanni]

name=ilanni

baseurl=http://192.168.1.247/ilanni/

enabled=1

gpgcheck=0


注意:該檔案名稱可以變,但是尾碼一定是.repo。

repo檔案修改完畢後,我們來進行相關測試。

安裝curl軟體,如下:

yum -y install curl


安裝lrzsz軟體,如下:

yum -y install lrzsz


通過以上測試,我們可以很明顯的看到用戶端已經從yum伺服器下載我們所需要的軟體包。

注意:如果用戶端yum安裝軟體包時,提示找不到該軟體。強烈建議,在用戶端上執行yum clean all和yum list命令。

其中yum clean all表示清除yum源緩衝,yum list表示列出所有的軟體包。

以上就是我們在內網搭建yum源的步驟。

六、儲存yum安裝的軟體包

在我們使用yum進行安裝軟體時,安裝完畢後會自動把軟體包刪除。

為了儲存yum安裝的軟體包,我們需要修改yum的設定檔yum.conf,把keepcache修改為1即可。如下:

vi /etc/yum.conf


cachedir表示rpm包的緩衝位置。

七、更新rpm包

在我們搭建完畢內網yum源後,會經常遇到這兩種情況。一是軟體版本的更新,二是新增軟體。

無論遇到以上那種情況,我們都需要先刪除原來的yum伺服器的yum資料庫和資訊索引檔案,然後通過createrepo命令重新建立yum資料庫和資訊索引檔案。

在此我們以新增軟體為例,該軟體為lftp。

如下:

cp /var/cache/yum/x86_64/6/base/packages/lftp-4.0.9-1.el6_5.1.x86_64.rpm /var/www/html/ilanni/

ll /var/www/html/ilanni/

rm -fr /var/www/html/ilanni/repodata/

createrepo /var/www/html/ilanni/


現在我們再來切換到用戶端上進行操作,如下:

yum clean all

yum list |grep lftp

yum -y install lftp


通過上圖,可以很明顯的看出用戶端已經安裝lftp軟體了。

Linux源碼包製作Apache RPM包

一、安裝rpm-build

查閱相關資料得知,要把源碼包製作成rpm包需要使用rpm打包工具rpm-build。

rpm-build通過rpmbuild命令根據本地源碼包,通過spec檔案中的規則就可以把源碼包製作成rpm包。

現在我們來安裝rpm-build包,如下:

yum -y install rpm-build


rpm-build安裝完畢後,我們來查看rpm-build的rpm包資訊。如下:

cd /var/cache/yum/x86_64/6/updates/packages/


注意:yum安裝軟體預設是安裝完畢立即刪除的,但是我們可以通過修改yum.conf檔案使其不刪除。

cat /etc/yum.conf


查看rpm-build的rpm包相關資訊,如:軟體名稱、版本、build日期、功能描述、大小等等。如下:

rpm -qpi rpm-build-4.8.0-38.el6_6.x86_64.rpm


查看rpm-build的rpm包含安裝的目錄和檔案,如下:

rpm -qpl rpm-build-4.8.0-38.el6_6.x86_64.rpm


查看rpm-build的rpm包的設定檔,如果該該rpm包沒有設定檔的話就不會顯示。

rpm -qpc rpm-build-4.8.0-38.el6_6.x86_64.rpm


查看rpm-build的rpm包的依賴關係,如下:

rpm -qpR rpm-build-4.8.0-38.el6_6.x86_64.rpm


除此之外,如果想查看這個檔案屬於哪個rpm 包,我們也可以使用以下命令。如下:

rpm -qf /etc/init.d/iptables


有關rpm命令的詳細使用方法,我們也可以通過man rpm進行查看。如下:

man rpm


二、spec規則檔案內容詳解

spec檔案是整個rpm包製作的核心,它的作用如同源碼編譯器時的Makefile檔案一樣。

spec檔案包含建立一個rpm包必要的資訊,包括哪些檔案是包的一部分以及它們安裝在哪個目錄等等資訊。

注意:spec檔案必須由普通使用者建立,並且強烈建議使用vi或者vim命令建立。

我們先來建立一個httpd.spec檔案,使用vi命令,如下:

vi httpd.spec

whoami

pwd


通過上圖,我們可以很明顯的看出,目前httpd.spec檔案中已經有spec檔案的選項。我們所需要做的就是根據這些選項來填寫該spec檔案,填寫完畢後儲存即可。

注意:在建立一個spec檔案時,系統會預設建立一個spec檔案模版。只是該模版是空的,如果沒有填寫內容的話,是無法儲存該檔案的。

下面我們就開始講解spec檔案的相關選項,spec檔案內容一般分為如下幾個部分:

定義rpm包的資訊、定義源碼包、定義rpm包的依賴關係、打包前的工作、編譯並安裝rpm包、安裝之後產生的檔案、安裝前後需要執行的指令碼、軟體變更日誌

2.1定義rpm包的資訊

rpm包資訊,主要定義使用者查詢rpm包資訊時所顯示的內容。它包含rpm包的功能描述、軟體版本、著作權資訊和軟體授與類型等等。

詳細資料如下:

Name定義該rpm包的名字,必須要填寫。

Version定義該rpm包的版本號碼,建議和源碼包的名稱保持一致。

Release定義rpm本身的版本號碼,使用預設值即可。

Summary定義關於該rpm包的一些介紹。

%description定義關於該rpm包的一些描述資訊。

Group標識軟體包所屬類型。

License軟體授與類型,比如GPL、Commercial、Shareware。

URL定義軟體作者的首頁。

rpm包資訊中最重要的是NVR,也就是name、version、release。因為最後產生的rpm包的名稱就是根據這三項來的。

rpm名稱形式,如下:name-version-release.rpm。

2.2定義源碼包

Source0用來定義製作rpm包時所需要的源碼包。如果製作rpm包時,有多個源碼包,那麼使用source和數字混合,比如:

source0: tbsys-src.tar.gz

source1: tbnet-src.tar.gz

source2: tair-2.1.0-src.tar.gz

注意:

Source0必須要填寫,而且填寫的名字必須是和下載源碼包名稱要一模一樣,還要注意只有tar.gz的源碼包,才能製作rpm包。

2.3定義rpm包的依賴關係

rpm包在製作過程中會依賴基本庫,而rpm包在安裝時有時也需要其他軟體包。這些我們都可以通過以下選項進行控制。

BuildRequires定義製作rpm包時,所依賴的基本庫。該選項可有可無。

Requires定義安裝該rpm包時,所依賴的軟體包。該選項可有可無。

注意:

在這裡要重點說明一點,Requires定義所依賴的軟體包,在進行yum安裝時的情況。

我們在使用yum安裝軟體A時,yum會在下載完A的rpm包後,對該rpm包進行檢查(rpm包中會給出安裝該rpm包安裝時,所依賴的基礎庫和軟體)。

如果檢查出,A的安裝還要依賴軟體B,那麼此時yum就會自動下載並安裝B。B安裝完畢後,就會繼續安裝A。如果是內網yum源的話,我們只需要把B放在內網yum源即可。

如果檢查出,A的安裝不需要其他軟體的支援,那麼yum會自動安裝A。

2.4編譯並安裝rpm包

這一步是非常重要,類似與源碼安裝的的./configure、make、make install。主要包括%build、%install等選項。如下:

%build定義編譯軟體包時的操作

%install定義安裝軟體包,使用預設值即可。

BuildRoot定義安裝或編譯時間使用的虛擬目錄,建議使用預設值即可。如下:

%(mktemp-ud%{_tmppath}/%{name}-%{version}-%{release}-XXXXXX)

該參數非常重要,因為在產生rpm包的過程中,執行make install時就會把軟體安裝到上述的路徑中。在打包的時候,同樣依賴虛擬目錄為根目錄進行操作。

2.5安裝之後產生的檔案

rpm包在進行安裝時,會建立相關的目錄及檔案,我們就可以在此定義。

%files定義rpm包安裝時建立的相關目錄及檔案。

在該選項中%defattr (-,root,root)一定要注意。它是指定安裝檔案的屬性,分別是(mode,owner,group),-表示預設值,對文字檔是0644,可執行檔是0755。

2.6安裝前後需要執行的指令碼

%prep指定rpm包安裝前執行的指令碼。在對軟體進行打包前,我們還進行其他動作。比如解壓tar.gz檔案。%prep主要與%setup ?q命令配合使用,建議使用預設值即可。

%post指定rpm包安裝後執行的指令碼。我們在安裝完畢rpm包後,執行軟體初始化的動作,就可以通過%post來達到目的。比如:apache在安裝後,將apachectl拷貝成httpd等操作。預設spec模版檔案不存在此選項。

%preun指定rpm包卸載前執行的指令碼,該選項主要用於軟體升級的時候會執行。預設spec模版檔案不存在此選項。

%postun指定rpm包卸載後執行的指令碼。預設spec模版檔案不存在此選項。

2.7軟體變更日誌

%changelog主要用於軟體的變更日誌。該選項可有可無。

如果使用%changelog選項的話,一定要以*開頭,以- -結尾。時間格式為,如下:

* 星期 月 日 年 XXX

--

樣本為:

* Tue Mar 03 2015 ilanni2.2.27

--

注意:星期和月一定要使用英文,並且是簡寫的,否則會報錯。如下:


三、httpd.spec檔案樣本

下面就以系統提供的spec檔案為模版,把apache源碼包製作成rpm包。apache的spec檔案如下:

Name: httpd

Version: 2.2.27

Release: 1%{?dist}

Summary: compiled from 2.2.27 by ilanni

Group: System Environment/Daemons

License: GPL

URL: http://www.ilanni.com

Source0: httpd-2.2.27.tar.gz

BuildRoot: %(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-XXXXXX)

BuildRequires: gcc, gcc-c++, openssl-devel

%description

Apache web server. Compiled from 2.2.27 by ilanni

%prep

%setup -q

%build

./configure --prefix=/usr/local/httpd --enable-so --enable-rewrite --enable-cgi --enable-ssl --enable-charset-lite --enable-suexec --with-suexec-caller=daemon --with-suexec-docroot=/usr/local/httpd/htdocs

make %{?_smp_mflags}

%install

rm -rf %{buildroot}

make install DESTDIR=%{buildroot}

%clean

rm -rf %{buildroot}

%files

%defattr(-,root,root,-)

/usr/local/httpd/bin/*

/usr/local/httpd/build/*

/usr/local/httpd/cgi-bin/*

%config /usr/local/httpd/conf/*

/usr/local/httpd/error/*

/usr/local/httpd/htdocs/*

/usr/local/httpd/icons/*

/usr/local/httpd/include/*

/usr/local/httpd/lib/*

%dir /usr/local/httpd/logs

%doc /usr/local/httpd/man/*

%doc /usr/local/httpd/manual/*

/usr/local/httpd/modules/*

%post

cp /usr/local/httpd/bin/apachectl /etc/init.d/httpd

sed -i '1a # chkconfig: 2345 85 15' /etc/init.d/httpd

sed -i '2a # description: apache web server' /etc/init.d/httpd

chkconfig --add httpd

%preun

/etc/init.d/httpd stop

chkconfig --del httpd

%changelog

* Tue Mar 3 2015 ilanni2.2.27

--


四、產生相關目錄

要產生rpm包的相關目錄,我們可以通過手工建立,也可以通過rpmbuild命令建立。如下:

rpmbuild httpd.spec


注意:在使用rpmbuild產生rpm包的相關目錄時會報錯,這個不需要去管它。

tree rpmbuild/


通過上圖,我們可以很明顯的看到rpmbulid命令已經產生相關的目錄。

每個目錄的作用,如下:

BUILD用於存放解壓後的檔案。

BUILDROOT用安裝或編譯時間使用的虛擬目錄。

RPMS用於存放由rpmbuild製作好的二進位包。

SOURCES用於存放原始碼、補丁、表徵圖等檔案。

SPECS用於存放用於管理rpm製作進程的spec檔案。

SRPMS用於存放由rpmbuild製作好的源碼包。

五、把檔案拷貝到指定目錄

相關目錄建立完畢後,現在我們需要把相關apache的源碼檔案以及spec檔案複製指定的目錄。如下:

cp httpd-2.2.27.tar.gz rpmbuild/SOURCES/

cp httpd.spec rpmbuild/SPECS/


六、產生RPM包

以上配置完畢後,我們現在就開始產生rpm包,使用rpmbuild命令。如下:

rpmbuild -ba rpmbuild/SPECS/httpd.spec



通過上圖,我們可以很明顯的看出rpm包已經製作成功。

新產生的rpm包存放在rpmbuild/RPMS/目錄下,而源碼rpm包則存放在rpmbuild/SRPMS/目錄下。

注意:rpmbuild ?ba命令的意思是編譯後做成*.rpm包和src.rpm包。

七、測試產生RPM包

rpm包製作完成後,我們來測試該rpm包。如下:

cp /home/ilanni/rpmbuild/RPMS/x86_64/httpd-2.2.27-1.el6.x86_64.rpm ./

rpm -ivh httpd-2.2.27-1.el6.x86_64.rpm


通過上圖,我們可以很明顯的看出,通過源碼製作的rpm已經正常安裝。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.