1. 程式人生 > >Linux的系統程序包管理

Linux的系統程序包管理

Linux之路

RPM

我們知道在操作系統之上使用的程序是由程序員通過開發工具開發出來的,而程序員編寫的純文本我們 稱為源代碼。由於計算機只認識二進制,程序員寫好的源代碼要經過一定的編譯成計算機認識的二進制程序。而編譯就是將源代碼轉成二進制,再通過一定的步驟來安裝到時操作系統之上被我們使用。

雖然原始碼進行軟件編譯, 畢竟不是每個人都會進行原始碼編譯的。如果我位的 Linux系統與發行廠商一模一樣,那麽在廠商系統上編譯出來的程序,自然也可以在我們的系統上來運行。由於我們本來就是使用廠商的發行版,那麽使用廠商系統上編譯出來的軟件,當然就沒問題了。

安裝的時候還可以加上一些與這些程序相關的信息,將他建立成為數據庫,那不就可以進行安裝、反安裝、 升級與驗證等等的相 關功能。常見的Linux的軟件安裝方式有RedHat的rpm和Debian的dpkg。

RPM 是透過預先編譯並打包成為 RPM 文件格式後,再加以安裝的一種方式,並且還能夠進行數據庫的記載。

包管理器

  • 二進制應用程序的組成部分:
    二進制文件、庫文件、配置文件、幫助文件
  • 程序包管理器:
    debian:deb文件, dpkg包管理器
    redhat: rpm文件, rpm包管理器
    rpm: Redhat Package Manager
    RPM Package Manager

源代碼:name-VERSION.tar.gz|bz2|xz
VERSION: major.minor.release
pm包命名方式:
name-VERSION-release.arch.rpm
例:bash-4.2.46-19.el7.x86_64.rpm

VERSION: major.minor.release
release:release.OS
常見的arch:
x86: i386, i486, i586, i686
x86_64: x64, x86_64, amd64
powerpc: ppc
跟平臺無關:noarch

包:分類和拆包

Application-VERSION-ARCH.rpm: 主包
Application-devel-VERSION-ARCH.rpm 開發子包
Application-utils-VERSION-ARHC.rpm 其它子包
Application-libs-VERSION-ARHC.rpm 其它子包
**包之間:可能存在依賴關系,甚至循環依賴

解決依賴包管理工具:

  • yum:rpm包管理器的前端工具
  • apt-get:deb包管理器前端工具
  • zypper: suse上的rpm前端管理工具
  • dnf: Fedora 18+ rpm包管理器前端管理工具

庫文件

  • 查看二進制程序所依賴的庫文件**
    ldd /PATH/TO/BINARY_FILE***
  • 管理及查看本機裝載的庫文件
    ldconfig 加載庫文件
    sbin/ldconfig -p: 顯示本機已經緩存的所有可用庫文件名及文件路徑映射關系
    配置文件:/etc/ld.so.conf, /etc/ld.so.conf.d/\.conf**
    緩存文件:/etc/ld.so.cache***

rpm包管理

CentOS系統上使用rpm命令管理程序包:
安裝、卸載、升級、查詢、校驗、數據庫維護

安裝:

rpm {-i|--install} [install-options] PACKAGE_FILE…
-v: verbose
-vv:
-h: 以#顯示程序包管理執行進度
rpm -ivh PACKAGE_FILE ...

rpm包安裝
[install-options]

  • --test: 測試安裝,但不真正執行安裝,即dry run模式
  • --nodeps:忽略依賴關系
  • --replacepkgs 覆蓋包
  • --replacefiles 覆蓋文件(當兩個包裏有相同的文件時,默認是不安裝。)
  • --nosignature: 不檢查來源合法性
  • --nodigest:不檢查包完整性
  • --noscripts:不執行程序包腳本
    %pre: 安裝前腳本; --nopre
    %post: 安裝後腳本; --nopost
    %preun: 卸載前腳本; --nopreun
    %postun: 卸載後腳本; --nopostun

升級:

  • rpm {-U|--upgrade} [install-options] PACKAGE_FILE...
    upgrade:安裝有舊版程序包,則“升級”
    如果不存在舊版程序包,則“安裝”
  • rpm {-F|--freshen} [install-options] PACKAGE_FILE...
    freshen:安裝有舊版程序包,則“升級”
    如果不存在舊版程序包,則不執行升級操作
    rpm -Uvh PACKAGE_FILE ...
    rpm -Fvh PACKAGE_FILE ...
    --oldpackage:降級
    --force: 強制安裝

升級註意項

