軟件包管理

軟件包管理


API(Application Programming Interface):應用程序編程接口,API兼容,意味着開發庫兼容,所以源代碼可跨平臺php

ABI(Application Binary Interface):應用程序二進制接口,ABI兼容,意味着編譯後的程序可跨平臺前端

庫爲函數提供頭文件,是可執行的二進制程序,不能做爲程序執行的入口,但可爲其餘程序所調用,是編譯好的二進制程序
  動態連接庫:各個程序所共享
  靜態連接庫:將庫包含在程序的自身中,僅供本程序自身所使用node

編譯:將源代碼翻譯成特定cpu指令集的過程,此時的ABI庫已經整合到程序中python

應用程序跨平臺應考慮:
  1、os平臺:編譯好的應用程序必須爲特定平臺所支持的版本
  2、硬件平臺:應用程序爲特定的cpu所支持,這是因爲cpu指令集不必定相同linux

軟件包的組成部分:
  二進制程序:/bin,/sbin,/usr/bin,/usr/sbin,/usr/local/bin,/usr/local/sbin
  庫文件:/lib,/lib64,/usr/lib,/usr/lib64,/usr/local/lib,/usr/local/lib64一般到特定路徑(前四個)下尋找
  配置文件:/etc配置文件沒法共享,僅爲當前一個程序所使用,無需額外配置
  幫助文件:man文件,info文件,README,INSTALL,Changelog
    --help:在程序內部存放,不需額外配置
    man Command:都某特定路徑下查找以.gz結尾的同名壓縮文件,一般查找路徑/usr/share/man
  例如:安裝nginx至/usr/local/nginx路徑
    二進制程序:/usr/local/nginx/bin或/usr/local/sbin
      需PATH提供路徑或用絕對路徑執行程序
    自身庫文件:/usr/local/nginx/lib或/usr/local/nginx/lib64
      經過調整/etc/ld.so.conf(主配置文件),或添加至/etc/ld.so.conf.d/*.conf或添加軟連接,推薦最後一種
    頭文件:/usr/local/nginx/include
    幫助文件:/usr/local/nginx/man
      添加/etc/man.config中MANPATH=/usr/local/nginx/man,或執行man -M /user/local/nginx/man nginx查看命令幫助
    配置文件:/usr/local/nginx/etc/
    
ldd:顯示共享庫依賴關係,查看應用程序所依賴的共享庫
  ldd [option] 二進制文件ldd [option] `which command`nginx

[root@ZYB ~]# ldd `which cat`
    linux-vdso.so.1 =>  (0x00007fff6a73f000)            ``全部以動態方式調用其餘庫的入口,每個應用程序只要製做成動態調用其餘庫的格式後都應依賴的庫,但他直接被作進應用程序裏面,不是真正的調用庫
    libc.so.6 => /lib64/libc.so.6 (0x00007f3d901c3000)  ``共享庫位置=>可執行程序的位置(調用加載後內存中的地址)
    /lib64/ld-linux-x86-64.so.2 (0x000055f8c3c99000)    ``直接說明調用的哪一個庫

全部可以使用一個相對應的包管理器所對應的包必定是事先打包好的包正則表達式

包管理器指定特定路徑,把二進制程序、頭文件、幫助文件、配置文件等文件打包成一個文件,按照某種格式存放、組織,或者把特定格式組織在一塊兒的歸檔打包文件可以自動展開至系統相對應的路徑下,而且將展開的各文件保存在數據庫中
功能:
一、數據庫:
  名稱和版本;安裝生成的各文件路徑及校驗碼;管理依賴關係(循環依賴、版本依賴);提供功能性的說明
    例如nginx:記錄二進制程序安裝在哪些路徑分別有哪些文件,配置文件位置分別有哪些文件,還保存每一個文件的校驗碼
二、提供程序組成格式:
  文件清單;安裝卸載時運行的腳本;等等算法

包管理器的基本功能
  打包、安裝、查詢、升級、卸載、校驗、數據庫管理sql

應用程序的安裝方式總結
  使用包管理器:rpm,便捷、易用
  包管理器的前端管理:yum,可自動解決依賴關係,創建在rpm基礎之上
  源代碼編譯:
  簡單打包的二進制格式:展開至特定路徑下,簡單配置就好shell

rpm包命名格式
  源程序:name-version.tar.{gz|bz2|xz}
    version:major.minor.release
  rpm包:name-version-release.arch.rpm
    release:一般包含rpm包的製做發行號,還包含使用的OS
    bash-4.3.2-2.el6.x86_64.rpm:第二次製做的rpm包
    nginx-1.4.16-5.rpm:不限系統,有些3二、64系統、架構均可用

分包
  主包:bash-4.3.2-2.el6.x86_64.rpm
  支包:bash-hello-4.3.2-2.el6.x86_64.rpm
     bash-word-4.3.2-2.el6.x86_64.rpm

來源合法性驗證
  源程序:經過md5或sha1校驗碼驗證;
  rpm包:發行商提供的是合法性是可信的
    驗證包完整性:校驗碼
    驗證來源合法:公鑰加密算法

rpm包管理


安裝rpm {-i|--install} /path/to/rpm_package ...安裝成功沒有提示消息
  -v顯示安裝信息
  -vv二級詳細
  -vvv三級詳細
  -h以#的個數顯示安裝進度,一個#表示2%的進度
  --test僅測試,不真正執行安裝過程
  若是存在依賴
    解決依賴關係:手動一個一個查找,遇到循環依賴基本掛了
    忽略依賴關係:--nodeps,有些包製做者認爲須要依賴關係,但實際不用

  從新安裝rpm -ivh /path/to/rpm_package ... --replacepkgs
    原來的配置文件不會被覆蓋,新安裝的配置文件將會重命名爲以.rpmnew爲後綴的文件,有些沒有這些功能,因此要測試一下

卸載rpm {-e|--erase} package_name卸載若是卸載的包被其餘包所依賴,則報錯不容許卸載
  若是卸載被其餘程序所依賴的包解決辦法
    一、把依賴者一同卸載
    二、忽略依賴關係:--nodeps
    三、再也不卸載,有點廢話

查詢rpm -q package_name
  查詢全部已安裝的包:rpm –qa
    可以使用文件名通配或rpm –qa | grep "^*"正則表達式
  查詢包的描述信息rpm -qi package_name可不用跟版本號,q和i順序不可調換

[root@ZYB ~]# rpm -qi bash
Name        : bash
Version     : 4.2.46
Release     : 28.el7                            rpm包的發行號,不是源碼包發行號
Architecture: x86_64
Install Date: Sat 17 Mar 2018 12:06:19 PM CST
Group       : System Environment/Shells         包組
Size        : 3663637
License     : GPLv3+                            許可證
Signature   : RSA/SHA256, Thu 10 Aug 2017 11:03:40 PM CST, Key ID 24c6a8a7f4a80eb5
數字簽名驗證包完整性來源合法性
Source RPM  : bash-4.2.46-28.el7.src.rpm        源碼的rpm包
Build Date  : Thu 03 Aug 2017 05:13:21 AM CST   包製做時間
Build Host  : c1bm.rdu2.centos.org              在那個系統製做的
Relocations : (not relocatable)
Packager    : CentOS BuildSystem <http://bugs.centos.org>   包製做者
Vendor      : CentOS
URL         : http://www.gnu.org/software/bash
Summary     : The GNU Bourne Again shell
Description :
The GNU Bourne Again shell (Bash) is a shell or command language
interpreter that is compatible with the Bourne shell (sh). Bash
incorporates useful features from the Korn shell (ksh) and the C shell
(csh). Most sh scripts can be run by bash without modification.

  rpm -q package_name查詢某單個包是否安裝
  rpm -ql package_name查詢包安裝以後在當前系統生成文件列表
  rpm -qf /path/to/somefile查詢某文件是由哪一個包安裝生成的
  rpm -qd package_name查詢包安裝後生成的幫助文檔
  rpm -qc package_name查詢安裝後生成的配置文件
  rpm -q --scripts package_name查詢包相關的腳本
    腳本分四類
      preinstall 安裝前腳本
      postinstall 安裝後腳本,如安裝後啓動服務程序
      preuninstall 卸載前腳本,如卸載前中止程序
      postuninstall 卸載後腳本,如卸載後刪除相關文件
  查詢還沒有安裝的rpm包文件的相關信息:
    rpm -qpl /path/to/package_file查詢安裝後會生成的文件列表:
    rpm -qpi /path/to/package_file查詢其簡單描述信息 :

升級
  rpm -U升級或安裝
  rpm -F只升級
  rpm {-Uvh|-Fvh} /path/to/package_file
    --nodeps忽略依賴關係,用於升級的時候其餘包依賴於這個包
    --force強行安裝,有衝突時強行安裝
  注意:不要對內核執行升級操做
    多版本內核能夠並存,所以,建議執行安裝操做

校驗,檢查包安裝後生成的文件是否被修改過
  rpm -V package_Name

[root@ZYB zyb]# rpm -V zsh
[root@ZYB zyb]# vi /usr/share/zsh/5.0.2/functions/zfcget
[root@ZYB zyb]# rpm -V zsh
S.5....T.    /usr/share/zsh/5.0.2/functions/zfcget
        S file Size differs                         大小
        M Mode differs (includes permissions and file type) 頭文件
        5 digest (formerly MD5 sum) differs MD5
        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                   能力改變了

校驗來源合法性和軟件完整性,這個是安裝以前
  包完整行:經過單向加密機制(MD5|sha1)
  來源合法性:經過公鑰加密機制(RSA)
  導入製做者的公鑰,CentOS發行版的公鑰在iso文件中
    導入命令rmp --import /path/to/gog-key-file
      [root@ZYB mnt]# rpm --import RPM-GPG-KEY-CentOS-7
  命令:gpg,pgp,導入密鑰後作檢驗
    rpm -K /path/to/somefile

[root@ZYB ~]# rpm -K /mnt/Packages/tree-1.6.0-10.el7.x86_64.rpm 
/mnt/Packages/tree-1.6.0-10.el7.x86_64.rpm: rsa sha1 (md5) pgp md5 OK

  rpm --checksig /path/to/package_file
    --nosigeature不檢查來源合法性
    --nodigest不檢查包完整性

數據庫重建
  默認位置:/var/lib/rpm
  非默認位置指令rpm -{initdb| rebuilddb} [--dbpath /path/dir]
  重建
    rpm --initdb初始化,若是事先不存在一個數據庫,則新建之若是,已存在不會重複執行,也不會覆蓋原有數據庫
    rpm --rebuilddb重建,直接新建數據庫,會覆蓋原有庫

rpm包前端管理器:yum


yum(Yellowdog Update Modifier):只是rpm的補充工做依然依賴於rpm包,不能取代rpm包管理器,自動解決依賴關係,自動過程依賴於某一層機制,意思是某個地方存放了許多的程序包
  文件服務器(共享rpm包)經過yum所支持的文件共享機制,將各rpm包經過文件服務共享
  repository:倉庫,能夠有多個
    一、須要的各rpm包
    二、依賴關係、程序包安裝後所可以生成文件列表等元數據文件

yum客戶端
  一、配置文件:指定各可用的yum倉庫;
  二、緩存元數據:yum會到各可用yum倉庫獲取元數據,並緩存至本地
  三、分析元數據:根據具體的操做請求完成元數據分析,可能包括檢查依賴關係、文件列表等信息
  四、根據元數據分校結果執行具體操做
  客戶端配置文件指定對應服務器(ftp,http,nfs,file)訪問方式:
  ftp ftp://server/path/to/repo
  http http://server/path/to/repo
  nfs nfs://servr/nfs_path
  file file:///path/to/path 用於客戶端和服務器端是同一個主機

安裝和卸載不用指定路徑,自動到yum倉庫中獲取,所以能夠直接指定package_name,要使用yum管理應用程序,首先得配置其可用的yum倉庫,保存在配置文件中
  /etc/yum.conf:核心配置,[main]:主配置段
  /etc/yum.repo.d/*.repo:倉庫,倉庫配置段,每個倉庫都有一個獨立的這個配置段,當前倉庫的ID

[root@ZYB ~]# cat /etc/yum.conf 
[main]
cachedir=/var/cache/yum/$basearch/$releasever   緩存文件夾,先對比本地緩存和遠程倉庫是否同樣,同樣不用下載,不然從新下載,對比md5碼
keepcache=0                 是否保存緩存中曾已經被下載安裝的rpm包
debuglevel=2                調試級別
logfile=/var/log/yum.log    日誌文件
exactarch=1                 精確匹配主機版本
obsoletes=1                 廢棄包
gpgcheck=1                  檢驗程序包來源合法性及數據包完整性
plugins=1                   是否支持yum插件
installonly_limit=5
bugtracker_url=http://bugs.centos.org/set_project.php?project_id=23&ref=http://bugs.centos.org/bug_report_page.php?category=yum
distroverpkg=centos-release


#  This is the default, if you make this bigger yum won't see if the metadata
# is newer on the remote and so you'll "gain" the bandwidth of not having to
# download the new metadata and "pay" for it by yum not having correct
# information.
#  It is esp. important, to have correct metadata, for distributions like
# Fedora which don't keep old packages around. If you don't like this checking
# interupting your command line usage, it's much better to have something
# manually check the metadata once an hour (yum-updatesd will do this).
# metadata_expire=90m

# PUT YOUR REPOS HERE OR IN separate files named file.repo
# in /etc/yum.repos.d   我的配置yum倉庫路徑

配置repo

[base_1]                                                    不能隨便加空格,不能和其餘倉庫重名
name=Centos 7 x86_64 release                                不須要加引號,用空格也無所謂
baseurl=http://mirrors.163.com/centos/7/os/x86_64/          有repodata目錄所在路徑
enabled=1                                                   1,表示啓用。0表示不啓用,默認啓用
gpgcheck=1                                                  1,驗證gpg。0表示不驗證,若啓用gpgkey必選
gpgkey=http://mirrors.163.com/centos/RPM-GPG-KEY-CentOS-7   公鑰地址能夠是本地,也能夠是服務器端路徑
cost=2000                                                   默認爲1000,開銷越小越被優先使用

利用光盤配置本地repo

[root@ZYB ~]# mount -r /dev/cdrom /mnt/
[root@ZYB ~]# vim /etc/yum.repos.d/media.repo
[Media]
name=hahha
baseurl=file:///mnt/
enabled=1
gpgcheck=0
cost=100

肯定內核版本uname -a

[root@ZYB ~]# uname -a
Linux ZYB 3.10.0-693.el7.x86_64 #1 SMP Tue Aug 22 21:09:27 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux

查看是否啓用yum倉庫
[root@ZYB yum.repos.d]# grep "^enabled=.*" *.repo
yum倉庫信息

[root@ZYB yum.repos.d]# ls /var/cache/yum/x86_64/7/base
017a874b73d9668d5eee574fb94c91bb7718e2107cfa4bd6356ee84e45204f84-primary.sqlite.bz2
cachecookie
gen
mirrorlist.txt
packages
repomd.xml

yum的各命令
  repolist [all|enabled(默認)|disabled]:列出全部可用的yum repo
  clean [all|packeages(包)|metadata(元數據)|expire-cache(過時數據)|rpmdb(rpm數據)|plugins]:清理緩存
  list [all(默認)|installed(已安裝過的)|available(可用)]:列出yum包,@符號表明已安裝
  info package_name:顯示包的詳細信息
  grouplist:列出全部的包組
  groupinfo "package_group_name": 顯示包組信息,必須安裝的包組,可選包組,可能有空格,加引號
    三個跟開發相關的包組:
      Desktop Platform Development 有圖形程序時需安裝此組
      Server Platform Development
      Development Tools
      若是系統爲Centos 5,開發包組爲」Development Tools「和」DeveLopment Libraries「
      如何系統爲centos 6,經常使用的開發包爲」Development tools「和"Server Platform Development"
  install package_name …:安裝指定的程序包
  reinstall package_name ...:從新安裝指定的包
  yum check-update:檢查可升級的包
    update packe_name ...:指定升級的程序包,默認升級到最高版本,要升級到指定版本要帶版本號
  downgrade packe_name:降級
  erase|remove pack_name ...:會自動把依賴到這個包的包卸載,同rpm -e不一樣
  whatprovides|provides /path/to/somefile:查詢某文件是由誰提供的
  groupinstall "group_name":安裝指定包組
  groupremove "group_name":卸載指定組
  yum history:查看yum的命令歷史
  安裝本地包:若此前沒導入公鑰文件,yum檢查依賴關係完整性來源合法性時可能失敗,則安裝不上
    yum install /path/to/package_file若檢查公鑰失敗yum命令沒法安裝
  手動禁止檢查來源及完整性:--nogpgcheck
    yum install /tmp/zsh-2.3.1-2.el6.x86_64.rpm --nogpcheck

yum配置文件中可用的四個宏
  $releasever:程序的版本,對Yum而言指是redhat-relrase版本。只替換爲主版本號,如Redhat6.5 則替換爲6
  $arch:系統架構,與pathon中os.uname()版本相同

[root@ZYB ~]# python
Python 2.7.5 (default, Aug  4 2017, 00:39:18) 
[GCC 4.8.5 20150623 (Red Hat 4.8.5-16)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> os.uname()
('Linux', 'ZYB', '3.10.0-693.el7.x86_64', '#1 SMP Tue Aug 22 21:09:27 UTC 2017', 'x86_64')
>>> quit()

  $basharch:系統基本架構,如i686,i586等的基本架構爲i386
  $YUM0-9:在系統定義的環境變量,能夠在yum中使用,給用戶自定義用
  獲取當前系統相應宏替換的辦法

[zyb@ZYB ~]$ python
Python 2.7.5 (default, Aug  4 2017, 00:39:18) 
[GCC 4.8.5 20150623 (Red Hat 4.8.5-16)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import yum,pprint
>>> yb = yum.YumBase()
>>> pprint.pprint(yb.conf.yumvar,width=1)
Loaded plugins: fastestmirror, langpacks
{'arch': 'ia32e',
 'basearch': 'x86_64',
 'infra': 'stock',
 'releasever': '7',
 'uuid': '2e295e02-51b3-438b-8804-e955af8290e5'}
>>> quit()

  利用宏替換配置yum倉庫的訪問路徑

[base_1]
name=Centos 7 x86_64 release
baseurl=http://mirrors.163.com/centos/$releasever/os/$basearch/
enabled=1
gpgcheck=0

  利用光盤配置本地yum源

[root@ZYB ~]# mount /dev/cdrom /media
[root@ZYB ~]# vim /etc/yum.repos.d/local-media.repo
[base_local_media]
name=CentOS 6.9 x86_64 release iso file
baseurl=file///media
enabled=1
gpgcheck=1
gpgkey=file:///media/RPM-GPG-KEY-CentOS-6
相關文章
相關標籤/搜索