9.軟件包管理

1.軟件包和包管理器

1.1 軟件包介紹

開源軟件最初只提供了.tar.gz的打包的源碼文件,用戶必須自已編譯每一個想在GNU/Linux上運行的軟件。爲了更加便利的方法來管理這些軟件,出現了包管理系統。html

1.1.1 程序包管理器

軟件包管理器功能:node

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

主流的程序包管理器linux

  • redhat:rpm文件, rpm 包管理器
  • debian:deb文件, dpkg 包管理器
1.1.2 包命名

源代碼打包文件命名:c++

  • name-VERSION.tar.gz|bz2|xzgit

  • VERSION: major.minor.releasegithub

rpm包命名方式:sql

  • name-VERSION-release.arch.rpm
  • VERSION: major.minor.release

常見的arch:數據庫

  • x86: i386, i486, i586, i686ubuntu

  • x86_64: x64, x86_64, amd64

  • 跟平臺無關:noarch

1.1.3 程序包管理器相關文件

1)包文件組成 (每一個包獨有)

  • 包內的文件
  • 元數據,如:包的名稱,版本,依賴性,描述等
  • 可能會有包安裝或卸載時運行的腳本

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

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

1)系統發版的光盤或官方網站

CentOS鏡像:

https://www.centos.org/download/

http://mirrors.aliyun.com

http://mirrors.sohu.com

http://mirrors.163.com

Ubuntu 鏡像:

http://cdimage.ubuntu.com/releases/

http://releases.ubuntu.com

2)第三方組織提供

https://fedoraproject.org/wiki/EPEL

https://mirrors.aliyun.com/epel/?spm=a2c6h.13651104.0.0.3bc47dfaZpesAr

http://www.elrepo.org

3)軟件項目官方站點

http://yum.mariadb.org/10.4/centos8-amd64/rpms/

http://repo.mysql.com/yum/mysql-8.0-community/el/8/x86_64/

4)搜索引擎

http://pkgs.org

http://rpmfind.net

http://rpm.pbone.net

https://sourceforge.net/

5)本身製做

將源碼文件,利用工具,如:rpmbuild,fpm等工具製做成rpm包文件

2.包管理器rpm

2.1 安裝

格式:

rpm {-i|--install} [install-options] PACKAGE_FILE ...

選項:

  • -v 打印詳細信息
  • -h 顯示安裝進度

安裝選項【install-options】

  • --test: 測試安裝,但不真正執行安裝,即dry run模式
  • --nodeps:忽略依賴關係
  • --nosignature: 不檢查來源合法性
  • --nodigest:不檢查包完整性
  • --noscripts:不執行程序包腳本

注意:因爲rpm命令安裝包大部分會產生包依賴問題,因此通常不使用rpm安裝包

2.2 升級和降級

格式:

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

降級
rpm {--oldpackage} [install-options] PACKAGE_FILE...

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

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

3.3 包查詢

格式:

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

【select-options】

  • -a:全部包
  • -f:查看指定的文件由哪一個程序包安裝生成
  • -p rpmfile:針對還沒有安裝的程序包文件作查詢操做

【query-options】

  • --changelog:查詢rpm包的changelog
  • -c:查詢程序的配置文件
  • -d:查詢程序的文檔
  • -i:information
  • -l:查看指定的程序包安裝後生成的全部文件
  • --scripts:程序包自帶的腳本

和CAPABILITY相關

  • --whatprovides CAPABILITY:查詢指定的CAPABILITY由哪一個包所提供
  • --whatrequires CAPABILITY:查詢指定的CAPABILITY被哪一個包所依賴
  • --provides:列出指定程序包所提供的CAPABILITY
  • -R:查詢指定的程序包所依賴的CAPABILITY

範例:

[root@centos8 data]# rpm -qf /etc/skel/.bashrc 
bash-4.4.19-10.el8.x86_64

[root@centos8 data]# rpm -ql tree
/usr/bin/tree
/usr/lib/.build-id
/usr/lib/.build-id/d8
/usr/lib/.build-id/d8/6d516d7cb07fb9334cb268af808119e33a5ac5
/usr/share/doc/tree
/usr/share/doc/tree/LICENSE
/usr/share/doc/tree/README
/usr/share/man/man1/tree.1.gz

[root@centos8 data]# rpm -qd tree
/usr/share/doc/tree/LICENSE
/usr/share/doc/tree/README
/usr/share/man/man1/tree.1.gz

