9-1 軟件包管理

軟件包管理

軟件運行和編譯

ABI:Application Binary Interfacephp

  • Windows與Linux不兼容
    • ELF(Executable and Linkable Format)
    • PE(Portable Executable)
  • 庫級別的虛擬化:
    • Linux: WINE
    • Windows: Cygwin

API:Application Programming Interface前端

  • POSIX:Portable OS

程序源代碼 --> 預處理 --> 編譯 --> 彙編 --> 連接java

  • 靜態編譯:.a
  • 動態編譯:.so

gcc編譯程序

gcc 編譯程序主要通過四個過程:node

  • 預處理(Pre-Processing)
  • 編譯 (Compiling)
  • 彙編 (Assembling)
  • 連接 (Linking)

gcc編譯過程:數據庫

  • gcc -E hello.c -o hello.i 對hello.c文件進行預處理,生成了hello.i 文件
  • gcc -S hello.i -o hello.s 對預處理文件進行編譯,生成了彙編文件
  • gcc -c hello.s -o hello.o 對彙編文件進行編譯,生成了目標文件
  • gcc hello.o -o hello 對目標文件進行連接,生成可執行文件
  • gcc hello.c -o hello 直接編譯連接成可執行目標文件

靜態和動態連接

連接主要做用是把各個模塊之間相互引用的部分處理好,使得各個模塊之間可以正確地銜接,分爲靜態連接和動態連接
靜態連接:centos

  • 把程序對應的依賴庫複製一份到包
  • libxxx.a
  • 嵌入程序包
  • 升級難,需從新編譯
  • 佔用較多空間,遷移容易

動態連接:緩存

  • 只把依賴加作一個動態連接
  • libxxx.so
  • 鏈接指向
  • 佔用較少空間,升級方便

開發語言

系統級開發:C,C++
應用級開發:java,Python,go,php,perl,delphi,rubyruby

包和包管理器

最初只提供了.tar.gz的打包的源碼文件,用戶必須自已編譯每一個想在GNU/Linux上運行的軟件。用戶急需系統能提供一種更加便利的方法來管理這些軟件,當Debian誕生時,這樣一個管理工具也就應運而生,它被命名爲dpkg。從而著名的「package」概念第一次出如今GNU/Linux系統中,稍後Red Hat纔開發本身的「rpm」包管理系統
包的組成:bash

  • 二進制文件、庫文件、配置文件、幫助文件

程序包管理器:服務器

  • debian: deb文件, dpkg包管理器
  • redhat: rpm文件, rpm包管理器
    • rpm:Redhat Package Manager->RPM Package Manager

包命名

源代碼:name-VERSION.tar.gz|bz2|xz

  • VERSION: major.minor.release

rpm包命名方式:

  • 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: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包內的文件
  • RPM的元數據,如名稱,版本,依賴性,描述等
  • 安裝或卸載時運行的腳本

數據庫(公共):/var/lib/rpm:

  • 程序包名稱及版本
  • 依賴關係
  • 功能說明
  • 包安裝後生成的各文件路徑及校驗碼信息

程序包的來源

管理程序包的方式:

  • 使用包管理器:rpm
  • 使用前端工具:yum, dnf

獲取程序包的途徑:

  1. 系統發版的光盤或官方的服務器
  2. 項目官方站點
  3. 第三方組織:
  4. 本身製做
    • 注意:第三方包建議要檢查其合法性:來源合法性,程序包的完整性

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包升級

升級:

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

注意:

  1. 不要對內核作升級操做;Linux支持多內核版本並存,所以直接安裝新版本內核
  2. 若是原程序包的配置文件安裝後曾被修改,升級時,新版本提供的同一個配置文
    件不會直接覆蓋老版本的配置文件,而把新版本文件重命名(FILENAME.rpmnew)後保留

包查詢

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

經常使用查詢用法:

  • -qi PACKAGE, -qf FILE, -qc PACKAGE, -ql PACKAGE, -qd PACKAGE
  • -qpi PACKAGE_FILE, -qpl PACKAGE_FILE, ...
  • -qa

包卸載:

  • rpm {-e|--erase} [--allmatches] [--nodeps] [--noscripts] [--notriggers] [--test] PACKAGE_NAME ...
  • 當包卸載時,對應的配置文件不會刪除, 以FILENAME.rpmsave形式保留

包校驗

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
  • CentOS 7發行版光盤提供:RPM-GPG-KEY-CentOS-7
  • rpm -qa 「gpg-pubkey*」

rpm數據庫

數據庫重建:

  • /var/lib/rpm

rpm {--initdb|--rebuilddb}

  • initdb: 初始化
    • 若是事先不存在數據庫,則新建之,不然,不執行任何操做
  • rebuilddb:重建已安裝的包頭的數據庫索引目錄
相關文章
相關標籤/搜索