註意:

  • 不要對內核做升級操作;Linux支持多內核版本並存,因此,對直接安裝新版本內核
  • 如果原程序包的配置文件安裝後曾被修改,升級時,新版本的提供的同一個配置文件並不會直接覆蓋老版本的配置文件,而把新版本的文件重命名(FILENAME.rpmnew)後保留
  • 在升級的時候,會對二進制覆蓋,不會對配置文件覆蓋。
  • Linux內核允許多版本共存,安裝 內核,不要用-Uvh和-Fvh來安裝,應該用-ivh來安裝。系統啟動時只能用一個內核來引導,

包查詢
rpm {-q|--query} [select-options] [query-options]
[select-options]

  • -a: 所有包
  • -f: 查看指定的文件由哪個程序包安裝生成
  • -p rpmfile:針對尚未安裝的程序包文件做查詢操作
  • --whatprovides CAPABILITY:查詢指定的CAPABILITY由哪個包所提供
  • --whatrequires CAPABILITY:查詢指定的CAPABILITY被哪個包所依賴
  • rpm2cpio 包文件|cpio –itv 預覽包內文件
    rpm2cpio 包文件|cpio –id “*.conf” 釋放包內文件

[query-options]

  • --changelog:查詢rpm包的changelog
  • -c: 查詢程序的配置文件
  • -d: 查詢程序的文檔
  • -i: information
  • -l: 查看指定的程序包安裝後生成的所有文件
  • --scripts:程序包自帶的腳本
  • --provides: 列出指定程序包所提供的CAPABILITY
  • -R: 查詢指定的程序包所依賴的CAPABILITY

包卸載:

rpm {-e|--erase} [--allmatches] [--nodeps] [--noscripts] [--notriggers] [--test] PACKAGE_NAME ...

包校驗

一個包安裝完成以後會自動更新/var/lib/rpm這個數據庫。裏面記錄了這個包裏面的每個文件的元數據。
查詢包安裝之後生成的文件是否發生了改變,
常見用法:
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
  • 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

包校驗

  • 包來源合法性驗正及完整性驗正
    完整性驗正:SHA256
    來源合法性驗正:RSA
  • 公鑰加密
    對稱加密:加密、解密使用同一密鑰
    非對稱加密:密鑰是成對兒的
    public key: 公鑰,公開所有人
    secret key: 私鑰, 不能公開
    導入所需要公鑰

    rpm -K|checksig rpmfile 檢查包的完整性和簽名
    rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
    rpm --import /run/media/root/CentOS\ 7\ x86_64/RPM-GPG-KEY-CentOS-7
    CentOS 7發行版光盤提供:RPM-GPG-KEY-CentOS-7
    rpm -qa “gpg-pubkey

    rpm -qi gpg-pubkey-f4a80eb5-53a7ff4b
    cat /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
    rpm -e gpg-pubkey-f4a80eb5-53a7ff4b *

rpm數據庫

  • 數據庫重建:
    /var/lib/rpm
  • rpm {--initdb|--rebuilddb}
    initdb: 初始化
    如果事先不存在數據庫,則新建之
    否則,不執行任何操作
    rebuilddb:重建已安裝的包頭的數據庫索引目錄

Yum

由於rpm有軟件相關依賴的問題,當有多個包互相依賴時,有沒有一口氣把要裝的軟件和所依賴的軟件都裝起來呢?yum是基於以C/S結構來實現的。
yum服務器上有一些rpm包和一些元數據,所有要發行的rpm包都放在yum服務器上以提供別人來下載,yum服務器只要提供簡單的下載就可以了,ftp或者httpd的形式都可以。
而客戶端每次使用yum都會去解析/etc/yum.repos.d下面所有以.repo結尾的配置文件,這些配置文件指定了yum服務器的地址。

yum

  • CentOS: yum, dnf
  • YUM: Yellowdog Update Modifier,rpm的前端程序,可解決軟件包相關依賴性,可在多個庫之間定位軟件包,up2date的替代工具
  • yum repository: yum repo,存儲了眾多rpm包,以及包的相關的元數據文件(放置於特定目錄repodata下)
    文件服務器:
    http://
    https://
    ftp://
    file://

yum配置文件

