(注:此博文源於夜歸人的博客)
程序包管理,rpm、yum的使用
程序包管理的相關概念:
<<===============================================================================================>>
軟件包的組成部分:
1、二進制程序:可執行文件
通常安裝在 /bin、/sbin、/usr/bin、/usr/sbin、/usr/local/bin, /usr/local/sbin 目錄之下
2、庫文件:
程序的運行依賴於庫文件,Linux的核心庫是glibc,某些軟件也會將自己的核心文件封裝成庫文件,
以供其他程序調用或二次開發。
Linux下的庫分爲靜態庫和動態庫,靜態庫通常以".a"結尾,動態庫通常以".so"結尾。
通常安裝在 /usr/lib, /usr/lib64, /var/lib, /usr/local/lib 目錄下
★庫文件也是可執行程序,但不能直接執行,因爲庫文件沒有執行入口,只能被其他文件調用執行。
調用的兩種方式:
開發調用:二進制格式的庫
運行調用:文本格式的頭文件
函數(參數)頭文件 /usr/include, /usr/local/include
#inclue stdio.h
鏈接程序所要查找動態格式的共享對象庫時的路徑:
/etc/ld.so.conf
/etc/ld.so.conf.d/*.conf
ldd:用於查看程序或者庫文件所依賴的共享庫列表
ldd [OPTION]... FILE...
例如:
[root@CentOS7 ~]# ldd /bin/cat
linux-vdso.so.1 => (0x00007fffa5ffe000)
libc.so.6 => /lib64/libc.so.6 (0x00007f013c418000)
/lib64/ld-linux-x86-64.so.2 (0x00007f013c7e2000)
3、配置文件:通常是純文本文件,用來定義程序的特性。
通常存放在:/etc, /usr/etc, /usr/local/etc 或指定的路徑下(配置文件一般無需額外配置)
4、幫助文檔:man手冊、info文件、README、INSTALL、ChangeLog
man COMMAND
到某路徑下查找與命令同名的,通常以.gz結尾的壓縮文件的名字
/usr/share/man/
man 的配置文件: /etc/man.config
★總結:如果是指定路徑安裝程序
例如:/usr/local/nginx
二進制程序:bin、sbin
庫:lib
頭文件:include
配置文件:etc、conf
幫助文件:man
軟件包管理器的兩個重要功能:
1、數據庫:
軟件名和版本
安裝生成的各文件路徑及校驗碼
各軟件包之間的依賴關係
提供功能性說明
rpm -qi FILENAME
2、提供程序組成格式:
文件清單
安裝或卸載時運行的腳本
常見的軟件包管理器:
Debian系列:dpkg (DebianPackager) 管理 以.deb 結尾的軟件包。
“Debian”的“Linux ”發行版都使用 “dpkg”,例如 “Ubuntu”、“Knoppix ”等。
RedHat系列: rpm ( RPM isPackage Manager ) 管理 以.rpm 結尾的軟件包。
以前是RedHat Package Manager的縮寫,現在包括OpenLinux、S.u.S.E.以及TurboLinux等
Linux的分發版本都有采用該包管理器,算是公認的行業標準了。
包管理器的基本功能:
製作程序包
安裝程序包
查詢程序包
升級程序包
卸載程序包
校驗程序包
數據庫管理
應用程序的安裝方式
1、使用包管理器:便捷、易用
2、包管理器的前端工具:yum
3、簡單打包的二進制格式:展開到特定路徑下
4、使用源代碼編譯:
rpm包命名格式:
源程序:PackageName-version.tar.{gz|bz2|xz}
version:major.minor.release
通常版本號(Version)有三個:major.minor.release——主版本號.次版本號.發行號
主版本號:是程序的主要功能發生了巨大的改變時才使用;
次版本號:是在程序的部分功能有重大改變時使用;
發行號:是在修復了一些bug,調整了一些屬性後進行的升級。
rpm包:name-version-release.arch.rpm
RPM包的Version號和源程序的版本號需要保持一致,這裏的release號通常包含rpm的製作發行號,
和源程序本身沒有關係,並且這個Release號可能會標明所適用的操作系統平臺。
arch指的是安裝在哪種主機平臺上,常見的主機平臺有:
i686、x86_64、amd64、ppc(powerPC)、noarch(不依賴平臺)等。
如:bash-4.3.2-6.el6.x86_64.rpm
表明這是一個bash程序包;其源程序的主版本號爲4,次版本號是3,發行號2;
它是第6次修正的RPM包;這個包用在RedHat6的Enterprise版上;適用於x86_64的主機平臺。
有些沒有指定arch的rpm包,可能是通用版本
如:nginx.1.4.16-5.rpm
rpm包的分包:
將程序的某些功能做成獨立的包,讓用戶選擇安裝
一個程序可能會有許多功能,其中不少功能是用不上的,如某些程序提供了頭文件,用來供程序員
進行二次開發,而普通用戶根本不需要對該程序進行二次開發,所以只需要安裝該程序的配置文件
和二進制文件就即可。
RPM包可以分爲主包(核心包)和分包(支包),其中主包的包名遵循RPM包的基本命名規則。
如:主包:bash-4.3.2-2.el6.x86_64.rpm
支包:bash-hello-4.3.2-2.el6.x86_64.rpm
bash-world-4.3.2-2.el6.x86_64.rpm
DNS: bind, bind-devel, bind-libs, bind-utils
程序包來源合法性驗證:
源程序:通過md5或sha1驗證碼驗證
rpm包:發行商提供的合法性是可信的
驗證包完整性:校驗碼
驗證來源合法:公鑰
獲取rpm包的途徑:
1、發行商的光盤或站點服務器
以CentOS爲例:
2、fedora-EPEL
3、項目的官方站點
4、搜索引擎:
rpm包管理器的使用:
<<======================================【rpm管理:安裝】======================================>>
rpm包管理:安裝
rpm {-i|--install} [install-options] PACKAGE_FILE ...
-v verbose
-vv
-vvv
-h hash,以#的個數顯示安裝進度,一個#表示2%的進度;
--test: 僅測試,不真正執行安裝過程
每個rpm包都提供一個或多個capability,安裝一個程序包時可能需要依賴或被別的包所依賴
如果存在依賴:
解決依賴關係:
忽略依賴關係: --nodeps
重新安裝: --replacepkgs
原來的配置文件不會被覆蓋,新安裝的配置文件將會重命名爲以.rpmnew爲後綴的文件
實例1:安裝程序包
實例2:測試安裝程序包
實例3:安裝程序包時忽略依賴關係
實例4:重新安裝已安裝過的程序包
<<====================================【rpm管理:卸載】====================================>>
rpm包管理:卸載
rpm -e或--erase
rpm -e package_name
如果卸載被其他程序所依賴的包
1、把依賴者一同卸載;
2、忽略依賴關係;
--nodeps
--noscrips: 卸載時不運行腳本
3、不再卸載
實例:卸載已安裝的程序包
實例:卸載時忽略依賴關係
<<======================================【rpm管理:查詢】======================================>>
rpm包管理:查詢
查詢所有已安裝的包:rpm -qa
查詢某單個包是否安裝: rpm -q package_name
查詢包安裝之後在當前系統生成的文件列表: rpm -ql package_name
查詢某文件是哪個包安裝生成的: rpm -qf /PATH/TO/SOMEFILE
查詢包安裝後生成的幫助文檔: rpm -qd package_name
查詢包安裝後生成的配置文件: rpm -qc package_name
查詢包的描述信息:rpm -qi package_name
查詢包相關的腳本: rpm -q --scripts package_name
腳本有四類:
preinstall: 安裝前腳本
postinstall: 安裝後腳本
preuninstall: 卸載前腳本
postuninstall: 卸載後腳本
查詢尚未安裝的rpm包文件:rpm -qp
查詢安裝後會生成的文件列表:rpm -qpl /PATH/TO/package_file
查詢其簡單描述信息: rpm -qpi /PATH/TO/package_file
實例1:查詢 lsof-4.82-5.el6.x86_64程序包安裝後生成的文件列表
實例2:查詢/usr/share/man/man8/lsof.8.gz文件是由哪個包安裝所生成的
實例3:查詢程序包安裝後生成有哪些幫助文檔
實例4:查詢程序包安裝後生成的配置文件
實例5:查詢程序包安裝完後生成的腳本
實例6:查詢bash程序包的描述信息
Name:軟件名稱
Relocations:在安裝時是否可指定安裝路徑(重定位)
Version:版本號
Vendor:提供商
Release:rpm的發行號
BuildDate:rpm包的製作日期
InstallDate:安裝時間
Build Host:在哪個系統上製作的rpm包
Group:包組
SourceRPM:源碼的rpm包
Size:包大小
License:許可證
Signature:數字簽名(驗證來源合法性和包完整性)
Packager:包的製作者
URL:獲取源碼的網址
Summary:簡要說明
Description:略詳細的說明
<<======================================【rpm管理:升級】======================================>>
rpm包管理:升級
rpm -U: 升級或安裝,如果有舊版程序包,則升級,如果沒有,則安裝
rpm -F: 僅升級,如果有舊版程序包,則升級,如果沒有,則不安裝
rpm {-Uvh|-Fvh} /PATH/TO/package_file
--nodeps: 忽略依賴關係
--oldpackage: 降級
--force: 強行安裝
注意: 不要對內核執行升級操作
多版本內核可並存,因此,要執行安裝操作
實例1:升級程序包,升級過程中提示有依賴關係時忽略,繼續更新
實例2:把剛升級的程序包降級爲原來的版本
<<======================================【rpm管理:校驗】======================================>>
rpm包管理:校驗
檢查包安裝後生成的文件是否被修改過
rpm -V package_name
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
校驗軟件包來源合法性和完整性
包完整性:通過單向加加密機制(md5|sha1)
來源合法性:通過公鑰加密機制(RSA)
導入製作者的公鑰:CentOS發行版的公鑰在iso文件中
導入命令:rpm --import /PATH/TO/gpg-key-file
檢查: rpm -K /PATH/TO/package_file
rpm --checksig /PATH/TO/package_file
--nosignature: 不檢查來源合法性
--nodigest:不檢查完整性
實例1:分別對程序包安裝後生成的文件進行改名和修改操作,然後驗證
實例2:導入公鑰驗證軟件包的來源合法性和完整性
<<================================【rpm管理:數據庫重建】================================>>
rpm包管理:數據庫重建
數據庫:/var/lib/rpm/
重建:
rpm --initdb:初始化
如果事先不存在一個數據庫,則新建
rpm --rebuilddb:重建
直接重建數據,會覆蓋原有的庫
程序包的依賴關係:
<<===============================================================================================>>
由於許多程序包之間存在這依賴關係,例如A依賴B,而B又依賴X、Y...
所以使用rpm管理器安裝或卸載程序時會有諸多不便,很可能安裝一個程序包之後由於所依賴的另外一個程序
包沒有安裝,造成安裝失敗,或是卸載程序把被其他程序包依賴的包卸載了,導致其他程序無法運行等……
因此爲了解決這一問題,後來便有了程序包的前端管理器,它會自動處理程序包之間的依賴關係
前端管理器:
Debian:apt-get
RedHat:yum (Yellowdog Update Modifed)
dnf:下一代解決依賴關係的程序包前端管理器
文件服務器(共享rpm包):通過yum所支持的文件共享機制,將各rpm包通過文件服務共享
repository:倉庫
1、各rpm包
2、依賴關係、程序包安裝後所能生成文件列表等元數據文件
yum客戶端:
1、配置文件:指定各可用的yum倉庫
2、緩存元數據: yum會到各可用yum倉庫獲取元數據,並緩存至本地
3、分析元數據:根據具體操作請求完成元數據分析,可能包括檢查依賴關係,文件列表等信息
4、執行具體操作
客戶端配置文件指定對應服務器的訪問方式
http http://server/path/to/repo
nfs nfs://server/nfs_path
file file:///path/to/repository
yum程序的配置文件:
<<===============================================================================================>>
要使用yum管理應用程序,首先得配置其可用的yum倉庫,保存在配置文件中
/etc/yum.conf
/etc/yum.repos.d/
配置文件格式:
由兩段組成,類似windows的ini配置文件
[main]:主配置段
[repo]:倉庫配置段
[root@CentOS-6 ~]# cat /etc/yum.conf
[main]
cachedir=/var/cache/yum/$basearch/$releasever #緩存目錄
keepcache=0 #刪除緩存中已安裝的rpm包
debuglevel=2 #調試級別
logfile=/var/log/yum.log #日誌文件
exactarch=1 #必須跟當前主機的版本完全精確匹配才安裝
obsoletes=1 #過去的,廢棄的
gpgcheck=1 #是否檢驗其來源合法性及數據包完整性
plugins=1 #是否支持插件
installonly_limit=5 #
bugtracker_url= #追蹤bug保存的位置
distroverpkg=centos-release
定義一個倉庫指向(配置repo):
[repo_ID]
name=倉庫描述信息
baseurl=倉庫的訪問路徑
# mirrorlist=SCHEME://HOSTNAME/PATH/TO/MIRROR_LIST_FILE
enabled={1|0}
gpgcheck={1|0}
gpgkey=公鑰文件(可以在本地,也可以是服務器端路徑)
cost=定義此倉庫的開銷,默認爲1000
例:
repo文件:
[base]
name=CentOS-6 - Base - 163.com
baseurl=http://mirrors.163.com/centos/6/os/x86_64/
gpgcheck=1
gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-CentOS-6
yum配置文件中可用的四個宏:
$releasever: #程序的版本,對yum而言指的是redhat-release版本,只替換爲主版本號,RedHat6.5,則替換爲6
$arch: #系統CPU架構
$basearch: #系統基本架構,如i686,i586等的基本架構爲i386
$YUM0-9: #在系統中定義的環境變量,可以在yum中使用
★宏的作用是變量替換,如:想讓不同系統架構都使用同一個repo(通用版本)。
[base]
name=CentOS-$releasever -Base - 163.com
baseurl=http://mirrors.163.com/centos/$releasever/os/$basearch/
gpgcheck=1
gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-CentOS-6
<<=========================================【yum命令】=========================================>>
yum命令
格式:
yum [options] [command] [package ...]
yum的各命令:
repolist [all|enabled|disabled]: 列出所有可用yumrepo
clean [all|packages|metadata|expire-cache|rpmdb|plugins]: 清理緩存
makecache: 生成緩存
list [all|installed|available]: 列出rpm包
info package_name: 列出包的描述信息
install package_name ... : 安裝指定的程序包
reinstall package_name ... : 重新安裝指定的程序包
chek-update package_name: 檢查可升級的程序包
downgrade package_name: 降級
update package_name: 升級指定的程序包
★直接update 程序包名,將會升級到最新的版本,
如果有多個版本,想升級到指定的版本號,要明確指定版本號
erase|remove package_name... :卸載時所依賴的包也將一併卸載
whatprovides|provides /PATH/TO/SOMEFILE: 查詢指定文件由哪個包安裝生成
history: yum的歷史
search KEYWORD:搜索程序包
★安裝本地包:
install /PATH/TO/package_file
手動禁止檢查來源及完整性: --nogpgcheck
如:
yum install /tmp/finger-0.17-40.el6.x86_64 --nogpgcheck
grouplist: 列出所有包組
groupinstall "group_name": 安裝指定的包組
groupremove "group_name" : 卸載指定的包組
groupinfo "package_name": 顯示包組相關信息
三個跟開發相關的包組:
Desktop Platform Development :有圖形程序時需安裝此組
Server Platform Development :服務器平臺開發包組
Developmetn tools:開發包組
★提示:
如果系統爲CentOS 5,常用的開發包組爲"DevelopmentTools" 和 "Development Libraries"
如果系統爲CentOS 6,常用的開發包組爲"DevelopmentTools" 和 "Server Platfrom Development"
實例1:查看當前系統上所有可用的yum源
實例2:卸載指定的程序包
實例3:檢測指定的程序包是否有更新,然後更新程序包
實例4:對指定的程序包進行降級處理
降級完後查看版本:
<<========================================【製作yum源】========================================>>
製作yum源
yum repositories
文件服務器
/PATH/TO/REPO
repodata/
repomd.xml
使用發行版光盤當本地yum倉庫:
1、先禁用當前可用的yum倉庫,(可把repo配置文件改名)然後執行 yum clean all 命令清空
2、創建一個 local-media-repo 配置文件
[CentOS 6.7 ISO]
name=CentOS 6.7 x86_64 release iso file
baseurl=file:///media/
enable=1
gpgcheck=1
gpgky=file:///RPM-GPG-KEY-CentOS-6
創建本地yum倉庫
crepodata是一個目錄,裏面包含了yum倉庫索引文件和rpm包的一些信息。
創建本地yum倉庫時使用createropo命令,它會自動創建repodata目錄及目錄內的數據庫文件
createrepo /PATH/DirName
實例:
使用發行版光盤當本地yum倉庫
1、先禁用當前可用的yum倉庫(修改當前yum倉庫配置文件後綴名)
2、插入光盤-->掛載-->
3、在/etc/yum.repo.d/目錄下創建repo配置文件local-media-repo,並編輯
4、使用yum repolist 驗證,查看當前系統可用yum倉庫