程序包管理
概述
API:Application Program Interface應用編程接口 ABI:Application Binary Interface應用二進制接口 Unix-like, ELF Windows exe,msi 庫級別的虛擬化: linux:WinE(模擬windows) Windows:Cywin(模擬linux) 系統級開發: C/C++:httpd,vsftpd,nginx go 應用級開發: java/python/perl/ruby/php java:hadoop,hbase,(jvm(java虛擬機)) Python:openstack,(pvm(python虛擬機)) perl:(per解釋器) php:(php解釋器) c/c++程序格式: 源代碼:文本格式的程序代碼; 編譯開發環境:編譯器、頭文件、開發庫 二進制格式:文本格式的程序代碼->編譯器->二進制格式(二進制程序、庫文件、配置文件、幫助文件) java/python程序格式: 源代碼:編譯成能夠在其虛擬機(jvm/pvm)運行的格式; 開發環境:編譯器、開發庫 二進制: 項目構建工具: c/c++:make java:maven
程序包管理器:
源代碼-->目標二進制格式(二進制程序、庫文件、配置文件、幫助文件)-->組織成為一個或有限幾個“包”文件; 安裝、升級、卸載、查詢、校驗 程序包管理器: debian:dpt,dpkg,".deb" redhat:redhat package manager,rpm, ".rpm";rpm is package manager; S.u.S.E:rpm,".rpm", Gentoo:ports Archlinux: 源代碼:name-VERSION.tar.gz VERSION:major,minor,release
rpm包命名格式:
name-VERSION-release.arch.rpm VERSION:major.minor.release release.arch:rpm包的發型號 release.os:3.el7.i386.rpm(適用于redhat7,32為的程序包,第三次制作的程序包) archetecture(架構):i386,x64(amd64),ppc,noarch redis-3.0.2.tar.gz-->redis-3.0.2-1.centos7.x64.rpm (包命名格式) changelog 拆包:主包和支包 主包:name-VERSION-release.arch.rpm 支包:name-function(功能)-VERSION-release.arch.rpm function:devel,utils,libs,...
依賴關系:
包和包之間存在復雜的依賴關系 X,Y,Z X-->Y,Z Y-->A,B,C C-->Y 循環依賴關系
前端工具:自動解決依賴關系;
yum:rhel系列系統上rpm包管理器的前端工具; apt-get(apt-cache):deb包的管理器的前端工具; zypper:suse的rpm管理器前端工具; dnf:Fedora 22+系統上rpm包管理器的前端工具;
程序包管理器:
功能:將編譯好的應用程序的各組成文件打包成一個或幾個程序包文件,從而更方便地實現程序包的安裝、升級、卸載和查詢等管理操作 1、程序包的組成清單(每個程序包都單獨實現); 文件清單 安裝或卸載時運行的腳本 2、數據庫(公共) 程序包的名稱和版本; 依賴關系; 功能說明; 安裝生成的各文件的文件路徑及校驗碼信息; 等等 /var/lib/rpm/ :這個路徑下所存放的是rpm包的數據庫
獲取程序包的途徑:
(1)系統發行版的光盤或官方文件服務器(或鏡像站點): htty://mirrors.allyun.com htty://mirrors.sohu.com htty://mirrors.163.com (2)項目的官方站點 (3)第三方組織: (a)EPEL: (b)搜索引擎 htty://pkgs.org htty://rpmfind.net htty://rpm.pbone.net (4)自己動手,豐衣足食 建議:檢測其合法性 來源合法性: 程序包的完整性;
centos系統上rpm命令管理程序包:
安裝、升級、卸載、查詢和校驗、數據庫維護 rpm命令:rpm [options] [PACKAGE_FILE] 安裝:-i,--install 升級:-U,--update,-F,--freshen 卸載:-e,--erase 查詢:-q,--query 校驗:-V,--verify 數據庫維護:--builddb,--initdb
安裝:卸載時用的是name包名
rpm {-i|--install} [install-options] PACKAGE_FILE... GENERAL OPTIONS:通用選項 -v: verbose,詳細信息 -vv:更詳細的輸出
安裝時真正用的是:rpm -ivh PACKAGE_FILE,例如:
[install-options]: -h:hash marks輸出進度條;每個#表示2%的進度; --test:測試安裝,檢測并報告依賴關系及沖突消息等; --nodeps:忽略依賴關系;不建議,即使裝上也沒法用; --replacepkgs:重新安裝,例如先把/etc/zshrc里的文件改掉,但我不知道修改哪里且無法復原,我就需要重新安裝一下包來恢復。 但是,這里的修改系統會認為是認為故意的,所有不會恢復。這時候要刪除整個/etc/zshrc,再重新安裝包
注意:rpm可以自帶腳本; 四類:--noscripts都不執行 preinstall:安裝過程開始之前運行的腳本,%pre, --nopre不執行 postinstall:安裝過程完成之后運行的腳本,%post, --nopost不執行 preuninstall:卸載過程真正開始執行之前運行的腳本,%preum,--nopreun不執行 postuninstall:卸載過程完成之后運行的腳本,%postun,--nopostun不執行 --nosignature:不檢查包簽名信息,不檢查來源合法性; --nodigest:不檢查包完整性信息;
升級:用的是file,包的路徑
rpm {-U|--upgrade} [install-options] PACKAGE_FILE ... rpm {-F|--freshen} [install-options] PACKAGE_FILE ... -U:升級或安裝; -F:升級 rpm -Uvh PACKAGE_FILE... rpm -Fvh PACKAGE_FILE... --oldpackage:降級; --force:強制升級; 注意:(1)不要對內核做升級操作;linux支持多內核版本并存,因此,可以直接安裝新版本內核; (2)如果某原程序包的配置文件安裝后被修改過,升級時,新版本的程序提供的同一個配置文件不會覆蓋原有版本的配置文件,而是把新版本的配置文件重命名(FILENAME.rpmnew)后提供;
卸載:卸載時用的是name包名,不需要路徑
rpm{-e|--erase}[--allmatches][--nodeps][--noscripts][--test] PACKAGE_NAME... --allmatches:卸載所有匹配指定名稱的程序包的各版本; --nodeps:忽略依賴關系 --test:測試卸載,dry run模式
查詢(非常重要):查詢時用的是name包名,不需要路徑
rpm {-q|--query}[select-options][query-options] [select-options] PACKAGE_NAME:查詢指定的程序包是否已經安裝,及其版本;
-a,--all:查詢所有已經安裝過的包,這里可以用正則表達式
-f FILE(路徑) :查詢指定的文件由哪個程序包安裝生成;非常有用
-p,--package PACKAGE_FILE:用于實現對未安裝的程序包執行查詢操作; --whatprovides CAPABILITY:查詢指定CAPABILITY由哪個程序包提供; --whatequires CAPABILITY:查詢指定的CAPABILITY被哪個包所依賴; [query-options] --changelog:查詢rpm包的changlog; -l,--list:程序安裝生成的所有文件列表;
-i,--info:程序包相關的信息,版本號、大小、所屬的包組,等;
-c,--configfiles:查詢指定的程序包提供的配置文件;
-d,--docfiles:查詢指定的程序包提供的文檔; --provides:列出指定的程序包提供的所有的CAPABILITY
-R,--requires:查詢指定的程序包的依賴關系
--scripts:查看程序包自帶的腳本片段
用法: -qi PACKAGE(查詢information),-qf FILE(指定文件由哪個包安裝生成),-qc PACKAGE(配置文件),-ql PACKAGE(程序包安裝生成的文件列表),-qd PACKAGE(程序包安裝生成的文檔) -qpi PACKAGE_FILE,-qpl PACKAGE_FILE,-qpc PACKAGE_FILE.....查詢未安裝的程序包的相關信息
校驗:
rpm {-V|--verify} [select-options] [verify-options] S file Size differs文件大小發送改變 M Mode differs (includes permissions and file type)權限發生改變 5 digest (formerly MD5 sum) differs數據指紋信息,文件的di5碼發送改變 D Device major/minor number mismatch主次設備號改變 L readLink(2) path mismatch readlink的路徑不匹配 U User ownership differs 屬主改了 G Group ownership differs 屬組改了 T mTime differs 最近一次的時間戳改了 P capabilities differ capabilities改了 可以指明檢測哪些信息,也可以指明不檢查哪些信息
包來源合法性驗證和完整性驗證:
來源合法性驗證:印簽,數字簽名 完整性驗證: 制作者制作一個rpm包,第一步要先使用單向加密算法去提取出包的特征碼來,特征碼是定長的。 第二部,制作者會用自己的私鑰去加密這段特征碼,然后附加在文件后面。 使用者拿到這個包后,第一步驗證來源合法性,拿到制作者的公鑰,解密這段特征碼。 同樣的用單向加密算法對包做計算,算出特征碼,只要數據沒改變,和以前的特征碼一定是一樣的。二者一樣,包的完整性就得到了驗證。 如何獲得合法的公鑰,通過第三方加密機構獲得,要通過可靠手段來拿到 獲取并導入信任的包制作者的密鑰: 對于centos發行版來說:rpm --import/etc/pki/rpm-gpg/RPM-GPG-KEY-Centos-7
驗證: (1)安裝此組織簽名的程序時,會自動執行驗證; (2)手動驗證:rpm-K PACKAGE_FILE 數據庫重建: rpm管理器數據庫路徑:/var/lib/rpm/ 查詢操作:通過此處的數據庫進行; 獲取幫助: centos 6:man rpm centos 7:man rpmdb rpm{--initdb|--rebuildbd}[--dbpath DIRECTORY][--root DIRECTORY] --initdb:初始化數據庫,當前無任何數據庫可實施化創建一個新的;當前有時不執行任何操作; 如果實現不存在數據庫,則新建之;否則,不執行任何操作 --rebuiddb:重新構建,通過讀取當前系統上所有已經安裝過的程序包進行重新創建; 無論當前存在與否,直接重新創建數據庫
回顧
linux程序包管理的實現、rpm包管理器
rpm命令實現程序管理 安裝:-ivh,--nodeps,--replacepkgs 卸載:-e,--nodeps 升級:-Uvh,-Fvh,--nodeps,--oldpackage 查詢:-q,-qa,-qf,-qi,-qd,-qc,--scripts,-q --changlog(查詢更新日志),-q --provides,-q --provides,-q --requires 校驗:-V 導入GPG密鑰:--import,-K,--nodigest,--nosignature 數據庫重建:--initdb,--rebuilddb
linux程序包管理(2)
Centos:yum,dnf ftp://172.16.0.1/pub/
yum是用來解決依賴關系的,自動解決依賴關系,完成包的安裝
yum是cs架構的工具,工作前提要求本地客戶端可達的網絡上,首先,這可以是一個文件服務器,可以提供很大的存儲空間,在這個空間上放置所有對我們有用的rpm包。這個目錄文件共享的方式輸出到外部主機,讓主機能夠訪問。可以有linux主機,可以支持yum工具的使用,當用戶需要安裝程序包的時候,可以不用rpm命令,而使用yum,接到命令后會根據本地所指向的提供服務的訪問地址(URL),互聯網提供共享服務的服務器有很多。
yum需要一個配置文件指明要訪問網絡中的哪一個服務器。yum在接收到安裝程序包的指定后,會嘗試通過文件中 的配置指定去找遠程的服務器。服務器會提供一個程序包倉庫,會有一個元數據信息,指明倉庫中存放的包名,版本等。yum安裝程序包時去找倉庫的時候,yum會首先請求服務器把元數據文件發過來,先放置在本地的緩存區域中(cache),yum就開始分區這個cache,看有沒有用戶想要的程序包的包名,如果有就開始嘗試讀取這個包。每一個包和程序包之間可能會存在依賴關系,還會去嘗試根據元數據文件取分析依賴關系。接下來去查詢本地以安裝的程序包,分析完后把剩余的尚未安裝的包給列出來,和我們要安裝的程序包給列出來,最后把自己扮演為文件客戶端的角色,去嘗試連線對應的文件服務器,開始去下載對應的程序包文件。
下載完先緩存在本地,在本地執行類似于rpm的安裝操作,安裝時會自動先安裝被依賴的程序包,安裝完成開始返回告訴客戶端安裝完成,安裝完會把緩存中的文件刪除。安裝完成后會自動刪除程序包,但元數據文件不會刪除。因為下次再安裝程序包時,直接分享本地的元數據就可以了。如果遠程服務器中的包,依賴關系之類的發送改變,元數據文件也會發生改變。
yum每次都會遠程到服務器去請求元數據。在倉庫上,元數據文件不止一個,服務器中還有一個特殊文件,這個文件記錄了沒一個元數據文件的校驗碼,本地緩存的文件也有校驗碼,每一次yum到服務器客戶端請求元數據時會先請求校驗碼,先拿到校驗碼和本地對比是不是發生改變,只有文件沒變校驗碼一定不變。檢測完一樣,本地緩存繼續有效,否則還是請求重新下載元數據文件。可以大大節約網絡帶寬,還能保證本地緩存文件是最新版本的。
查詢本地程序包,發現分析本地元數據文件時,但遠程服務器連不上。這是看自己是否要用未知的文件。
yum不是rpm的取代者,只是rpm的前端管理工具,yum是依賴rpm才能存在的。yum解決安裝問題,rpm在后臺完成查詢等各種管理操作,對后期應用很有用。
本地進行yum操作,需要自行去配置一臺服務器主機,配置成文件服務器。一般yum所支持的文件服務器有兩種:1、ftp 2、http。把這些文件創建出元數據文件。有一個命令去生成,元數據文件是通過分析每一個程序包的元數據,再從中抽取出來給羅列在元數據文件中實現的。工具creatrepo
creatrepo用來創建高級程序包時比較困難
YUM:yellow dog,Yellowdog Update Modifier yum repository:yum repo 存儲了眾多rpm包,以及包的相關的元數據文件(放置于特定的目錄下:repodata): 安裝過程也會用到依賴關系分析,用到倉庫,默認倉儲都是本地光盤當倉庫來使用,操作系統的安裝鏡像光盤,本身就是一個倉庫。repodata目錄所在的位置就是倉庫應該指向的路徑,并不是rpm包所在的目錄是倉庫,而是repodata這個目錄所在的位置應該是倉庫所指向的路徑。 文件服務器: ftp:// http:// nfs:// file:/// 本地倉庫,把鏡像光盤當倉庫 yum客戶端所指定的文件
配置文件: /etc/yum.conf:為所有倉庫提供公共配置(主配置文件通常只提供各yum倉庫指向的公共配置) /etc/yum.repos.d/*.repo:為倉庫的指向提供配置(可以配置一個或多個倉庫指向)
主配置文件
定義yum的特性
倉庫的定義: [reposotoryID] name-Some name for this repository baseur1-ur1://path/to/repository/ enabled={1|0}默認為1,倉庫是否可以用 gpgcheck={1|0}:安裝前是否堅持完整性或來源合法性 gpgkey=URL:密鑰文件 enablegroups={1|0}是否支持在此倉庫上使用組 failovermethod={roundrobin|prority}故障轉移方法,默認為roundrobin意為隨機挑選 cost=1000 :開銷數字,默認為1000
倉庫id
每一個中括號當中定義了一個配置段,可能只對某一段生效
教室的yum
repodata上一級目錄,就是目前這一級
配置yum倉庫
配置好以后查看yum倉庫
這樣就可以使用了
yum命令的用法:
yum [options] [command] [package...] command is one of: * install package1 [package2] [...] * update [package1] [package2] [...] * update-to [package1] [package2] [...] * update-minimal [package1] [package2] [...] * check-update * upgrade [package1] [package2] [...] * upgrade-to [package1] [package2] [...] * distribution-synchronization [package1] [package2] [...] * remove | erase package1 [package2] [...] * autoremove [package1] [...] * list [...] * info [...] * provides | whatprovides feature1 [feature2] [...] * clean [ packages | metadata | expire-cache | rpmdb | plugins | all ] * makecache [fast] * groups [...] * search string1 [string2] [...] * shell [filename] * resolvedep dep1 [dep2] [...](maintained for legacy reasons only - use repoquery or yum provides) * 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] * repoinfo [all|enabled|disabled] * repository-packages <enabled-repoid> <install|remove|remove-or-rein‐stall|remove-or-distribution-synchronization> [package2] [...] * version [ all | installed | available | group-* | nogroups* | grou‐plist | groupinfo ] * history [info|list|packages-list|packages-info|summary|addon-info|redo|undo|rollback|new|sync|stats] * load-transaction [txfile] * updateinfo [summary | list | info | remove-pkgs-ts | exclude-updates| exclude-all | check-running-kernel] * fssnapshot [summary | list | have-space | create | delete] * fs [filters | refilter | refilter-cleanup | du] * check * help [command] 常用: 顯示倉庫列表: repolist [all|enabled|disabled] 顯示程序包: list # yum list [all | glob_exp1] [glob_exp2] [..] # yum list {available|installed|updates}[glob_exp1][..] 安裝程序包: install package [package2] [...] reinstall package1 [package2] [..] (重新安裝) 升級程序包: update package1 [package2] [...] downgrade package1 [package2] [...] (降級) 檢測可用升級: check-update 卸載程序包: remove | erase package1 [package2] [..] 查看程序包information info [..] 查看指定的特性(可以是某文件)是由哪個程序包提供: provides | whatprovides features [features] [..] 清理本地緩存: clean [ pakages|metdata|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 [..]
原創文章,作者:15152188070,如若轉載,請注明出處:http://www.www58058.com/38248