程序包管理

軟件包管理

1、c語言程序的構建過程

1.程序源代碼 --> 預處理 --> 編譯 --> 彙編 --> 連接--> 可執行程序php

  • 開放源碼:就是程序碼,文本格式的源代碼,寫給人類看的程序語言,但機器並不認識,因此沒法執行;
  • 編譯器:將程序碼轉譯成爲機器看的懂得語言,就相似翻譯者的角色,生成二進制文件;
  • 連接:在Linux上使用ld工具,將o文件和所需的庫文件連接起來組成一個可正常工做的可執行程序。連接了庫文件以後就能夠發起一些系統調用。
    • 靜態編譯:.a
      • 把程序對應的依賴庫複製一份到包
      • libxxx.a
      • 嵌入程序包
      • 升級難,需從新編譯
      • 佔用較多空間,遷移容易
    • 動態編譯:.so
      • 只把依賴加作一個動態連接
      • libxxx.so
      • 「鏈接指向」
      • 佔用較少空間,升級方便
      • 指針指向,軟連接
  • 可執行文件:通過編譯器變成二進制程序後,機器看的懂因此能夠執行的文件。

2.二進制程序的組成部分:二進制文件、庫文件、配置文件、幫助文件
查看二進制程序所依賴的庫文件:
ldd /PATH/TO/BINARY_FILEhtml

3.包命名規則:前端

源代碼: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

通常,源碼都是打包壓縮過的文件,其一般以「.gz」、「.bz2」、「.xz」結尾,源碼包中包含了源碼,還包含了一些有助於製做二進制rpm的文件;rpm包通常以「rpm」結尾,都是已經編譯完成的,安裝rpm包的過程實際上就是將包中的文件複製到Linux上,有可能還會在複製文件的先後執行一些命令,如建立一個必要的用戶,刪除非必要文件等。node

4.包管理器:shell

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

5.包的分類與拆包
Application-VERSION-ARCH.rpm: 主包
Application-devel-VERSION-ARCH.rpm 開發子包
Application-utils-VERSION-ARHC.rpm 其它子包
Application-libs-VERSION-ARHC.rpm 其它子包數據庫

注意:包之間可能存在依賴關係,甚至循環關係;vim

解決依賴包管理工具:
yum:rpm包管理器的前端工具
apt-get:deb包管理器前端工具
zypper: suse上的rpm前端管理工具
dnf: Fedora 18+ rpm包管理器前端管理工具centos

6.獲取程序包的途徑:瀏覽器

(1) 系統發版的光盤或官方的服務器;
CentOS鏡像:
https://www.centos.org/download/
http://mirrors.aliyun.com
http://mirrors.sohu.com
http://mirrors.163.com緩存

(2) 項目官方站點

(3) 第三方組織:
Fedora-EPEL:
Extra Packages for Enterprise Linux
Rpmforge:RHEL推薦,包很全
搜索引擎:
http://pkgs.org
http://rpmfind.net
http://rpm.pbone.net
https://sourceforge.net/

注意:第三方包要檢查其合法性、完整性!!

7.庫文件
一些查看命令:

ldd  /PATH/TO/BINARY_FILE    # 查看二進制程序所依賴的庫文件
ldconfig -p   # 顯示本機已經緩存的全部可用庫文件名及文件路徑映射關係

