當前位置:首頁 > 科技 > 正文

Linux程序包管理工具

Linux程序包管理工具

Linux程序包管理工具

1. 程序包

我已經使用 Linux 已經有很長一段時間了,日常中經常會安裝或者卸載一些應用,久而久之很多的命令已經讓我的記憶能力不容樂觀了,所以今天在這裡寫一點管理程序包管理的博客。一方面,之後可以幫助我快速的查閱想要試用的命令;另一方面,也可以為各位看官帶來一絲絲幫助。

1.1 什麼是程序包管理

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

程序包的組成清單 (各個程序包獨有)文件清單安裝或卸載時運行的腳本

程序包的數據庫(各個程序包共享)程序包名稱及版本依賴關系功能說明安裝生成的各文件的文件路徑及校驗碼信息

1.2 管理程序包的方式

如果所有的程序包都讓我們一個個的自行編譯安裝顯然不切實際,除非我們面對有些問題不得不自己手動編譯安裝。面對各種各樣的程序包,我們應該怎麼管理呢?所有就出現了很多的公司和組織開發了面對程序包的管理工具,讓我們更加方面的管理我們日常中所使用到了程序。

程序包管理器:

debian:系列的操作系統使用的是dpt程序包管理器,其程序的格式是 deb

redhat:系列的操作系統使用的是rpm程序包管理器,其程序的格式是 rpm

Gentoo

Archlinux

程序包前端工具

yum:rpm 包管理器的前端工具

apt-get:deb 包管理器前端工具

zypper:suse 上的 rpm 前端管理工具

dnf:Fedora22+之後的 rpm 包管理器前端管理工具

1.3 程序包的命令規則

源代碼包的命名方式

name-version.tar.gz

version = major.minor.release

rpm 包的命名方式

name-version-release.arch.rpm

version = major.minor.release

release:release.os

# 以下為rpm的zlib實例

zlib-1.2.7-13.el7.i686.rpm

# 常見的arch:

x86 ==> 32位 ==> i386, i486, i586, i686

x86_64 ==> 64位 ==> x64, x86_64, amd64

powerpc ==> 小型機 ==> ppc

跟平台無關 ==> noarch

程序包的拆包

程序包的拆包就是将相同的一個程序包根據用途分為不用的包次,對于不用的包次有其不用的用途。

# 以testapp程序包為例進行演示

testapp:

testapp-VERSION-ARCH.rpm ==> 主包

testapp-devel-VERSION-ARCH.rpm ==> 支包

testapp-testing-VERSION-ARHC.rpm ==> 支包

1.4 程序包之間的依賴管理

當我們在使用CentOS安裝應用程序的時候,會遇到一個問題。那就是在我們使用rmp安裝 A 程序的時候,會提示我們要安裝 A 程序必須要安裝 B 和 C 程序。當我們順利安裝之後,A 程序才能别我們順利的安裝在系統中。

Linux程序包管理工具

yum-attack

但是,我們有沒有想過要是安裝 B、C 程序的時候提示我們還要安裝 D、E、F 等程序呢?這樣可能會無休止的叠代下去,我們的小心髒怎麼會受得了。及時受得了,我們裝載一個程序可能會花掉什麼多時間。難道就沒有方法了嗎?有,那就是程序包前端工具。

手動解決依賴的問題,我們可以

查看二進制程序所依賴的庫文件

ldd /PATH/TO/BINARY_FILE

管理及查看本機裝載的庫文件

ldconfig -p

顯示本機已經緩存的所有可用庫文件名及文件路徑映射關系

