《鳥哥的Linux私房菜》筆記
軟件管理器簡介
不是每個人都會進行源碼安裝的!
廠商先在他們的系統上面編譯好了我們用戶所需要的軟件,然后將這個編譯好的可執行的軟件直接發布給用戶安裝。
如果在安裝的時候還可以加上一些與這些程序有關的信息,將它新建成為數據庫,那么就可以進行安裝、反安裝、升級與驗證等的相關功能(類似Windows下的添加,刪除程序)。在Linux上面有兩種常見的軟件管理器,分別是RH的rpm與Debian的dpkg。
Linux界的兩大主流:RPM與DPKG
Linux開發商先在固定的硬件平臺與操作系統平臺上面將需要安裝或升級的軟件編譯好,然后將軟件的所有相關文件打包成為一個特殊格式的文件,在這個軟件文件內還包含了預先檢測系統與依賴軟件的腳本,并提供記載該軟件提供的所有文件信息等,最終將這個軟件文件發布。
用戶取得這個文件后,只要通過特定的指令來安裝,那么該軟件文件就會依照內部的腳本來檢測相依的前驅軟件是否存在。若安裝的環境符合要求,那就會開始安裝,安裝完成后還會將該軟件的信息寫入軟件管理機制中,以完成未來可以進行升級、刪除等操作。
目前Linux界軟件安裝最常見的兩種方式:
dpkg:這個機制最早是由Debian Linux社區開發出來的,由Debian衍生的其他Linux distribution大多使用dpkg這個機制來管理軟件;
rpm:這個機制最早是由Red Hat這家公司開發出來的,因為很好用,所以很多distribution就使用這個機制來作為軟件安裝的管理方式;
不論是dpkg還是rpm,這些機制都會有軟件依賴性的問題,那么該如何解決呢?每個軟件文件都有提供依賴性檢查,如果我們將依賴性的信息做成列表,等到軟件實際安裝時,若發生有依賴性的軟件問題時,透過依賴屬性列表,管理機制自動去安裝依賴,不就解決了依賴性的問題了嗎!
目前Linux開發商提供了這樣的“在線升級”機制,只有有網絡,你就能夠取得原本開發商提供的任何軟件。
什么是RPM與SRPM
RPM全名是“RedHat Package Manager”,簡稱為RPM。當初這個軟件管理機制是由Red Hat這家公司發展出來的。RPM是以一種數據庫記錄的方式來將你所需要的軟件安裝到你的Linux系統的一套管理機制。
它最大的特點就是將你要安裝的軟件先編譯過,并且打包成為RPM機制的包裝文件,透過包裝好的軟件里面默認的數據庫記錄,記錄這個軟件要安裝的時候必須具備的依賴性軟件。當安裝在你的Linux主機時,RPM會先依照軟件里面的信息查詢Linux主機的依賴屬性是否滿足,若滿足則予以安裝,不滿足則不予安裝。安裝的時候就將該軟件的信息整個寫入RPM的數據庫中,以便未來的查詢、驗證與反安裝!優點:
由于已經編譯完成并且打包完畢,所以軟件傳輸與安裝上很方便(無需重新編譯);
由于軟件的信息都已經記錄在Linux主機的數據庫上,很方便查詢、升級與反安裝。
但這也造成些許困擾。由于RPM文件是已經包裝好的數據,也就是說,里面的數據都已經“編譯完成”了。所以,該軟件幾乎只能安裝在原本默認的硬件與操作系統版本中。也就是說,你的主機系統環境必須要與當初建立這個軟件數據的主機環境相同才行。強制安裝通常會發生一些錯誤!這些 軟件管理機制的問題是:
軟件文件安裝的環境必須與打包時的環境一致或相當;
需要滿足軟件的依賴性需求;
反安裝時需要特別小心,最底層的軟件不可先移除,否則可能造成整個系統的問題!
如果我真的想要安裝其他distribution提供的好用的RPM軟件數據,那就得利用SRPM這個東西!SRPM,它是Source RPM的意思,也就是這個RPM文件里面含有源碼,但注意,這個SRPM提供的軟件內容并沒有經過編譯,它提供的是源碼。
通常SRPM文件擴展名為***.src.rpm。
與Tarball比對:SRPM雖然內容是源碼,但它仍然含有該軟件所需要的依賴性說明以及所有RPM文件所提供的資料;
與RPM對比:它提供了參數配置文件(configure與makefile)。
如果我們下載的是SRPM文件,那么在安裝時,必須要:
先將該軟件以RPM管理的方式編譯,此時SRPM會被編譯成RPM文件;
然后將編譯完成的RPM文件安裝到Linux系統中。
通常一個軟件發布的時候,都會同時發布該軟件的RPM與SRPM。我們可以通過修改SRPM內的參數配置文件,然后重新編譯產生能適合我們Linux環境的RPM文件。如此一來,就可以將軟件安裝到我們的系統當中,而不必與原廠商打包的Linux環境相同了。
什么是i386,i586,i686,noarch,x86_64
gcc-4.8.5-11.el7.x86_64
#gcc 軟件名稱;
#4.8.5 版本信息;
#11 是發布版本次數;
#el7.x86_64 是操作硬件平臺;
由于RPM可以適用于不同的操作平臺上,但是不同的平臺設置的參數還是有所差異!我們可以針對比較高級的CPU來進行最佳化參數的設置,這樣才能使用高級CPU所帶來的硬件加速功能。所以就有所謂的i386,i586,i686,x86_64與noarch等的文件名出現了。
由于x86系統的支援,新的CPU都能夠執行老舊CPU所支持的軟件,也就是說硬件方面是可以向下兼容的,因此最低等級的i386軟件也可以安裝在所有的x86硬件平臺上面,無論32位還是64位。
RPM的優點
rpm內包含已經編譯過的程序與配置文件等資料,可以讓使用者免除重新編譯的困擾;
rpm在被安裝之前會先檢查系統的硬盤容量、操作系統版本等,可以避免文件被錯誤安裝;
rpm文件本身提供軟件版本信息,依賴性軟件名稱、軟件用途說明、軟件所包含文件等信息,便于了解軟件;
rpm管理的方式使用數據庫記錄RPM文件的相關參數,便于升級、移除、查詢與驗證。
為了解決軟件之間依賴性問題,rpm在提供打包的軟件時,同時加入一些信息登錄的功能,這些信息包括軟件的版本、軟件打包者、依賴的其他軟件、本軟件的功能說明、本軟件的所有文件記錄等等,然后在Linux系統上面也建立一個rpm軟件數據庫。如此一來,當你要安裝某個以rpm類型提供的軟件時,在安裝過程中,rpm回去檢驗一下數據庫里面是否已經存在相關的軟件。如果數據庫顯示不存在,那么這個rpm文件默認就不能安裝。這就是rpm類型文件為人詬病的軟件依賴性問題!
rpm依賴性的克服方式:yum在線升級
rpm軟件文件內部會記錄依賴性的資料,要是我將這些依賴性的軟件先列表,在有安裝軟件需求的時候,先到這個列表去找,同時與系統內已經安裝的軟件相比較,沒安裝到的依賴軟件就一口氣同時安裝起來了,那樣就解決了依賴性問題了。這就是yum機制的由來。
軟件倉庫內的清單會記載每個文件的依賴性關系,以及所有文件的URL。
當用戶端有升級、安裝的需求時,yum會向軟件倉庫要求清單的更新,等到清單更新到本機的/var/cache/yum里面后,等一下更新時就會用這個本機清單與本機的rpm數據庫進行比較,這樣就知道該下載什么軟件。接下來yum會跑到軟件倉庫服務器(yum server)下載所需要的軟件,然后再通過rpm的機制開始安裝軟件啦!
RPM軟件管理程序:rpm
RPM的使用不難,只要使用rpm這個命令即可。
rpm -q ? ?#查詢已安裝的軟件
#rpm現在主要是用來查詢與檢驗軟件,安裝通過yum就可以了!
RPM默認安裝的路徑
RPM文件安裝完畢后,該軟件相關信息會被寫入/var/lib/rpm/目錄下的數據庫中。這個目錄內的信息很重要,因為未來如果我們有任何軟件升級的需求,版本之間的比較就是來自于這個數據庫,而且你想要查詢系統已經安裝的軟件也是從這里查詢的!這個目錄主要不要被刪了!
RPM安裝(install)
因為安裝軟件是root的工作,需要是root才能夠操作rpm命令。
rpm -ivh /home/zhang/aaa.rpm ? ?;
rpm -ivh aaa.rpm bbb.rpm ? ?#安裝多個軟件;
rpm -ivh http://www.xxx.com/path/ccc.rpm ? ?#安裝網絡上的么某個文件。
如果我們在安裝的過程中發現問題(如缺少依賴),或者已經知道會發生的問題,但還是要執意安裝此軟件。可以使用如下參數“強制”安裝軟件:
盡量不要通過“暴力安裝”,可能會發生很多不可預期的問題。
RPM升級與更新(upgrade/freshen)
-U, --upgrade=+? ? 升級軟件包;
-F, --freshen=+? ? 如果軟件包已經安裝,升級軟件包。
首先需要下載新版本的rpm包;
使用更新-F 或 -U將系統的軟件更新。
從上看來,如果是大量升級舊版本軟件,使用-Fvh是比較好的辦法。當然,升級也是可以利用--nodeps或--force等參數。不過現在有了yum機制,就不需要上面這些方法了!
RPM查詢(query)
RPM在查詢的時候,是查詢/var/lib/rpm這個目錄下的數據庫文件。另外,RPM也可以查詢未安裝的RPM文件內的信息!
查詢已安裝到系統上面的軟件信息,這部分由/var/lib/rpm/提供;
查詢某個rpm文件內容,等于是由RPM文件內找出一些要寫入數據庫內的信息就是了,使用 -qp;
查詢本機上面的rpm軟件相關信息時,不需要加上版本的名稱,只要軟件名即可!
RPM驗證與數字簽名(Verify/signature)
驗證(Verify)的功能主要是在于提供給系統管理員一個有用的管理機制!使用/var/lib/rpm/下的數據庫內容來比對目前Linux系統的環境下的所有軟件信息。
使用簡單的方法驗證原來的文件系統,好讓你了解修改了哪些文件資料。
-V :后面加的是軟體名稱,若該軟體所含的檔案被更動過,才會列出來;
-Va :列出目前系統上面所有可能被更動過的檔案;
-Vp :后面加的是檔案名稱,列出該軟體內可能被更動過的檔案;
-Vf :列出某個檔案是否被更動過~
文件前面有幾個字母,他們的意思為:
S :(file Size differs) 檔案的容量大小是否被改變;
M :(Mode differs) 檔案的類型或檔案的屬性(rwx) 是否被改變?如是否可執行等參數已被改變;
5 :(MD5 sum differs) MD5 這一種指紋碼的內容已經不同;
D :(Device major/minor number mis-match) 裝置的主/次代碼已經改變;
L :(readLink(2) path mis-match) Link 路徑已被改變;
U :(User ownership differs) 檔案的所屬人已被改變;
T :(mTime differs) 檔案的建立時間已被改變;
P :(caPabilities differ) 功能已經被改變。
文件類型有以下幾類:
c :配置文件(config file);
d :文件資料檔(documentation);
g :鬼文件~通常是該檔案不被某個軟體所包含,較少發生!(ghost file);
l :授權文件(license file);
r :只讀文件(read me)。
數字簽名(digital signature)
驗證只能驗證軟件內的信息與/var/lib/rpm/里面的數據庫信息而已,如果該軟件文件本身就有問題,那使用驗證的手段也無法確定該軟件的正確性啊!我們可以通過數字簽名來檢驗軟件的來源。
就像你自己的簽名一樣,我們的軟件開發商發布的軟件也會有一個廠商自己的簽名系統!只是這個簽名被數字化了。廠商可以利用數字簽名系統產生一個專屬該軟件的簽名,并將公鑰(public key)放出。
首先你必須要先安裝原廠發布的公鑰文件;
實際安裝原廠的RPM軟件時,rpm指令會去讀取RPM文件的簽名信息,與本及系統內的簽名信息比對;
若簽名相同則予以安裝,若找不到相關的簽名信息時,則給予警告并停止安裝。
Centos使用的數字簽名系統為GNU計劃的GnuPG.
Centos數字簽名位于:
rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7 ? ?#安裝
find /etc -name '*GPG-KEY*' ? ?#查找GPG密鑰文件位置
RPM反安裝與重建數據庫(erase/rebuilddb)
反安裝就是將軟件解除安裝,要注意,解安裝的過程一定是由最上層往下層解除。解除A軟件之前先得解除B軟件。
rpm -e xxx ? ?#當然也可以加入--nodeps參數強制移除
由于RPM文件常常會安裝/移除/升級,某些動作可能導致RPM數據庫/var/lib/rpm/內的文件受損。
rpm --rebuilddb ? ?#重建rpm數據庫
YUM在線升級機制
yum就是通過分析RPM的列表頭資料后,根據各軟件的相關性制作出依賴性的解決方案,然后自動處理依賴性軟件問題,以解決軟件安裝或移除與升級的問題。
由于distribution必須要先發布軟件,然后將軟件放置到yum服務器上,以提供給用戶端來要求安裝與升級。因此我們想要使用yum的功能時,必須要先找到適合的yum server才行,每個yum server可能都會提供許多個不同的軟件功能,那就是“軟件倉庫”。因此,你必須要前往yum server查詢到相關的軟件倉庫網址后,再繼續處理后續的設定事宜!
利用yum進行查詢、安裝、升級與移除功能
查詢功能:yum [list | info | search | provides | whatprovides]參數
yum [option] [查詢工作項目] [相關參數]
選項與參數:
[option]:主要的選項有:
-y:自動提供yes回答;
--installroot=/some/path:將該軟件安裝在/some/path下,而不是用默認路徑;
[查詢工作項目][相關參數]有:
search:搜尋某個軟件名稱或描述的重要關鍵字;
list:列出目前yum所管理的所有軟件名稱與版本,類似rpm -qa;
info:類似rpm -qai;
provides:從文件去查找軟件,類似rpm -qf。
升級/安裝功能:yum [install | update]軟件
yum install自動解決依賴性問題!
移除軟件:yum remove 軟件
yum remove 軟件名
雖然yum特別簡單,但也是架構在rpm上面所發展起來的,所以還是需要了解rpm才行。
yum的設置文件
雖然yum 是主機連上Internet就可以用,不過,由于Centos映射的站臺可能會選錯。
舉個栗子,我們中國,可能映射到日本,美國等的服務器,這樣的速度是非常慢的。所以我們可以手動修改yum的設置文件,自定義yum服務器。
最重要的就是 “repodata” 的目錄!該目錄就是分析RPM軟件后所產生的軟件屬性依賴資料存放處!因此,當你要找軟件倉庫所在的網址時,最重要的就是該網址下面一定要有一個名為repodata的目錄存在,那就是軟件倉庫的網址了!
需要注意的幾個是:
[base] ? ?#代表軟件倉庫的名字!中括號[]一定要存在,里面的名稱則可以隨意取,但不能有兩個相同的倉庫名,否則yum會不曉得該到哪里去找相關軟件清單文件;
name ? ?#只是說明這個軟件庫的意義而已,重要性不搞;
mirrorlist ? ?#列出這個軟件倉庫可以使用的映射網址,如果不想使用可以注釋掉;
baseurl ? ?#這個最重要,這個后面接的是軟件庫的實際網址;
enable=1 ? ?#讓這個軟件被啟動;
gpgcheck=1 ? ?#這個就是前面的RPM數字簽名;
gpgkey= ? ?#這兒接數字簽名公鑰文件所在的位置。
修改軟件倉庫產生的問題與解決之道:
由于我們是修改系統默認的設置文件,事實上,我們應該在/etc/yum.repos.d/下面新建一個文件,改文件擴展名必須是.repo才行!
要知道,yum會先下載軟件倉庫的清單到本機的/var/cache/yum里面去!如果我們修改了網址卻沒有修改軟件倉庫名稱(中括號中的文字),可能就會造成本機的清單與yum服務器的清單不同步,就會出現無法更新的問題。
這是就需要清除本機上面的舊資料即可,清除的是/var/cache/yum/里面的文件。
yum的軟件組功能
通過yum來在線安裝一個軟件是非常簡單,但是,如果要安裝一個大型項目呢?如安裝一個KDE?
yum grouplist ? ?#查看目前軟件倉庫與本機上面可用與安裝過的軟件組有哪些
還及得全新安裝Centos時,不是可以選擇所需要的軟件嗎?(mini最小化安裝等),那就是軟件群組。
yum groupinfo "Scientific Support"
yum groupinstall "Scientific Support"
全系統自動升級
我們可以手動選擇是否需要升級,那能不能讓系統自動升級,讓我們的系統隨時保持在最新的狀態。
yum -y update ? ?#自動升級
然后再寫入crontab定時執行
管理的抉擇:RPM還是Tarball
這是一個有趣的問題,如果我要升級或者是全新安裝一個新軟件,那么該選擇RPM還是Tarball來安裝呢?通常建議如下:
優先選擇原廠的RPM功能;
選在軟件官網發布的RPM或者是提供的軟件倉庫網址;
利用Tarball安裝特殊軟件;
用Tarball測試新版軟件;
RPM與Tarball各有其優缺點,不過,如果有RPM的話,那么優先權還是在于RPM安裝上面,畢竟管理上比較便利。但如果軟件的架構差異性太大,或者是無法解決依賴性問題,那么就以Tarball來安裝吧!
基礎服務管理:以Apache為例
一般來說,WWW服務器需要有WWW服務器軟件+網頁程序語言+數據庫系統+程序語言與數據庫的連接軟件等。
另外,在默認的情況下,你無須修改服務的配置文件,通過系統默認值來處理你的服務即可!
1,安裝:yum install 軟件;
2,啟動:systemctl start 軟件;
3,開機自啟:systemctl enable 軟件;
4,防火墻:firewall-cmd --add-service=“服務”;firewall-cmd --add-service=“服務”;
5,測試:用軟件檢查你的服務是否正常。
SRPM的使用:rmpbuild(Optional)
新版的rpm已經將RPM與SRPM的指令分開了,SRPM使用的是rpmbuild這個命令,不是rpm。
利用默認值安裝SRPM文件(--rebuid/--recompile)
直接編譯并安裝SRPM文件的主要選項:
這兩個選項都不會修改SRPM的值,僅是通過再次編譯來產生RPM可安裝軟件文件而已。
一般來說,如果你需要用到SRPM的文件,大部分原因就是你需要重新修改里面的某些設置,讓軟件加入某些特殊功能等等。
SRPM使用的路徑與需要的軟件
SRPM既然含有source code,那么其中必有配置文件,所以首先我們必須知道,這個SRPM在進行編譯的時候會使用到哪些目錄,這樣才能夠來修改!
假設使用root身份來進行SRPM的操作,會有以下目錄:
此外,在編譯過程中,可能會發生不明的錯誤,或者是設置的錯誤,這個時候就會在/tmp下產生一個相對應的錯誤文件,你可以根據該錯誤文件進行排錯。編譯成功之后,/root/rpmbuild/{SPECS,SOURCES,BUILD}等文件都會被殺掉,而只剩下放在/root/rpmbuild/RPMS下的文件了。
設置文件的主要內容(*.spec)
我們知道在/root/rpmbuild/SOURCES里面放置源碼(Tarball)以及相關升級文件(patch file),而編譯步驟(./configure, make,make install等)產生的文件就放置在/root/rpmbuild/SPECS文件中。
cd /root/rpmbuild/SPECS
vim xxx.spec
這個xxx.spec文件是將SRPM編譯成RPM的配置文件,基本規則如下:
1,整個文件的開頭都已Summary開始,這部分的設置都是最基礎的說明內容;
2,然后每個不同的段落之間,都以%來作為開頭,例如%prep與%install等;
系統整體信息方面:
上面幾個資料通常都必須要寫,但是如果你的軟件沒有依賴性的關系時,那么就可以不需要那個REquires。根據上面的設置,最終的文件名就是[ {name}-{Version}-{Release}-.{Arch}.rpm ] 的格式。
%description:軟件的一個簡短說明;
%prep:未進行設置或安裝前,你要編譯完成的RPM幫你事先做的事情,就是prepare。
#1,進行軟件的補丁(patch)等相關工作;
#2,尋找軟件所需的目錄是否已經存在?確認用的!
#3,實現建立你的軟件所需要的目錄,或者事先需要進行的任務;
#4,如果待安裝的Linux系統內已經有安裝的時候可能會被覆蓋掉的文件,那么就需要進行備份(backup)的工作了。
%build:這個段落就是在談怎么make編譯成為可執行的程序;
%install:編譯完成后的安裝;
%files:這個軟件安裝的文件都需要寫到這里來;
%changelog:這個項目主要實在記錄這個軟件曾經的更新記錄;
SRPM的編譯命令(-ba/-bb)
要在/root/rpmbuild下文件編譯或者是單純的打包成為RPM或SRPM時,就需要rpmbuild命令與相關選項的幫助了。
rpmbuild -ba xxx.spec ? ?#編譯并同時產生RPM與SRPM文件;
rpmbuild -bb ?xxx.spec ? ?#僅編譯成RPM文件;
這個時候系統就會這樣做:
1,先進入BUILD這個目錄,/root/rpmbuild/BUILD;
2,依照xxx.spec文件內的Name與Version定義出工作的目錄名稱,并進入該目錄;
3,在新建的目錄里面,針對SOURCES目錄下的來源文件,也就是xxx.spec里面的Source設置的那個文件,以tar進行解壓縮;
4,再來開始%build以及%install的設置與編譯;
5,最后將完成打包的文件給他放置到該放置的地方去。
一個打包自己軟件的范例
我們來自己編輯一下自己制作的RPM怎么樣?哈哈哈!
制作源碼文件Tarball生成:
建立xxx.spec的設置文件:
這個文件的配置是所有rpm制作里面最重要的課題!
編譯成為RPM與SRPM:
那個spec文件配置妥當后,后續的動作就簡單的要命了!
安裝/測試/實際查詢: