軟件包管理

軟件包管理

軟件運行和編譯

  • ABI:應用程序二進制接口;直接給編譯好的二進制使用;

    • windows與linux不兼容,
      windows: ELF
      linux: PE
    • 庫級別的虛擬化:
      linux:WINE
      windows:Cywin
  • API:定義了和庫之間的接口;編寫應用程序時調用的函數之類的;

  • 編譯
    程序源代碼(.c) –> 預編譯(.i) –> 編譯(.a) –> 匯編(.o) –> 鏈接(.out)

    • 鏈接主要作用是把各模塊之間相互作用的部分處理好使得各模塊之間正確的銜接,分為靜態鏈接和動態鏈接

      • 靜態鏈接: .a
      • 動態鏈接: .so

包管理器

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

包命名

  • 源代碼
    name-VERSION.tar.gz|bz2|xz
    VERSION :major.minor.release

  • rpm包命名方式:
    name-VERSION-release.arch.rpm
    示例:bash-4.2.46-19.e17.x86_64.rpm

    • VERSION (軟件的版本號):major.minor.release
    • release (編譯者的版本號):release.OS
    • 常見的arch :
      x86 :i386,i486,i586,i686
      x8664 :x64,x8664,amd64
      powerpc:ppc
      跟平臺無關:noarch

包分類

Application-VERSION-ARCH.rpm:主包
    Application-devel-VERSION-ARCH.rpm:開發子包
    Application-utils-VERSION-ARCH.rpm:其他子包
    Application-libs-VERSION-ARCH.rpm:其他子包

包之間

  • 包之間:可能存在依賴關系,甚至循環依賴
  • 解決依賴包管理工具:

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

