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 程序才能别我們順利的安裝在系統中。
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]
創建目錄/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 !
有話要說...