Linux中包的管理与程序安装
包是捆綁在一起并準備安裝在 Linux 系統上的軟件,安裝和卸載包是任何 Linux 用戶和管理員的基本操作。本篇將提供 Red Hat Package Manager(RPM)和 YUM 軟件管理工具的用法并配合實例,這對你熟悉linux環境中的包管理以及程序的安裝有很大幫助。
一、RPM包管理
RPM,是Red Hat Package Manager的縮寫。出現最早是在早期Slackware中的打包文件,就是把文件簡單打包壓縮,解壓時會放置在目標位置,優點類似Windows綠色軟件安裝。這種安裝本質上基于壓縮解壓縮的簡單管理方式,不能解決軟件安裝中的依賴關系問題,軟件卸載也是問題。之后,著名的Linux發行版Debian上率先出現了一種軟件包管理器dpkg(Debian Package Management)和其前端工具APT,它很好的解決了二進制包的安裝問題。
隨后,在Red Hat上也出現了類似的軟件包管理器,叫做rpm(Redhat Package Management)。rpm使用了一個以.rmp為擴展名的特殊文件,即軟件包文件。rpm提供了叫做rmp的管理程序和其它相關的工具程序,以實現查詢、安裝、升級、更新和刪除rpm軟件包文件。 rpm將安裝過的軟件信息,例如軟件的版本號碼、作者、發行單位、內容、文件路徑等信息,保存在數據庫中。數據庫使用Berkeley DB,在RHEL中這個數據庫放在/var/lib/rpm目錄下。 rpm軟件包文件,里面封裝了軟件的二進制程序、配合文件、說明文件、鏈接庫以及源代碼等。二進制程序是編譯好的文件,它必須與安裝目標機器的CPU架構(arch)相兼容。
1、rpm命名格式
name-VERSION-release.arch.rpm
例如:bash-4.2.46-19.el7.x86_64.rpm
關鍵字含義
| name | 軟件包的包名 |
| VERSION | 軟件的版本號 |
| release | release:發行版;軟件的發行版本號 |
| arch | 軟件包符合的cpu架構;常見的有noarch(平臺無關)、x86、x86_64、ppc |
2、rpm常見的分類
首先我們先通過命令rpm -ivh 試著去裝http服務,通過命令補全功能,我們看到了許多的包;我們必須要詳細了解這些包的具體用途,才能更好的安裝我們想要的軟件。
上述例子中,我們通過tab鍵補出了4個rpm包,包含devel(development)字樣的為開發自包;包名含有tools字樣的表示相應的一些工具包;httpd-2.2.15-59.el6.centos.x86_64.rpm 這種以版本號命名的就是服務的主包;當然并不只這些包,下面歸類列出常見包分類:
| Application-Version-Arch.rpm | 服務主包;也是我們安裝服務需要安裝的包 |
| Application-devl-Version-Arch.rpm | 開發子包; |
| Application-utils-Version-Arch.rpm | 其他子包; |
| Application-libs-Version-Arch.rpm | 相應的庫包; |
3、rpm命令的用法
(1)rpm包安裝
命令:rpm { -i | -v|-h } [ install-options ] PACKAGE_FILE...
[install-options]
--test: 測試安裝,但不真正執行安裝,即dry run模式
--nodeps:忽略依賴關系
--replacepkgs| replacefiles? :替代安裝,覆蓋包(假設只刪除了某個文件)?
--nosignature: 不檢查來源合法性(建議先檢查,處于安全考量)
--nodigest:不檢查包完整性
--noscripts:不執行程序包腳本
(2)rpm包升級
命令:rpm {-U|--upgrade} [install-options] PACKAGE_FILE...? #存在舊版本就升級,否則就安裝
命令:rpm { -F|--freshen } [ install-options ] PACKAGE_FILE... # 安裝有舊版本才升級,否者不做任何操作
上述命令中的[ install-options ]
--oldpackage:降級(注意:降級之后以前的版本還在)
--force: 強制安裝
rpm包升級與降級注意事項:
不要對內核做升級操作;Linux支持多內核版本并存,因此,對直接安裝新版本內核
如果原程序包的配置文件安裝后曾被修改,升級時,新版本的提供的同一個配置文件并不會直接覆蓋老版本的配置文件,而把新版本的文件重命名(FILENAME.rpmnew)后保留
直接安裝軟件包時會覆蓋原文件??? ????
(3)rpm包查詢
命令:rpm {-q|--query} [select-options] [query-options]
[select-options]
-c: 只列配置文件
-d:只列幫助文檔
-i:列出包的描述信息(軟件包的版本、開發組織等)
-a: 查詢軟件包相關的所有包
-f: 查看指定的文件由哪個程序包安裝生成(通常會通過which cmd查詢到相應的程序文件)
-l: 文件名,列出文件列表
-p rpmfile:針對尚未安裝的"程序包文件"做查詢操作(rpm -qpi 包名)
(4)rpm包卸載
命令:rpm { -e | --erase } [options ] PACKAGE_NAME
options
--allmatches : 所有匹配,全部卸載,只要是這個名字的
--nodeps :忽略依賴性
--noscripts :
--notriggers :
--test :測試
4、實例
#---查看是否安裝了telnet服務軟件包---#[root@localhost?~]#?rpm?-q?telnet??????#?查詢是否安裝telnet包 telnet-0.17-48.el6.x86_64 [root@localhost?~]#?rpm?-q?telnet-devel? package?telnet-devel?is?not?installed [root@localhost?~]#? [root@localhost?~]#?rpm?-ivh?/misc/cd/Packages/telnet- telnet-0.17-48.el6.x86_64.rpm?????????telnet-server-0.17-48.el6.x86_64.rpm?? [root@localhost?~]#?rpm?-ivh?/misc/cd/Packages/telnet-0.17-48.el6.x86_64.rpm??#?安裝telnel包;其中/misc/cd/為光盤掛載目錄#--安裝后查詢--#[root@localhost?~]#?rpm?-qi?telnet????#?rpm?-qi?查詢telnet包的詳細信息 Name????????:?telnet???????????????????????Relocations:?(not?relocatable) Version?????:?0.17??????????????????????????????Vendor:?CentOS Release?????:?48.el6????????????????????????Build?Date:?Thu?10?Jul?2014?04:08:14?PM?CST Install?Date:?Tue?22?Aug?2017?06:45:01?PM?CST??????Build?Host:?c6b8.bsys.dev.centos.org Group???????:?Applications/Internet?????????Source?RPM:?telnet-0.17-48.el6.src.rpm Size????????:?112112???????????????????????????License:?BSD Signature???:?RSA/SHA1,?Thu?10?Jul?2014?04:29:36?PM?CST,?Key?ID?0946fca2c105b9de Packager????:?CentOS?BuildSystem?<http://bugs.centos.org> Summary?????:?The?client?program?for?the?Telnet?remote?login?protocol Description?: Telnet?is?a?popular?protocol?for?logging?into?remote?systems?over?the Internet.?The?package?provides?a?command?line?Telnet?client [root@localhost?~]#? [root@localhost?~]#?rpm?-ql?telnet?????????#?查詢軟件包的文件列表 /usr/bin/telnet /usr/share/man/man1/telnet.1.gz [root@localhost?~]#?rpm?-qf?`which?telnet`??#?查詢telnet路徑屬于哪個rpm包 telnet-0.17-48.el6.x86_64 [root@localhost?~]#二、使用yum安裝包
雖然RPM很好的解決了包的安裝、卸載、查詢、校驗,但是它的管理是對已經安裝的軟件信息收集的管理,它沒有解決軟件包安裝中最頭痛的問題-依賴關系。例如,安裝ImageMagick包(一個用于圖片處理的包)
[root@localhost?~]#?rpm?-ivh?/misc/cd/Packages/ImageMagick-6.7.2.7-6.el6.x86_64.rpm? warning:?/misc/cd/Packages/ImageMagick-6.7.2.7-6.el6.x86_64.rpm:?Header?V3?RSA/SHA1?Signature,?key?ID?c105b9de:?NOKEY error:?Failed?dependencies:libHalf.so.6()(64bit)?is?needed?by?ImageMagick-6.7.2.7-6.el6.x86_64libICE.so.6()(64bit)?is?needed?by?ImageMagick-6.7.2.7-6.el6.x86_64libIex.so.6()(64bit)?is?needed?by?ImageMagick-6.7.2.7-6.el6.x86_64libIlmImf.so.6()(64bit)?is?needed?by?ImageMagick-6.7.2.7-6.el6.x86_64...后面省略... [root@localhost?~]#由這個例子可以看出:rpm并不能從根本上解決程序包的依賴性關系。
1、yum的特點
yum是建立在RPM之上,它收集rpm包相關信息,檢查依賴性,并將眾多的信息保存在repo數據庫中,數據庫采用輕量級關系型數據庫Sqlite,早期使用xml文件。
yum按照目錄組織軟件rpm包,形成倉庫repository,并檢查倉庫中的軟件,收集、分析信息后建立repo數據庫。
yum采用了CS(Client/Server)架構。Server端就是一個文件服務器,可以采用HTTP、FTP、File、NFS等協議,但是這些協議的URL路徑下必須有repo庫文件;客戶端通過這些協議,連接到repo Server,獲取配置文件中指向的URL路徑下的repo庫信息,并緩沖至本地,CentOS通常是在/var/cache/yum。
用戶可使用YUM客戶端,查找所有YUM倉庫,下載、安裝、升級、卸載軟件包或者包組。
2、yum服務端的配置
服務端的配置相對簡單,只要找一個yum源即可,可以是本地的光盤也可以是網絡上的一些yum源;常見的網絡yum源:
| CentOS系統yum源(阿里云) | https://mirrors.aliyun.com/centos/$releasever/os/x86_64/ |
| EPEL源(阿里云) | https://mirrors.aliyun.com/epel/$releasever/x86_64 |
| 本地yum源(光盤自帶源) | 光盤掛載目錄/Packages/ |
說明:$releasever:表示操作系統主版本號,是yum識別的一個變量;$arch:表示cpu架構
3、yum客戶端配置(yum倉庫)
yum客戶端的配置主要是配置指向yum服務器端的一個路徑;主配置文件位于/etc/yum.conf,一個或多個相關倉庫的配置信息可保存一個文件,文件名都已.repo結尾,并放在/etc/yum.repos.d目錄中,該目錄下的文件格式如下:
[base]??????????????????????????????????????????#?yum倉庫的明字,通常為[base]或[epel] name=base????? baseurl=http://server1/path/to/repository/?????ftp://server2/path/to/repository/?????file:///misc/cdenabled=1????? gpgcheck=1????? gpgkey=URL????? mirrorlist=URL cost=1000說明:相關名詞含義
| 參數 | 說明 |
| repositoryid | 倉庫的唯一標識 |
| name | 倉庫的描述 |
| baseurl | 指向yum倉庫的repodata目錄的上一級目錄。可以一個baseurl指向多個URL,但不能出現多個baseurl=url |
| enabled | 0或者1,分別表示停用或者啟用此yum源 |
| gpgcheck | 0或者1,分別表示停用或者啟用GPG簽名驗證 |
| gpgkey | 指向GPGKey文件的URL |
4、實例
手動創建yum倉庫
上述例子僅僅實現了本地yum倉庫的實現,即采用關盤中自帶的yum源。本例中采用的是file協議,如果你的主機能夠聯網,你可以采用http服務,使用阿里云或者搜狐的鏡像站點;但這里面的yum源只是一些基礎源,如果你想要獲取更多的包,最新的包,你可以配置epel源。具體做法就是在你所創建的yum倉庫文件后面添加epel源的路徑:
[root@localhost?yum.repo.d]#?vim?base.repo????? [base] name=base baseurl=file:///misc/cd/ gpgcheck=0 enabled=1[epel] name=epel baseurl=ftp://? gpgcheck=0 enabled=1 [root@localhost?yum.repo.d]#三、源碼編譯安裝
源碼編譯安裝時直接使用編寫好的程序實現手動編譯并安裝,需要程序員自己解決包的依賴性關系,通常是C語言的軟件開發包。Linux的設計原則就是由眾多單一功能軟件組成,所以很多軟件,需要依賴系統或者其他第三方軟件提供的功能(庫)。軟件依賴關系簡單的還好對付,當軟件依賴關系復雜甚至循環依賴時就會很讓人頭疼。
1、源碼編譯安裝的優點是:(1)一份源碼,四處編譯:開發者只需要提供一份源代碼,就可以在任何具備條件的編譯環境下,本地編譯安裝,完全根據本機自身CPU特性度身定做的。這樣編譯出來的二進制程序,能最大發揮CPU的指令能力,使程序運行具有更高的效率。(2)定制化安裝:安裝過程中,可以按照需求,設定選項參數進行安裝。
2、源碼編譯安裝的缺點:優點其實也就是缺點(1)源代碼編譯需要安裝者有很多的知識、有很強的技能,甚至很好的耐心才能安裝好一個軟件。(2)軟件升級后,有可能導致依賴庫的版本過低,或者依賴庫升級,導致軟件不能使用較新的庫而運行失敗。(3)卸載時,如何能將安裝時產生的文件刪除干凈,同時也要解決依賴關系,不能把其它軟件正在使用的庫卸載。運維時,對于批量安裝,源代碼編譯方法就顯得效率低下。
3、C語言源代碼編譯安裝三步驟:
./configure
(1) 通過選項傳遞參數,指定啟用特性、安裝路徑等;執行時會參考用戶的指定以及makefile.in文件生成makefile
(2) 檢查依賴到的外部環境,如依賴的軟件包,如果本機沒有就會加載make? 根據makefile文件,構建應用程序
make install? 復制文件到相應路徑
4、實例
下面以http的安裝為例,簡要介紹如何源碼編譯安裝。
[root@localhost?~]#?cd?app?????????????#??進入目標目錄 [root@localhost?app]#?rpm?-q?httpd*???#?查看是否安裝有httpd服務 [root@localhost?app]#?yum?remove?httpd*?????#?卸載所有httpd服務 [root@localhost?app]#?tar?xvf?httpd-2.4.37.tar.bz2??????#?解壓httpd源碼包 [root@localhost?app]#?cd?httpd-2.4.37????????????????????#?進入httpd-2.4.37目錄? [root@localhost?app]#?cat?README???????#?查看README文件與INSTALL文件,里面有詳細的說明信息 [root@localhost?app]#?cat?INSTALL [root@localhost?app]#?./configure?--prefix=/app/apache24?--sysconfdir=/etc/apache24/?--enable-rewite [root@localhost?app]#?make?-j?4??????#?-j?表示多線程編譯安裝,編譯速度快 [root@localhost?app]#?make?install [root@localhost?app]#?vim?/etc/profile.d/apache24.sh?????#?提供PATH路徑 export?PATH=/app/apache24/bin:$PATH [root@localhost?~]#?vim?/etc/man.config?????????#?添加幫助文檔 MANPATH?/app/apache24/man說明:configure 命令又眾多的選項:
-prefix=/PATH: 指定默認安裝位置,默認為/usr/local/
--sysconfdir=/PATH:配置文件安裝位置/
System types:支持交叉編譯
轉載于:https://blog.51cto.com/vinsent/1962172
總結
以上是生活随笔為你收集整理的Linux中包的管理与程序安装的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据中心的“维稳之道”
- 下一篇: Linux系统中软件的“四”种安装原理详