1. 程式人生 > >程序包管理(一)rpm

程序包管理(一)rpm

yum rpm 程序包管理

一、編程語言與操作系統:
應用程序
____________________
|lib call | |
|-------------------|
|system call |
|———————————----————|
|各種硬件 |
————————————————————|

API:application program interface
ABI:application binary interface
Api應用層級兼容,未必abi層次也兼容,有些程序對二進制的識別格式是不相同的


UNix-like:ELF格式的程序
windows:exe,msi
linux:wine模擬windows庫
windows:Cywin虛擬出linux運行環境
系統級開發:C/C++:httpd,vsftpd,nginx
go編程語言:新貴
C/C++編程依賴於系統上的標準庫
應用級開發:java/Python/perl/ruby/php
java:hadoop,hbase,(jvm)運行環境
Python:openstack 雲管理平臺,(pvm)
perl:(perl)perl的解釋器
ruby:(ruby)解釋器/虛擬機{運行環境}
php:(php)
//一般解釋器或者虛擬機{jvm,pvm} 使用C/C++編寫

php:世界上最好的語言
c/C++程序格式:
源代碼:文本格式的程序代碼
編譯開發環境:編譯器、頭文件、開發庫
二進制格式:文本格式的代碼-->編譯器-->二進制格式(二進制程序、庫文件、配置文件)
java/python
源代碼:編譯成能夠在其虛擬機(jvm/pvm)上運行的格式
開發環境:編譯器、開發庫
二進制:

項目構建工具://不再需要考慮程序編譯主次關系,由項目構建關系負責,項目構建工具借助於配置文件實現
c/c++:make
java:maven

程序包管理器:
源代碼 --> 目標二進制格式 -->組織成為一個或有限幾個“包”文件;
安裝、升級、卸載、查詢、校驗等操作
程序包管理器:
debian:kali,ubuntu //dpt,dpkg , ".deb"
redhat:rhel,centos,fedora //redhat package manager,rpm , ".rpm" //perl-C現在使用的是C語言寫的
//rpm:rpm is package manager;成為標準
slckware:S.u.S.E: //rpm,suse的rpm和rhel的是不兼容的,suse為rpm開發了一個重要的庫,後期被rhel收納
//rpm:".rpm" 命令rpm
Gentoo: //采用了freebsd的機制,ports的包機制
Archlinux //輕量級,
源代碼:name-VERSION.tar.[xz,gz,bz2]
VERSION:major-minor-release
major:重大改變
minor:局部改變
release:修復bug,小串代碼改變
rpm包命令格式:
vsftpd-3.0.2-10.el7.x86_64.rpm
name-VERSION-release.arch.rpm
release:是制作rpm包的次數
VERSION.release是源代碼的release
arch:architecture:i386,x64(amd64),ppc(powerpc),noarch(通用平臺)
i386:支持較老版本的32bit cpu
i686:支持較新版本的32bit cpu

拆包:
redis-3.0.2.tar.gz--> redis.3.0.2-1.el7.x86_64
//把一個包的多種功能,拆成多個部分,按需組織rpm包
//主包和分支包
主包:name-VERSION-release.arch.rpm
支包:name-function-VERSION-release.arch.rpm
function:devel,utils(工具程序),libs,plugins(插件)
依賴關系:每個程序包的功能都很簡單,包之間存在很復雜的依賴關系
x,y,z
x-->y,z
y-->a,c,b
c-->Y
前端工具:自動解決依賴關系
yum:rpm包管理器的前端工具
apt-get(apt-cache):deb包
zypper:suse上的rpm包管理器
dnf:Fedora 22+ 系統上的rpm包管理器的前端工具
程序包管理:
功能:將編譯好的應用程序的各組成文件打包成一個或幾個程序包文件,從而更方便地實現程序包的安裝、升級、卸載和查詢等操作
1.程序包的組成清單(每個程序包單獨實現)
文件清單
安裝或卸載時運行的腳本
2.數據庫(公共)
程序包的名稱和版本
依賴關系
功能說明
安裝生成的各文件路徑及校驗碼信息
/var/lib/rpm/ rpm數據庫所在

