Linux的程序包管理,RPM,yum及編譯安裝簡介
Linux的程序包,指的是ELF格式的二進制應用程序文件所組成的軟件包。它一般由二進制文件、庫文件、軟件配置文件及幫助文件等組成。而對這些包進行管理的工具,主流分為兩種,在debian上,用的是apt-get管理deb包;在redhat上,主要用rpm作為軟件包管理工具。在這里,我簡單的介紹下rpm的使用(主要是apt我也不懂呀哈 J)
RPM:原名是Redhat Package Manager,是Redhat為管理軟件包而開發的一款軟件,但后來主要是它越來越受歡迎,因而變成了事實上redhat系發行版的標準配置,redhat也不好意思獨享了,于是后來改了個好玩的名字:RPM is Package Manager.歪果仁真會玩呀。
我們現在獲取程序包的途徑主要有幾種:
(1) 系統發版的光盤或官方的服務器;
國內的幾個鏡像站點:
http://mirrors.aliyun.com
http://mirrors.sohu.com
http://mirrors.163.com
(2) 項目官方站點
比較大型的軟件項目,一般會有自己的獨立官方網站,上面會提供各種版本的RPM及源代碼包供下載。
(3) 由第三方組織提供的下載:
Fedora-EPEL
搜索引擎:
http://pkgs.org
http://rpmfind.net
(4) 自己制作RPM包
RPM的命令使用:
Rpm命令可對軟件程序包進行安裝、卸載、升級、查詢、校驗、數據庫維護等功能,在此簡單介紹幾個常用命令:
RPM安裝:
rpm {-i|–install} [install-options] PACKAGE_FILE …
一般我們會使用 rpm –ivh rpm_file的命令進行安裝,其中:
–i: 安裝
-v: verbose,詳細信息
-h:安裝進度顯示,以#顯示程序包管理執行進度;每個#表示2%的進度
比如,我在本機光盤的軟件包里安裝lftp程序包:
[root@nginx Packages]# rpm -ivh lftp-4.0.9-1.el6_5.1.x86_64.rpm
Preparing… ########################################### [100%]
1:lftp ########################################### [100%]
[root@nginx Packages]#
有時如果安裝的軟件包需要依賴其它軟件,則會報錯,此時需要先安裝好依賴的軟件包才能繼續安裝。當然,你作為管理員,享有特權,使用 –nodeps可以強制安裝,不過不是不得而,不建議這樣做,因為就算軟件安裝成功,亦可能會產生一些隱患。
另外,安裝時亦有一大堆的安裝選項,限于篇幅,這里不詳細展開,大家可以man一下幫助了解一下。
[install-options]
–test: 測試安裝,但不真正執行安裝過程;dry run模式;
–nodeps:忽略依賴關系;
–replacepkgs: 重新安裝;
–nosignature: 不檢查來源合法性;
–nodigest:不檢查包完整性;
–noscipts:不執行程序包腳本片斷;
%pre: 安裝前腳本; –nopre
%post: 安裝后腳本; –nopost
%preun: 卸載前腳本; –nopreun
%postun: 卸載后腳本; –nopostun
RPM升級:
rpm {-U|–upgrade} [install-options] PACKAGE_FILE …
rpm {-F|–freshen} [install-options] PACKAGE_FILE …
一般我們會使用 rpm –Uvh rpm_file的命令進行安裝
–upgrage:安裝有舊版程序包,則“升級”;如果不存在舊版程序包,則“安裝”;
–freeshen:安裝有舊版程序包,則“升級”;如果不存在舊版程序包,則不執行升級操作;
–oldpackage:降級;
–force: 強行升級;
RPM查詢:
rpm {-q|–query} [select-options] [query-options]
[select-options]
-a: 所有包
-f: 查看指定的文件由哪個程序包安裝生成
-p /PATH/TO/PACKAGE_FILE:針對尚未安裝的程序包文件做查詢操作;
–whatprovides CAPABILITY:查詢指定的CAPABILITY由哪個包所提供;
–whatrequires CAPABILITY:查詢指定的CAPABILITY被哪個包所依賴;
[query-options]
–changelog:查詢rpm包的changlog
-c: 查詢程序的配置文件
-d: 查詢程序的文檔
-i: information
-l: 查看指定的程序包安裝后生成的所有文件;
–scripts:程序包自帶的腳本片斷
-R: 查詢指定的程序包所依賴的CAPABILITY;
–provides: 列出指定程序包所提供的CAPABILITY;
查詢操作我們常用會用到,一般是用 –qa查詢當前的安裝包,用 –qi查詢特定的安裝包的信息,例如:
查詢當前主機上mysql相關軟件的安裝情況:
[root@nginx Packages]# rpm -qa | grep mysql
mysql-libs-5.1.73-3.el6_5.x86_64
[root@nginx Packages]#
該命令查詢到當前與mysql相關的只安裝了一個軟件包mysql-libs-5.1.73-3.el6_5.x86_64,然后,我們想進一步查詢該軟件包的詳細信息:
[root@nginx Packages]# rpm -qi mysql-libs-5.1.73-3.el6_5.x86_64
Name : mysql-libs Relocations: (not relocatable)
Version : 5.1.73 Vendor: CentOS
Release : 3.el6_5 Build Date: Thu 13 Feb 2014 03:42:39 AM CST
Install Date: Fri 25 Dec 2015 06:00:10 AM CST Build Host: c6b9.bsys.dev.centos.org
Group : Applications/Databases Source RPM: mysql-5.1.73-3.el6_5.src.rpm
Size : 4244886 License: GPLv2 with exceptions
Signature : RSA/SHA1, Thu 13 Feb 2014 03:48:08 AM CST, Key ID 0946fca2c105b9de
Packager : CentOS BuildSystem <http://bugs.centos.org>
URL : http://www.mysql.com
Summary : The shared libraries required for MySQL clients
Description :
The mysql-libs package provides the essential shared libraries for any
MySQL client program or interface. You will need to install this package
to use any other MySQL package or any clients that need to connect to a
MySQL server.
[root@nginx Packages]#
上面列出了mysql-libs的詳細信息,包括軟件名稱,版本,數字簽名等等。
RPM卸載:
rpm {-e|–erase} [–allmatches] [–nodeps] [–noscripts]
[–notriggers] [–test] PACKAGE_NAME …
比如,我將上面安裝的lftp執行卸載:
[root@nginx tmp]# rpm -e lftp
[root@nginx tmp]#
沒有出錯信息,即是成功執行。當然,卸載時如涉及到依賴關系,同樣可以用—nodeps強制進行卸載。
此外,還有包校驗,檢查來源合法性,導入公鑰,重建數據庫等,此處不再一一解釋,有興趣大家可以man一下。
接下來跟大家說說一個程序包管理利器 –YUM
Yum是Yellowdog Update Modifier的簡寫,這只小黃狗可是深得大家的喜愛,為什么呢?因為我們系統安裝各種各樣的軟件包時,會檢查相應各軟件的依賴關系,這些依賴關系千絲萬縷,復雜非常。如果光靠我們自己去解決這些依賴沖突,耗時耗力,簡直是浪費青春呀。因而,就有了這款神器-yum。Yum的設計思想是可自動化地安裝、卸載RPM包,收集管理RPM包的相關信息,檢查依賴關系并自動對其進行處理,讓用戶能從依賴關系統中走出來,關注軟件本身,而不是將精力浪費在對其進行安裝上。
初學者常有個誤解,以為yum是取代RPM的,有了yum就不用RPM了,其實yum只是rpm的前端,后端還是rpm。yum只是幫助用戶對rpm進行管理的工具,二者是互補關系,而不是互斥。
Yum采用c/s結構,前端是工具命令行界面,后端有個數據倉庫的概念,也可稱之為yum源(yum repository: yum repo)。網上有很多的yum源可供使用,而我們也可以自已創建自己的yum倉庫,以供使用。比如在公司內部,統一軟件版本,自動化標準化安裝服務器,同時亦能節省帶寬,則可以事先將需要用到的RPM包下載下來,集中存放,然后再構建自己的yum倉庫,以實現資源共享。Yum repo的創建方式多種多樣,可以存放在ftp服務器中,也可以存放在web服務器中,NFS服務器中,甚至于放在本機的文件系統里。因而我們還可以將本地的安裝光盤做成yum repo,以方便使用。
Centos默認已安裝好yum,它的配置文件存放在 /etc/yum.conf 及 /etc/yum.repos.d/*.repo 內,其中,yum.conf為所有倉庫提供公共配置,yum.repos.d目錄下的配置文件則為倉庫的指向提供配置(注:文件名后綴一定要為repo才有效)。
下面是配置文件的幾個主要的設置的含義:
倉庫指向的定義:
[repositoryID]
name=Some name for this repository //倉庫名稱
baseurl=url://path/to/repository/ //倉庫路徑,路徑的形式有多種,可以是:
ftp://
http://
nfs://
也可以多條,每個地址路徑寫一行即可
enabled={1|0} //是否啟用此倉庫,1為啟用,0為停用
gpgcheck={1|0} //是否進行gpg(GNU Private Guard)檢驗,以確定rpm包來源是有效和安全的
gpgkey=URL
enablegroups={1|0}
failovermethod={roundrobin|priority} //默認為:roundrobin,意為隨機挑選;
cost= //倉庫權值,默認為1000
yum命令的用法:
yum [options] [command] [package …]
command is one of:
* install package1 [package2] […]
* update [package1] [package2] […]
* update-to [package1] [package2] […]
* check-update
* upgrade [package1] [package2] […]
* upgrade-to [package1] [package2] […]
* distribution-synchronization [package1] [package2] […]
* remove | erase package1 [package2] […]
* list […]
* info […]
* provides | whatprovides feature1 [feature2] […]
* clean [ packages | metadata | expire-cache | rpmdb | plugins | all ]
* makecache
* groupinstall group1 [group2] […]
* groupupdate group1 [group2] […]
* grouplist [hidden] [groupwildcard] […]
* groupremove group1 [group2] […]
* groupinfo group1 […]
* search string1 [string2] […]
* shell [filename]
* resolvedep dep1 [dep2] […]
* localinstall rpmfile1 [rpmfile2] […]
(maintained for legacy reasons only – use install)
* localupdate rpmfile1 [rpmfile2] […]
(maintained for legacy reasons only – use update)
* reinstall package1 [package2] […]
* downgrade package1 [package2] […]
* deplist package1 [package2] […]
* repolist [all|enabled|disabled]
* version [ all | installed | available | group-* | nogroups* | grouplist | groupinfo ]
* history [info|list|packages-list|packages-info|summary|addon-info|redo|undo|rollback|new|sync|stats]
* check
* help [command]
顯示倉庫列表:
repolist [all|enabled|disabled]
顯示程序包:
list
# yum list [all | glob_exp1] [glob_exp2] […]
# yum list {available|installed|updates} [glob_exp1] […]
安裝程序包:
install package1 [package2] […]
reinstall package1 [package2] […] (重新安裝)
升級程序包:
update [package1] [package2] […]
downgrade package1 [package2] […] (降級)
檢查可用升級:
check-update
卸載程序包:
remove | erase package1 [package2] […]
查看程序包information:
info […]
查看指定的特性(可以是某文件)是由哪個程序包所提供:
provides | whatprovides feature1 [feature2] […]
清理本地緩存:
clean [ packages | metadata | expire-cache | rpmdb | plugins | all ]
構建緩存:
makecache
搜索:
search string1 [string2] […]
以指定的關鍵字搜索程序包名及summary信息;
查看指定包所依賴的capabilities:
deplist package1 [package2] […]
查看yum事務歷史:
history [info|list|packages-list|packages-info|summary|addon-info|redo|undo|rollback|new|sync|stats]
安裝及升級本地程序包:
* localinstall rpmfile1 [rpmfile2] […]
(maintained for legacy reasons only – use install)
* localupdate rpmfile1 [rpmfile2] […]
(maintained for legacy reasons only – use update)
包組管理的相關命令:
* groupinstall group1 [group2] […]
* groupupdate group1 [group2] […]
* grouplist [hidden] [groupwildcard] […]
* groupremove group1 [group2] […]
* groupinfo group1 […]
創建yum倉庫的命令為:
createrepo [options] <directory> ,該命令會對所在目錄的軟件包進行掃描,生成元數據數據庫,以供yum前端使用(就是前面提到的,自已創建yum源)。
下面舉個栗子,說明如何將光盤里的RPM包設置成yum源:
首先,你要有光盤(掛載光盤)
[root@nginx media]# mount /dev/cdrom /media/cdrom/ -t iso9660 -r
[root@nginx media]#
[root@nginx /]# ls -lh /media/cdrom/
total 712K
-r–r–r–. 2 root root 14 Oct 24 2014 CentOS_BuildTag
dr-xr-xr-x. 3 root root 2.0K Oct 24 2014 EFI
-r–r–r–. 2 root root 212 Nov 28 2013 EULA
-r–r–r–. 2 root root 18K Nov 28 2013 GPL
dr-xr-xr-x. 3 root root 2.0K Oct 24 2014 images
dr-xr-xr-x. 2 root root 2.0K Oct 24 2014 isolinux
dr-xr-xr-x. 2 root root 670K Oct 24 2014 Packages
-r–r–r–. 2 root root 1.4K Oct 20 2014 RELEASE-NOTES-en-US.html
dr-xr-xr-x. 2 root root 4.0K Oct 24 2014 repodata
-r–r–r–. 2 root root 1.7K Nov 28 2013 RPM-GPG-KEY-CentOS-6
-r–r–r–. 2 root root 1.7K Nov 28 2013 RPM-GPG-KEY-CentOS-Debug-6
-r–r–r–. 2 root root 1.7K Nov 28 2013 RPM-GPG-KEY-CentOS-Security-6
-r–r–r–. 2 root root 1.7K Nov 28 2013 RPM-GPG-KEY-CentOS-Testing-6
-r–r–r–. 1 root root 3.4K Oct 24 2014 TRANS.TBL
可以看到,CentOS光盤的Packages目錄,且已有repodata,已經事先寫好了元數據定義了軟件倉庫,因而我們不用再運行createrepo來創建了。
然后,創建repo文件,配置yum源
[root@nginx cdrom]# cd /etc/yum.repos.d/ #切換至 /etc/yum.repos.d目錄下
[root@nginx yum.repos.d]#
[root@nginx yum.repos.d]# vi LocalCDROM.repo #創建LocalCDROM的源
[LocalCDROM]
name=LocalCDROM RPM
baseurl=file:///media/cdrom #路徑指向cdrom,注間,路徑指向至元文件目錄 repodata 的上一級路徑即可
gpgcheck=0
enabled=1
保存退出
[root@nginx yum.repos.d]# yum repolist #查看當前的yum源
(為展示效果,我臨時將系統默認的yum源CentOS-Base.repo文件改名成CentOS-Base.repo.bak,這樣,就只剩下新創建的yum源LocalCDROM 了)
[root@nginx yum.repos.d]# yum install telnet
從圖中可以看出,telnet的rpm包的確是從剛才創建的LocalCDROM源中安裝
附表是從網上收集的國內yum源列表,大家可以參考一下,創建適合自己的倉庫:
1. 企業貢獻:
阿里:http://mirrors.aliyun.com/
搜狐:http://mirrors.sohu.com/
網易:http://mirrors.163.com/
2. 大學教學:
北京理工大學:
http://mirror.bit.edu.cn (IPv4 only)
http://mirror.bit6.edu.cn (IPv6 only)
北京交通大學:
http://mirror.bjtu.edu.cn (IPv4 only)
http://mirror6.bjtu.edu.cn (IPv6 only)
http://debian.bjtu.edu.cn (IPv4+IPv6)
蘭州大學:http://mirror.lzu.edu.cn/
廈門大學:http://mirrors.xmu.edu.cn/
清華大學:
http://mirrors.tuna.tsinghua.edu.cn/ (IPv4+IPv6)
http://mirrors.6.tuna.tsinghua.edu.cn/ (IPv6 only)
http://mirrors.4.tuna.tsinghua.edu.cn/ (IPv4 only)
天津大學:http://mirror.tju.edu.cn/
中國科學技術大學:
http://mirrors.ustc.edu.cn/ (IPv4+IPv6)
http://mirrors4.ustc.edu.cn/
http://mirrors6.ustc.edu.cn/
東北大學:
http://mirror.neu.edu.cn/ (IPv4 only)
http://mirror.neu6.edu.cn/ (IPv6 only)
電子科技大學:http://ubuntu.uestc.edu.cn/
編譯安裝:
有些場景,光有RPM軟件包,也未必能附合我們的需求,因為rpm包相對軟件的版本而言,一般并非是最新版本,很多時候,軟件編譯的功能也未必能100%符合我們自身的需求,因而,我們就需要對軟件源代碼進行編譯安裝,以便軟件可以100%定制為我們所用。
Linux上大多數軟件都是用C語言開發,編譯時可使用以下三招來打天下:
一configure腳本配置 二make 三make install,其實就是先利用腳本指定一些參數,選項,指定軟件啟用的功能等,然后用make來調用各種編譯器,將源代碼編譯成二進制程序,最后由install程序,將這些二進制代碼copy到系統相應的地方中去。具體為:
第一步:configure腳本
選項:指定安裝位置、指定啟用的特性
–help: 獲取其支持使用的選項
選項分類:
安裝路徑設定:
–prefix=/PATH/TO/SOMEWHERE: 指定默認安裝位置;默認為/usr/local/
–sysconfdir=/PATH/TO/SOMEWHERE:配置文件安裝位置;
System types:
Optional Features: 可選特性
–disable-FEATURE
–enable-FEATURE[=ARG]
Optional Packages: 可選包
–with-PACKAGE[=ARG]
–without-PACKAGE
第二步:make
第三步:make install
另外,編譯安裝完畢,還需要做些善后工作,以便讓系統能正確識別新安裝的軟件的bin路徑、庫文件路徑,頭文件路徑,man手冊等。
安裝后的配置:
(1) 導出二進制程序目錄至PATH環境變量中;
編輯文件/etc/profile.d/NAME.sh
export PATH=/PATH/TO/BIN:$PATH
(2) 導出庫文件路徑
編輯/etc/ld.so.conf.d/NAME.conf
添加新的庫文件所在目錄至此文件中;
讓系統重新生成緩存:
ldconfig [-v]
(3) 導出頭文件
基于鏈接的方式實現:
ln -sv /usr/local/apppath/include /usr/local/include/appname
(4) 導出幫助手冊
編輯/etc/man.config文件
添加一個MANPATH
下面再舉個栗子,說明編譯安裝的過程:
編譯安裝Apache2.2.31
[root@nginx LAMP]# tar xf httpd-2.2.31.tar.bz2 #解壓
[root@nginx LAMP]# cd httpd-2.2.31
[root@nginx httpd-2.2.31]# ./configure –prefix=/usr/local/apache #運行configure,演示簡單起建,這里只指定一個prefix參數,實際上生產環境編譯apache,還需要指定很多參數,這里略過
checking for chosen layout… Apache
checking for working mkdir -p… yes
checking build system type… x86_64-unknown-linux-gnu
checking host system type… x86_64-unknown-linux-gnu
checking target system type… x86_64-unknown-linux-gnu
Configuring Apache Portable Runtime library …
………………………… #中間一大段略過
config.status: creating include/ap_config_auto.h
config.status: include/ap_config_auto.h is unchanged
config.status: executing default commands
如無報錯,則可繼續運行make 及 make install完成編譯安裝
完成安裝,繼續完善設置:
1)增加path
[root@nginx apache]# vi /etc/profile.d/httpd.sh
export PATH=/usr/local/apahce/bin;$PATH
2)導出庫文件
[root@nginx apache]# vi /etc/ld.so.conf.d/httpd.conf
/usr/local/apache/lib
[root@nginx ld.so.conf.d]# ldconfig
3)導出頭文件
[root@nginx local]# ln -sv /usr/local/apache/include/ /usr/local/include/apache
`/usr/local/include/apache' -> `/usr/local/apache/include/'
4)導出幫助手冊
[root@nginx man]# vim /etc/man.config
#增加一欄
# Every automatically generated MANPATH includes these fields
#
MANPATH /usr/man
MANPATH /usr/share/man
MANPATH /usr/local/man
MANPATH /usr/local/share/man
MANPATH /usr/X11R6/man
MANPATH /usr/local/apache/man
至此,apache編譯完成。
測試軟件正常否:
測試配置文件并啟動
查看80端口
打開網頁,It works!
以上是我對rpm、yum及編譯安裝的理解!作為初學者,我對linux的認識還是很膚淺,以上可能有不正確的地方,如有錯漏,希望各位能指正,共同進步。
小斌斌
我的QQ:153975050
在此感謝馬哥及馬哥團隊的所有人,在linux的道路上引領我一直前進!
2016-05-25
原創文章,作者:馬哥Net19_小斌斌,如若轉載,請注明出處:http://www.www58058.com/16559
非常認真,樣式上可以試下markdown
@stanley:我在wps上寫好貼上來的,不知道為什么一提交格式就變了