?yum客戶端配置文件:
/etc/yum.conf:為所有倉庫提供公共配置
/etc/yum.repos.d/*.repo:為倉庫的指向提供配置

倉庫指向的定義

  • [main] 語句塊的名稱
  • cachedir=/var/cache/yum/$basearch/$releasever
    緩存的文件夾<br/>$basearch 為cpu架構,$releasever 為版本
  • baseurl=url://path/to/repository/ yum倉庫的路徑,當yum倉庫的指向多條路徑時,可以把多條路徑放到一個文件裏,倉庫的路徑指向文件的路徑:<br/>mirrorlist=file:///root/baselist
  • keepcache=0 為1時,rpm包下載下來時,包會緩存下來,默認會刪掉
  • debuglevel=2 調試
  • enabled={1|0} 為0時禁用倉庫,為1時啟用倉庫
  • logfile=/var/log/yum.log 日誌
  • exactarch=1
  • obsoletes=1
  • gpgcheck=1 相當於rpm -K,為1,包不完整不合法,拒絕安裝,為0時,忽略檢查
    gpgkey=URL 導入公鑰
    gpgkey=file:///mnt/cdrom/RPM-GPG-KEY-CentOS-7
  • plugins=1 插件啟用
  • installonly_limit=5並行安裝,加速訪問
  • enablegroups={1|0}
  • failovermethod={roundrobin|priority}
    roundrobin:意為隨機挑選,默認值
    priority:按順序訪問
  • cost= 默認為1000`越小優先極越高

yum的特性:不允許同時在一個機器上並行運行多個yum命令的。
使用光盤做yum源。在光盤裏:rpm包在Packages這個目錄下,而元數據據在repodata這個目錄裏。
原則:將來寫倉庫的路徑是寫的是repodata的父目錄

yum倉庫
yum的repo配置文件中可用的變量:
$releasever: 當前OS的發行版的主版本號
$arch: 平臺,i386,i486,i586,x86_64等
$basearch:基礎平臺;i386, x86_64
$YUM0-$YUM9:自定義變量
實例
http://server/centos/$releasever/$basearch/
http://server/centos/7/x86_64
http://server/centos/6/i384

yum命令

  • yum命令的用法:
    yum [options] [command] [package ...]
  • 顯示倉庫列表:
    yum repolist [all|enabled|disabled]
  • 顯示程序包:
    yum list
    yum list [all | glob_exp1] [glob_exp2] [...]
    yum list {available|installed|updates} [glob_exp1] [...]
  • 安裝程序包:
    yum install package1 [package2] [...]
    yum reinstall package1 [package2] [...] (重新安裝)

  • 升級程序包:
    yum update [package1] [package2] [...]
    yum downgrade package1 [package2] [...] (降級)
  • 檢查可用升級:
    yum check-update
  • 卸載程序包:
    yum remove | erase package1 [package2] [...]

  • 查看程序包information:
    yum info [...]
  • 查看指定的特性(可以是某文件)是由哪個程序包所提供:
    yum provides | whatprovides feature1 [feature2] [...]
  • 清理本地緩存:
    清除/var/cache/yum/$basearch/$releasever緩存
    yum clean [ packages | metadata | expire-cache | rpmdb | plugins | all ]
  • 構建緩存:
    yum makecache

  • 搜索:yum search string1 [string2] [...]
    以指定的關鍵字搜索程序包名及summary信息
  • 查看指定包所依賴的capabilities:
    yum deplist package1 [package2] [...]
  • 查看yum事務歷史:
    yum history [info|list|packages-list|packages-info|
    summary|addon-info|redo|undo|
    rollback|new|sync|stats]
    yum history
    yum history info 6 查看
    yum history undo 6 取反
    yum history redo 6 重做
  • 日誌 :/var/log/yum.log

  • **安裝及升級本地程序包:***
    yum localinstall rpmfile1 [rpmfile2] [...]
    (用install替代)
    yum localupdate rpmfile1 [rpmfile2] [...]
    (用update替代)
  • 包組管理的相關命令:
    yum groupinstall group1 [group2] [...]
    yum groupupdate group1 [group2] [...]
    yum grouplist [hidden] [groupwildcard] [...]
    yum groupremove group1 [group2] [...]
    yum groupinfo group1 [...]

  • yum的命令行選項:
    --nogpgcheck:禁止進行gpg check
    -y: 自動回答為“yes”
    -q:靜默模式
    --disablerepo=repoidglob:臨時禁用此處指定的repo
    --enablerepo=repoidglob:臨時啟用此處指定的repo
    --noplugins:禁用所有插件

系統光盤yum倉庫

  • 系統安裝光盤作為本地yum倉庫:
    (1) 掛載光盤至某目錄,例如/mnt/cdrom
    mount /dev/cdrom /mnt/cdrom
    (2) 創建配置文件
    [CentOS7]
    name=
    baseurl=
    gpgcheck=
    enabled=
  • 創建yum倉庫:
    createrepo [options] <directory>

Linux的系統程序包管理