您好,登錄后才能下訂單哦!
Linux程序包管理
我們linux操作系統從底層到高層的層次結構:
最底層首先是硬件,計算機的計算能力都是在硬件邏輯上設計實現的,而不同廠商生產的芯片哪怕是同一廠商生產的同一型號的芯片,他們給我們提供的計算接口都不一樣,我們基本都同說過嵌入式開發,那么這種開發如果沒有系統可以使用的話,主要是面向硬件,來寫程序的,而這種程序只能適應一種或者幾種有限的芯片,單片機尤其如此,現在很多嵌入式開發過程中,也已經有了一種通用層來實現,但是像單片機這種還是面向硬件編程的,
然后在底層之上就是將硬件接口封裝起來的操作系統層,系統層將底層的硬件接口封裝起來以后,通過系統調用(system call),向上輸出,但是系統調用仍然很底層,為了加速開發操作,在操作系統層之上又加了半層叫“庫(lib call)”,注意這里不是全層,而是半層,因為對于程序員來講,可以面向半層“庫”來寫程序,也可以面向我們的操作系統來寫程序,然后在庫之上就是應用程序了,應用程序是給我們真正帶來一些生產力的,我們的內核是不能完成任何具體的操作的,在這眾多的應用類型程序中,我們知道有一類比較獨特的,他主要是讓用戶跟主機交互的,叫shell任何利用操作系統完成任務的操作,都是通過應用程序完成的,所以我們說將來我們真正去實現運維操作的過程中,除了系統管理,庫調用管理之外,其實作為運維人員來講,就是不停的在我們的操作系統上安裝配置某一應用程序包,然后讓這個應用程序包運行起來,并提供服務,或者利用此工具完成某種具體相應操作的過程。那對于我們運維人員來講,安裝卸載管理程序包,是實現很多后期工作的最基礎,最根本的任務,所以首先我們要學會靈活實現對于程序包的安裝管理操作。
任何程序的運行,他有可能在程序包上提供兩種格式的程序包,我們稱之為源碼包或者叫二進制包,那么我們將到這就不得不回顧一下以前講到的API和ABI,API叫應用程序開發接口,ABI叫應用程序二進制接口。我們說過,API層次兼容未必ABI層次兼容。因為有些操作系統他們執行程序的格式,或者對二進制的是識別格式,并非是相同的,像linux跟類unix(Unix-like)他們的操作系統,一般而言是相同的,他們的ABI是相同的,但是與windows相差很遠,比方說windows系統上的可執行程序都是exe或者是msi的,而linux上的是elf格式的。所以他們在ABI層次不兼容,所以我們說即使我們使用高級編程語言,去編寫程序,他們即便是在源碼格式兼容的,但是一旦編譯成功以后,本來是linux上面的格式的,而跑到windows上一樣依然無法運行。所以有一個程序包,在linux上編譯好了,他是二進制格式的,我們是不能拿來裝到windows之上的。反過來如果一個程序包在windows上編譯好了,是一個exe格式的文件,能不能在linux系統上運行起來呢?也很難。我們可以借助虛擬化將二者的差異將其磨平了,比方說現在的各種各樣的應用程序,幾乎都是針對庫調用來開發的,很少說是直接通過系統調用來實現。即使是通過系統調用來實現,那也沒問題,現在在windows上有很多程序模擬linux的庫,在linux上也有很多模擬windows庫的程序。
比方說現在這里有一個linux操作系統,沒關系我們裝一個WinE,這個wine就能在linux上模擬出windows庫來。所以我們就可以借助wine來運行windows應用程序。比方說希望在linux上玩的各種各樣的游戲,甚至還能給我們提供一個安裝的路徑,模擬出windows上的C盤D盤E盤。但這只是一個庫虛擬層。同樣在windows上我們也能提供linux運行環境。叫cywin,在windows之上運行一個cywin,他能夠提供運行模擬出linux的運行環境來。所以說有一些程序只能在linux上運行的話,我們也能在windows上基于cywin運行起來,比如說像docker。這都不是正常的方案,正常的方案就是,由于abf庫是不兼容的,至少在二進制層次上他們是不兼容的。所以他們沒有辦法安裝塊系統來實現系統調用。
庫級別的虛擬化:我們可以借助庫級別的虛擬化來抹平他們的不同。比如在linux上我們可以借助于wine來提供windows庫從而能夠運行windows應用程序。而在Windoes上我們借助于Cywin這個程序包,來虛擬模擬出linux的運行環境。從而使得那些二進制程序也能跨系統來運行了。
系統級開發:
C/C++:服務及應用程序:httpd,vsftpd,nginx
go
應用級開發
java/Python/perl/ruby/php
java:hadoop,hbase,(他們的運行需要jvm就是java虛擬機)
Python:openstack(openstack是一個云操作系統)
運行Python程序需要用到pvm(Python虛擬機)
運行perl:(依賴于perl)
運行ruby:(依賴于ruby解釋器)
運行php:(依賴于php解釋器)
C/C++程序格式:
源代碼:文本格式的程序代碼;
二進制格式:文本格式的程序代碼---->編譯器------>二進制格式(二進制程序,庫文件,配置文件,幫助文件)
(二進制格式我們僅僅是指他的陳序和庫是二進制的,他的配置文件和幫助文件當然是文本的。我們知道Linux重要的哲學思想之一就是:用文本文件保存配置信息,這樣帶來的好處就在于,我們將來配置任何應用程序時,只需要依賴一款文本編輯器就可以。)
所以我們將來要想安裝應用程序,那么針對我們兩種格式的內容,他的安裝方式就顯然不一樣,我們知道源代碼不能運行,所以我們必須將其編譯以后將其安裝運行。對于源代碼而言我們要手動把“文本格式的程序代碼---->編譯器------>二進制格式”這個過程手動完成。如果是別人給我們提供的是二進制格式的文件,上面的過程就不需要我們自己做了。因為我們拿到的直接是可運行格式的。萬一很不幸的是對方僅提供了源代碼怎么辦呢?那么我們就只能自己編譯了。而要想能夠自己編譯的話,那就依賴于編譯開發環境。因為編譯要依賴于編譯器,依賴于頭文件,依賴于開發庫。我們的庫也是源代碼格式的,所以庫也有兩種文件。后來我們把它編譯成了二進制格式的。
所以我們的編譯開發環境依賴于:編譯器,頭文件,開發庫。
如果我們拿到的是二進制格式的,那么就不需要編譯,我們直接放到目錄下就能運行起來了。
所以我們如果要執行源代碼編譯安裝,那么我們需要額外的準備好幾步。至少我們要想方設法保證我們的編譯環境是完整的。而提供編譯環境是相當勞心費神的工作。
我們學習程序包安裝,首先了解二進制格式是怎么安裝的,然后再去了解如何源代碼編譯安裝。上面是C程序的格式。
那么如果是應用級的程序格式呢?
那么我們就以JAVA和Python為例,那么JAVA和Python應用程序格式是一樣的,
java/python程序格式:
源代碼
二進制
同樣的道理,如果是源代碼格式,那也只能編譯了,如果是二進制格式那么直接使用即可
但是他們的編譯不同在于,他們編譯出來的不是二進制格式,或者不是能夠直接在CPU上直接運行的二進制格式,而是編譯成其能夠在虛擬機上(jvm/pvm)運行的程序格式。也就是說通過虛擬機將其轉換成能夠運行的二進制格式。中間多了一層,所以性能很差。或者說比起C語言性能比較差。通常來說無論是C格式的源代碼,還是java格式的源代碼,通常他們的程序文件,都不止一個。那為什么不止一個?
將來我們的程序文件在編譯時存在錯綜復雜的依賴關系,導致我們有一百個程序源文件,很有可能我們先編譯第一個,在編譯第三個,在編譯第二個。因為第一個第三個被第二個所依賴。這樣帶來的結果就是誰先編譯誰后編譯,作為使用者我們沒有能力管理他們的編譯順序。所以各種各樣的源代碼通常都使用一個項目管理工具。或者叫項目構建工具。
項目構建工具:
C/C++:最著名的項目構建工具就叫make
java:最經典的項目構建工具就叫maven
這樣項目構建工具,也必須依賴項目開發環境才能構建。而對于java來講他也有自己的開發環境。他也需要開發環境。只不過對于這兩種的編程語言來講。他們的開發環境,通常指的是,那個對應應用程序的虛擬機,和虛擬機上面的編譯器。java源代碼編譯也需要開發環境,只不過是沒有頭文件,他們也需要:編譯器,卡發庫。這也是我們程序包的組成格式。
為了降低初級使用者的難度,我們應該怎樣做?
我們應該使用程序包管理器,來協助這些終端用戶的管理工作。
程序包管理器:
源代碼---->目標二進制格式----->組織成為一個或有限幾個“包”文件;
安裝,升級,卸載,查詢,(甚至對linux上還支持)校驗
程序包管理器:
(程序包管理器大體上有哪幾種呢?
對于windows來講,大多數的應用程序都是exe格式的。這種格式應用程序給我們提供一個安裝界面,我們只需點擊下一步下一步即可,卸載的時候我們通過我們控制面板中的,卸載應用程序來實現,為什么我們能看到的只是下一步下一步就能完成安裝呢?他其實就是通過一個程序包管理器打包成一個單個的exe文件,我們知道我們安裝完以后他的確分散成多個可能放在program/files目錄下某一個路徑下,每一個應用程序都有一個目錄,里面存放各種文件,有二進制的有庫的,對于windows來說,他們的庫是dll文件,動態鏈接庫,dynamic link,而對于linux而言,叫so。)
目前linux有三大主流分支:
debian:dpt,dpkg,".dep"
redhat:redhat package manager,簡稱:rpm,".rpm";rpm ispackage manager;
S.u.S.E:rpm,".rpm",
Gentoo:ports
ArchLinux:
源代碼:
命名方式:name-VERSION.tar.gz
VERSION:major.minor.release //主版本號.次版本號.發行版本
rpm包命名格式:
name-VERSION-release.arch.rpm //release是rpm包的release。
VERSION:major.minor.release
release.arc:是指rpm包的發行號
release.os:2.el7.i386.rpm
archetecture:架構,i386,x64(amd64),ppc,noarch
redis-3.0.2.targz----->redis-3.0.2-1.centos7.x64.rpm
changelog:
拆包:主包和支包
主包:name-VERSION-release.arch.rpm
支包:name-function-VERSION-release.arch.rpm
function:devel,utils,libs.....
依賴關系:
x,y,z
x------依賴--->y,z
y------依賴-------->A,B,C
c--------->y
前端工具:自動解決依賴關系;
yum:rhel系列系統上rpm包管理器的前端工具;
apt-get(apt-cache):dep包管理器的前端工具;
zypper:suse的rpm管理器前端工具;
dnf:Fedora 22+系統上rpm包管理器的前端工具;
程序包管理器:
功能:將編譯好的應用程序的各組成文件打包成一個或幾個程序包文件,從而更方便的 實現程序包的安裝,升級,卸載,和查詢等管理操作;
1.程序包的組成清單(每個程序包都單獨實現);
文件清單
安裝或卸載時運行的腳本
2數據庫(公共)
程序包的名稱和版本;
依賴關系;
功能說明;
安裝生成的各個文件的文件路徑及校驗碼信息;
CentOS系列系統的rpm數據庫:路徑
/var/lib/rpm
[root@centos7 ~]# ls /var/lib/rpm
Basenames __db.002 Group Obsoletename Requirename Triggername
Conflictname __db.003 Installtid Packages Sha1header
__db.001 Dirnames Name Providename Sigmd5
[root@centos7 ~]#
解釋:
Group:包組,我們可以將程序劃分成一個組,將來可以把一個程序包組全部安上,一個組 全部卸載。
Name:各個程序的名字;
Sigmd5:MD5的校驗碼;
Triggername:觸發器名稱;
獲取程序包的途徑:
(1)系統發行版的光盤或官方的文件服務器(或鏡像站點):
http://mirrors.aliyun.com
http://mirrors.sohu.com
http://mirrors.163.com
(2)項目的官方站點
舉例:以thhp為例:站點httpd.apache.org
或者:
網站www.zabbix.com
打開網站www.zabbix.com網站,我們網站的導航欄中直接點擊“Download”,打開一個頁面,前面的“Zabbix Packages”是zabbix的rpm包,再往下“Zabbix Sources”是源碼包。
所以說很多項目的官方站點也提供rpm包,并且我們一定注意,既然后能用rpm包安裝的我們一定不要使用源碼包編譯安裝。
(3)第三方組織:EPEL
EPEL:紅帽官方的社區組織所維護的,發行光盤之外其他他們覺得比較有用比較重點,比較有名的程序包,都將制作成rpm包放在EPEL中。
其實國內的很多官方站點都有這樣的epel。
舉例演示,我們以“mirrors.aliyun.com”為例:
在鏡像阿里云的站點上“mirrors.aliyun.com”也有epel,在epel中會為我們的centos提供了眾多的額外的補充包。
(a)EPEL
(b)搜索引擎
http://pkgs.org(在rpm領域中,這是一個非常重要的);
rpmfind.net(要想搜哪個文件包直接搜。)
rpm.pbone.net
上面對話框中,我們可以輸入正確的內容來進行查詢,我們還可以通過后面的
Advanced RPM Search |
來進行高級查詢。
(4)自己手動制作rpm包。
注意:不管上面的那種方式獲得rpm包,只要是通過互聯網上獲得的,那么我們就可以認為即使原作者在里面沒有做任何改變,或者修改,因為我們現在經常使用一些下載工具,像迅雷,那這種工具有點問題,為什么這種工具他的下載的速度非常的塊,就是因為他們可能不是從官方的原站點下載的,或者是非完完全全的官方站點上下載的,其實從已經下載的用戶的那里下載的,如果官方站點下載不到的話,而且這時候他恰恰搜索到某個用戶的那里有這個文件,他也會傳給你,但是這個文件可能被其他用戶精心的修改過,制作了后門,所以以后我們在互聯網上下載人格安全性較高的文件的,像銀行官方站點的插件,還有像支付寶的證書等,我們就不應該在使用迅雷下載。以后這中工具少用,尤其是使用PHP下載的,是相當危險的,那么我們下載下來一個工具我們不知道他到底是不是官方提供的呢?
至少是所有的數據沒有被篡改過,那怎么辦呢?
我們建議要做MD5校驗,提供一個MD5校驗器,檢驗其合法性,來源合法性。
程序包的完整性要做校驗;
CentOS系統上rpm命令管理程序包:
安裝,升級,卸載,查詢和校驗,數據庫的維護
上面提到的“安裝,升級,卸載,查詢和校驗”都用rpm命令來實現。
格式: rpm [OPTIONS] [PACKAGE_FILE]
安裝用到的選項:-i=--install
升級用到的選項:-U=--update, -F=--freshen
卸載:-e=--erase
查詢:-q=--query
校驗:-V=--verify
數據庫維護:--builddb,--initdb
安裝:
安裝時必須有對應的文件才行。
rpm {-i|--install} [install-options]PACKAGE_FILE ...
真正安裝的時候應該使用選項:-ivh
rpm -ivh PACKAGE_FILE......
GENERAL OPTIONS(通用選項)
-v:verbose;(輸出相信信息)
-vv:(輸出更詳細的過程信息)
[install-options]
-h:hash marks輸出進度條;每個#表示2%的進度;
--test:如果不想真正的安裝,僅僅是檢查一下有沒有潛在的沖 突的可能我們就可以測試安裝,檢查并報告依賴關系及 沖突消息等;
--nodeps:忽略依賴關系;不建議;
--replacepkgs:重新安裝 (如果某個包安裝過,但是后來我們 更改了他的配置文件,出了錯,那我們刻意先卸載 再重新安裝,但是我們還有一個更好的方法就是, 直接重新安裝。)
--noscripts:
--oldpackage:降級用的
--justdb:只是升級一下數據庫。
注意rpm包可以自帶腳本:
這些腳本有四類:
如果這四類都不想執行:--noscripts
preinstall:安裝過程開始之前運行腳本,%pre --nopre
postinstall:安裝過程完成以后運行的腳本,%post --nopost
preuninstall:卸載過程真正開始執行之前運行的腳本,%preun --nopreun
postuninstall:卸載過程完成之后運行的腳本,%postun --nopostun
--nosignature:不檢查簽名信息,不檢查來源合法性;
--nodigest:不檢查包完整性信息;
舉例演示:
[root@centos6 Packages]# rpm -ivh zsh-4.3.11-4.el6.centos.2.x86_64.rpm
warning:zsh-4.3.11-4.el6.centos.2.x86_64.rpm: Header V3 RSA/SHA1 Signature, key IDc105b9de: NOKEY
Preparing... ###########################################[100%]
1:zsh ########################################### [100%]
[root@centos6 Packages]# cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/bin/dash
/bin/tcsh
/bin/csh
/bin/zsh
[root@centos6 Packages]#
演示重新安裝replacepkgs:
之前我們zsh已經安裝過了,那我們先編輯一下zsh的配置文件“/etc/zshrc”,比方說我們刪除其中的幾行,然后保存,因為我們執行“wq”之后,他的配置文件信息就不能恢復了。那么這時,我們
[root@centos6 media]# vim /etc/zshrc //先將zsh的配置文件中的內容刪除一部分
[root@centos6 media]# cat /etc/zshrc
[root@centos6media]#rpm -ivh --replacepkgs /media/Packages/zsh-4.3.11-4.el6.centos.2.x86_64.rpm
[root@centos6media]# cat /etc/zshrc //發現配置文件內容沒有恢復,這時因為我們的系統在我們沒有將原先的配置文件刪除,就在重裝軟件,那么系統就會認為我們這個配置文件修改是有目的的,我們也要記住replacepkgs是不能修改原來的配置文件的。所以我們在重裝之前要先刪除配置文件。
[root@centos6media]# rm -f /etc/zshrc
[root@centos6 media]# rpm -ivh --replacepkgs/media/Packages/zsh-4.3.11-4.el6.centos.2.x86_64.rpm
[root@centos6media]# cat /etc/zshrc //發現配置文件內容恢復了
#
# /etc/zshrc is sourced in interactiveshells. It
# should contain commands to set upaliases, functions,
# options, key bindings, etc.
#
## shell functions
#setenv() { export $1=$2 } # csh compatibility
# Set prompts
PROMPT='[%n@%m]%~%# ' # default prompt
#RPROMPT=' %~' # prompt for right side of screen
# bindkey -v # vi key bindings
# bindkey -e # emacs key bindings
bindkey ' ' magic-space # also do history expansion on space
_src_etc_profile_d()
{
# Make the *.sh things happier,and have possible ~/.zshenv options like
#NOMATCH ignored.
emulate -L ksh
#from bashrc, with zsh fixes
if [[ ! -o login ]]; then # We're not a login shell
for i in /etc/profile.d/*.sh; do
if [ -r "$i" ]; then
. $i
fi
done
unset i
fi
}
_src_etc_profile_d
unset -f _src_etc_profile_d
[root@centos6 media]#
不檢查簽名演示:
[root@centos6 media]# rpm -ivh --replacepkgs/media/Packages/zsh-4.3.11-4.el6.centos.2.x86_64.rpm
warning: /media/Packages/zsh-4.3.11-4.el6.centos.2.x86_64.rpm: Header V3RSA/SHA1 Signature, key ID c105b9de: NOKEY
Preparing... ########################################### [100%]
1:zsh ########################################### [100%
上面在重新安裝軟件包的時候,前面出現了警告,我們要見檢查文件的合法性,文件的完整性,要檢查文件的這兩個選項,要依賴一個秘鑰文件,要依賴這個包制作者的公鑰。
[root@centos6 media]# rpm -ivh--replacepkgs --nosignature/media/Packages/zsh-4.3.11-4.el6.centos.2.x86_64.rpm
Preparing... ###########################################[100%]
1:zsh ########################################### [100%]
[root@centos6 media]#
上面安裝時,警告消失。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。