1. 程式人生 > >軟件包管理rpm、yum及編譯安裝

軟件包管理rpm、yum及編譯安裝

glib 設定 不出 命令行選項 save rpm -ivh 詳細 強制安裝 參數

庫文件
查看二進制程序所依賴的庫文件
ldd /PATH/TO/BINARY_FILE
管理及查看本機裝載的庫文件
ldconfig 加載庫文件
/sbin/ldconfig -p: 顯示本機已經緩存的所有可用庫文件
名及文件路徑映射關系
配置文件:/etc/ld.so.conf, /etc/ld.so.conf.d/*.conf
緩存文件:/etc/ld.so.cache

rpm(RedHat Package Manager)
程序包管理器:
功能:將編譯好的應用程序的各組成文件打包一個或幾個程序包文件,從而方便快捷地實現程序包的安裝、卸載、查詢、升級和校驗等管理操作

包文件組成 (每個包獨有)
RPM包內的文件
RPM的元數據,如名稱,版本,依賴性,描述等
安裝或卸載時運行的腳本

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

rpm {-i|--install} [install-options] PACKAGE_FILE...
-v: verbose
-vv:更加詳細的過程(用於排錯)
-e:卸載
直接接basename即可
如:rpm -e tree
-h:以#顯示程序包管理執行進度
-q:查詢
-ql:包的文件列表
解壓是要完整的路徑,而查詢和卸載只需要名字,因為是根據數據庫查的;
rpm -ivh PACKAGE_FILE ...

rpm包安裝
[install-options]
--test: 測試安裝,但不真正執行安裝,即dry run模式
可以用v來看到完整的過程,但是不是真的安裝
--nodeps(忽略依賴關系):
使用時機:
當發生依賴關系無法安裝時;
危險性:
強制操作可能會造成軟件無法正常使用;
--replacepkgs
面向全局:
用於在解壓開來後的文件缺失或者誤改,少的補,多的用原來的覆蓋,所以他會帶來一個問題就是如果你加了很多自己的配置文件,運行此選項也會被覆蓋;
面向局部:
rpm2cpio tree-1.6.0-10.el7.x86_64.rpm | cpio -id ./usr/bin/tree,把rpm轉成cpio然後再來對某一個文件解開,在復制過去就好了,但這樣也會帶來一個問題是文件的屬性可能會有不同,而上面的直接用rpm覆蓋安裝是不會存在這樣的問題的;
--replacefiles
對於A,B兩個包解壓出來同名的文件進行覆蓋,但一般都是版本的原因才會出現這樣的情況。如果有添加版本號的,那麽2者可以共存,如果都是以名字命名的那麽會覆蓋;
--nosignature: 不檢查來源合法性
--nodigest:不檢查包完整性
--noscripts:不執行程序包腳本
%pre: 安裝前腳本; --nopre
%post: 安裝後腳本; --nopost
%preun: 卸載前腳本; --nopreun
%postun: 卸載後腳本; --nopostun

rpm包升級
rpm {-U|--upgrade} [install-options] PACKAGE_FILE...
rpm {-F|--freshen} [install-options] PACKAGE_FILE...
upgrade:安裝有舊版程序包,則“升級” 如果不存在舊版程序包,則“安裝”
freshen:安裝有舊版程序包,則“升級” 如果不存在舊版程序包,則不執行升級操作
rpm -Uvh PACKAGE_FILE ...
rpm -Fvh PACKAGE_FILE ...
--oldpackage:降級
使用老版本的時候
--force: 強制安裝

註意:
(1) 不要對內核做升級操作;Linux支持多內核版本並存,因此,直接安裝新版本內核即可
(2) 如果原程序包的配置文件安裝後曾被修改,升級或者卸載時,新版本的提供的同一個配置文件並不會直接覆蓋老版本的配置文件,而把老版本的文件重命名(FILENAME.rpmnsave)後保留
1.rpm -ivh /run/media/root/CentOS\ 7\ x86_64/Packages/vsftpd-3.0.2-22.el7.x86_64.rpm
Preparing... ################################# [100%]
package vsftpd-3.0.2-22.el7.x86_64 is already installed

2.rpm -ql vsftpd
選擇一個配置文件/etc/vsftpd/vsftpd.conf

3.ll /etc/vsftpd/vsftpd.conf並添加一行
-rw-------. 1 root root 5030 Aug 3 2017 /etc/vsftpd/vsftpd.conf
[root@centos7 ~]# echo >> /etc/vsftpd/vsftpd.conf
[root@centos7 ~]# ll /etc/vsftpd/vsftpd.conf
-rw-------. 1 root root 5031 Jul 6 15:49 /etc/vsftpd/vsftpd.conf

4.刪除文件時,會提示你有修改過的文件,並將其命名為以.rpmsave結尾的文件,其他均被刪除,
後期如果需要用到可以直接覆蓋使用;
[root@centos7 ~]# rpm -e vsftpd
warning: /etc/vsftpd/vsftpd.conf saved as /etc/vsftpd/vsftpd.conf.rpmsave

5.重新安裝一次
[root@centos7 vsftpd]# ll
total 28
-rw-------. 1 root root 125 Aug 3 2017 ftpusers
-rw-------. 1 root root 361 Aug 3 2017 user_list
-rw-------. 1 root root 5030 Aug 3 2017 vsftpd.conf
-rwxr--r--. 1 root root 338 Aug 3 2017 vsftpd_conf_migrate.sh
-rw-------. 1 root root 5031 Jul 6 15:49 vsftpd.conf.rpmsave
rpm查詢包
rpm {-q|--query} [select-options] [query-options]
[select-options]
-q:僅查詢
-a: 所有包
-l:列出該軟件所以的文件與目錄所在的完整的文件名;
-f: 查看指定的文件由哪個程序包安裝生成
ql與qf是相反的,一個是解開是哪些,一個是這屬於哪個包
其實文件本刪除了也可以查詢,因為他查詢的是數據庫;
-p :針對尚未安裝的程序包文件做查詢操作
也可以用cpio -itv來預覽
--whatprovides CAPABILITY:查詢指定的CAPABILITY由哪個包所提供
CAPABILITY相當於關鍵字bash、tree等,這個tree或者bash是由哪個包提供
--whatrequires CAPABILITY:查詢指定的CAPABILITY被哪個包所依賴
哪些包會用到(依賴)這個CAPABILITY
rpm2cpio 包文件|cpio –itv 預覽包內文件
rpm2cpio 包文件|cpio –id “*.conf” 釋放包內文件

1.查詢/usr/bin/java來自哪個rpm?

[query-options]
--changelog:查詢rpm包的changelog
更改日誌
-c: 查詢程序的配置文件
-d: 查詢程序的文檔
cd為l的部分文件
-i: information
-l: 查看指定的程序包安裝後生成的所有文件
--scripts:程序包自帶的腳本
有安裝前後的腳本,卸載前後的腳本;
--provides: 列出指定程序包所提供的CAPABILITY
提供的能力,關鍵字
-R: 查詢指定的程序包所依賴的CAPABILITY
需要支持的文件

常用查詢用法:
-qi PACKAGE, -qf FILE, -qc PACKAGE, -ql
PACKAGE, -qd PACKAGE
-qpi PACKAGE_FILE, -qpl PACKAGE_FILE, ... -qa

包卸載:
rpm {-e|--erase}
[--allmatches] :卸載所以匹配到的
[--nodeps] :忽略依賴性
[-- noscripts] :不去運行腳本
[--notriggers] :觸發器
[--test] :測試
PACKAGE_NAME ...

包校驗:
rpm {-V|--verify} [select-options] [verify-options]
-V:接軟件名,如果文件被更改過,才會列出來;
-Va:列出目前系統上面所以可能被更改過的文件;
-Vp:接文件名,列出該軟件內可能背更改的文件;
-Vf:列出系統上的某個文件是否被更動過;
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

c:配置文件(config file)
d:文件數據文件(documentation)
g:鬼文件~通常是該文件不被某個軟件所包含,較少發生(ghost file)
l:授權文件(license file)
r:讀我文件(read me)


包來源合法性驗正及完整性驗正
完整性驗正:SHA256 來源合法性驗正:RSA
公鑰加密
對稱加密:加密、解密使用同一密鑰
非對稱加密:密鑰是成對兒的
public key: 公鑰,公開所有人
secret key: 私鑰, 不能公開
導入所需要公鑰(不導入是查不出來的)
rpm -K|checksig rpmfile 檢查包的完整性和簽名
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(Yellowdog Update Modifier):
rpm的前端程序,可解決軟件包相關依賴性,可在多個庫之間定位軟件包,up2date的替代工具
yum repository: yum repo,存儲了眾多rpm包,以及包的相關的元數據文件(放置於特定目錄repodata下)
文件服務器:
http://
https://
ftp://
file://
學習yum無非這2點:
1:會寫配置文件(路徑)
2:會清緩存,因為可能因為路徑修改之後,與本地的源數據有所變化(因為yum都是從倉庫上下載下來放到自己的本機上的),所以需要清緩存

這是本地的文件
cd /var/cache/yum/x86_64/7/base/
[root@centos7 base]# ll
total 6052
*-rw-r--r--. 1 root root 6023293 Sep 6 2017 0c34273ad0292747ee5e15c047d3e51c67ca59861a446972db45d71abacc7ad7-primary.sqlite.bz2
*-rw-r--r--. 1 root root 159667 Sep 6 2017 9346184be1deb727caf4b1ecf4a7949155da5da74af9b92c172687b290a773df-c7-x86_64-comps.xml.gz
-rw-r--r--. 1 root root 0 Jul 6 20:14 cachecookie
drwxr-xr-x. 2 root root 48 Jul 6 20:14 gen
drwxr-xr-x. 2 root root 6 Jul 4 22:11 packages
-rw-r--r--. 1 root root 3735 Sep 6 2017 repomd.xml

這是yum倉庫上的文件(這裏暫時為光盤)
[root@centos7 base]# ll /run/media/root/CentOS\ 7\ x86_64/repodata/
total 27222
*-rw-rw-r--. 1 root root 6023293 Sep 6 2017 0c34273ad0292747ee5e15c047d3e51c67ca59861a446972db45d71abacc7ad7-primary.sqlite.bz2
-rw-rw-r--. 1 root root 751786 Sep 6 2017 38b60f66d52704cffb8696750b2b6552438c1ace283bc2cf22408b0ba0e4cbfa-c7-x86_64-comps.xml
-rw-rw-r--. 1 root root 7019993 Sep 6 2017 6cd606547d4f569538d4090e9accdc3c69964de1116b9ab1e0a7864bb1f3ec98-filelists.sqlite.bz2
*-rw-rw-r--. 1 root root 159667 Sep 6 2017 9346184be1deb727caf4b1ecf4a7949155da5da74af9b92c172687b290a773df-c7-x86_64-comps.xml.gz

以上可以看出yum倉庫上的文件會下載到本地;

yum配置文件:
yum客戶端配置文件: /etc/yum.conf:為所有倉庫提供公共配置
/etc/yum.repos.d/*.repo:為倉庫的指向提供配置
必須在這個文件下,而且擴展名為.repo
倉庫指向的定義:
[repositoryID]
軟件庫的名字可以隨意取,但不能重名;
name=Some name for this repository
說明下軟件庫的意義,重要性不大,但是不寫,系統每次都有一句提示Repository ‘base‘ is missing name
baseurl=url://path/to/repository/ enabled={1|0}
需要是熱破data的父目錄;
enable
軟件庫是否啟動;
gpgcheck={1|0}
是否需要查閱RPM文件內的數碼簽章;
gpgkey=URL
數碼簽章的公鑰所在位置,使用默認值即可;
enablegroups={1|0}
failovermethod={roundrobin|priority}
roundrobin:意為隨機挑選,默認值
priority:按順序訪問
cost= 默認為1000

搭建本地倉庫(用光盤來作為源):
1.寫一個後綴為.repo的文件,名字不重要,取base.repo;
2.編輯這個文件,vim base.repo
3.[base]
baseurl=file:///run/media/root/CentOS\ 7\ x86_64/ (baseurl需要是repodata的父目錄)
4.寫了這兩行之後yum repolist就會有一個名字為base的源;
5.繼續編寫base.repo
[base]
name=centos7.4 cdrom
baseurl=file:///run/media/root/CentOS\ 7\ x86_64/(需要寫repodata的父目錄)
gpgkey=file:///run/media/root/CentOS\ 7\ x86_64/RPM-GPG-KEY-CentOS-7
不想裝鑰匙第4句改為gpgcheck=0
enabled=0(不使用時,臨時禁用)

yum clean all:刪除所有數據庫數據
packages:將已下載的軟件文件刪除
headers:將下載的軟件文件開始刪除
yum repolist查看倉庫列表
yum install ** 安裝
-y:不交互,默認yes
-q:靜默安裝;
--installroot=/some/path:該軟件安裝在/some/path下而不是用默認路徑;
yum remove ** 卸載
search :搜尋某個軟件名稱或者是描述(description)的重要關鍵字
list:列出目前yum所管理的所有軟件名稱與版本,類似rpm -qa
info:類似 rpm -qai
provides:從文件去搜尋軟件,類似於rpm -qf
update:後面接要升級的文件!如要整個系統都升級,就直接update;


*把自己搭建為搭建yum倉庫服務器:
準備工作
關閉SElinux
enforcing改為permissive
setenforce 0

關閉iptables
centos7
systemctl stop firewalld 關閉當前防火墻
systemctl disable firewalld 關閉開機自啟動

centos6
chkconfig iptables off關閉開機自啟動
service iptables stop 關閉當前防火墻

systemctl start vsftpd 現在啟動
systemctl enable vsftpd 開機啟動


共享服務:httpd、ftp
/var/www/html
/var/ftp/pub
當你完成一個項目的時候已經做出了rpm包了,但是要在共享服務上顯示,還需要rpm包元數據
createrepo /some/to/file 一個命令就可以制作rmp包元數據
上面的操作可以把磁盤內容拷過到這2個文件裏,也可以直接把光盤掛載到其下面。

yum的repo配置文件中可用的變量:
$releasever: 當前OS的發行版的主版本號
$arch: 平臺,i386,i486,i586,x86_64等
$basearch:基礎平臺;i386, x86_64
$YUM0-$YUM9:自定義變量

實例:
http://server/centos/$releasever/$basearch/
http://server/centos/7/x86_64
http://server/centos/6/i384

yum命令的用法:
yum [options] [command] [package ...]
顯示倉庫列表:
yum repolist [all|enabled|disabled]
顯示程序包:
yum list
yum list [all | glob_exp1] [glob_exp2] [...]
yum list {available|installed|updates} [glob_exp1] [...]
安裝程序包:
yum install package1 [package2] [...]
yum reinstall package1 [package2] [...] (重新安裝)
對於某些部分文件缺失的功能使用

yum-config-manager
yum-config-manager --add-repo=url
yum-config-manager --disable “倉庫名" 禁用倉庫
yum-config-manager --enable “倉庫名” 啟用倉庫

升級程序包:
yum update [package1] [package2] [...]
yum downgrade package1 [package2] [...] (降級)

檢查可用升級:
yum check-update

卸載程序包:
yum remove | erase package1 [package2] [...]

查看程序包information:
yum info [...]

查看指定的特性(可以是某文件)是由哪個程序包所提供:
yum provides | whatprovides feature1 [feature2] [...]

清理本地緩存:
清除/var/cache/yum/$basearch/$releasever緩存
yum clean [ packages | metadata | expire-cache | rpmdb | plugins | all ]

構建緩存:
yum makecache(yum repolist 的時候會自動構建)

搜索: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 history
yum history info 6
yum history undo 6(撤銷第6步)
redo 6(重做第6步)
用於刪除某個文件,而且確定他的所以依賴文件都不需要的時候使用,因為默認yum remove **只會刪除後面接的文件;
日誌 :/var/log/yum.log

安裝及升級本地程序包:
yum localinstall rpmfile1 [rpmfile2] [...]
(用install替代)
yum localupdate rpmfile1 [rpmfile2] [...]
(用update替代)

包組管理的相關命令:
yum groupinstall group1 [group2] [...]
yum groupupdate group1 [group2] [...]
yum grouplist [hidden] [groupwildcard] [...]
yum groupremove group1 [group2] [...]
yum groupinfo group1 [...]

yum的命令行選項:
--nogpgcheck:禁止進行gpg check
-y: 自動回答為“yes”
-q:靜默模式 --disablerepo=repoidglob:臨時禁用此處指定的repo --enablerepo=repoidglob:臨時啟用此處指定的repo --noplugins:禁用所有插件

程序包的編譯安裝:
Application-VERSION-release.src.rpm --> 安裝後,使用rpmbuild命令制作成二進制格式的rpm包,而後再安裝

源代碼-->預處理-->編譯-->匯編-->鏈接-->執行

源代碼組織格式:
多文件:文件中的代碼之間,很可能存在跨文件依賴關系
C、C++:make 項目管理器
configure腳本 --> Makefile.in --> Makefile
java: maven

C語言源代碼編譯安裝三步驟:
1、./configure
(1) 通過選項傳遞參數,指定啟用特性、安裝路徑等;執行時會參考用戶的指定以及Makefile.in文件生成Makefile
(2) 檢查依賴到的外部環境,如依賴的軟件包
2、make 根據Makefile文件,構建應用程序
3、make install 復制文件到相應路徑
開發工具:
autoconf:生成configure腳本
automake:生成Makefile.in
註意:安裝前查看INSTALL,README

編譯安裝:
編譯C源代碼: 準備:提供開發工具及開發環境
開發工具:make, gcc等
開發環境:開發庫,頭文件
glibc:標準庫
實現:通過“包組”提供開發組件
*Development Tools
Server Platform Development
第一步:configure腳本
選項:指定安裝位置、指定啟用的特性
--help: 獲取其支持使用的選項
選項分類:
安裝路徑設定:
--prefix=/PATH: 指定默認安裝位置,默認為/usr/local/ --sysconfdir=/PATH:配置文件安裝位置
System types:支持交叉編譯
Optional Features: 可選特性
--disable-FEATURE
--enable-FEATURE[=ARG]
Optional Packages: 可選包
--with-PACKAGE[=ARG],依賴包
--without-PACKAGE,禁用依賴關系
註意:通常被編譯操作依賴的程序包,需要安裝此程序包的“開發”組件,其包名一般類似於name-devel-VERSION
第二步:make
第三步:make install

安裝後的配置:
(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|man_db.conf文件
添加一個MANPATH

編譯安裝httpd(網上下載一個最新的版本)
1.yum groupinstall "Development Tools"
2.cat README
cat INSTALL
參考格式:
$ ./configure --prefix=PREFIX
$ make
$ make install
$ PREFIX/bin/apachectl start
3.進入到httpd那個目錄(./configure --help)
./configure --prefix=/app/httpd24 --sysconfdir=/etc/httpd24/ --enable-ssl
--enable-proxy-fcgi
報錯:
checking for APR... no
configure: error: APR not found. Please read the documentation.
缺啥補啥:
yum install apr-devel(缺什麽後面跟-devel補上就行)
再次報錯:
checking for APR-util... no
configure: error: APR-util not found. Please read the documentation.
繼續補:
yum install apr-util-utildevel
再次報錯:
checking for pcre-config... false
繼續補:
yum install pcre-devel
再次報錯:
checking whether to enable mod_ssl... configure: error: mod_ssl has been requested but can not be built due to prerequisite failures
繼續補:
yum install openssl-devel
成功之後會生成Makefile文件;

4.make -j 2 (-j指定cpu個數,多線程)
5.make install
45可以合成一句:
make;make install && echo -e "\a"
6.配置運行環境
1.修改PATH
vim /etc/profile.d/httpd24.sh
PATH=/app/httpd24:$PATH
. /etc/profile.d/httpd24.sh
7.apachectl 啟動apache服務;

軟件包管理rpm、yum及編譯安裝