rpm命令的使用
什麼是RPM?
rpm:RPM Package Manager (原Redhat Package Manager) Linux 軟件包管理工具
特定的程序由應用程序組成;
GPL:源碼
glibs:標準的C庫
常見Linux發行版的軟件包管理器:
Debian:.deb dpkg
RadHat: .rpm(perl編寫),rpm(RadHat Package Manager)
rpm:RPM is Package Manager
SUSE : rpm
軟件運行環境
API:Application Programming Interface 意味開發庫兼容,因此,源代碼可跨平臺
遵循POSIX規範:Portable Openratin System 可跨平臺調用
程序的過程:預編譯、編譯、彙編、鏈接
編譯:源代碼翻譯成cpu指令集的過程
靜態鏈接:將庫包含在程序中
動態鏈接:so(shared object)(相當於windows系統的.dll文件)
庫爲函數,function
庫:可執行程序,本身不能作爲程序執行入口,但可以被調用是編譯好的二進制格式
ABI:Application Binary Interface 編譯後的程序可以跨平臺
注意:1.os平臺:編譯好的應用程序必須爲特定平臺所支持的版本(linux和windows平臺不兼容)
2.硬件平臺:應用程序爲特定的cpu所支持
包的組成部分
二進制程序:/bin,/sbin /usr/sbin,/usr/local.bin,/usr/local/sbin
自身庫文件:/lib /lib64 /usr/lib /usr/lib64 /usr/local/lib /usr/local/lib64
開發時調用API,運行時調用ABI
通過調整 /etc/ld.so.conf /etc/ld.so.conf.d/*.conf
配置文件: /etc,無須額外配置
幫助文件: man文件,info文件,README,INSTALL,ChangeLog
man COMMAND
到某路徑下查找與命令名同名的通常以。gz結尾的壓縮文件的名字
/usr/share/man
包命名格式:
源代碼:
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,通常包含rpm的只做發行號,還包含使用的OS
例如:el6:redhat enterprise linux6
常見的arch:
x86: i386, i486, i586, i686
x86_64: x64, x86_64, amd64
ppc:powerpc
noarch:跟平臺無關
包分類:
Application-VERSION-ARCH.rpm: 主包
Application-devel-VERSION-ARCH.rpm 開發子包
Application-utils-VERSION-ARHC.rpm 其它子包
Application-libs-VERSION-ARHC.rpm 其它子包
軟件包之間可能存在依賴關係,甚至循環依賴
解決依賴包管理工具:
yum:rpm包管理器的前端工具
apt-get:deb包管理器前端工具
zypper: suse上的rpm前端管理工具
dnf: Fedora 18+ rpm包管理器前端管理工具
庫文件
查看二進制程序所依賴的庫文件:
ldd [options] 二進制文件
ldd /PATH/TO/BINARY_FILE
管理及查看本機裝載的庫文件:
ldconfig
/sbin/ldconfig -p: 顯示本機已經緩存的所有可用庫文件名及文件路徑映射關係
配置文件:/etc/ld.so.conf, /etc/ld.so.conf.d/*.conf
緩存文件:/etc/ld.so.cache
包管理器
程序包管理器:
功能:將編譯好的應用程序的各組成文件打包一個或幾個程序包文件,從而方便快捷地實現程序包的安裝、卸載、查詢、升級和校驗等管理操作
1、包文件組成(每個包獨有)
RPM包內的文件清單
RPM的元數據,如名稱,版本,依賴關係,功能性描述等
安裝或卸載時運行的腳本
2、數據庫(公共)
程序包名稱及版本
依賴關係
功能說明
包安裝後生成的各文件路徑及校驗碼信息
程序包的來源
管理程序包的方式:
使用包管理器:rpm
使用前端工具:yum, dnf(這個可能是未來版本)
獲取程序包的途徑:
(1) 系統發版的光盤或官方的服務器;
CentOS鏡像:
https://www.centos.org/download/
http://mirrors.aliyun.com
http://mirrors.sohu.com
http://mirrors.163.com
(2) 項目官方站點
(3) 第三方組織:
EPEL:Extra Packages for Enterprise Linux
(4) 自己製作
注意:檢查其合法性:來源合法性,程序包的完整性
rpm包管理
CentOS系統上使用rpm命令管理程序包基本功能:
安裝、卸載、升級、查詢、校驗、數據庫維護
安裝:
rpm {-i|--install} [install-options] PACKAGE_FILE…
-i --install:安裝
-v:顯示安裝信息
-vv:二級詳細
-vvv:三級詳細
-h:hash 以#的個數顯示安裝進度,一個#表示2%的進度
安裝選項[install-options]
--test: 測試安裝,但不真正執行安裝;dry run模式
--nodeps:忽略依賴關係
--replacepkgs| replacefiles 重新安裝
原來的配置文件不會被覆蓋,新安裝的配置文件將會重命名爲以.rpmnew爲後綴的文件
--nosignature: 不檢查來源合法性
--nodigest:不檢查包完整性
--noscipts:不執行程序包腳本片斷
%pre: 安裝前腳本;--nopre
%post: 安裝後腳本;--nopost
%preun: 卸載前腳本;--nopreun
%postun: 卸載後腳本;--nopostun
示例:rpm -ivh PACKAGE_FILE ...
升級:
rpm {-U|--upgrade} [install-options] PACKAGE_FILE...
rpm {-F|--freshen} [install-options] PACKAGE_FILE...
upgrade:安裝有舊版程序包,則“升級”
如果不存在舊版程序包,則“安裝”
freshen:安裝有舊版程序包,則“升級”
如果不存在舊版程序包,則不執行升級操作
--oldpackage:降級
--force: 強行升級
例如:rpm -Uvh PACKAGE_FILE ...
例如:rpm -Fvh PACKAGE_FILE ...
升級注意項
(1) 不要對內核做升級操作;Linux支持多內核版本並存,因此,對直接安裝新版本內核
(2) 如果原程序包的配置文件安裝後曾被修改,升級時,新版本的提供的同一個配置文件並不會直接覆蓋老版本的配置文件,而把新版本的文件重命名(FILENAME.rpmnew)後保留
示例:用centos6.8的內核升級到centos7.2的內核,但是失敗了,原因是沒有安裝相關的依賴文件
如果一定要升級,就需要安裝相關依賴的文件
添加 --nodeps忽略依賴包的選項強行升級測試
升級完內核以後,發現內核掛了,請小夥伴謹慎操作
查詢:
rpm {-q|--query} [select-options] [query-options]
[select-options]
-q: 查詢某單個包是否安裝
-qa: 查詢所有已安裝的包
-qf: 查看指定的文件由哪個程序包安裝生成
-p:查詢尚未安裝的rpm包文件的相關信息
-qpl rpm_file:針對尚未安裝的程序包文件做查詢操作;
--whatprovides CAPABILITY:查詢指定的CAPABILITY由哪個包所提供
--whatrequires CAPABILITY:查詢指定的CAPABILITY被哪個包所依賴
rpm2cpio 包文件|cpio–itv :預覽包內文件
rpm2cpio 包文件|cpio–id “*.conf” :釋放包內文件
查詢選項(配合-q)[query-options]
-qc: 查詢安裝後生成的配置文件
-qd: 查詢包安裝後生成的幫助文檔
-qi: 查詢包的描述信息
-qR: 查詢指定的程序包所依賴的CAPABILITY;
--provides: 列出指定程序包所提供的CAPABILITY;
--changelog:查詢rpm包的changelog
-q --scripts:查詢包相關的腳本
preinstall 安裝前腳本
postinstall 安裝後腳本
preuninstall 卸載前腳本
postuninstall 卸載後腳本
卸載:
rpm {-e|--erase} [--allmatches] [--nodeps] [--noscripts] [--notriggers] [--test] PACKAGE_NAME ...
例如:rpm -e package_name
如果卸載被其他程序所依賴的包
1、把依賴者一同卸載
2、忽略依賴關係:--nodeps
3、不在卸載
校驗:檢查包安裝後生成的文件是否被修改過
rpm {-V|--verify} [select-options] [verify-options]
S 大小 file Size differs
M 頭文件 Mode differs (includes permissions and file type)
5 MD5 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 修改時間 mTimediffers
P 能力改變 capabilities differ
包來源合法性驗正及完整性驗正:
包完整性:通過單向加密機制(MD5|sha1)
來源合法性:通過公鑰加密機制(RSA)
公鑰加密:
對稱加密:加密、解密使用同一密鑰;
非對稱加密:密鑰是成對兒的
public key: 公鑰,公開所有人
secret key: 私鑰, 不能公開
導入所需要公鑰:
rpm -K|checksig rpmfile 檢查包的完整性和簽名
--nosigeature:不檢查來源合法性
--nodigest:不檢查包完整性
rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7 導入以後再做驗證
CentOS 7發行版光盤提供:RPM-GPG-KEY-CentOS-7
rpm -qa gpg-pubkey*
示例:導入公鑰以後,查詢包的時候,我們會發現沒有提示信息了,這是因爲默認沒有校驗包的公鑰,所以系統會對所有的包對提示報錯的信息
rpm數據庫
數據庫重建:
/var/lib/rpm
rpm {--initdb|--rebuilddb}
initdb: 初始化
如果事先不存在數據庫,則新建之,否則,不執行任何操作
rebuilddb:重建
無論當前存在與否,直接重新創建數據庫
yum命令的使用
CentOS前端工具: yum, dnf
yum: YellowdogUpdate Modifier,rpm的前端程序,用來解決軟件包相關依賴性,可以在多個庫之間定位軟件包,up2date的替代工具
yum repository: yum repo,存儲了衆多rpm包,以及包的相關的元數據文件(放置於特定目錄repodata下)
文件服務器:通過yum所支持的文件共享機制將各rpm包通過文件服務共享
ftp ftp://server/path/to/repo
http http://server/path/to/repo
nfs nfs://servr/nfs_path
file file:///path/to/path
yum客戶端作用
1.配置文件:指定各可用的yum倉庫;
2.緩存元數據:yum會到各可用yum倉庫獲取元數據,並緩存至本地
3、分析元數據:根據具體的操作請求完成元數據分析,可能包括依賴關係、文件列表等信息
4.執行具體操作
yum客戶端配置文件:
要使用yum管理應用程序,首先得配置其可用的yum倉庫,保存在配置文件中
/etc/yum.conf:爲所有倉庫提供公共配置
/etc/yum.repos.d/*.repo:爲倉庫的指向提供配置
配置文件格式:由兩段組成。類似window的ini配置文件
[main]:主配置段
[repo]:倉庫配置段
倉庫指向的定義:
[repositoryID] 倉庫ID
name=Some name for this repository 倉庫名
baseurl=url://path/to/repository/ 倉庫的訪問路徑
enabled={1|0} 1,表示啓用,0表示不啓用
gpgcheck={1|0} 1,校驗gpg,0表示不驗證
gpgkey=URL 公鑰地址(可以是本地,也可以是服務器端路徑)
enablegroups={1|0}
failovermethod={roundrobin|priority} 默認爲:roundrobin,意爲隨機挑選;
cost= 定義此倉庫開銷,默認爲1000
yum-config-manager 命令
--add-repo= URL 添加倉庫
--disable “倉庫名” 禁用倉庫
--enable “倉庫名” 啓用倉庫
示例:創建一個倉庫
yum命令的用法:
yum [options] [command] [package ...]
顯示倉庫列表:
repolist[all|enabled|disabled]
顯示程序包:
list
# yum list [all | glob_exp1] [glob_exp2] [...]
# yum list {available|installed|updates} [glob_exp1] [...]
示例yum list 支持通配符。由於裏面的安裝包太多。所以這裏用通配符只看部分
安裝程序包:
install package1 [package2] [...]
reinstall package1 [package2] [...] (重新安裝)
升級程序包:
update [package1] [package2] [...]
downgrade package1 [package2] [...] (降級)
檢查可用升級:
check-update
卸載程序包:
remove | erase package1 [package2] [...]
查看程序包information:
info [...]
查看指定的特性(可以是某文件)是由哪個程序包所提供:
provides | whatprovidesfeature1 [feature2] [...]
清理本地緩存:一般來說,除非倉庫出了問題或者使用新的倉庫,否則一般情況下面不需要清理緩存
clean [ packages | metadata | expire-cache | rpmdb| plugins | all ]
構建緩存:
makecache
搜索:search string1 [string2] [...]
以指定的關鍵字搜索程序包名及summary信息
查看指定包所依賴的capabilities:
deplist package1 [package2] [...]
查看yum事務歷史:
history [info|list|packages-list|packages-info|
summary|addon-info|redo|undo|
rollback|new|sync|stats]
yum history
yum history info 6
yum history undo 6
查看指定yum歷史的操作
撤銷指定歷史操作
日誌存放位置:
/var/log/yum.log
安裝及升級本地程序包:
localinstallrpmfile1 [rpmfile2] [...]
(用install替代)
localupdaterpmfile1 [rpmfile2] [...]
(用update替代)
包組管理的相關命令:
group install group1 [group2] [...]
group update group1 [group2] [...]
group list[hidden] [groupwildcard] [...] 加hidden可以顯示隱藏文件
group remove group1 [group2] [...]
group info group1 [...]
注意:包組需要用group install安裝
如何使用光盤當作本地yum倉庫:
(1) 掛載光盤至某目錄,例如/media/cdrom
# mount /dev/cdrom/media/cdrom
(2) 創建配置文件
[CentOS7]
name=
baseurl=
gpgcheck=
enabled=
示例:centos7的cdrom當作倉庫配置,注意的是,得先手動配置掛載光盤到該目錄,由於centos7不支持自動掛載,可以把掛載的命令寫入到/etc/profile.d裏面以實現開機自動掛載cdrom
示例:centos6建立yum的光盤倉庫
yum的命令行選項:
--nogpgcheck:禁止進行gpgcheck
-y: 自動回答爲“yes”
-q:靜默模式
--disablerepo=repoidglob:臨時禁用此處指定的repo
--enablerepo=repoidglob:臨時啓用此處指定的repo
--noplugins:禁用所有插件
yum倉庫
yum的repo配置文件中可用的變量:
$releasever: 當前OS的發行版的主版本號,對Yum而言指的是redhat-relrase版本。只替換爲主版本號,如CentOS 7.2 則替換爲7
$arch: 系統架構平臺,i386,i486,i586,x86_64等
$basearch:系統基本架構,如i686,i586等的基本架構爲;i386
$YUM0-$YUM9:在系統定義的環境變量,可以在yum中使用
獲取當前系統相應宏替換的辦法
python
import yum,pprint
yb=yum.YumBase()
pprint.pprint(yb.conf,yumvar,width=1)
quit()
示例:
http://server/centos/$releasever/$basearch/
http://server/centos/7/x86_64
http://server/centos/6/i384
示例:系統自帶的倉庫裏面的url的鏈接均是變量,這樣的話,在生產環境中,如果是有大量的服務器,因爲服務器的系統版本很可能不一樣,這樣配置的話,系統可以自動識別版本號,以免安裝錯了其他系統發行版的包導致出其他問題。
自己創建yum倉庫:
createrepo[options] <directory>
示例:在/root/treedir下面創建一個倉庫,並且把一個tree的安裝包放在裏面
可以跟cd裏面的repodata目錄對比一下基本是一樣的
編輯/etc/yum.repos.d/base.repo文件,啓動treedir的倉庫,並且關閉其他倉庫
安裝tree命令,並且成功,可以查看到tree命令是在tree的倉庫裏面安裝的。
思考問題
刪除kernel包後,系統無法啓動,怎麼恢復?
一言不合就把內核幹掉了O.O
重啓以後發現內核真的掛了,怎麼辦怎麼辦?T_T
此時我們可以把安裝光盤放進去服務器,然後選擇cd-rom啓動
點擊進去Rescue installed system救援模式
選擇系統語言
選擇默認鍵盤格局。在天朝都是us的
是否啓用網絡,這一個可以選擇no,因爲我們是用光盤的,無需聯網
問你是否繼續,選擇Continue
這裏提示如果你需要用root環境的權限可以輸入chroot /mnt/sysimage
這裏會提示你的系統已經掛載到/mnt/sysimage這個目錄下面
此時選擇Start shell,然後救援模式就開始了..
因爲是內核不小心卸載掉了(實際上是故意的),所以我們只需要從光盤裏面安裝一個內核即可,我們把光盤掛載到一個空的文件夾裏面。
注意,千萬不要直接掛載/dev/sr0到/mnt下面,不然會出錯的,出錯以後只能重啓又重複這個操作。
掛載完光盤以後,輸入rpm -ivh kernel-2.6.32-642.el6.noarch.rpm --root=/mnt/sysimage
等待安裝完畢以後,重啓電腦
重啓電腦可能會看見這樣的提示,意味着你要等一個很長的時間才能進入系統,這個就慢慢等一下吧
漫長的等待,看見可以正常進入系統了,並且登陸正常,ok,內核已經修復完