配置文件為:/etc/ld.so.conf, /etc/ld.so.conf.d/*.conf

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

各種的程序包的管理器的實質就是自行對于源碼包進行編譯,将通常用的參數添加進去,生成對應自己平台的程序包格式。利用各自的程序包管理器進行管理以及依賴的解決。

我們需要自行編譯的原因就是,他們自行編譯的程序包不能滿足我們的需要,比如說我想啟用一個新特性,但是他們編譯的程序包中沒有啟用,所以我就需要自己編譯。

1.5 獲取程序包的途徑

(1) 系統發版的光盤或官方的服務器光盤鏡像CentOS 鏡像

中科大鏡像阿裡雲鏡像

(2) 項目官方站點

(3) 第三方組織EPELPKGSRPMRpmfind

(4) 自己制作

Note:檢查其合法性、來源合法性、程序包的完整性

2. RPM 程序包管理命令

2.1 通用

參數選項:

-v

verbose

-vv

更詳細信息

-h

以#顯示程序包管理執行進度

2.2 安裝

格式:

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

參數選項:

[install-options]

--test

測試安裝,但不真正執行安裝過程;dry run模式

--nodeps

忽略依賴關系

--replacepkg

重新安裝

--nosignature

不檢查來源合法性

--force

忽略軟件包及文件的沖突

--ignoreos

不檢查軟件包運行的操作系統

--nodigest

不檢查包完整性

--noscipts

不執行程序包腳本片斷,程序包的腳本分為以下四類--nopre %pre: 安裝前腳本

--nopost %post: 安裝後腳本

--nopreun %preun: 卸載前腳本

--nopostun %postun: 卸載後腳本

2.3 卸載

格式:

rpm {-e|--erase} [install-options] PACKAGE_NAME ...

參數選項:

[install-options]

--test

隻執行删除的測

--noscripts

不運行預安裝和後安裝腳本程序

--nodeps

不檢查依賴性

2.4 升級

格式:

rpm {-U|--upgrade} [install-options] PACKAGE_FILE ...

安裝有舊版程序包,則“升級”;如果不存在舊版程序包,則“安裝”

rpm {-F|--freshen} [install-options] PACKAGE_FILE ...

安裝有舊版程序包,則“升級”;如果不存在舊版程序包,則不執行升級操作

參數選項:

[install-options]

--oldpackage

降級

--force

強行

--test

測試安裝,但不真正執行安裝過程;dry run模式

Note:

(1) 不要對内核做升級操作,因為有可能因為升級操作導緻很多服務不能使用,而且 Linux 支持多内核版本并存。

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

(3) 通常和-vh一起使用,更加直觀。

2.5 查詢

格式:

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

參數選項:

[select-options]

-a

所有包

-f

查看指定的文件由哪個程序包安裝生成

-p /PATH/TO/PACKAGE_FILE

針對尚未安裝的程序包文件做查詢操作

--whatprovides CAPABILITY

查詢指定的 CAPABILITY 由哪個包所提供

--whatrequires CAPABILITY

查詢指定的 CAPABILITY 被哪個包所依賴

[query-options]

--changelog

查詢 rpm 包的 changlog

-c

查詢程序的配置文件

-d

查詢程序的文檔

-i

information

-l

查看指定的程序包安裝後生成的所有文件

--scripts

程序包自帶的腳本片斷

-R

查詢指定的程序包所依賴的 CAPABILITY

--provides

列出指定程序包所提供的 CAPABILITY

2.6 校驗

格式:

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

參數選項:

[select-options]

-f

校驗所屬的軟件包

-a

Verify 校驗所有的軟件包

-g

校驗所有屬于組 的軟件包

修改類型:

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

Note:包來源合法性驗正及完整性驗正,完整性驗正使用SHA256,來源合法性驗正使用RSA。

2.7 其他

導入所需要公鑰

rpm --import

/PATH/FROM/GPG-PUBKEY-FILE

Note:CentOS 7 發行版光盤提供的密鑰文件:RPM-GPG-KEY-CentOS-7

數據庫重建

rpm {--initdb|--rebuilddb}

--initdb

初始化,如果事先不存在數據庫,則新建之;否則,不執行任何操作。

--rebuilddb

重建,無論當前存在與否,直接重新創建數據庫。

3. YUM 程序包管理命令

3.1 yum 命令用法

格式:

yum [options] [command] [package ...]

用法:

yum 的命令行選項

yum 的命令行參數高于配置文件中指定的參數

--nogpgcheck

禁止進行 gpg check

-y

自動回答為“yes”

-q

靜默模式

--disablerepo=repoidglob

臨時禁用此處指定的 repo

--enablerepo=repoidglob

臨時啟用此處指定的 repo

--noplugins

禁用所有插件

顯示倉庫列表

yum repolist [all|enabled|disabled]

顯示程序包

yum list [all | glob_exp1] [glob_exp2] [...]

yum list {available | installed | updates} [glob_exp1] [...]

安裝程序包

yum install package1 [package2] [...]

yum reinstall package1 [package2] [...] (重新安裝)

升級程序包

yum update [package1] [package2] [...]

yum downgrade package1 [package2] [...] (降級)

檢查可用升級

yum check-update

卸載程序包

yum remove | erase package1 [package2] [...]

查看程序包 information

yum info [...]

查看指定的特性(可以是某文件)是由哪個程序包所提供

yum provides | whatprovides feature1 [feature2] [...]

清理本地緩存

yum clean [ packages | metadata | expire-cache | rpmdb | plugins | all ]

構建緩存

yum makecache

搜索

yum search string1 [string2] [...]

以指定的關鍵字搜索程序包名及 summary 信息

查看指定包所依賴的 capabilities

yum deplist package1 [package2] [...]

查看 yum 事務曆史

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

安裝及升級本地程序包

yum localinstall rpmfile1 [rpmfile2] [...]

(maintained for legacy reasons only - use install)

yum localupdate rpmfile1 [rpmfile2] [...]

(maintained for legacy reasons only - use update)

包組管理的相關命令

yum groupinstall group1 [group2] [...]

yum groupupdate group1 [group2] [...]

yum grouplist [hidden] [groupwildcard] [...]

yum groupremove group1 [group2] [...]

yum groupinfo group1 [...]

3.2 yum 客戶端配置

3.2.1 什麼是yum repository

存儲了衆多 rpm 包,以及包的相關的元數據文件,放置于特定目錄下(repodata)

3.2.2 配置文件

/etc/yum.conf ==> 為所有倉庫提供公共配置

/etc/yum.repos.d/*.repo ==> 為倉庫的指向提供配置

配置文件

# 可以使用man `whatis yum.conf`來查看主配置文件中各個參數的含義

[escape@localhost ~]$ cat /etc/yum.conf

[main]

cachedir=/var/cache/yum/$basearch/$releasever

# 是否保存安裝緩存

keepcache=0

# 調試等級

debuglevel=2

# 安裝日志

logfile=/var/log/yum.log

# 是否進行平台匹配

exactarch=1

obsoletes=1

# 是否檢測合法性

gpgcheck=1

# 是否支持插件

plugins=1

# 可以同時安裝幾個程序包

installonly_limit=5

# 追蹤bug時候的url

bugtracker_url=

# 版本号從哪裡獲取

distroverpkg=centos-release

倉庫指向的定義

# 倉庫ID号,要唯一

[repositoryID]

# 描述信息

name=Some name for this repository

# 倉庫地址在哪裡,一般為ftp://、:///等

# baseurl還可以指向多個url,以此查找

baseurl=url://path/to/repository/

# 使用鏡像站點中使用,不能和baseurl一起使用

mirrorlist=

# 倉庫是否啟用,默認為啟用

enabled={1|0}

# 對程序包是否校驗,來源合法性和完整性

gpgcheck={1|0}

# 校驗的key在哪裡

gpgkey=URL

# 是否可以基于組進行管理,默認啟用

enablegroups={1|0}

# 默認為roundrobin,意為随機挑選;priority,自上而下優先級

failovermethod={roundrobin|priority}

# 開銷,默認為1000

cost=

yum可以指定多個倉庫,當安裝程序包的時候分析多個倉庫,并從這些倉庫之中找到一個版本最新的在本地安裝。同一類倉庫使用鏡像管理,不同倉庫可以同時使用。如果一個同程序同版本存在于各倉庫之中,可以使用距離最近者,用來節省開銷。

3.2.3 如何使用光盤當作本地 yum 倉庫

挂載光盤至某目錄,例如/media/cdrom

mount -r -t iso9660 /dev/cdrom /media/cdrom

創建配置文件

[CentOS7]

name=CentOS7 repo

baseurl=file://repo-path-file

gpgcheck=0

enabled=1

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

使用變量可以節省我們的成本,使用同一個配置文件,即可管理所有的倉庫。

$releasever ==> 當前OS的發行版的主版本号

$arch ==> 平台架構

$basearch ==> 基礎平台,如32位的不管是什麼,基礎平台就是i386

$YUM0-$YUM9 ==> 自定義的10個變量

3.2.5 如何創建 yum 倉庫

createrepo [options] 其中的[options]可以使用man createrepo命令來查看其參數選項。其中-baseurl來指定其程序包目錄的父目錄,使其下的子目錄都可以使用。

創建目錄/yum/repo,将 rpm 的程序包放在此目錄中

執行createrepo ./,指定當前目錄

即會在當前目錄下面生成一個repodate目錄,其中有個repomd.xml的文件,用來表示緩存是否需要更新。

将這個yum源加入倉庫,即可被本地訪問。如果想被外部使用,可以搭建 倉庫中,即可完成外部訪問。

使用yum makecache或者yum repolist即可使用

# yum倉庫配置

[newrepo]

name=newrepo test

baseurl=file:///yum/repo/

gpgcheck=0

3.3 apt 和 apt-get 的區别

Let’s see which apt command replaces which apt-get and apt-cache command options.

apt command

the command it replaces

function of the command

apt install

apt-get install

Installs a package

apt remove

apt-get remove

Removes a package

apt purge

apt-get purge

Removes package with configuration

apt update

apt-get update

Refreshes repository index

apt upgrade

apt-get upgrade

Upgrades all upgradable packages

apt autoremove

apt-get autoremove

Removes unwanted packages

apt full-upgrade

apt-get dist-upgrade

Upgrades packages with auto-handling of dependencies

apt search

apt-cache search

Searches for the program

apt show

apt-cache show

Shows package details

apt has a few commands of its own as well.

new apt command

function of the command

apt list

Lists packages with criteria (installed, upgradable etc)

apt edit-sources

Edits sources list

安裝指定版本和查詢指定軟件有多少個版本

# 1.通過apt-get安裝指定版本

# apt-get install [package name]=[version]

$ apt-get install vim=7.3.547

# 2.查詢指定軟件有多少個版本

# 通過網站搜索: /

# apt-cache madison [package name]

# apt-cache policy [package name]

$ apt-cache madison vim

$ apt-cache policy vim

# 3.查詢後面帶上一些參數來實現篩選

$ apt-cache show package | grep Version

$ apt-show-versions | more

4. dnf 程序包管理命令

DNF 新一代的 RPM 軟件包管理器,首先出現在 Fedora 18 這個發行版中。而最近,他取代了 YUM,正式成為 Fedora 22 的包管理器。DNF 包管理器克服了 YUM 包管理器的一些瓶頸,提升了包括用戶體驗,内存占用,依賴分析,運行速度等多方面的内容。DNF 使用 RPM, libsolv 和 hawkey 庫進行包管理操作。盡管它沒有預裝在 CentOS 和 RHEL 7 中,但你可以在使用 YUM 的同時使用 DNF 。

4.1 安裝 DNF 包管理器

為了安裝 DNF ,您必須先安裝并啟用 epel-release 依賴

yum install -y epel-release

使用 epel-release 依賴中的 YUM 命令來安裝 DNF 包

yum install -y dnf

4.2 常用命令

查看 DNF 包管理器版本

dnf –version

查看系統中可用的 DNF 軟件庫

dnf repolist

查看系統中可用和不可用的所有的 DNF 軟件庫

dnf repolist all

列出所有 RPM 包

dnf list

列出所有安裝了的 RPM 包

dnf list installed

列出所有可供安裝的 RPM 包

dnf list available

搜索軟件庫中的 RPM 包

dnf search nano

查找某一文件的提供者

dnf provides /bin/bash

查看軟件包詳情

dnf info nano

安裝軟件包

dnf install nano

升級軟件包

dnf update nano

檢查系統軟件包的更新

dnf check-update

升級所有系統軟件包

dnf update 或 dnf upgrade

删除軟件包

dnf remove nano 或 dnf erase nano

删除無用孤立的軟件包

dnf autoremove

删除緩存的無用軟件包

dnf clean all

獲取有關某條命令的使用幫助

dnf help clean

查看所有的 DNF 命令及其用途

dnf help

查看 DNF 命令的執行曆史

dnf history

查看所有的軟件包組

dnf grouplist

安裝一個軟件包組

dnf groupinstall ‘Educational Software’

升級一個軟件包組中的軟件包

dnf groupupdate ‘Educational Software’

删除一個軟件包組

dnf groupremove ‘Educational Software’

從特定的軟件包庫安裝特定的軟件

dnf –enablerepo=epel install nano

更新軟件包到最新的穩定發行版

dnf distro-sync

重新安裝特定軟件包

dnf reinstall nano

回滾某個特定軟件的版本

dnf downgrade nano

獲取更多使用信息,請點擊這裡

5. 源碼編譯

5.1 源碼編譯基礎

執行過程

源代碼 –> 預處理 –> 編譯(gcc) –> 彙編 –> 鍊接 –> 執行

源代碼組織格式

多文件,文件中的代碼之間,很可能存在跨文件依賴關系

C 代碼編譯安裝三步驟

./configure通過選項傳遞參數,指定啟用特性、安裝路徑等執行時會參考用戶的指定以及 Makefile.in 文件生成 makefile檢查依賴到的外部環境autoconf ==> 生成 configure 腳本automake ==> 生成 Makefile.in

make

根據 makefile 文件,構建應用程序

make install

安裝

開源程序源代碼的獲取

官方自建站點apache.org (ASF)mariadb.org

代碼托管SourceForgeGithub.comcode.google.com

5.2 手動編譯

5.2.1 前提:提供開發工具及開發環境

通過“包組”提供開發組件 ==> CentOS 6: "Development Tools", "Server Platform Development"

開發工具:make, gcc 等

開發環境:開發庫,頭文件

glibc:标準庫

5.2.2 第一步:configure 腳本

選項:指定安裝位置、指定啟用的特性

--help: 獲取其支持使用的選項

選項分類:

安裝路徑設定:--prefix=/PATH/TO/SOMEWHERE: 指定默認安裝位置,默認為/usr/local/--sysconfdir=/PATH/TO/SOMEWHERE:配置文件安裝位置

System types

optional features: 可選特性--disable-FEATURE--enable-FEATURE[=ARG]

optional packages: 可選包--with-PACKAGE[=ARG]--without-PACKAGE

5.2.3 第二步:make

make

5.2.4 第三步:make install

make install

5.2.5 安裝後的配置

(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文件

添加一個 MANPATH

文章作者: Escape

文章鍊接:

版權聲明: 本博客所有文章除特別聲明外,均采用 CC BY 4.0 許可協議。轉載請注明來源 Escape !

你可能想看:

有話要說...

取消
掃碼支持 支付碼