[root@centos8 data]# rpm -q --scripts bash
postinstall scriptlet (using <lua>):
nl        = '\n'
sh        = '/bin/sh'..nl
...

[root@centos8 data]# rpm -q --whatrequires tree
no package requires tree

3.4 包卸載

格式:

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

注意:當包卸載時,對應的配置文件不會刪除, 以FILENAME.rpmsave形式保留

範例:強行刪除rpm包,並恢復

[root@centos7 ~]#rpm -e rpm --nodeps
#重啓進入rescue模式
#mkdir /mnt/cdrom
#mount /dev/sr0 /mnt/cdrom
#rpm -ivh /mnt/cdrom/Packages/rpm-4.11.3-40.el7.x86_64.rpm --root=/mnt/sysimage
#reboot

3.5 包校驗

在安裝包時,系統也會檢查包的來源是不是合法的

本身校驗步驟:

1.導入所須要公鑰
rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
#查詢密鑰是否導入成功
rpm -qa 「gpg-pubkey*」

2.檢查包的完整性和簽名
rpm -K|--checksig rpmfile

範例:

[root@centos8 ~]#rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial
[root@centos8 rpm-gpg]#rpm -K /misc/cd/AppStream/Packages/httpd-2.4.37-
16.module_el8.1.0+256+ae790463.x86_64.rpm
/misc/cd/AppStream/Packages/httpd-2.4.37-
16.module_el8.1.0+256+ae790463.x86_64.rpm: digests signatures OK

[root@centos8 ~]#rpm -qa "gpg-pubkey*"
gpg-pubkey-8483c65d-5ccc5b19

軟件在安裝時,會將包裏的每一個文件的元數據,如:大小,權限,全部者,時間等記錄至rpm相關的數 據庫中,能夠用來檢查包中的文件是否和當初安裝時有所變化

格式:

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

範例:

[root@centos8 data]# vim /etc/issue
[root@centos8 data]# cat /etc/issue
111
\S
Kernel \r on an \m
[root@centos8 data]# rpm -V centos-release 
S.5....T.  c /etc/issue
[root@centos8 data]# vim /etc/issue
[root@centos8 data]# rpm -V centos-release 
.......T.  c /etc/issue

3.yum

3.1 yum工做原理

​ 先在yum服務器上建立 yum repository(倉庫),在倉庫中事先存儲了衆多rpm包,以及包的相關的 元數據文件(放置於特定目錄repodata下),當yum客戶端利用yum/dnf工具進行安裝時包時,會自動 下載repodata中的元數據,查詢遠數據是否存在相關的包及依賴關係,自動從倉庫中找到相關包下載並 安裝。

yum服務器的倉庫能夠多種形式存在:

  • file:// 本地路徑
  • http:// 、https://
  • ftp://

3.2 yum客戶端配置

yum客戶端配置文件:

- /etc/yum.conf         		  #爲全部倉庫提供公共配置
- /etc/yum.repos.d/*.repo:     #爲每一個倉庫的提供配置文件
- 幫助參考: man 5 yum.conf

yum的repo配置文件中可用的變量:

- $releasever: 當前OS的發行版的主版本號,如:8,7,6
- $arch: CPU架構,如:aarch64, i586, i686,x86_64等
- $basearch:系統基礎平臺;i386, x86_64
- $contentdir:表示目錄,好比:centos-8,centos-7
- $YUM0-$YUM9:自定義變量

範例:配置文件

[root@centos8 ~]# cat /etc//yum.conf 
[main]
gpgcheck=1										#安裝包前合法性校驗
installonly_limit=3							#容許同時安裝包的個數
clean_requirements_on_remove=True		#卸載時是否刪除不使用的包
best=True										#升級時自動選擇最新版本,即便缺乏包的依賴
skip_if_unavailable=False					#

[root@centos8 yum.repos.d]# cat /etc/yum.repos.d/CentOS-Base.repo 

[BaseOS]											#倉庫名稱
name=CentOS-$releasever - Base			#倉庫描述		
#倉庫路徑
baseurl=http://mirrors.cloud.aliyuncs.com/$contentdir/$releasever/BaseOS/$basearch/os/	
gpgcheck=1										#安裝包前合法性校驗
enabled=1										#是否啓用倉庫
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial		#校驗文件位置

範例:爲centos8配置其餘兩個經常使用源(epel和Extras源)

[root@centos8 yum.repos.d]# vim CentOS-epel.repo
[epel]                                                      
name=Extra Packages for Enterprise Linux 8 - $basearch
baseurl=http://mirrors.cloud.aliyuncs.com/epel/8/Everything/$basearch
failovermethod=priority
enabled=1
gpgcheck=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-8

[extras]
name=CentOS-$releasever - Extras
baseurl=http://mirrors.cloud.aliyuncs.com/$contentdir/$releasever/extras/$basearch/os/
gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial

yum-config-manager命令

用於管理yum倉庫的配置文件

格式:

[root@centos8 ~]# yum provides yum-config-manager
Last metadata expiration check: 1:31:04 ago on Thu 21 Jan 2021 10:29:03 AM CST.
yum-utils-4.0.17-5.el8.noarch : Yum-utils CLI compatibility layer
Repo        : BaseOS
Matched from:
Filename    : /usr/bin/yum-config-manager

#增長倉庫
yum-config-manager --add-repo URL或file
#禁用倉庫
yum-config-manager --disable 「倉庫名"
#啓用倉庫
yum-config-manager --enable 「倉庫名」

3.3 yum命令

格式:

yum [options] <command> [<args>...]

常見選項:

  • -y #自動回答爲「yes」
  • -q #靜默模式
  • --nogpgcheck #不進行gpg check
  • --enablerepo=repoidglob #臨時啓用此處指定的repo,支持通配符,如:」*「
  • --disablerepo=repoidglob #臨時禁用此處指定的repo,和上面語句同時使用,放在後面的生效
3.3.1 顯示

格式:

yum repolist [all|enabled|disabled]						#顯示倉庫列表,all會列出沒啓用的倉庫
yum list [all | glob_exp1] [glob_exp2] [...]			#顯示程序列表,all會列出沒安裝的包

範例:

[root@centos8 ~]# yum repolist 
repo id                                      repo name
AppStream                                    CentOS-8 - AppStream
BaseOS                                       CentOS-8 - Base
data                                         created by dnf config-manager from file:///data
epel                                         Extra Packages for Enterprise Linux 8 - x86_64
extras                                       CentOS-8 - Extras

[root@centos8 ~]# yum repolist all
repo id             repo name                   		status                                   
AppStream           CentOS-8 - AppStream         		enabled                                   
AppStream-source    CentOS-8 - AppStream Sources    	disabled   

[root@centos8 ~]# yum list all tree
Last metadata expiration check: 2:21:49 ago on Thu 21 Jan 2021 10:29:03 AM CST.
Installed Packages
tree.x86_64            1.7.0-15.el8                                                @anaconda
[root@centos8 ~]# yum list all httpd
Last metadata expiration check: 2:22:00 ago on Thu 21 Jan 2021 10:29:03 AM CST.
Available Packages
httpd.x86_64           2.4.37-30.module_el8.3.0+561+97fdbbcc                       AppStrea
3.3.2 安裝程序

格式:

yum install package1 [package2] [...]
yum reinstall package1 [package2] [...] #從新安裝

範例:

[root@centos8 data]# yum install [url]
							Install a package directly from a URL
[root@centos8 data]# yum -y install tree
...
Installed:
  tree-1.7.0-15.el8.x86_64                                                       
Complete!
3.3.3 卸載程序包

格式:

yum remove | erase package1 [package2] [...]
3.3.4 升級和降級

格式:

yum update [package1] [package2] [...]
yum downgrade package1 [package2] [...] (降級)
yum check-update(檢查可用升級)

範例:

[root@centos7 ~]#yum install samba --disablerepo=updates
[root@centos7 ~]#yum update samba

#更新全部能夠更新的軟件
[root@centos7 ~]# yum update

3.3.5 查詢

格式:

#查看程序包information:
yum info [...]  

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

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

範例:

#注意要寫文件全路徑才能查詢到
[root@centos8 data]# yum provides vsftpd.conf
Last metadata expiration check: 2:51:12 ago on Thu 21 Jan 2021 01:31:05 PM CST.
Error: No Matches found

[root@centos8 data]# yum provides vsftp.conf
Last metadata expiration check: 2:50:03 ago on Thu 21 Jan 2021 01:31:05 PM CST.
Error: No Matches found
[root@centos8 data]# yum provides /etc/vsftpd/vsftpd.conf
Last metadata expiration check: 2:50:58 ago on Thu 21 Jan 2021 01:31:05 PM CST.
vsftpd-3.0.3-32.el8.x86_64 : Very Secure Ftp Daemon
Repo        : AppStream
Matched from:
Filename    : /etc/vsftpd/vsftpd.conf

[root@centos8 data]# yum info tree
Last metadata expiration check: 2:52:35 ago on Thu 21 Jan 2021 01:31:05 PM CST.
Installed Packages
Name         : tree
Version      : 1.7.0
Release      : 15.el8
Architecture : x86_64
Size         : 109 k
Source       : tree-1.7.0-15.el8.src.rpm
Repository   : @System
From repo    : BaseOS
Summary      : File system tree viewer
URL          : http://mama.indstate.edu/users/ice/tree/
License      : GPLv2+
Description  : The tree utility recursively displays the contents of directories in a
             : tree-like format.  Tree is basically a UNIX port of the DOS tree
             : utility.

[root@centos8 data]# yum deplist httpd
Last metadata expiration check: 2:54:15 ago on Thu 21 Jan 2021 01:31:05 PM CST.
package: httpd-2.4.37-30.module_el8.3.0+561+97fdbbcc.x86_64
  dependency: /bin/sh
   provider: bash-4.4.19-12.el8.x86_64
  dependency: /etc/mime.types
   provider: mailcap-2.1.48-3.el8.noarch
  dependency: httpd-filesystem
...
3.3.5 倉庫緩存

格式:

#清除目錄/var/cache/yum/緩存
yum clean [ packages | metadata | expire-cache | rpmdb | plugins | all ]

#構建緩存
yum makecache

範例:

[root@centos8 data]# du -sh /var/cache/dnf/
41M	/var/cache/dnf/
[root@centos8 data]# yum clean all 
29 files removed
[root@centos8 data]# du -sh /var/cache/dnf/
1.3M	/var/cache/dnf/
[root@centos8 data]# du -sh /var/cache/dnf/
1.3M	/var/cache/dnf/
[root@centos8 data]# yum makecache 
...
Metadata cache created.
[root@centos8 data]# du -sh /var/cache/dnf/
41M	/var/cache/dnf/
3.3.6 查看yum歷史

yum 執行安裝卸載命令會記錄到相關日誌中

#CentOS 7之前版本日誌
/var/log/yum.log

#CentOS 8 版本日誌
/var/log/dnf.rpm.log
/var/log/dnf.log

命令

yum history [info|list|packages-list|packages-info|summary|addoninfo|redo|undo|rollback|new|sync|stats]

範例:

[root@centos8 data]# yum history
ID     | Command line                  			| Date and time    | Action(s)      | Altered
-----------------------------------------------------------------------------------------------
    22 | -y install tree                        | 2021-01-21 16:07 | Install        |    1   
    21 | remove tree                            | 2021-01-21 16:07 | Removed        |    1   
    20 | -y install yum-utils.noarch            | 2021-01-21 12:03 | I, U           |   13  
    
[root@centos8 ~]#dnf history undo 22 -y
Removed:
 dnf-utils-4.0.2.2-3.el8.noarch              
Complete!
[root@centos8 ~]#dnf history redo 22 -y
3.3.7 實現私用yum倉庫

範例:

#該例在內網環境採用光盤掛在方式建立yum源
[root@centos7 os]#mount /data/CentOS-7-x86_64-DVD-2009\(1\).iso /home/centos/7/os/
mount: /dev/loop0 寫保護,將以只讀方式掛載
[root@centos7 os]#ll
總用量 696
-rw-r--r--  3 root root     14 10月 30 05:14 CentOS_BuildTag
drwxr-xr-x  3 root root   2048 10月 27 00:25 EFI
-rw-rw-r-- 21 root root    227 8月  30 2017 EULA
-rw-rw-r-- 21 root root  18009 12月 10 2015 GPL
drwxr-xr-x  3 root root   2048 10月 27 00:26 images
drwxr-xr-x  2 root root   2048 11月  3 00:17 isolinux
drwxr-xr-x  2 root root   2048 10月 27 00:25 LiveOS
drwxr-xr-x  2 root root 673792 11月  4 19:30 Packages
drwxr-xr-x  2 root root   4096 11月  4 19:35 repodata
-rw-rw-r-- 21 root root   1690 12月 10 2015 RPM-GPG-KEY-CentOS-7
-rw-rw-r-- 21 root root   1690 12月 10 2015 RPM-GPG-KEY-CentOS-Testing-7
-r--r--r--  1 root root   2883 11月  4 19:36 TRANS.TBL

#配置倉庫服務器
[root@centos7 os]#mv CentOS7-Base-163.repo CentOS7-Base-163.repo.bak
[root@centos7 os]cat Base.repo
[root@centos7 os]#cat /etc/yum.repos.d/Base.repo 
[BaseOS]
name=Centos7 BaseOS
baseurl=file:///home/centos/7/os/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release
[root@centos7 os]#yum repolist
已加載插件:fastestmirror
Loading mirror speeds from cached hostfile
源標識                  源名稱                      狀態
BaseOS                 Centos7 BaseOS             4,070
repolist: 4,070

#安裝httpd服務
[root@centos7 os]#yum -y install httpd
[root@centos7 os]#service httpd start
Redirecting to /bin/systemctl start  httpd.service
[root@centos7 ~]#cp -a /home/centos/7/os/* /var/www/html/centos/7/

#這裏倉庫服務端搭建完畢,修改本機倉庫baseurl
[root@centos7 ~]#cat /etc/yum.repos.d/Base.repo 
[BaseOS]
name=Centos7 BaseOS
baseurl=http://172.16.60.243/centos/7/
[root@centos7 os]#yum repolist
已加載插件:fastestmirror
Loading mirror speeds from cached hostfile
源標識                  源名稱                      狀態
BaseOS                 Centos7 BaseOS             4,070
repolist: 4,070

#客戶端配置yum文件測試
[root@localhost yum.repos.d]# yum -y install vim
...
做爲依賴被安裝:
  gpm-libs.x86_64 0:1.20.7-6.el7        vim-common.x86_64 2:7.4.629-7.el7        vim-filesystem.x86_64 2:7.4.629-7.el7       
完畢

範例:下載extras源,製做私有yum源

#安裝下載工具
[root@centos8 ~]# yum -y install yum-utils

#配置epel源
[root@centos8 ~]# cat /etc/yum.repos.d/CentOS-Base.repo
...
[epelOS]
name=CentOS-$releasever - epel
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=BaseOS&infra=$infra
baseurl=https://mirrors.aliyun.com/epel/8/Everything/x86_64/
gpgcheck=0
enabled=1

#使用工具下載rpm包和metadata
[root@centos8 ~]# yum reposync --repoid=epelOS --download-metadata -p /data

#下載完成將包和metadata拷貝至http中www文件夾下,在按照以前方式配置epel倉庫便可

4.編譯安裝

4.1 c語言源碼編譯過程

  • ./configure

    (1) 經過選項傳遞參數,指定安裝路徑、啓用特性等;執行時會參考用戶的指定以及Makefile.in文 件生成Makefile

    (2) 檢查依賴到的外部環境,如依賴的軟件包

  • make 根據Makefile文件,會檢測依賴的環境,進行構建應用程序

  • make install 複製文件到相應路徑

4.1.1 準備

解決安裝環境和依賴

  • 開發工具:make, gcc (c/c++編譯器GNU C Complier)
  • 軟件相關依賴包
4.1.2 編譯安裝

第一步:運行 configure 腳本,生成Makefile 文件

獲取其支持使用的選項

  • ./configure --help
  • --prefix=/PATH:指定默認安裝位置,默認爲/usr/local/
  • --sysconfdir=/PATH:配置文件安裝位置

第二步:make

第三步:make install

4.1.3 安裝完成配置
  1. 二進制程序目錄導入至PATH環境變量中

    編輯文件/etc/profile.d/NAME.sh

  2. 導入幫助手冊

    編輯/etc/man.config|man_db.conf文件,添加一個MANPATH

範例:編譯安裝 cmatrix

#準備:系統若是沒有相關依賴需先進行安裝
#gcc make autoconf ncurses-devel 

#1.下載cmatrix
https://github.com/abishekvashok/cmatrix/releases

#2.解壓
[root@centos8 data]# tar -xf cmatrix-v2.0-Butterscotch.tar -C /usr/local/

#3.配置安裝路徑
[root@centos8 /]# cd /usr/local/src/cmatrix/
[root@centos8 cmatrix]#./configure --prefix=/apps/cmatrix

#4.編譯並安裝
[root@centos8 cmatrix]#make && make install 

#5.配置環境
[root@centos8 ~]#echo 'PATH=/apps/cmatrix/bin:$PATH' > /etc/profile.d/cmatrix.sh
[root@centos8 ~]#. /etc/profile.d/cmatrix.sh

#或者用軟連接實現
[root@centos8 ~]#ln -sv /apps/cmatrix/bin/cmatrix /usr/local/bin/

#6.實現man幫助
[root@centos8 ~]#vim /etc/man_db.conf
MANDATORY_MANPATH                       /apps/cmatrix/share/man
[root@centos8 ~]#man cmatrix
相關文章
相關標籤/搜索