8.程序的配置文件和緩存文件:
配置文件:
/etc/ld.so.conf 所有放到一個文件中,或
/etc/ld.so.conf.d/*.conf 此文件目錄下.cong結尾的文件,方便一個程序寫一個配置文件

緩存文件:
/etc/ld.so.cache

2、rpm管理器

1.程序包管理器:

功能:將編譯好的應用程序的各組成文件打包一個或幾個程序包文件,從而方便快捷地實現程序包的安裝、卸載、查詢、升級和校驗等管理操做

包文件組成 (每一個包獨有)
RPM包內的文件
RPM的元數據,如名稱,版本,依賴性,描述等
安裝或卸載時運行的腳本

數據庫(公共):/var/lib/rpm
程序包名稱及版本
依賴關係
功能說明
包安裝後生成的各文件路徑及校驗碼信息

ll  /var/lib/rpm/
total 75612   
-rw-r--r--. 1 root root  5521408 Oct 23 18:48 Basenames
-rw-r--r--. 1 root root    12288 Oct 23 18:47 Conflictname
-rw-r--r--. 1 root root    73728 Dec  4 11:57 __db.001
-rw-r--r--. 1 root root   229376 Dec  4 11:57 __db.002
-rw-r--r--. 1 root root  1318912 Dec  4 11:57 __db.003
-rw-r--r--. 1 root root   753664 Dec  4 11:57 __db.004
# 這個rpm包數據庫文件夾中包含着現有已經安裝的包的各類信息,包括安裝版本,安裝時間、升級時間、卸載時間等等很是重要,最好備份

2.rpm命令的使用

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

2.1 安裝

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

[install-options]
    --test: 測試安裝,但不真正執行安裝,即dry run模式
    --nodeps:忽略依賴關係
    --replacepkgs | replacefiles  # 對於已經安裝過的包,若是不通過卸載,只是刪除其一些文件,就會致使這個程序沒法使用,咱們再從新安裝這個程序包時,會顯示此包已經安裝,是由於在/var/lib/rpm這個文件中有該程序的安裝記錄。因此這種狀況下要想從新安裝這個程序包就須要rpm -ivh --replacepkgs 這個選項!
    --nosignature: 不檢查來源合法性
    --nodigest:不檢查包完整性
    --noscripts:不執行程序包腳本
    %pre: 安裝前腳本; --nopre
    %post: 安裝後腳本; --nopost
    %preun: 卸載前腳本; --nopreun
    %postun: 卸載後腳本; --nopostun

注意:

咱們在rpm安裝時截圖中紅框位置顯示nokey是由於咱們沒有導入RPM-GPG-KEY-CentOS-7這個檢查工具來檢查其合法性,導入後便可顯示
rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6 (centos6))導入公鑰便可檢查,這樣在安裝來源合法的程序包時就不在顯示nokey。

2.2 升級

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: 強制安裝

注意:

(1) 不要對內核作升級操做;Linux支持多內核版本並存,所以,對直接安裝新版本內核;

(2) 若是原程序包的配置文件安裝後曾被修改,升級時,新版本的提供的同一個配置文件並不會直接覆蓋老版本的配置文件,而把新版本的文件重命名(FILENAME.rpmnew)後保留。

2.3查詢

rpm {-q|--query} [select-options] [query-options]
[select-options]
    -a: 全部包
    -f: 查看指定的文件由哪一個程序包安裝生成
    -p rpmfile:針對還沒有安裝的程序包文件作查詢操做
    --whatprovides CAPABILITY:查詢指定的CAPABILITY由哪一個包所提供
    --whatrequires CAPABILITY:查詢指定的CAPABILITY被哪一個包所依賴

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

rpm2cpio 包文件|cpio –itv 預覽包內文件
rpm2cpio 包文件|cpio –id 「*.conf」 釋放包內文件

2.4 卸載

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

注意:因爲咱們在安裝程序包是會同時安裝許多依賴文件,而這種卸載方法只是卸載程序自己,並不一樣時將依賴文件卸載,因此要想完整卸載的話須要用yum

yum history  # 查看歷史記錄,找到是第幾部的操做
yum  history undo #    # 表示對歷史操做中的第#想進行反操做

2.5 包校驗

rpm {-V|--verify} [select-options] [verify-options]
# option
    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

導入所須要公鑰
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*」

3、yum

yum工具經過倉庫的方式簡化rpm包的管理。它從倉庫中搜索相關的軟件包,並自動下載和解決軟件包的依賴性,很是方便。yum底層依賴rpm,若是把rpm卸載,那麼yum也不能用了。

老王說:
利用yum的主要問題:
(1)配置文件格式語法錯誤;
(2)緩存問題

yum客戶端配置文件:

/etc/yum.conf  # 爲全部倉庫提供公共配置
/etc/yum.repos.d/*.repo  # 爲倉庫的指向提供配置

[root@CentOS7 ~]#cat /etc/yum.conf 
[main]  
cachedir=/var/cache/yum/$basearch/$releasever  # 緩存文件夾路徑
    $$basearch   # cpu架構,X86_64等
    $releasever  # 系統版本
keepcache=0   # 0表明不緩存rpm包,下載安裝後默認刪除;1爲緩存rpm安裝包
debuglevel=2  #
logfile=/var/log/yum.log   # yum安裝的日誌文件
exactarch=1   # 
obsoletes=1
gpgcheck=1    # 默認1表明安裝包的完整性合法性爲nokey是直接拒絕安裝
plugins=1
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


# PUT YOUR REPOS HERE OR IN separate files named file.repo
# in /etc/yum.repos.d

本身搭建一個yum配置文件

vim /etc/yum.repo.d/base.repo    # 兩個必須:1必須在/etc/yum.repo.d/這個文件夾下;2.文件名必須以.repo結尾;通常習慣將光盤建的yum庫命名爲base

[base]  # 不容許有空格
name=cdrom
baseurl=file:///mnt/cdrom/ # 通常是repodata的父目錄,文件路徑不容許有空格,支持http://  https:// ftp://  file://
    # 此地址能夠添加多個地址,在多個地址的狀況下,能夠將所有地址保存在一個文本文件中,而此處的baseuer換成 mirrorlist=file:// 文件路徑
    
gpgcheck=0  # 0默認爲不進行gpgcheck檢查完整性
以上這些是必須項,
-----------------------------------------------------
還能夠添加:
gpgkey=file:///mnt/cdrom/RPM-GPG-KEY-CentOS-7  # 直接將光盤中的公鑰導入,也能夠換成
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7   # 直接導入配置文件中的公鑰;此項不加的話,gpgcheck=0;

enabled=0 # 默認爲1,0爲臨時禁用該倉庫

failovermethod={roundrobin|priority}  # 這個是在baseurl包含多個地址的狀況下使用
    roundrobin # 意爲隨機挑選,默認值
    priority  # 按順序訪問

cost=1000  # 存在多個倉庫的狀況下,越少優先值越高

也能夠經過命令直接生成該配置文件:

yum-config-manager  --add-repo=BASEURL   # 即自動生成該網址的repo配置文件 
yum-config-manager --disable 「倉庫名"  # 禁用倉庫
yum-config-manager --enable 「倉庫名」  # 啓用倉庫

搭建完yum配置文件便可使用yum安裝了。

[aliyunepel]
name=aliyun-epel
baseurl=https://mirrors.aliyun.com/epel/7/x86_64/
gpgcheck=0
# 這樣就又搭建了一個阿里雲的epel的yum庫

yum的其餘一些命令

yum install  PACKAGES    # yum安裝程序包
yum reinstall package1 [package2] [...]  # 從新安裝
yum remove  PACKAGES   # yum卸載程序包
yum remove | erase package1 [package2] [...]

yum repolist  # 可查看搭建的yum庫有多少個安裝包。
yum repolist all  # 顯示全部的倉庫狀況
yum clean  # 清除yum緩存
cat  /var/log/yum.log  # 查看yum安裝報的日誌文件,包括安裝、卸載、更新等
yum list  # 顯示全部庫中全部的包,前帶@說明已經安裝
yum list *ftp*  # 支持文件名通配符,列出包含ftp的程序包
yum list [all | glob_exp1] [glob_exp2] [...]  # 列出包,支持文件名通配符
yum list {available|installed|updates} [glob_exp1] # 列出可用的、可安裝的、能升級的

yum update [package1] [package2] [...]  # 升級,通常不建議升級
yum downgrade package1 [package2] [...]  # 降級

yum check-update  # 檢查可用升級

yum info [...]  # 查詢包信息

yum provides | whatprovides feature1 [feature2] # 查看指定的特性(能夠是某文件)是由哪一個程序包所提供

yum clean [ packages | metadata | expire-cache | rpmdb | plugins | all ]  # 清除/var/cache/yum/$basearch/$releasever緩存,清楚類型指定,all爲全部

yum makecache  # 構建緩存

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

yum deplist package1 [package2] [...]   # 查看指定包所依賴的capabilities

Alt text
如圖所示,兩個yum庫分別有多少個包均有顯示

注意: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

對於repo文件咱們也能夠參考阿里雲,
http://mirrors.aliyun.com/repo/
將其的配置格式直接做爲咱們本身的配置。
可經過:
wget url....下載配置文件至當前目錄

查看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歷史記錄第六條的詳細信息  
yum history undo 6  # 反向操做yum歷史記錄第六條的操做

利用yum安裝rpg包:

yum install  rpmfile1  [rpmfile2] [...]  # 
yum update rpmfile1 [rpmfile2] [...]

利用yum安裝包組

yum groupinstall group1 [group2] [...]
yum groupupdate group1 [group2] [...]
yum grouplist [hidden] [groupwildcard] [...]
yum groupremove group1 [group2] [...]
yum groupinfo group1 [...]

yum grouplist  # 查看包組列表

yum的一些命令選項:

yum的命令行選項:
    --nogpgcheck:禁止進行gpg check
    -y: 自動回答爲「yes」
    -q:靜默模式
        yum -y -q :須要分開寫
    --disablerepo=repoidglob:臨時禁用此處指定的repo,repo配置文件中[]中的名字
    --enablerepo=repoidglob:臨時啓用此處指定的repo
    --noplugins:禁用全部插件

補充:

systemctl  stop  firewalld   # 關閉防火牆
systemctl disable firewalld   # 關閉開機自動啓動防火牆

4、實驗

實驗1:

當知道是哪一個庫文件被刪除(以刪除/lib64/libc.so.6這個庫文件爲例),致使沒法使用命令或系統不能使用時,這麼修復:(以CentOS 7爲例)
第一步:重啓,從光盤開機,有的系統是開機f2修改,有的是f12,還有的是Esc鍵;
第二步:進入此界面,選擇第三項Troubleshooting進入

再選擇第二項rescure centos system ,進入救援模式;

再選擇第一項continue進入bash shell界面。

經過df命令能夠看到,根目錄已經變成/mnt/sysimage;因此,咱們在cp丟失的文件時要使用相對路徑。

!!注意:libc.so.6 這個文件是個軟連接,也就是說咱們實驗時cp到data目錄下的庫文件是個軟連接,並非真正的庫文件,因此這樣的話咱們再從新建立個軟連接便可。

ln -s libc-2.17.so libc.so.6
(注意,此處要切換至/mnt/sysimage/lib64下,使用相對路徑進行建立軟連接)

重啓,正常!(注意,將從光盤啓動改回從硬盤啓動)

實驗2:

像centos6那樣,能夠直接依靠/misc/cd 打開光盤文件
第一步:yum install autufs這個包
第二步:systemctl start autofs 打開autofs服務
(注意:centos特有的,能夠經過rpm -ql autofs 查看到其有個服務文件,因此須要命令打開它)

第三步:再經過systemctl enable autofs命令讓其開機自動啓動服務
此時,centos7 也能夠經過 cd /misc/cd 切換至光盤

實驗3:

用centos7的安裝光盤爲centos6的客戶機搭建一個yum庫
第一步:安裝並開啓httpd

yum install httpd      # 安裝httpd
systemctl  stop  firewalld   # 關閉防火牆
systemctl disable  filewalld   # 關閉自動啓動防火牆

打開瀏覽器,在地址欄輸入ip地址,看是否能夠鏈接,如圖所示已經鏈接成功

第二步:

cd   /var/www/html/  # 切換至該文件夾
mkdir  -p  epel/{6,7}/x86_64/       # 模仿阿里雲的epel網址格式分別建立6和7兩個文件夾

第三步:掛載光盤

mount   /dev/sr0   /var/www/html/epel/7/x86_64/     # 掛載硬盤至指定目錄,若是是想在centos7上使用這個庫就用7的文件夾
mount   /dev/sr0   /var/www/html/epel/6/x86_64/     # 若是是想在centos6上使用這個庫就用6的文件夾

如圖所示,已經能夠在瀏覽器中查看到咱們掛載的光盤的內容

第四步:後面的就修改 /etc/yum.con.d/ 下的配置文件按正常操做便可。

相關文章
相關標籤/搜索