二、獲取程序包的途徑:
1.系統發行版的光盤或者官方的文件服務器
http://mirrors.aliyun.com
http://mirrors.sohu.com
http://mirrors.163.com
2.項目官方站點
apache官網:www.apache.org
zabbix:www.zabbix.com
3.第三方組織
(a)EPEL:
mirrors.aliyun.com/epel/7/x86_64
(b)搜索引擎
pkgs.org
rpmfind.net
rpm.pbone.net
4.自己動手,豐衣足食

建議:校驗,檢查其合法性
來源合法性:
程序包的完整性:

三、Centos上rpm命令管理程序包
(1)安裝
安裝,升級,卸載,查詢和校驗,數據庫維護
rpm {-i|--install} [install-options] PACKAGE_FILE ...
-i :install
-v verbose通用選項,顯示過程
-vv 更詳細
-h 以hash輸出進度條
--test 僅僅是檢查一下,測試不安裝
--nodeps //忽略依賴關系,no dependce
--replacepkgs //替代安裝
--noscripts //有些程序包安裝過程中,可能需要運行一段自帶腳本,
rpm可以自帶腳本:
四類:
preinstall:安裝之前,%pre
postinstall:安裝完成之後,%post
preuninstall:卸載開始前,%preun
postuninstall :卸載完成之後,%postun
--noscripts
--nopre
--nopost
--nopreun
--nopostun
--nosignature //來源合法性,不檢查包簽名信息
--nodigest //不檢查包完整幸信息,頭文件摘要
-U :update,-F --freshen//使更新
-e :--erase
-q:--query
-l :list生成文件
-V:--verify校驗
數據庫維護:
--builddb,--initdb

(2)升級
-U update
Uvh /Fvh
rpm {-U|--upgrade} [install-options] PACKAGE_FILE ... //和安裝一樣
-U 升級或者安裝,有沒有老版本,都會安裝
-F 升級,有老版本才會安裝
--oldpackage :降級安裝老的程序包,不兼容
--force:強制升級

其他和rpm -ivh 一樣
註意:
(1)不要對內核做升級操作,更新內核需要重啟系統
//linux支持多內核版本並存,因此,直接安裝新版本內核即可
(2)如果某源程序包的配置文件,安裝後曾被修改過,升級時,新版本的程序提供的同一個配置那文件不會覆蓋原有的
配置文件,而是把新版本的配置文件,重命名後(filename.rpmnew)後,提供

(3)卸載
-e
--allmatches //假如存在多版本的話,多版本一並刪除
--nodeps //忽略依賴關系
--test //dry run 僅僅測試
--noscripts //不執行腳本
rpm -e zsh //pack_name zsh即可,數據庫中有文件保存
rpm -ivh 文件名
(4)查詢

rpm {-q|--query} [select-options] [query-options]
-q zsh //查詢指定包zsh是否安裝
select-options:
-a,--all 不加選項,查詢所有已經安裝的包
rpm -qa |grep zsh
-f /etc/fstab 查詢文件的安裝包
-g,--group 組名//查詢指定包組中包含的包
-p,--packaeg package_file:實現查看未安裝包的,結合query-optionss實現
rpm -qpl zsh-5.0.2-14.el7.x86_64.rpm //查詢未安裝程序包的安裝能夠生成文件
--wahtprovice CAPABILITY//查詢提供某種能力的包
rpm -q --whatprovide ‘config(bash)‘
--whatrequires CAPABLITY //查詢指定的CAPABILITY被哪個程序包所依賴

query-options
--changelog //查詢rpm包的changelog,不是源碼的
rpm -q --changelog zsh //查看zsh的改進日誌