庫文件

  • 查看二進制程序所依賴的庫文件
    ldd /PATH/TO/BINARY_FILE
  • 管理及查看本機裝載的庫文件:ldconfig
    /sbin/ldconfig -g :顯示本機已經緩存的所有可用庫文件名及文件路徑映射關系
    配置文件:/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:verblse顯示指令執行過程
      -vv:詳細顯示指令執行過程,便于排錯
      -h:hash,以#來表示安裝進度
      rpm -ivh PACKAGE_FILE…

    • [install-options]
      –test:測試安裝,但不真正執行安裝,即dry run模式
      –nodeps:忽略依賴關系
      –replacepkgs(覆蓋安裝) | repalacefiles
      –nosignature:不檢查來源合法性
      –noscripts:不執行程序包腳本

      • %pre:安裝前腳本; –nopre
        %post:安裝后腳本; –nopost
        %preun:卸載前腳本; –nopreun
        %postun:卸載后腳本; –nopostun
  • 升級

    rpm {-U|–upgrade} [install-options] PACKAGEFILE …
    rpm {-F|–freshen} [install-options] PACKAGE
    FILE …

    • upgrade:安裝有舊版程序包,則“升級”
      如果不存在舊版程序包,則“安裝”
    • freshen:安裝有舊版程序包,則“升級”
      如果不存在舊版程序包,則不執行升級操作
    • rpm -Uvh PACKAGEFILE…
      rpm -Fvh PACKAGE
      FILE…
      –oldpackage:降級(降級安裝)
      –force:強制安裝
      注:1、不要對內核做升級操作;Linux支持多內核版本并存,因此,直接安裝新版本內核
      2、如果原程序包的配置文件安裝后曾被修改,升級時,新版本的提供的同一個配置文件并不會直接覆蓋老版本的配置文件,而把新版本的文件重命名(FILENAME.rpmnew)后保留;
      3、啟動時默認啟動內核文件;/boot/grub/groub.conf
  • 查詢

    rpm {-q|–query} [select-options] [query-options]

    • [select-options]
      -a:所有包
      -f:查看指定的文件由哪個程序包安裝生成;當刪除某文件時也是可以查詢(在/usr/bin/rpm中記錄)
      -p rpmfile:針對尚未安裝的程序包文件做查詢操作;p后面是文件名,且是完整的文件名包括路徑,

    • rpm2cpio 包文件|cpio -itv 預覽包內文件

    • rpm2cpio 包文件 |cpio -id “.conf” ; 釋放包內的“.conf”文件

    • [query-options]
      -q PACKAGE_NAME…查詢某包或某些包是否安裝 (準確寫包名
      –changelog:查詢rpm包的cahngelog(改變的日志)
      -c: 查詢程序的配置文件
      -d:查詢程序的文檔
      -i:information(信息)
      -l:查看指定的程序包安裝后生成的所有文件
      –scripts:程序包自帶的腳本

      CAPABILITY:跟包相關的關鍵字;
      –provides:列出指定程序包所提供的的CAPABILITY
      -R:查詢指定的程序包所依賴的CAPABILITY
      –whatprovides CAPABILITY:查詢指定的CAPABILITY由哪個包所提供
      –whatrequires CAPABILITY:查詢指定的CAPABILITY由哪個包所依賴

    • 常用的查詢方法:
      -qf FILE; :查詢某文件是由哪個包安裝產生“/path/文件名”
      -ql PACKAGE;查詢某包安裝生成的文件列表包名
      -qc PACKAGE;查詢某包安裝完成后生成的所有配置文件 
      -qd PACKAGE;查詢某包安裝完成后生成的所有幫助文件
      -qi PACKAGE;查詢某包的簡要說明信息輸入包名(只能針對于已安裝的查詢)
      -qpi PACKAGEFILE;查詢尚未安裝的包文件的相關信息,使用-p選項虛假;輸入的是全路徑,對于已安裝的程序包也是顯示not installed
      -qpl PACKAGE
      FILE,…可以查看未安裝前的包中的文件;后跟文件路徑
      -qa :列出所有的包

  • 包卸載包名

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

    • 簡單使用:rpm -e PACKAGE_NAME…
      -nodeps :忽略依賴關系
      –test:測試卸載;dry-run模式;
      –allmatches:如果一個程序同時安裝多個版本,則此選項一次全部卸載
      注:
      1.如果程序包的配置文件安裝后曾被修改,卸載時,此文件通常不會被刪除,而是被重命名(加后綴.rpmsave)后留存
      2.卸載時,如果就單個版本則寫包名;如果有多個版本需要指定版本號
  • 包校驗

    rpm {-V|–verify} [select-options] [verify-options]

    • S file Size differs 文件的容量大小是否被改變
      M : Mode differs (includes permissions and file type) 文件的類型或文件的屬性rwx是否被改變?如是否可運行等參數已被改變
      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

    • 程序包的合法性驗證:

      • 來源性驗證:RSA: 由我們信任的制作者提供;依賴于制作者的數字簽名,簽名是作者使用自己的私鑰加密程序包的特性碼進行的;
      • 完整性驗證:SHA256:包未被二次修改;完整性校驗成功,依賴于制作者提供的程序特征碼;
    • 驗證其光盤中程序包的來源及完整性(沒有安裝公鑰的情況下任何檢查都是NOT OK)
      先導入合法的KEY文件:rpm –import /path/to/RPM-GPG-KEY-FILE;示例:rpm –import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6;
      驗證:rpm -K|–checksing rpmfile ;檢查的包的完整性和簽名(文件名
      -nosignature:不檢查來源合法性
      -nodigest:不檢查完整性
  • rpm數據庫

    • /var/lib/rpm
      rpm {–initdb|–rebuilddb}
      initdb :初始化;如果事先不存在數據庫,則新建;否則,不執行任何操作
      rebuilddb:無論當前數據存在與否,都會直接重建此庫;構建的數據庫存放在/var/lib/rpm當中;

yum

  • yum:rpm的前端程序,可解決軟件包相關依賴性,可在多個庫之間定位軟件包,up2date的替代工具;
    yum的工作原理:在客戶端上先存在yum源(repodata的父目錄),在客戶端上執行yum命令;首先在客戶端上的緩存yum元數據(/var/cache/yum/$basearch/$releasever),然后yum倉庫(yum包和元數據)中下載相應的yum包進行安裝,安裝完成后刪除yum包;

    • 文件服務器:
      ftp:// 
      http://
      file://
      yum倉庫:yum包和元數據
  • yum客戶端配置文件
    /etc/yum.conf:為所有倉庫提供公共配置
    /etc/yum.repos.d/*.repo:為倉庫的指向提供配置

    • 倉庫指向的定義:
      [repositoryID] 倉庫的名稱
      name=Some name for this repository
      baseurl=url://path/to/repository
      enabled={1|0}
      gpgcheck={1|0}
      gpgkey=URL (本地公鑰路徑、磁盤公鑰路徑)
      enablegroups={1|0};包組
      failovermethod={roundrobin | priority} ; roundrobin:意為隨機挑選,默認值;priority:按順序訪問
      cost= 默認為1000越小優先級越高

    • yum的repo配置文件中可用的變量:
      $releasever:當前OS的發行版的主版本號
      $arch :平臺,i386、i486、i586、x8664等
      $basearch :基礎平臺;i386,x86
      64
      $YUMO-$YUM9:自定義變量

    • yum-config-manager
      yum-config-manager –disable “倉庫名” ;禁用倉庫
      yum-config-manager –disable “倉庫名” ;禁用倉庫

    生成172.16.0.1cobblerksmirrorCentOS-X-x8664.repo
    yum-config-manager –add-rego=http://172.16.0.1/cobbler/ks_mirror/7/

  • yum命令

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

    • yum命令的用法:
      yum [options] [command] [package …]

    • 顯示倉庫列表:
      yum repolist [all | enabled | disabled]
    • 顯示程序包
      yum list
      yum list [all | globexp1] [globexp2] […]
      yum list {available | installed | updates} [glob_exp1] […]
    • yum install 全部安裝
      yum install package1 安裝指定的安裝包package1
      yum groupinstall group1 安裝程序組group1

    • 升級
      yum update 全部更新
      yum update package1 更新指定程序包package1
      yum upgrade package1 升級指定程序包package1
      yum groupupdate group1 升級程序組group1
      yum downgrade package1 更新指定程序包package1;(降級)

    • 檢查可用升級:
      yum check-update 檢查可更新的程序

    • 刪除程序
      yum remove | erase package1 刪除程序包package1
      yum groupremove group1 刪除程序組group1

    • 查看程序包information
      yum info […]

    • 查看指定的特性(可以是某文件)是由哪個程序包所提供:
      yum provides | whatprovides feature1 [feature2] […]

    • 清除本地緩存(清除/var/cache/yum/$basearch/$releasever緩存)
      yum clean [ packages | metadata | expire-cacherpmdb | plugins | all ]
      當配置文件路徑發生變化時,需要清除緩存

    • 構建緩存:
      yum makecache

    • 搜索:
      以指定的關鍵字搜索程序包名及summary信息
      yum search string1 [ string2 ] […]

    • 查看指定包所依賴的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 #;查詢歷史中編號為#的操作
      yum history unfo #;撤銷編號為#的操作

    • 日志:/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倉庫

      • 系統安裝光盤作為本地yum倉庫

        1. 掛載光盤至某目錄, 

          例如:/media/cdrom

          #mount /dev/cdrom /media/cdrom

        2. 創建配置文件

          [CentOS7]

          name=

          baseurl=

          gpgcheck=

          enabled=

    • 創建yum倉庫:
      createrepo [options] <directory>

程序包編譯安裝

  • 程序包編譯安裝:
    Application-VERSION-release.src.rpm –>安裝后,使用rpmbuild命令制作成二進制格式的rpm包,而后再安裝
  • 源代碼–>預處理–>編譯–>匯編–>鏈接–>執行
  • 源代碼組織格式:

    • 多文件:文件中的代碼之間,很可能存在跨文件依賴關系
    • C、C++:make項目管理器
      configure –> Makefile.in –> makefile
    • java:maven
  • C語言源代碼編譯安裝三步驟:

    1. ./configure
      (1)通過選項傳遞參數,指定啟用特性、安裝路徑等;執
      行時會參考用戶的指定以及makefile.in文件生成makefile
      (2)檢查依賴到的外部環境,如依賴的軟件包
    2. make 
      根據makefile文件,構建應用程序
    3. make install
      復制文件到相應路徑
  • 開發工具:

    • autoconf:生成configure腳本
      automake:生成Makefile.in
      注意:安裝前查看INSTALL,README
  • 開源程序源代碼的獲取:

    • 官方自建站點:
      apache.org (ASF:Apache Software Foundation)
      mariadb.org
    • 代碼托管:
      SourceForge.net
      Github.com
      code.google.com
      c/c++編譯器: gcc (GNU C Complier)
  • 編譯C源代碼:

    • 準備:提供開發工具及開發環境

      • 開發工具:make, gcc等
        開發環境:開發庫,頭文件
        glibc:標準庫
    • 實現:通過“包組”提供開發組件

      • CentOS 6:Development Tools 、 Server Platform Development
        CentOS 7:Development Tools 、 Development and Creative Workstation
    • 第一步:configure腳本

      • 選項:指定安裝位置、指定啟用的特性
        –help:獲取其支持使用的選項
      • 選項分類:

        1. 安裝路徑設定:
          –prefix=/PATH:指定默認安裝位置,默認為/usr/local/
          –sysconfdir=/PATH:配置文件安裝位置
        2. System types:支持交叉編譯
        3. Optional Features:可選特性
          –disable-FEATURE
          –enable-FEATURE[=ARG]
        4. Optional Packages:可選包
          –with-PACKAGE[=ARG],依賴包
          –without-PACKAGE,禁用依賴關系
    • 第二步:make

    • 第三步:make install
  • 安裝后的配置:

    1. 二進制程序目錄導入至PATH環境變量中
      編輯文件/etc/profile.d/NAME.sh
      export PATH=/PATH/TO/BIN:$PATH
    2. 導入庫文件路徑
      編輯/etc/ld.so.conf.d/NAME.conf
      添加新的庫文件所在目錄至此文件中
      讓系統重新生成緩存:
      ldconfig [-v]
    3. 導入頭文件
      基于鏈接的方式實現:
      ln -sv
    4. 導入幫助手冊
      編輯/etc/man.config|man_db.conf文件
      添加一個MANPATH

原創文章,作者:s,如若轉載,請注明出處:http://www.www58058.com/73841

(0)
ss
上一篇 2017-04-21 16:38
下一篇 2017-04-22

相關推薦

  • 推薦-MySQL存儲日志并使用Loganalyzer作為前端展示

    MySQL存儲日志并使用Loganalyzer作為前端展示 MySQL存儲日志并使用Loganalyzer作為前端展示 為什么要使用日志 本文目標 實驗拓撲圖 實驗環境 實驗步驟 syslog主機上rsyslog設置 Server1主機上rsyslog設置 Web服務器配置 總結 為什么要使用日志 在生產環境中我們可能需要一個較為完整的日志系統來查看運行中主…

    Linux干貨 2016-03-30
  • linux歷史命令history詳解

    history命令 history命令用于顯示指定數目的指令命令,讀取歷史命令文件中的目錄到歷史命令緩沖區和將歷史命令緩沖區中的目錄寫入命令文件。 該命令單獨使用時,僅顯示歷史命令,在命令行中,可以使用符號!執行指定序號的歷史命令。例如,要執行第2個歷史命令,則輸入!2。  128  ls  129  history[…

    Linux干貨 2016-09-05
  • ELK 日志分析實例

    網海過客www.chinasa.net ELK 日志分析實例一、ELK-web日志分析二、ELK-MySQL 慢查詢日志分析三、ELK-SSH登陸日志分析四、ELK-vsftpd 日志分析 一、ELK-web日志分析 通過logstash grok正則將web日志過濾出來,輸出到Elasticsearch 搜索引擎里,通過Kibana前端展示。  …

    Linux干貨 2016-06-03
  • shutil,csv,ini

    序列化和反序列化筆記

    2017-10-29
  • ifconfig

    ifconfig 命令詳解

    Linux干貨 2018-02-10
  • 高級變量-有類型變量

    一.高級變量用法– 有類型變量   Shell 變量一般是無類型的,但是bash Shell 提供了declare和 typeset 兩個命令用于指定變量的類型,兩個命令是等價的 declare [ 選項]  變量名 -r  將變量設置為只讀屬性 -i  將變量定義為整型數 -a  將變量定義為數…

    Linux干貨 2016-11-24

評論列表(1條)

  • renjin
    renjin 2017-04-28 11:11

    對rpm包管理與yum的配置和使用展開的詳細的介紹,內容寫的很不錯,排版也很好,加油,加油

欧美性久久久久