1. 程式人生 > 實用技巧 >Linux程式包管理及yum安裝管理

Linux程式包管理及yum安裝管理

Linux程式包管理:

APIApplicationProgramming Interface 應用程式設計介面

POSIXPortable OS 遵循本協議的程式均可在不同系統間移植


程式編寫完成後,執行所要經過的處理步驟:

程式原始碼 --> 預處理 --> 編譯 --> 彙編 --> 連結

靜態編譯:

共享編譯:直接呼叫.so共享物件實現

ABIApplicationBinary Interface 應用二進位制介面

WindowsLinux所支援的可執行二進位制檔案格式不同,不相容

庫級別的虛擬化:(可以通過安裝虛擬共享庫執行)

Linux:WINE

Windows:Cywin

系統級開發

C

C++

應用級開發

java

Python

php

perl

ruby

二進位制應用程式的組成部分:

二進位制檔案、庫檔案、配置檔案、幫助檔案

程式包管理器:

debiandeb, dpt

redhat:rpm, rpm

rpm:Redhat Package Manager

RPMis Package Manager

Gentoo

Archlinux

原始碼:name-VERSION.tar.gz

VERSION:major.minor.release

rpm包命名方式:

name-VERSION-release.arch.rpm

VERSION:major.minor.release 主版本號.次版本號.release號

release.arch

releaserelease.OS

如:zlib-1.2.7-13.el7.i686.rpm

常見的arch

x86:i386, i486, i586, i686

x86_64:x64, x86_64, amd64

powerpc:ppc

跟平臺無關:noarch

testapp:拆包(遇到某些包的程式不符合實際應用時,就需要拆包)

testapp-VERSION-ARCH.rpm:主包

testapp-devel-VERSION-ARCH.rpm:支包

testapp-testing-VERSION-ARHC.rpm

包之間:存在依賴關係

X,Y, Z

yumrpm包管理器的前端工具,用於解決程式包依賴關係並自動安裝;

apt-getdeb包管理器前端工具;

zypper:suse上的rpm前端管理工具;

dnf:Fedora 22+ rpm包管理器前端管理工具;

檢視二進位制程式所依賴的庫檔案:

ldd/PATH/TO/BINARY_FILE

wKiom1XkTcCxqnMIAAHx3FsUqyg058.jpg

管理及檢視本機裝載的庫檔案:

ldconfig

/sbin/ldconfig-p:顯示本機已經快取的所有可用庫檔名及檔案路徑對映關係;