-l,--list //程序包安裝生成的所有文件列表
rpm -ql zsh
-i info,查詢程序包相關信息,版本號,大小,所屬的包組,等
rpm —qi bash
-c ,--configfiles:查詢指定的程序包的配置文件
rpm -qc bash
-d,--docfile :查詢指定的程序包的幫助文檔
rpm -qd bash
--provides:列出指定的程序包提供的CAPABILITY
rpm -q --provides bash //bash提供的
rpm -q --whatprovides ‘config(bash)‘
-R requires//查詢指定程序包的所依賴的程序包
rpm -qR bash
--scripts //查詢腳本
rpm -q --scripts bash
rpm -qp --scripts zsh-5.0.2-14.el7.x86_64.rpm
ql,qf,qc,qi,qd //qf文檔的產生源
(5)校驗
rpm {-V|--verify} [select-options] [verify-options]
-V //rpm -V zsh //安裝完成後,校驗

       S file Size differs
       M Mode differs (includes permissions and file type)
       5 digest (formerly MD5 sum) differs
       D Device major/minor number mismatch
       L readLink(2) path mismatch
       U User ownership differs
       G Group ownership differs
       T mTime differs
       P caPabilities differ

rpm -ql zsh //隨意修改其中一個文件
rpm -V zsh //就能看到效果
select-options:和查詢的select-options一樣
-a,-f,-g,-p
verify-options:
--nodeps 不校驗依賴
--nodigest 不校驗包頭,
--noscripts 不檢查腳本
--nofiles 不檢查
--nosignature 不檢查包頭簽名信息
//默認檢查所有屬性
rpm -V --nofiles zsh
(6)包來源合法性驗證和完整性驗證
來源合法性驗證:
數字簽名:非對稱加密:一個公鑰,一個私鑰
包的制作者,
1.首先使用單項加密,計算出包的特征碼,定長輸出
2.然後再用自己的私鑰加密特征碼,這叫數字簽名 ,
3.把加密後的特征碼附加到包後
//只要拿到公鑰,就能解密
中間者:能夠解密特征碼,因為能拿到對方公鑰,但是不能再次加密,因為沒有作者的私鑰
//用戶拿到作者的公鑰,進行解密特征碼,解密成功,則認為來源合法
//我用同樣的方法,進行單項加密計算特征碼,一樣則證明包內容沒有修改過//完整性
如何拿到對方的公鑰:
1.從網上下載,不可靠
2.互聯網上是使用CA來實現,可靠手段拿到對方公鑰
rpm --import /mnt/RPM-GPG-KEY-CentOS7 //導入公鑰
/etc/pki/rpm-gpg/ 導入到此地
對於CentOS發行版:rpm --import
rpm -ivh zsh-***** //自動進行校驗操作
rpm -K zsh-5.03..... //手動驗證

驗證:
安裝此組織簽名的程序時,會自動執行驗證
手動驗證:rpm -K PACKAGE_FILE
1
數字簽名:保證來源合法性和數據完整性
(7)數據庫重建
rpm管理數據庫路徑:/var/lib/rpm/
查詢操作:就是基於該數據庫查詢
Centos6:man rpm //rpm --initdb|--rebuilddb
Centos7:man rpmdb
rpmdb
--initdb 初始化db,當前無任何數據庫時創建一個新的,當前有,不執行任何操作
--rebuildb 重建db,重新構建,通過讀取當前系統上所有已經安裝過的程序包進行重新創建
--dbpath 指定db路徑
rpmdb --initdb --dbpath=/tmp/rpm

四、rpm命令小結

linux程序包管理器,rpm包管理器

    安裝:rpm -ivh ,--nodeps,--replacepkgs
    卸載:-e,--nodeps
    升級:-U|-F vh //F只用於升級,--nodeps,--oldpackage
    查詢:-q,-a,f,i,qd,qc,--script,changelog,provides/whatprovides,requires/whatrequires
    校驗:-V,
    驗證合法性:--import,-K手動驗證,--nodigest,--nosignature
    數據庫重建:rpmdb --initdb --rebuilddb


本文出自 “黑馬騰空” 博客,請務必保留此出處http://hmtk520.blog.51cto.com/12595610/1950170

程序包管理(一)rpm