優點:
包管理系統簡單,只通過幾個命令就可以實現包的安裝、升級、查詢和卸載
安裝速度比源碼包安裝快的多
缺點:
經過編譯,不再可以看到源代碼
功能選擇不如源碼包靈活
依賴性
有時我們會發現需要安裝軟件包a時需要先安裝b和c,而安裝b時需要安裝d和e。這是需要先安裝d和e,再安裝b和c,最後才能安裝a包。比如說,我買了個漂亮的燈具,打算安裝到我們家客廳,可是在安裝燈具之前我們家客廳總要有頂棚吧,頂棚總要是做好了防水和刷好油漆了吧,這個裝修和安裝軟件其實類似總要有一定的順序的。可是有時依賴性會非常繁瑣。
若在安裝rpm包提示缺少依賴時,可通過www.rpmfind.net查找該依賴存在哪個包中,安裝包含該依賴的包即可。
命名規則httpd-2.2.15-15.e16.centos.1.i686.rpm
httpd 軟件包名
2.15 軟件版本
15 軟件發布的次數
e16軟件發行商。el6 是RedHat 公司發布,適合x(Red Hat Enterprise Linux)和Cent0S6.x下使用。
i686 適合的硬件平台。RPM包可以在不同的硬件平台安裝,選擇適合不同CPU的軟件版本,可以最大化的發揮CPU性能,所以出現了所謂的i386(386以上計算機都可以安裝)、i586(586以上的計算機都可以安裝)、i686(奔騰II以上計算機都可以安裝,目前所有的CPU都是奔騰II以上,所以這個軟件版本居多)、x86_64(64位CPU可以安裝)和noarch(沒有硬件限制)等文件名了。
rpm rpm包的擴展名。我們說過Linux下文件不是靠擴展名區分文件類型,也就是Linux中擴展名沒有任何含義。可是這裏怎麽又出現了擴展名呢?原因很簡單,如果我不把RPM的擴展名叫做".rpm",管理員很難知道這是一個RPM包,當然也就無法正確安裝了。也就是說如果RPM包不用".rpm"作爲擴展名,系統可以正確識別沒有問題,可是管理員很難識別這是個什麽樣的軟件。
包全名:如果操作的是未安裝軟件包,則使用包全名,而且需要注意絕對路徑
包名:如果操作的是已經安裝的軟件包,則使用包名即可,系統會生産RPM包的數據庫
默認安裝位置
/etc/配置文件安裝目錄/usr/bin/可執行的命令安裝目錄/usr/lib/程序所使用的函數庫保存位置/usr/share/doc/基本的軟件使用手冊保存位置/usr/share/man/幫助文件保存位置rpm安裝命令[root@aliyun ~]# rpm [選項] 包全名
-a 查詢所有的軟件包
-b或-t 設置包裝套件的完成階段,並指定套件檔的文件名稱;
-c 只列出組態配置文件,本參數需配合”-l”參數使用
-d 只列出文本文件,本參數需配合”-l”參數使用
-e 卸載軟件包
-f 查詢文件或命令屬于哪個軟件包
-h 安裝軟件包時列出標記
-i 安裝軟件包
-l 顯示軟件包的文件列表
-p 查詢指定的rpm軟件包
-q 查詢軟件包
-R 顯示軟件包的依賴關系
-s 顯示文件狀態,本參數需配合”-l”參數使用
-U 升級軟件包
-v 顯示命令執行過程
-vv 詳細顯示指令執行過程
--nodeps 不檢測依賴性安裝。軟件時會檢測依賴性,確定所需的底層軟件是否安裝。
如果沒有安裝則會報錯。如果我不管依賴性,想強行安裝,可以使用這個選項。注意:這樣不檢測依賴性安裝的軟件基本是不能使用的,所以不建議這樣做
--replacefiles 替換文件安裝。如果安裝軟件包,可是包中部分文件已經存在,那麽正常安裝時候,會報錯“某個文件已經存在”從而導致軟件無法安裝,使用這個選項可以忽視這個報錯,而覆蓋安裝
--replacepkgs 替換軟件包安裝。如果軟件包已經安裝,此選項可以把軟件包重複安裝一遍。
--force 強制安裝。不管是否已經安裝,都重新安裝。就是-replacefiles和--replacepkgs 的綜合。
--test 測試安裝。不會實際安裝,只是檢測一下依賴性。
--prefix 指定安裝路徑。爲安裝軟件指定安裝路徑,而不使用默認安裝路徑。注意:如果指定了安裝路徑,軟件沒有安裝到系統默認路徑中的話,系統會找不到這些安裝的軟件,需要進行手工配置才能被系統識別。所以rpm包我們一般都采用默認路徑安裝。
驗證基本驗證
rpm -V 已安裝的軟件名列出該軟件被修改過的配置文件
rpm -Vf 文件名稱列出某個文件是否被改動過修改
[root@loaclhost ~]# rpm -Vf /etc/zabbix/zabbix_agentd.confS.5....T. c /etc/zabbix/zabbix_agentd.conf#表示此文件的Size,MD5,modify time不一致,且這是一個配置文件
出現了提示信息,我們來解釋下最前面共有8個信息內容,是表示驗證內容的。文件名前面的c是表示這是個配置文件(configuration)。最後是文件名。那麽驗證內容中的8個信息的具體內容如下:
S 文件大小是否改變
M 文件的類型或文件的權限(rwx)是否被改變
5 文件MD5校驗和是否改變(可以看成文件內容是否改變)
D 設備的主從代碼是否改變
L 文件路徑是否改變
U)文件的屬主(所有者)是否改變
G 文件的屬組是否改變
T0文件的修改時間是否改變
apache配置文件的文件類型是c,那麽還有哪些文件類型呢?
c 配置文件(config file)
d 普通文檔(documentation)
g"鬼”文件(ghost file),很少見,就是該文件不應該被這個RPM包包含1授權文件(license file)
r描述文件(read me)
RPM包中文件的提取
cpio命令
cpio 命令主要有三種基本模式:“-o”模式指的是 copy-out 模式,就是把數據備份到文件庫中;
“-i”模式指的是 copy-in 模式,就是把數據從文件庫中恢複;“-p”模式指的是複制模式,就是不把數據備份到 cpio 庫中,而是直接複制爲其他文件。命令如下:
[root@aliyun ~]# cpio -o[vcB] > [文件|設備]
備份
-o:copy-out 模式,備份
-v:顯示備份過程
-c:使用較新的 portable format 存儲方式
-B:設定輸入輸出塊爲 5120bytes,而不是模式的 512butes
[root@aliyun ~]# cpio -i[vcdu] < [文件|設備]
還原
-i:copy-in 模式,還原
-v:顯示還原過程
-c:使用較新的 portable format 存儲方式
-d:還原時自動新建目錄
-u:自動使用較新的文件覆蓋較舊的文件
[root@aliyun ~]# cpio -p 目標目錄
舉幾個例子吧,先來看看使用 cpio 備份數據的方法,命令如下:
# 利用 find 指定要備份/etc/目錄,使用>導出到 etc.cpio 文件[root@aliyun ~]# find /etc -print | cpio -ocvB > /root/etc.cpio[root@aliyun ~]# ll -h etc.cpio- rw-r--r--. 1 root root 21M 6 月 5 12:29 etc.cpio #etc.cpio 文件生成# 再來看看如何恢複 cpio 的備份數據,命令如下:[root@aliyun ~]# cpio -idvcu < /root/etc.cpio #還原 etc 的備份# 但是如果大家查看下當前目錄/root,會發現沒有生成 etc 目錄。這是因爲備份是/etc 目錄使用的是絕對路徑,所以恢複的數據直接恢複到了/etc 系統目錄中,而沒有生成在/root/etc 中。# 在 CentOS5.x 的版本中,是可以利用上面的命令備份與恢複指定的文件。但是到 CentOS6.x 當中,需要更加嚴謹。如果備份時使用絕對路徑,則恢複的數據會直接到絕對路徑指定的路徑中,如果需要把數據恢複到當前目錄中,則需要使用相對路徑,例如:# 備份:[root@aliyun ~]# cd /etc #進入/etc 目錄# 利用 find 指定要備份/etc/目錄,使用>導出到 etc.cpio 文件[root@aliyun ~]# find . -print | cpio -ocvB > /root/etc.cpio#恢複:[root@aliyun ~]# cd /root #回到/root 目錄中[root@aliyun ~]# mkdir etc_test #建立恢複測試目錄[root@aliyun ~]# cd etc_test #進入測試目錄,數據恢複到此#還原/etc 目錄的數據,因爲備份時使用的是相對路徑,則會還原到/root/etc_test/目錄下[root@localhost etc_test]# cpio -idvcu < /root/etc.cpio#最後來演示一下 cpio 命令的“-p”複制模式,命令如下:[root@aliyun ~]# cd /tmp/ #進入/tmp 目錄[root@localhost tmp]# rm -rf * #刪除/tmp 目錄中所有數據[root@localhost tmp]# mkdir test #建立備份目錄#備份/boot/目錄到/tmp/test/目錄中[root@localhost tmp]# find /boot/ -print | cpio -p /tmp/test
提取 RPM 包中文件
[root@aliyun ~]# rpm2cpio 包全名 | cpio -idv .文件絕對路徑
rpm2cpio #將 rpm 包轉換爲 cpio 格式的命令
cpio #是一個標准工具,它用于創建軟件檔案文件和從檔案文件中提取文件
舉個例子,現在我假設把系統中的/bin/ls 命令不小心誤刪除了,那麽我可以修複回來嗎?這時有兩種方法修複,要不就是使用—force 選項覆蓋安裝一遍 coreutils-8.4-19.el6.i686 包,要不就可以使用 cpio 命令提取出/bin/ls 命令文件,再把它拷貝到對應位置就可以了。不過我是怎麽知道/bin/ls命令是屬于 coreutils-8.4-19.el6.i686 這個軟件包的呢?還記得-qf 選項嗎?命令如下:
[root@aliyun ~]# rpm -qf /bin/ls #查看 ls 文件屬于哪個軟件包# 那麽我們在講 RPM 包中文件提取,所以我們使用第二章方法,cpio 命令提取出 ls 命令文件,然後拷貝到對應位置,命令如下:#把/bin/ls 命令移動到/root 目錄下,造成誤刪除的假象[root@aliyun ~]# mv /bin/ls /root/[root@aliyun ~]# ls- bash: ls: command not found #這時執行 ls 命令,系統會報錯“命令沒有找到”# 提取 ls 命令文件到當前目錄下[root@aliyun ~]# rpm2cpio /mnt/cdrom/Packages/coreutils-8.4-19.el6.i686.rpm | cpio -idv ./bin/ls ./bin/ls[root@aliyun ~]# cp /root/bin/ls /bin/ #把提取出來的 ls 命令文件複制到/bin 目錄下[root@aliyun ~]# lsanaconda-ks.cfg bin inittab install.log install.log.syslog ls#恭喜你,ls 命令又可以正常使用了
yum安裝yum源文件解析yum 源配置文件保存在/etc/yum.repos.d/目錄中,文件的擴展名一定是“.repo”。也就是說,yum 源配置文件只要擴展名是“.repo”就會生效。
[root@aliyun ~]# ls /etc/yum.repos.d/CentOS-Base.repo CentOS-Debuginfo.repo CentOS-fasttrack.repo CentOS-Media.repo CentOS-Vault.repo
這個目錄中有 5 個 yum 源配置文件,默認情況下 CentOS-Base.repo 文件生效。我們打開這個文
件看看,命令如下:
[root@localhost yum. repos. d]# vim /etc/yum. repos. d/CentOS-Base. repo[base]name=CentOS-$releasever-Basemirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=osbaseurl=http://mirror.centos. org/centos/$releasever/os/$basearch/gpgcheck=1gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
在 CentOS-Base.repo 文件中有 5 個 yum 源容器,這裏只列出了 base 容器,其他容器和 base 容
器類似。我們解釋一下 base 這個容器。
[base]:容器名稱,一定要放在[]中。
name:容器說明,可以自己隨便寫。
mirrorlist:鏡像站點,這個可以注釋掉。
baseurl:我們的 yum 源服務器的地址。默認是 CentOS 官方的 yum 源服務器,是可以使用的。如果你覺得慢,則可以改成你喜歡的 yum 源地址。
enabled:此容器是否生效,如果不寫或寫成 enabled=1 則表示此容器生效,寫成 enabled=0則表示此容器不生效。
gpgcheck:如果爲 1 則表示 RPM 的數字證書生效;如果爲 0 則表示 RPM 的數字證書不生效。
gpgkey:數字證書的公鑰文件保存位置。不用修改。
更換 or 搭建本地光盤yum源通常使用centos官方yum源時會比較慢,可以更換爲國內yum源。當主機無法使用外網時,可以使用本地yum源。這部分在後期文章中介紹。
yum命令[root@aliyun ~]# yum [選項] 軟件包
-h 顯示幫助信息
-y 對所有的提問都回答“yes”
-c 指定配置文件
-q 安靜模式
-v 詳細模式
-t 檢查外部錯誤
-d 設置調試等級(0-10)
-e 設置錯誤等級(0-10)
-R 設置yum處理一個命令的最大等待時間
-C 完全從緩存中運行,而不去下載或者更新任何頭文件
install 安裝rpm軟件包
update 更新rpm軟件包
check-update 檢查是否有可用的更新rpm軟件包
remove 刪除指定的rpm軟件包
list 顯示軟件包的信息
search 檢查軟件包的信息
info 顯示指定的rpm軟件包的描述信息和概要信息
clean 清理yum過期的緩存
shell 進入yum的shell提示符
resolvedep 顯示rpm軟件包的依賴關系
localinstall 安裝本地的rpm軟件包
localupdate 顯示本地rpm軟件包進行更新
deplist 顯示rpm軟件包的所有依賴關系
yum組管理命令形式就直接在對應的選項前加上group即可。例如查詢組列表 yum grouplist
源碼包安裝注意事項應該選擇哪種軟件包?
如果軟件包是給大量客戶提供訪問,建議使用源碼包安裝,如LAMP環境搭建,因爲源碼包效率更高。
如果軟件包是給Linux底層使用,或只給少量客戶訪問,建議使用rpm包安裝,因爲rpm包簡單。
源碼包是從哪裏來的?
rpm包是光盤中直接包含的,所以不需要用戶單獨下載。而源碼包是通過官方網站下載的,如果需要使用,是需要單獨下載的。
安裝過程我們來解釋一下源碼包安裝的具體步驟。
(1)下載軟件包。
(2)解壓縮。
(3)進入解壓目錄。
(4)./configure 編譯前准備
這一步主要有三個作用:
在安裝之前需要檢測系統環境是否符合安裝要求。
定義需要的功能選項。“./configure”支持的功能選項較多,可以執行“./configure --help”命令查詢其支持的功能。一般都會通過“./configure --prefix=安裝路徑”來指定安裝路徑。
把系統環境的檢測結果和定義好的功能選項寫入 Makefile 文件,後續的編譯和安裝需要依賴這個文件的內容。
需要注意的是,configure 不是系統命令,而是源碼包軟件自帶的一個腳本程序,所以必須采用“./configure”方式執行(“./”代表在當前目錄下)。
(5)make編譯
make 會調用 gcc 編譯器,並讀取 Makefile 文件中的信息進行系統軟件編譯。編譯的目的就是把源碼程序轉變爲能被 Linux 識別的可執行文件,這些可執行文件保存在當前目錄下。編譯過程較爲耗時,需要有足夠的耐心。
(6)make clean:清空編譯內容(非必需步驟)。
如果在“./configure”或“make”編譯中報錯,那麽我們在重新執行命令前一定要記得執行 make clean 命令,它會清空 Makefile 文件或編譯産生的“.o”頭文件。
(7)make install: 編譯安裝
這才是真正的安裝過程,一般會寫清楚程序的安裝位置。如果忘記指定安裝目錄,則可以把這個命令的執行過程保存下來,以備將來刪除使用。
刪除源碼包沒有刪除命令,如果需要刪除,直接刪除安裝目錄即可。
補丁生成補丁
diff:比較兩個文件的不同
[root@aliyun ~]# diff選項old new
-a 將任何文檔當做文本文檔處理
-b 忽略空格造成的不同
-B 忽略空白行造成的不同
-I 忽略大小寫造成的不同
-N 當比較兩個目錄時,如果某個文件只在一個目錄中,則在另一個目錄中視作空文件
-r 當比較目錄時,遞歸比較子目錄
-u 使用同一的輸出格式
[root@localhost]# mkdir test # 建立測試目錄[root@localhost]# cd test # 進入測試目錄[root@localhost test]#cat > old.txt <<-EOF # 文件 old.txt,爲了一會輸出便于比較,每行分開ourschoolisxuansuEOF[root@localhost test]#cat > new.txt <<-EOFourschoolisxuansuinBeijing# 比較兩個文件的不同,同時生成 txt.patch 補丁文件[root@localhost test]#diff -Naur /root/test/old.txt /root/test/new.txt > txt.patch[root@localhost test]#cat txt.patch # 查看下這個文件----/root/test/old.txt 2012-11-23 05:51:14.347954373 +0800 # 前一個文件++++/root/test/new.txt 2012-11-23 05:50:05.772988210 +0800 # 後一個文件@ @ -2,3 +2,5 @ @schoolisxuansu+in+beijing
後一個文件比前一個文件多兩行,使用 + 號表示
打入補丁
[root@localhost test]# patch –pn < 補丁文件
-pn n 爲數字。代表按照補丁文件中的路徑,指定更新文件的位置。
“-pn”不好理解,我們說明下。補丁文件是要打入舊文件的,但是你當前所在的目錄和補丁文
件中的記錄的目錄是不一定匹配的,所以就需要“-pn”來同步兩個目錄。
比如我當前是在“/root/test”目錄中(我要打補丁的舊文件就在當前目錄下),補丁文件中記錄的文件目錄爲“/root/test/old.txt”,這時如果寫入“-p1”(在補丁文件目錄中取消一級目錄)那麽補丁文件就會打入“/root/test/root/test/old.txt”文件中,這顯然是不對的。那如果寫入的是“-p2”(在補丁文件目錄中取消二級目錄)那麽補丁文件打入的就是“/root/test/test/old.txt”,這顯然也不對。如果寫入的是“-p3”(在補丁文件目錄中取消三級目錄)那麽補丁文件就是打入的“/root/test/old.txt”,我們的 old.txt 文件就在這個目錄下,所以就應該是“-p3”。 那麽我們更新下“old.txt”文件,命令如下:
[root@localhost test]# patch-p3 < txt.patch patching file old.txt # 給 old.txt 文件打補丁[root@localhost test]# cat old.txt # 查看下old.txtourschoolisatguiguinBei jing# 多出來了 in Beijing 兩行
腳本安裝程序腳本程序簡介腳本程序包並不多見,所以在軟件包分類中並沒有把它列爲一類。它更加類似于 Windows 下的程序安裝,有一個可執行的安裝程序,只要運行安裝程序,然後進行簡單的功能定制選擇(比如指定安裝目錄等),就可以安裝成功,只不過是在字符界面下完成的