配置檔案為:/etc/ld.so.conf,/etc/ld.so.conf.d/*.conf

快取檔案:/etc/ld.so.cache

wKiom1XkTzzge_FVAAHMiSwJDpA466.jpg

程式包管理:

功能:將編譯好的應用程式的各組成檔案打包一個或幾個程式包檔案,從而方便快捷地實現程序包

的安裝、解除安裝、查詢、升級和校驗等管理操作;

1、程式的組成組成清單 (每個包獨有)

檔案清單

安裝或解除安裝時執行的指令碼

2、資料庫(公共)

程式包名稱及版本

依賴關係;

功能說明;

安裝生成的各檔案的檔案路徑及校驗碼資訊;

管理程式包的方式:

使用包管理器:rpm

使用前端工具:yum,dnf

獲取程式包的途徑:

(1)系統發版的光碟或官方的伺服器;

CentOS映象:

http://mirrors.aliyun.com

http://mirrors.sohu.com

http://mirrors.163.com

(2)專案官方站點

(3)第三方組織:

Fedora-EPEL

搜尋引擎:

http://pkgs.org

http://rpmfind.net

http://rpm.pbone.net

(4)自己製作

建議:檢查其合法性

來源合法性;

程式包的完整性;

CentOS系統上rpm命令管理程式包:


安裝、解除安裝、升級、查詢、校驗、資料庫維護

安裝:

rpm{-i|--install} [install-options] PACKAGE_FILE ...

-v:verbose 顯示詳細資訊

-vv:顯示更多除錯資訊

-h:#顯示程式包管理執行進度;每個#表示2%的進度

rpm-ivh PACKAGE_FILE ...

[install-options]

--test:測試安裝,但不真正執行安裝過程;dry run模式;

--nodeps:忽略依賴關係;

--replacepkgs: 重新安裝;

--nosignature:不檢查來源合法性;

--nodigest:不檢查包完整性;

--noscipts:不執行程式包指令碼片斷;(指令碼分為四類)

%pre:安裝前指令碼; --nopre

%post:安裝後腳本; --nopost

%preun:解除安裝前指令碼; --nopreun

%postun:解除安裝後腳本; --nopostun

wKiom1XkU0jyVX4BAAG0Df7fKoA431.jpg

wKioL1XkVoGAesboAAFLxLKxu_A585.jpg

此升級應注意如果原zsh包已修改過配置檔案,則可能被覆蓋或者新安裝的配置檔案可能不會生效


升級:

rpm{-U|--upgrade} [install-options] PACKAGE_FILE ...

rpm{-F|--freshen} [install-options] PACKAGE_FILE ...

upgrage:安裝有舊版程式包,則“升級”;如果不存在舊版程式包,則“安裝”;

freeshen:安裝有舊版程式包,則“升級”;如果不存在舊版程式包,則不執行升級操作;

rpm-Uvh PACKAGE_FILE ...

rpm-Fvh PACKAGE_FILE ...

--oldpackage:降級;

--force:強行升級;

注意:(1) 不要對核心做升級操作;Linux支援多核心版本並存,因此對新版本核心直接安裝

(2) 如果原程式包的配置檔案安裝後曾被修改,升級時,新版本的提供的同一個配置檔案並

不會直接覆蓋老版本的配置檔案,而把新版本的檔案重新命名(FILENAME.rpmnew)後保留

查詢:

rpm{-q|--query} [select-options] [query-options]

[select-options] 挑選選項

-a:所有包

-f:檢視指定的檔案由哪個程式包安裝生成

-p/PATH/TO/PACKAGE_FILE:針對尚未安裝的程式包檔案做查詢操作;

--whatprovidesCAPABILITY:查詢指定的CAPABILITY由哪個包所提供;

--whatrequiresCAPABILITY:查詢指定的CAPABILITY被哪個包所依賴;

wKioL1XkXqWR8JxoAAFH-EZyRMY057.jpg

[query-options] 查詢選項

--changelog:查詢rpm包的changlog

-c:查詢程式的配置檔案

-d:查詢程式的文件

-i:information 顯示包的資訊(名稱、版本等)

-l:檢視指定的程式包安裝後生成的所有檔案;

--scripts:程式包自帶的指令碼片斷

-R:查詢指定的程式包所依賴的CAPABILITY

--provides:列出指定程式包所提供的CAPABILITY

wKioL1XkX-eDVe3uAAEe6ZiGakM743.jpg

wKiom1XkXovwigu1AAByy14RByE839.jpg

wKiom1XkX22D4SsDAAETEmaVebg402.jpg

wKioL1XkZO-CXUbPAAMAbBgQgHw926.jpg

wKiom1XkZDfSbdlYAADGN-T8ktg808.jpg

wKioL1XkZzHiamg6AACnyTBDwb0620.jpg

wKiom1XkZfHBe4JCAAEO2XW58m8905.jpg


用法(常用):

-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 ...

wKiom1XkatKAzPcEAABPo-PZNwg589.jpg

校驗:

rpm {-V|--verify} [select-options][verify-options]

wKioL1Xkbz_wsPR7AADp428T5MY084.jpg

S file Size differs

M Mode differs (includes permissions andfile 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

PcaPabilities differ

包來源合法性驗正及完整性驗正:

完整性驗正:SHA256

來源合法性驗正:RSA

公鑰加密:

對稱加密:加密、解密使用同一金鑰;

非對稱加密:金鑰是成對兒的,

publickey: 公鑰,公開所有人

secretkey: 私鑰, 不能公開

匯入所需要公鑰:

rpm--import /PATH/FROM/GPG-PUBKEY-FILE

CentOS7發行版光碟提供的金鑰檔案:RPM-GPG-KEY-CentOS-7

wKiom1XkbdPiXxktAADP_TqiBC0507.jpg

資料庫重建:

rpm{--initdb|--rebuilddb}

initdb:初始化

如果事先不存在資料庫,則新建之;否則,不執行任何操作;

rebuilddb:重建

無論當前存在與否,直接重新建立資料庫;


Linux程式包管理(2)

CentOS:yum, dnf

URL:ftp://172.16.0.1/pub/

YUM:yellow dog, Yellowdog Update Modifier

yumrepository: yum repo

儲存了眾多rpm包,以及包的相關的元資料檔案(放置於特定目錄下:repodata);

檔案伺服器:

ftp://

http://

nfs://

file:///

yum客戶端:

配置檔案:

/etc/yum.conf:為所有倉庫提供公共配置

/etc/yum.repos.d/*.repo:為倉庫的指向提供配置

倉庫指向的定義:(等號左右不可以出現空格)

[repositoryID]

name=Somename for this repository

baseurl=url://path/to/repository/

enabled={1|0} 是否啟用此倉庫,預設啟用,可不寫

gpgcheck={1|0} 對於此倉庫的所有程式包安裝前是否檢查完整性和來源合法性

gpgkey=URL 指明URLGPG祕鑰檔案的訪問路徑

enablegroups={1|0} 是否允許在此倉庫上基於組批量管理程式包,預設為支援

failovermethod={roundrobin|priority}故障轉移方法{輪巡(隨機)|優先順序}

預設為:roundrobin,意為隨機挑選;

cost= 開銷

預設為1000

教室裡的yum源:

http://172.16.0.1/cobbler/ks_mirror/CentOS-6.6-x86_64/

CentOS6.6 X86_64 epel: http://172.16.0.1/fedora-epel/6/x86_64/

mvCentOS-Base.repo CentOS-Base.repo.bak

vimcentos-local.repo

wKioL1Xi_lyAlf_PAACbB1BtWos754.jpg

wKiom1Xi_EDxty2HAADuVWtWCU0597.jpg


yum命令的用法:

yum[options] [command] [package ...]

command is one of:

* install package1 [package2] [...]

* update [package1] [package2] [...]

* update-to [package1] [package2] [...]

* check-update

* upgrade [package1] [package2] [...]

* upgrade-to [package1] [package2] [...]

* distribution-synchronization [package1] [package2] [...]

* remove | erase package1 [package2] [...]

* list [...]

* info [...]

* provides | whatprovides feature1 [feature2] [...]

* clean [ packages | metadata | expire-cache | rpmdb | plugins | all ]

* makecache

* groupinstall group1 [group2] [...]

* groupupdate group1 [group2] [...]

* grouplist [hidden] [groupwildcard] [...]

* groupremove group1 [group2] [...]

* groupinfo group1 [...]

* search string1 [string2] [...]

* shell [filename]

* resolvedep dep1 [dep2] [...]

* localinstall rpmfile1 [rpmfile2] [...]

(maintained for legacy reasons only - use install)

* localupdate rpmfile1 [rpmfile2] [...]

(maintained for legacy reasons only - use update)

* reinstall package1 [package2] [...]

* downgrade package1 [package2] [...]

* deplist package1 [package2] [...]

* repolist [all|enabled|disabled]

* version [all| installed | available | group-* | nogroups* | grouplist| groupinfo ]

* history[info|list|packages-list|packages-info|summary|addon-info|redo

|undo|rollback|new|sync|stats]

* check

* help [command] 獲取幫助資訊

顯示倉庫列表:

repolist [all|enabled|disabled] [全部|啟用|禁用]

顯示程式包:

list

# yum list [all | glob_exp1] [glob_exp2][...] 支援glob通配

# yum list {available|installed|updates}[glob_exp1] [...] {尚未安裝|已安裝|可用升級}

安裝程式包:

install package1 [package2] [...]

可以指定安裝程式的某一版本:yuminstall gcc-4.5.4

reinstall package1 [package2][...] (重新安裝)

請看下面的示例:

wKioL1Xi_1KgOY6BAAN_JEcCKAI238.jpg

wKiom1Xi_TrAkgCNAAMEPFZ0WzE180.jpg

wKioL1Xi_1vSYIyzAAJCixq5eCo089.jpg

升級程式包:

update [package1] [package2] [...]

downgrade package1 [package2] [...] (降級)

檢查可用升級:

check-update

解除安裝程式包:

remove | erase package1 [package2][...]

注:會同時解除安裝依賴此包的其他程式


wKioL1XjAETS_lM0AAJr4BZwBmg504.jpg

檢視程式包information

info [...]

wKiom1Xi_pySo7QBAAGEzaa7DWQ899.jpg

檢視指定的特性(可以是某檔案)是由哪個程式包所提供:

provides | whatprovides feature1[feature2] [...]

wKioL1XjANGhsqx2AAErjmSmF24784.jpg

清理本地快取:

clean [ packages | metadata |expire-cache | rpmdb | plugins | all ]

程式包 元資料 過期快取 rpmdb外掛 所有

構建快取:

makecache

搜尋:

search string1 [string2] [...]

以指定的關鍵字搜尋程式包名及summary資訊;

wKiom1Xi_u3h-UM4AAHwr5wuFTg490.jpg

檢視指定包所依賴的capabilities

deplist package1 [package2] [...]

wKiom1Xi_xeiwmF7AAM9uT9-kO4228.jpg

檢視yum事務歷史:

history[info|list|packages-list|packages-info|summary|addon-info|redo|undo|rollback|new|sync|stats]

包列表 包資訊

影象 010.jpg

wKioL1XjAXmSsd1aAADcMslg4Uc153.jpg

安裝及升級本地程式包:(能夠解決依賴包關係)

*localinstall rpmfile1 [rpmfile2] [...]

(maintained for legacy reasons only - use install)

* localupdate rpmfile1 [rpmfile2] [...]

(maintained for legacy reasons only - use update)

包組管理的相關命令:

* groupinstall group1 [group2] [...]yum groupinstall "Development Tools"

CentOS7 yumgroupinstall "開發工具"

* groupupdate group1 [group2] [...]

* grouplist [hidden] [groupwildcard] [...] 顯示包組

* groupremove group1 [group2] [...]

* groupinfo group1 [...] yumgroupinfo "Development Tools"

影象 012.jpg

yum源指向只能升級不能降級,如CentOS6.6只能使用版本大於等於CentOS6.6的源

CentOS7

如何使用光碟當作本地yum倉庫:

(1) 掛載光碟至某目錄,例如/media/cdrom

# mount -r -t iso9660/dev/cdrom /media/cdrom

wKiom1Xi_-bwHcYQAADCjHybWlw354.jpg

wKioL1XjAj_i8OtvAACI8pOcjEs088.jpg

wKiom1XjAEajGYizAADMj0h2Cyw688.jpg

yum的命令列選項:

--nogpgcheck:禁止進行gpg check

-y: 自動回答為“yes”;

-q:靜默模式;

--disablerepo=repoidglob:臨時禁用此處指定的repo

--enablerepo=repoidglob:臨時啟用此處指定的repo

--noplugins:禁用所有外掛;

yumrepo配置檔案中可用的變數:

$releasever: 當前OS的發行版的主版本號;

$arch: 平臺;

$basearch 基礎平臺;

$YUM0-$YUM9 使用者可自定義平臺

http://mirrors.magedu.com/centos/$releasever/$basearch/os

建立本地yum倉庫:(CentOS 6

以教室伺服器為例:

wKioL1XjAtKBEP8GAALgI6Gi8FE244.jpg

切換到即將下載檔案的目錄

……



wKiom1XjAN3DEWcxAAHqxydBVqI484.jpg

說明:!mkdir -p/yum/repo !表示執行shell指令碼程式

lcd /yum/repo l表示在本地執行[目錄切換]

mget *.rpm 下載*.rpm到本地/yum/repo


wKiom1XjATbx9at8AADNDfWTpLg679.jpg


接下來建立repodata createrepo [options]<directory>

wKioL1XjA3Wy8xWBAADctt2uNRI153.jpg

[[email protected] repo]# ll可檢視到當前目錄已經有repodata

接下來需要去編輯local.repo檔案

[[email protected]~]# cd /etc/yum.repos.d/

[[email protected]]# vim centos-local.repo


wKiom1XjAaqDrZ1mAAHJVnWoql8944.jpg



本地yum源建立成功。

程式包編譯安裝:

testapp-VERSION-release.src.rpm --> 安裝後,使用rpmbuild命令製作成二進位制格式的rpm包,而後再安裝;

原始碼 --> 預處理 --> 編譯(gcc)--> 彙編 --> 連結 --> 執行

原始碼組織格式:

多檔案:檔案中的程式碼之間,很可能存在跨檔案依賴關係;

CC++ make(configure --> Makefile.in --> makefile)

java: maven

C程式碼編譯安裝三步驟:

./configure

(1)通過選項傳遞引數,指定啟用特性、安裝路徑等;執行時會參考使用者的指定以Makefile.in

檔案生成makefile

(2)檢查依賴到的外部環境;

make

根據makefile檔案,構建應用程式;

make install

指令碼,把構建的二進位制放到指定路徑

開發工具:

autoconf:生成configure指令碼

automake 生成Makefile.in

建議:安裝前檢視INSTALLREADME

開源程式原始碼的獲取:

官方自建站點:

apache.org(ASF)

mariadb.org

...

程式碼託管:

SourceForge

Github.com

code.google.com

c/c++:gcc (GNU C Complier)

編譯C原始碼:

前提:提供開發工具及開發環境

開發工具:make,gcc

開發環境:開發庫,標頭檔案

glibc:標準庫

通過“包組”提供開發元件

CentOS 6:"Development Tools", "Server Platform Development",

第一步:configure指令碼

選項:指定安裝位置、指定啟用的特性等

--help: 獲取其支援使用的選項

選項分類:

安裝路徑設定:

--prefix=/PATH/TO/SOMEWHERE:指定預設安裝位置;預設為/usr/local/

--sysconfdir=/PATH/TO/SOMEWHERE:配置檔案安裝位置;

Systemtypes:目標系統平臺結構,用於交叉編譯

OptionalFeatures: 可選特性

--disable-FEATURE

--enable-FEATURE[=ARG]

OptionalPackages: 可選包,通常指該程式依賴到的其他程式包

--with-PACKAGE[=ARG]

--without-PACKAGE

第二步:make

第三步:make install





現在來試一下安裝,以教室環境為例:

首先獲取httpd-2.2.29.tar.bz2


影象 023.jpg

wKioL1XjBkiyM7TKAAC4jXoHK7Y565.jpg

wKiom1XjBCyC66VBAAGUppjgMVk309.jpg

看到INSTALL檔案,檢視之:[[email protected] httpd-2.2.29]# less INSTALL

wKioL1XjBmHg9rB6AAFLDHjbogE394.jpg

該檔案說明了操作順序,configureconfigure的選項,makemake install

檢視所需開發包組是否已安裝:

[[email protected] ~]#yum grouplist

安裝未安裝的包組:

[[email protected] ~]# yum groupinstall"Server Platform Development" -y -y自動回答為yes

進入/httpd-2.2.29依次執行如下命令:

[[email protected] httpd-2.2.29]# ./configure--prefix=/usr/local/apache2 --sysconfdir=/etc/httpd2 說明:指定安裝位置為/usr/local/apache2配置檔案路徑/etc/httpd2

[[email protected] httpd-2.2.29]# make

[[email protected] httpd-2.2.29]# make install

檢視安裝結果:

wKioL1XjBvujkBicAACyBp69iOU277.jpg

接下來可嘗試啟用該程式:

wKioL1XjBy7i14CMAANoahEFOjs874.jpg80埠已處於監聽狀態,嘗試訪問:

wKiom1XjBTHD5kpyAAB6VNN4vhE531.jpg

安裝後的配置:

(1) 匯出二進位制程式目錄至PATH環境變數中;

編輯檔案/etc/profile.d/NAME.sh

export PATH=/PATH/TO/BIN:$PATH

[[email protected] apache2]# vim/etc/profile.d/apache2.sh新增如下行:

影象 032.jpg

wKiom1XjBgSggjnlAACtGD2HNqQ884.jpg

(2) 匯出庫檔案路徑

編輯/etc/ld.so.conf.d/NAME.conf

新增新的庫檔案所在目錄至此檔案中; /usr/local/apache2/lib

讓系統重新生成快取:

ldconfig[-v]

vim /etc/ld.so.conf.d/apache2.conf

wKiom1XjBnyR31OOAAA5ix1-Wm4009.jpg

(3) 匯出標頭檔案

基於連結的方式實現:

ln-sv ln -s/usr/local/apache2/include/ apache2

(4) 匯出幫助手冊

編輯/etc/man.config檔案

新增一個MANPATH

vim /etc/man.config,新增下面黑色的欄位

wKioL1XjCP-Qd4DaAAEU_r0ZK_4591.jpg










轉載於:https://blog.51cto.com/chaochao3/1690342