首先,來看看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已經正常安裝。