軟件包基礎(chǔ)
包管理器
二進(jìn)制應(yīng)用程序的組成部分:二進(jìn)制文件,庫文件,配置文件,幫助文件
程序包管理器
debian:deb文件,dpkg包管理器
redhat:rpm文件,rpm包管理器
包命名
源代碼:name-VERSION.tar.gz|bz2|xz
rpm包命名方式:name-VERSION-release.arch.rpm
包分類
Application-VERSION-ARCH.rpm:主包
Application-devel-VERSION-ARCH.rpm:開發(fā)子包
Application-utils-VERSION-ARHC.rpm:其它子包
Application-libs-VERSION-ARHC.rpm:其它子包
工具
包之間可能存在依賴關(guān)系,甚至循環(huán)依賴,手動安裝的話會很頭疼,因此一般用工具安裝,工具會自動解決依賴關(guān)系
yum:rpm包管理器的前端工具
apt-get:deb包管理器的前端工具
zypper:suse上的rpm前端管理工具
dnf:Fedora 18+ rpm包管理器前端管理工具
庫文件
查看二進(jìn)制程序所依賴的庫文件
ldd /PATH/TO/BINARY_FILE:ldd `which ls`
管理及查看本機(jī)裝載的庫文件
ldconfig:加載庫文件
/sbin/ldconfig -p:顯示本機(jī)已經(jīng)緩存的所有可用庫文件名及文件路徑
映射關(guān)系
配置文件:/etc/ld.so.conf,/etc/ld.so.conf.d/*.conf
緩存文件:/etc/ld.so.cache
包管理器
程序包管理器
將編譯好的應(yīng)用程序的各組成文件打包成一個(gè)或幾個(gè)程序包文件,從而方便快捷的實(shí)現(xiàn)程序包的安裝,卸載,查詢,升級和校驗(yàn)等管理操作
包文件組成(每個(gè)包獨(dú)有)
rpm包內(nèi)的文件
rpm的元數(shù)據(jù),如名稱、版本、依賴性、描述等
安裝或卸載時(shí)運(yùn)行的腳本
數(shù)據(jù)庫(公共):/var/lib/rpm
程序包名及版本
依賴關(guān)系
功能說明
包安裝后生成的各文件路徑及校驗(yàn)碼信息
程序包的來源
系統(tǒng)發(fā)版的光盤或官方服務(wù)器
https://www.centos.org/download/
http://mirror.aliyun.com
http://mirrors.souhu.com
http://mirrors.163.com
項(xiàng)目官方站點(diǎn)
第三方組織
注意檢查包的來源合法性和完整性
http://fedoraproject.org/wiki/EPEL
http://repoforge.org/
http://pkgs.org
http://rpmfind.net
http://rpm.pbone.net
https://sourceforge.net/
自己制作
rpm
rpm包安裝
rpm -i/--install [install-options] PACKAGE_FILE…
- -v:詳細(xì)顯示
- -vv:超級詳細(xì)顯示
- -h:以#顯示程序包管理執(zhí)行進(jìn)度
- --test:測試安裝,但不真正執(zhí)行安裝,即dry run模式
- --nodeps:忽略依賴性關(guān)系
- --replacepkgs:重復(fù)安裝已安裝過的包,文件覆蓋
- --replacefiles:將要安裝包的部分文件與其他已安裝的包文件沖突,可繼續(xù)安裝,文件不覆蓋
- --noscripts:不執(zhí)行程序包腳本
- %pre: 安裝前腳本;--nopre
- %post: 安裝后腳本;--nopost
- %preun: 卸載前腳本;--nopreun
- %postun: 卸載后腳本;--nopostun
- --oldpackage:已安裝新版程序包,再同時(shí)安裝舊版程序包
- --force:強(qiáng)制安裝,等同于--replacepkgs --replacefiles --oldpackage
rpm包升級
rpm -U/--upgrade:安裝有舊版本的程序包,則升級,若不存在舊版程序包,則安裝
rpm -F/--freshen:安裝有舊版程序包,則升級,如果不存在舊版程序包,則不執(zhí)行升級操作
注意
- 不要對內(nèi)核做升級操作,Linux支持多內(nèi)核版本并存,因此,直接安裝新版本內(nèi)核即可
- 如果原程序包的配置文件安裝后曾被修改,升級時(shí),新版本的提供的同一個(gè)配置文件并不會直接覆蓋老版本的配置文件,而把新版本的文件重命名(FILENAME.rpmnew)后保留
rpm包查詢
rpm -q|--query [options]
- a:所有包
- -f:查看指定的文件是由哪個(gè)程序包提供(文件用路徑表示)
- -p:指定包名,配合其他選項(xiàng)一起用,不加-p不可直接指定包名,需要指定程序名
- --provides:查看指定包提供了哪些CAPABILITY 也可用-a --provides 查看所有CAPABILITY
- --whatprovides CAPABILITY:查詢指定的CAPABILITY由哪個(gè)包所提供
- --whatrequires CAPABILITY:查詢指定的CAPABILITY被哪個(gè)包所依賴
- --changelog:查詢r(jià)pm包的changelog
- -c:查詢程序的配置文件
- -d:查詢程序的文檔
- -i:查詢程序的信息
- -l:查看指定程序包安裝后生成的所有文件
- --scripts:查看程序包自帶的腳本
- -R:查詢指定的程序包所依賴的CAPABILITY
rpm2cpio
rpm2cpio PACKAGE | cpio -itv:預(yù)覽包內(nèi)文件
rpm2cpio PACKAGE | cpio -idv:釋放包
# 文件缺失
[root@centos7 ~]# rm -rf /etc/inittab
# 查看文件是由哪個(gè)rpm包生成的
[root@centos7 ~]# rpm -qf /etc/inittab
initscripts-9.49.41-1.el7.x86_64
# 在光盤中找到這個(gè)rpm包,并賦值到指定目錄
[root@centos7 ~]# cp /media/cd1/Packages/initscripts-9.49.41-1.el7.x86_64.rpm /app
# 使用rpm2cpio進(jìn)行轉(zhuǎn)換,并將命令結(jié)果直接給cpio處理,這里是解包
[root@centos7 app]# rpm2cpio initscripts-9.49.41-1.el7.x86_64.rpm |cpio -id
3039 blocks
[root@centos7 app]# ll
total 444
drwxr-xr-x. 10 root root 4096 Jun 2 16:15 etc
-rw-r--r--. 1 root root 447444 Jun 2 16:11 initscripts-9.49.41-1.el7.x86_64.rpm
drwxr-xr-x. 7 root root 68 Jun 2 16:15 usr
drwxr-xr-x. 4 root root 28 Jun 2 16:15 var
# 再將缺失的文件復(fù)制到/etc/目錄下即可
[root@centos7 app]# cp etc/inittab /etc/
rpm包卸載
rpm -e/-erase [OPTIONS] PACKAGE...
- --allmatches:卸載所有版本的包
- --nodeps:不進(jìn)行依賴性關(guān)系檢測
- --noscripts:不執(zhí)行腳本
- --test:測試卸載,但不真正執(zhí)行卸載,即dry run模式
rpm包校驗(yàn)
rpm -V|--verify
[root@centos7 ~]# rpm -V tree
S.5....T. d /usr/share/doc/tree-1.6.0/LICENSE
S:大小改變
M:權(quán)限和類型等改變
5:MD5改變
D:設(shè)備版本號改變
L:指向路徑改變
U:屬主改變
G:屬組改變
T:修改時(shí)間改變
P:功能改變
rpm -K/--checksig:公司通過私鑰加密的rpm包,用戶可以通過公鑰來校驗(yàn)包的完整性和簽名
- --nosignature:不檢查來源合法性
- --nodigest:不檢查包完整性
[root@centos7 app]# rpm -K /media/Packages/tree-1.6.0-10.el7.x86_64.rpm
/media/Packages/tree-1.6.0-10.el7.x86_64.rpm: rsa sha1 (md5) pgp md5 OK
rpm -qa "gpg-pubkey*":查看公鑰
rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7:導(dǎo)入公鑰
rpm數(shù)據(jù)庫
/var/lib/rpm
rpm --initdb:初始化數(shù)據(jù)庫,如果實(shí)現(xiàn)不存在,則新建,否則,不執(zhí)行任何操作
rpm --rebuilddb:重建已安裝的包頭的數(shù)據(jù)庫索引目錄
yum
yum實(shí)現(xiàn)原理
- 本地主機(jī)會在配置文件里面找到y(tǒng)um repository的指向,并建立連接
- 從yum repository獲取元數(shù)據(jù)文件和特征碼放在緩存里面
- 通過查看元數(shù)據(jù)文件獲知需要安裝的軟件包和其依賴的軟件的名稱并向yum repository發(fā)起請求
- 本地主機(jī)獲取到軟件包后進(jìn)行安裝
- 安裝好后,rpm包會被刪除,但是元數(shù)據(jù)文件和特征碼會被保存下來,其目的是為了當(dāng)你再向yum repository發(fā)起連接的時(shí)候,先會向yum repository獲取到特征碼和本地緩存的特征碼做對比,如果相同則說明yum repository里面的文件沒有發(fā)生改變,如果不同,則說明yum repository里面的文件發(fā)生了改變,這時(shí)候就需要重新向yum repository獲取元數(shù)據(jù)文件了
通常情況下yum repository都是文件服務(wù)器,你可以通過URL進(jìn)行訪問,如:
ftp://path/to/repository/
http://path/to/repository/
https://path/to/repository/
file://path/to/repository/
yum配置文件
/etc/yum.conf
為所有倉庫提供公共配置
cachedir=緩存目錄,默認(rèn)情況下在/var/cache/yum/
keepcache=是否保持緩存,0時(shí)不保存,1是保存
debuglevel=Debug信息的輸出等級,范圍是0-10,默認(rèn)是2
logfile=存放log文件的路徑
exactarch=是否精準(zhǔn)匹配平臺,默認(rèn)是1,精確匹配
obsoletes=僅僅會影響升級,簡單的說相當(dāng)于upgrade,允許更新舊版本的rpm包
gpgcheck=是否檢驗(yàn)安裝包的來源合法性
plugins=是否允許使用插件,默認(rèn)為1,表示安裝
installonly_limit=允許同時(shí)保持的內(nèi)核包
bugtracker_url=bug的追蹤的url
/etc/yum.repos.d/.repo*
為倉庫的指向提供配置
[repositoryID]具有唯一性
name=可以重復(fù)
baseurl=可以為多個(gè),路徑下必須有repodata
enable=是否開啟,1為開啟,0為關(guān)閉,默認(rèn)開啟
gpgckeck=是否檢查公鑰
gpgkey=公鑰
cost=超時(shí)時(shí)間
enablegroup=是否允許使用包組,默認(rèn)是允許
yum的repo配置文件中可用的變量: $releasever、 $arch、$basearch、$YUM0-$YUM9
[base]
name=base
baseurl=file:///media
enable=1
gpgcheck=0
[tsinghua]
name=tsinghua
baseurl=https://mirrors.tuna.tsinghua.edu.cn/epel/$releasever/$basearch/
enabled=0
gpgcheck=0
/var/log/yum.log
yum日志
yum命令
man 5 yum.conf
查看倉庫
yum repolist
- enabled:僅顯示激活的倉庫,默認(rèn)
- disable:僅顯示禁用的倉庫
- all:顯示所有的倉庫
createrepo dirname:創(chuàng)建yum倉庫
查看倉庫里面的軟件包
yum list
- all:顯示所有已安裝和可以安裝的包,默認(rèn)
- available:顯示未安裝的包
- installed:顯示安裝的包(@anaconda:表示操作系統(tǒng)預(yù)裝的包、installed:表示手動安裝的包、其余的表示包的來源倉庫)
- updates:顯示可更新的包
安裝包
yum install package1 package2 ...:安裝包,可以跟-y選項(xiàng),跳過交互式
yum install --downloadonly--downloaddir=/目錄名 軟件包名:僅下載包,不安裝
yum reinstall package1 package2 ...:重新安裝包,可以跟-y選項(xiàng),跳過交互式
升級包
yum update package1 package2 ...:升級包,可以配合-y選項(xiàng),跳過交互式
yum downgrade package1 package2 ...:升級包,可以配合-y選項(xiàng),跳過交互式
yum check-update:檢查可用升級
卸載包
yum remove/erase package1 package2 ...:卸載包,但不卸載安裝時(shí)依賴的包,可以配合-y選項(xiàng),跳過交互式
其他
yum info ...:查看包信息,和rpm -qi類似
yum provides/whatprovides feature1 feature2 ...:查看指定的特性(可以是某文件)是由哪個(gè)程序包提供
yum clean all:清空緩存
yum makecache:構(gòu)建緩存
yum search string1 string2 ...:以指定的關(guān)鍵字搜索程序包包名及sunmary信息
yum deplist package1 package2 ...:查詢指定的包依賴哪些能力及所提供的包
yum history:查看yum歷史
- info #:查看第#條yum歷史詳情
- undo #:卸載第#條yum歷史執(zhí)行的包及其依賴包,可以配合-y選項(xiàng),跳過交互式
- redo #:重裝第#條yum歷史執(zhí)行的包及其依賴包,可以配合-y選項(xiàng),跳過交互式
yum localinstall rpmfile1 rpmfile2 ...:安裝本地程序包,依賴性關(guān)系還交給yum處理,可以配合-y選項(xiàng),跳過交互式
yum localupdate rpmfile1 rpmfile2 ...:更新本地程序包,依賴性關(guān)系還交給yum處理,可以配合-y選項(xiàng),跳過交互式
包組相關(guān)
yum grouplist:查看當(dāng)前所有包組
yum groupinfo group1 ...:查看包組信息
yum groupinstall group1 ...:安裝包組
yum groupupdate group1 ...:升級包組
yum groupremove group1 ...:卸載包組
命令行選項(xiàng)
- --nogpgcheck:禁止進(jìn)行g(shù)pgcheck
- -y:自動回答為“yes”,通常配合其他選項(xiàng)來跳過交互式
- -q:靜默模式
dnf
yum升級版,詳細(xì)使用和yum類似,配置文件:/etc/dnf/dnf.conf
程序包的編譯安裝
我們有的時(shí)候并不能獲取到相應(yīng)軟件的rpm包或者是原本就是沒有rpm包的,但是一般項(xiàng)目網(wǎng)站都會給我們提供對應(yīng)的源代碼,然后我們可以使用工具進(jìn)行編譯安裝。
安裝步驟:
- 首次安裝先查看INSTALL和README文件
- 運(yùn)行configure腳本,生成makefile文件
- 通過傳遞參數(shù),指定啟動特性、安裝路徑等,執(zhí)行時(shí)會參考用戶指定以及Makefile.in文件(有的時(shí)候可能沒有configure文件和Makefile.in文件,autoconf根據(jù)指定的配置文件可以生成configure文件,automake可以根據(jù)指定的配置文件生成Makefile.in文件),最終生成Makefile
- 檢查依賴到的外部環(huán)境
- 常用選項(xiàng):
- --help:獲取其他支持的使用選項(xiàng)
- --prefix=/PATH/TO/SOMEWHERE:指定默認(rèn)安裝位置,默認(rèn)為/usr/local/
- --sysconfdir=/PATH/TO/SOMEWHERE:指定默認(rèn)配置文件安裝位置,默認(rèn)為/usr/local
- 如果不指定--prefix選項(xiàng),安裝后可執(zhí)行文件默認(rèn)放在/usr/local/bin,庫文件默認(rèn)放在/usr/local/lib,配置文件放在/usr/local/etc,其他的資源文件放在/usr/local/share。指定prefix的好處就是當(dāng)你想卸載軟件的時(shí)候,直接刪除該安裝目錄就行了,也可以將整個(gè)目錄拷貝到其他的機(jī)器上使用,前提是同樣的操作系統(tǒng)
- make:根據(jù)生成的makefile文件,構(gòu)建應(yīng)用程序
- make install:用來安裝,它從Makefile中讀取指令,安裝到指定的位置
- 安裝后的配置
- 導(dǎo)入二進(jìn)制程序目錄至PATH環(huán)境變量中:
- vim /etc/profile.d/NAME.sh
- export PATH=/PATH/TO/BIN:$PATH
- source /etc/profile.d/NAME.sh
- 導(dǎo)入庫文件路徑:
- vim /etc/ld.so.conf.d/NAME.conf
- 添加新的庫文件所在目錄至此文件中
- 讓系統(tǒng)重新生成緩存:ldconfig -v
- 導(dǎo)入頭文件:ln -sv
- 導(dǎo)出幫助手冊:編輯/etc/man_db.config文件,添加一個(gè)MANPATH
練習(xí)
-
查詢命令java來自于哪個(gè)rpm包
[root@centos7 app]# rpm -qa |grep java [root@centos7 app]# which java /usr/bin/java [root@centos7 app]# rpm -qf /usr/bin/java file /usr/bin/java is not owned by any packag [root@centos7 app]# ls /usr/bin/java -l lrwxrwxrwx. 1 root root 22 May 15 22:02 /usr/bin/java -> /etc/alternatives/java [root@centos7 app]# ll /etc/alternatives/java lrwxrwxrwx. 1 root root 71 May 15 22:02 /etc/alternatives/java -> /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.161-2.b14.el7.x86_64/jre/bin/java [root@centos7 app]# rpm -qf /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.161-2.b14.el7.x86_64/jre/bin/java java-1.8.0-openjdk-headless-1.8.0.161-2.b14.el7.x86_64
-
yum的配置和使用,包括yum倉庫的創(chuàng)建
# createrepo創(chuàng)建指定目錄存放repodate目錄 [root@centos7 rpm]# createrepo /app/rpm/ Spawning worker 0 with 5 pkgs Workers Finished Saving Primary metadata Saving file lists metadata Saving other metadata Generating sqlite DBs Sqlite DBs complete # 將指定目錄寫入repository,這樣才能生效 [root@centos7 rpm]# cat /etc/yum.repos.d/base.repo [base] name=base baseurl=http://172.18.0.1/centos/$releasever/ [base1] name=base1 baseurl=file:///media/ [base2] name=base2 baseurl=file:///app/rpm/ [base3] name=base3 baseurl=https://mirrors.tuna.tsinghua.edu.cn/epel/7/x86_64/
-
在centos7上安裝和使用dnf
# rz導(dǎo)入本地dnf包 # 安裝本地dnf包 [root@centos7 dnf]# yum localinstall * -y # 用dnf重裝tree和samba并跳過交互式 [root@centos7 dnf]# dnf reinsatll tree samba -y
-
編寫系統(tǒng)初始化腳本reset.sh,包括別名,提示符顏色,yum倉庫配置文件,安裝tree,ftp,lftp,telnet等包
#!/bin/bash # 設(shè)置別名、提示符顏色和PATH cat > /etc/profile.d/env.sh << EOF alias cdnet="cd /etc/sysconfig/network-scripts" alias editnet="vim /etc/sysconfig/network-scripts/ifcfg-ens33" export PS1="[\[\e[31m\]\u\e[0m\]@\h \W]\\$ " export PATH=/app/bin:$PATH EOF source /etc/profile.d/env.sh # 設(shè)置vim cat > ~/.vimrc << EOF set nu EOF source ~/.vimrc # 配置yum倉庫 cat > /etc/yum.repos.d/env.repo << EOF [mage] name=mage baseurl=http://172.18.0.1/centos/$releasever/ enable=1 [tsinghua] name=tsinghua baseurl=https://mirrors.tuna.tsinghua.edu.cn/epel/7/x86_64/ enabled=1 [dvd] name=dvd baseurl=file:///media/ enabled=0 EOF # 安裝常用包 rpm -q tree &> /dev/null && echo "tree已安裝" || ( yum install tree -y &> /dev/null && echo "tree安裝成功" || echo "tree安裝失敗") rpm -q ftp &> /dev/null && echo "ftp已安裝" || ( yum install ftp -y &> /dev/null && echo "ftp安裝成功" || echo "ftp安裝失敗" ) rpm -q lftp &> /dev/null && echo "lftp已安裝" || ( yum install lftp -y &> /dev/null && echo "lftp安裝成功" || echo "lftp安裝失敗" ) rpm -q telnet &> /dev/null && echo "telnet已安裝" || ( yum install telnet -y &> /dev/null && echo "telnet安裝成功" || echo “telnet安裝失敗”) echo "初始化完成"
-
在CentOS6上編譯安裝apache 2.2源碼包,并啟動此服務(wù)
# 服務(wù)器下載apache2.2源碼包,也可以rz本地上傳 [root@centos6 ~]# lftpget ftp://172.18.0.1/pub/Sources/sources/httpd/httpd-2.2.29.tar.bz2 # 解壓源碼包 [root@centos6 ~]# tar -xvf httpd-2.2.29.tar.bz2 # 安裝Development Tools [root@centos6 ~]# yum groupinstall "Development Tools" -y # 安裝第一步:./configure [root@centos6 ~]# ./configure --prefix=/app/apache22 --sysconfdir=/etc/apache22 # 安裝第二步:make [root@centos6 ~]# make # 安裝第三步:make install [root@centos6 ~]# make install # 配置環(huán)境變量 [root@centos6 ~]# cat /etc/profile.d/env.sh << EOF export PATH=/app/apache24/bin/:$PATH EOF [root@centos6 ~]# source /etc/profile.d/env.sh # 啟動服務(wù)并關(guān)閉防火墻 [root@centos6 ~]# apachectl start [root@centos6 ~]# iptables -F
在CentOS7上編譯安裝apache 2.4源碼包,并啟動此服務(wù)