版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
在本文中,學習如何在Linux系統(tǒng)上使用RPM和YUM包管理工具管理包。學習:使用RPM和YUM安裝、卸載、升級和刪除包獲取版本、狀態(tài)、依賴關(guān)系、完整性和簽名等RPM包相關(guān)信息判斷一個包提供哪些文件,查明某個文件來自哪個包先決條件為了最有效地利用本系列中的文章,您應(yīng)該具有基本的Linux知識,并需要準備一個Linux系統(tǒng)用于練習本文介紹的命令。有時候不同版本的程序輸出格式不同,因此您所得到的結(jié)果未必總是與這里所示的清單和圖相同,特別是許多輸出高度依賴于系統(tǒng)上已經(jīng)安裝的包。您自己的輸出可能很不一樣,但是應(yīng)該能夠看出重要的共同點。包管理簡介過去,許多Linux程序以源代碼的形式發(fā)行,用戶把源代碼構(gòu)建為所需的程序或程序集;源代碼還附帶必需的手冊頁、配置文件等等?,F(xiàn)在,大多數(shù)Linux發(fā)行商使用稱為包的預(yù)構(gòu)建的程序或程序集,包便于在發(fā)行版上安裝。在本文中,學習幫助安裝、更新和刪除包的包管理工具。本文主要關(guān)注RedHat開發(fā)的RedHatPackageManager(RPM),以及DukeUniversity物理系最初為管理RedHatLinux系統(tǒng)開發(fā)的YellowdogUpdaterModified(YUM)。從用戶的角度來說,基本的包管理功能由命令提供。Linux開發(fā)人員一直致力于讓Linux更容易使用,他們開發(fā)了其他工具(包括GUI工具)來補充基本工具,這對最終用戶隱藏了基本工具的一部分復雜性。在本文和學習Linux,101:Debian包管理中,我們主要討論基本工具,但是也會提到一些其他工具,讓您能夠繼續(xù)研究它們。RPM、YUM和APT(適用于Debian系統(tǒng))有許多相似之處。它們都可以安裝和刪除包。關(guān)于安裝的包的信息保存在數(shù)據(jù)庫中。它們都有基本的命令行功能,同時通過其他工具提供對用戶更友好的界面。它們都可以從Internet獲取包。在安裝Linux系統(tǒng)時,通常會安裝許多包。這個集合可能是根據(jù)系統(tǒng)的用途定制的,比如服務(wù)器、桌面或開發(fā)工作站。有時候,可能需要安裝新的包以添加新功能,更新現(xiàn)有的包,甚至刪除不再需要或已經(jīng)被新的包取代的包。我們來看看如何完成這些任務(wù)以及如何解決一些相關(guān)的難題,比如尋找包含某一命令的包。RPMRedHat于1995年引入了RPM。RPM現(xiàn)在是LinuxStandardBase(LSB)中采用的包管理系統(tǒng)。rpm命令選項分為三組:用于查詢和檢查包用于安裝、升級和刪除包用于執(zhí)行其他功能在本文中,我們主要關(guān)注前兩組命令選項。在RPM的手冊頁中可以找到其他功能的相關(guān)信息。還應(yīng)該注意rpm是操作RPM的主要命令,而.rpm是RPM文件使用的擴展名。所以“一個rpm”或“某某rpm”一般是指RPM文件,而rpm通常指命令。YUMYUM在RPM系統(tǒng)中增加了自動更新和包管理,包括依賴關(guān)系管理。與DebianAdvancedPackagingTool(APT)一樣,除了了解系統(tǒng)上安裝的包之外,YUM還使用存儲庫。存儲庫是包的集合,通??梢酝ㄟ^網(wǎng)絡(luò)連接訪問它們。安裝RPM包假設(shè)您想學Lisp,一位同事讓您使用gcl命令。您試著輸入gcl
--help、which
gcl或type
gcl。但是,如果系統(tǒng)無法找到gcl,您可能會看到與清單1相似的輸出。清單1.沒有找到gcl命令[ian@echidna~]$gcl--helpbash:gcl:commandnotfound[ian@echidna~]$whichgcl/usr/bin/which:nogclin(/usr/lib64/qt-3.3/bin:/usr/kerberos/sbin:/usr/kerberos/bin:/usr/lib64/ccache:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/ian/bin)[ian@echidna~]$typegclbash:type:gcl:notfound您可能會問同事要安裝哪個包,也可能猜想gcl命令應(yīng)該在gcl包中。這種猜測常常是對的,但是也不總是。我們稍后會看到如何尋找正確的包。在這里,需要gcl包。假設(shè)您已經(jīng)下載或以其他方式獲得了這個包的拷貝,可以使用帶-i(代表安裝)選項的rpm命令安裝它,見清單2。清單2.用rpm安裝gcl——第一次嘗試[root@echidna~]#rpm-igcl-2.6.8-0.6.20090701cvs.fc12.x86_64.rpmerror:Faileddependencies:gcl-selinuxisneededbygcl-2.6.8-0.6.20090701cvs.fc12.x86_64rpm命令知道這個包有一個依賴包,但是它并不幫助您解決依賴問題。您需要自己獲取依賴包,然后再次嘗試,看看是否還有其他依賴包—重復這個過程,直到滿足所有依賴關(guān)系為止。好消息是,可以向rpm命令提供要安裝的包的列表,如果滿足所有依賴關(guān)系,它會以正確的次序安裝所有包。因此,您至少不必以正確的次序手工安裝每個包。如果您使用過Debian的APT,可能希望有像apt-get命令一樣的功能,apt-get命令會尋找需要的東西(包括依賴包)并安裝它們。對于基于RPM的系統(tǒng),YUM(YellowdogUpdaterModified)提供這種功能。清單3說明如何使用帶install選項的yum命令安裝gcl和必需的gcl-selinux包。清單3.使用yum安裝gcl[root@echidna~]#yuminstallgclLoadedplugins:presto,refresh-packagekitSettingupInstallProcessResolvingDependencies-->Runningtransactioncheck--->Packagegcl.x86_640:2.6.8-0.7.20100201cvs.fc12settobeupdated-->ProcessingDependency:gcl-selinuxforpackage:gcl-2.6.8-0.7.20100201cvs.fc12.x86_64-->Runningtransactioncheck--->Packagegcl-selinux.x86_640:2.6.8-0.7.20100201cvs.fc12settobeupdated-->FinishedDependencyResolutionDependenciesResolved=====================================================================================PackageArchVersionRepositorySize=====================================================================================Installing:gclx86_642.6.8-0.7.20100201cvs.fc12updates6.3MInstallingfordependencies:gcl-selinuxx86_642.6.8-0.7.20100201cvs.fc12updates17kTransactionSummary=====================================================================================Install2Package(s)Upgrade0Package(s)Totaldownloadsize:6.4MInstalledsize:40MIsthisok[y/N]:yDownloadingPackages:SettingupandreadingPrestodeltametadataupdates/prestodelta|964kB00:01ProcessingdeltametadataPackage(s)datastilltodownload:6.4M(1/2):gcl-2.6.8-0.7.20100201cvs.fc12.x86_64.rpm|6.3MB00:12(2/2):gcl-selinux-2.6.8-0.7.20100201cvs.fc12.x86_64.rpm|17kB00:00-------------------------------------------------------------------------------------Total398kB/s|6.4MB00:16Runningrpm_check_debugRunningTransactionTestTransactionTestSucceededRunningTransactionInstalling:gcl-selinux-2.6.8-0.7.20100201cvs.fc12.x86_641/2Installing:gcl-2.6.8-0.7.20100201cvs.fc12.x86_642/2Installed:gcl.x86_640:2.6.8-0.7.20100201cvs.fc12DependencyInstalled:gcl-selinux.x86_640:2.6.8-0.7.20100201cvs.fc12Complete!清單3中的輸出表明,YUM在名為“updates”的存儲庫中找到了gcl.x86_640:2.6.8-0.7.20100201cvs.fc12和gcl-selinux.x86_640:2.6.8-0.7.20100201cvs.fc12(稍后詳細討論),并判斷出總下載大小。按“y”同意之后,它下載這兩個包,然后安裝依賴包,最后安裝gcl。在本文后面會進一步討論依賴關(guān)系。包的位置在前一節(jié)中,學習了如何安裝RPM包。但是,包來自什么地方呢?yum如何知道從哪里下載包?起點是/etc/yum.repos.d/目錄,這個目錄常常包含幾個repo文件。這是repo的默認位置,但是可以在YUM配置文件(通常是/etc/yum.conf)中指定其他位置。清單4給出fedora-updates.repo,我們從它所對應(yīng)的位置獲取gcl并安裝在我的Fedora12系統(tǒng)上。典型的repo文件分為三個部分,一個用于一般的包,一個用于調(diào)試包,最后一個用于源代碼包。常常可以從不同的位置(即鏡像)獲取發(fā)行版的包拷貝。所以repo文件告訴yum在哪里可以找到每個部分的最新鏡像列表。注意,發(fā)行版的發(fā)布級別和機器架構(gòu)表示為參數(shù),所以對于我的x86_64Fedora12系統(tǒng),yum會從/metalink?repo=updates-released-f12&arch=x86_64下載列表。除了存儲庫位置之外,repo文件還指出某個存儲庫是否啟用了,以及是否應(yīng)該使用GPG簽名檢查下載的包。清單4.fedora-updates.repo[ian@echidna~]$cat/etc/yum.repos.d/fedora-updates.repo[updates]name=Fedora$releasever-$basearch-Updatesfailovermethod=priority#baseurl=/pub/fedora/linux/updates/$releasever/$basearch/mirrorlist=/metalink?repo=updates-released-f$releasever&arch=$basearchenabled=1gpgcheck=1gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-$basearch[updates-debuginfo]name=Fedora$releasever-$basearch-Updates-Debugfailovermethod=priority#baseurl=/pub/fedora/linux/updates/$releasever/$basearch/debug/mirrorlist=/metalink?repo=updates-released-debug-f$releasever&arch=$basearchenabled=0gpgcheck=1gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-$basearch[updates-source]name=Fedora$releasever-UpdatesSourcefailovermethod=priority#baseurl=/pub/fedora/linux/updates/$releasever/SRPMS/mirrorlist=/metalink?repo=updates-released-source-f$releasever&arch=$basearchenabled=0gpgcheck=1gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-$basearchYUM和RPM使用本地數(shù)據(jù)庫判斷安裝的包。本地數(shù)據(jù)庫中存儲的包元數(shù)據(jù)是從啟用的存儲庫獲取的。盡管很少需要為本地數(shù)據(jù)庫操心,但是可以使用yum
clean命令清除本地存儲的信息的不同部分,使用yum
makecache在本地數(shù)據(jù)庫中為啟用的repo創(chuàng)建信息。例如,如果修改了repo配置,就可能需要這么做。刪除RPM包如果要刪除包,可以使用yum的remove選項或rpm的-e選項。使用rpm
-e刪除gcl的試運行見清單5。如果可以刪除這個包,就不會有輸出。清單5.試刪除gcl[root@echidna~]#rpm-e--testgcl與使用apt-get模擬刪除Debian包不同,RPM系統(tǒng)并不維護自動安裝的包的相關(guān)信息,所以無法通過試刪除查明哪些依賴包也可以刪除。但是,如果在單一命令中指定多個要刪除的包,那么沒有依賴關(guān)系的包會先于有依賴關(guān)系的包刪除。與安裝包不同,當使用rpm刪除包時,在刪除包之前沒有提示。但是,如果試圖刪除其他包需要的包,它不會執(zhí)行刪除操作,您會看到清單6所示的錯誤消息。清單6.用rpm刪除依賴包[root@echidna~]#rpm-egcl-selinuxerror:Faileddependencies:gcl-selinuxisneededby(installed)gcl-2.6.8-0.7.20100201cvs.fc12.x86_64如果使用yum
remove,在執(zhí)行事務(wù)測試之后會顯示提示。如果試圖刪除的包是其他已安裝包的依賴包,YUM會提議刪除這些包和依賴包,見清單7。清單7.用yum刪除依賴包[root@echidna~]#yumremovegcl-selinuxLoadedplugins:presto,refresh-packagekitSettingupRemoveProcessResolvingDependencies-->Runningtransactioncheck--->Packagegcl-selinux.x86_640:2.6.8-0.7.20100201cvs.fc12settobeerased-->ProcessingDependency:gcl-selinuxforpackage:gcl-2.6.8-0.7.20100201cvs.fc12.x86_64-->Runningtransactioncheck--->Packagegcl.x86_640:2.6.8-0.7.20100201cvs.fc12settobeerased-->FinishedDependencyResolutionDependenciesResolved=====================================================================================PackageArchVersionRepositorySize=====================================================================================Removing:gcl-selinuxx86_642.6.8-0.7.20100201cvs.fc12@updates90kRemovingfordependencies:gclx86_642.6.8-0.7.20100201cvs.fc12@updates40MTransactionSummary=====================================================================================Remove2Package(s)Reinstall0Package(s)Downgrade0Package(s)Isthisok[y/N]:nExitingonuserCommandComplete!升級RPM包既然已經(jīng)了解了如何安裝和刪除RPM,我們來看看如何把RPM包升級到更高級別??梢允褂脃um
update更新整個系統(tǒng),還可以指定單一包或通配符。清單8說明如何更新所有名稱以“gr”開頭的包。注意,這里使用撇號防止shell展開“*”。清單8.使用yumupdate執(zhí)行更新[root@echidna~]#yumupdate'gr*'Loadedplugins:presto,refresh-packagekitSettingupUpdateProcessResolvingDependencies-->Runningtransactioncheck--->Packagegrep.x86_640:2.6.3-1.fc12settobeupdated--->Packagegroff.x86_640:-20.fc12settobeupdated-->FinishedDependencyResolutionDependenciesResolved=====================================================================================PackageArchVersionRepositorySize=====================================================================================Updating:grepx86_642.6.3-1.fc12updates228kgroffx86_64-20.fc12updates1.5MTransactionSummary=====================================================================================Install0Package(s)Upgrade2Package(s)Totaldownloadsize:1.7MIsthisok[y/N]:yDownloadingPackages:SettingupandreadingPrestodeltametadataProcessingdeltametadataDownloaddeltasize:854k/pub/linux/fedora/linux/updates/12/x86_64/drpms/grep-2.5.3-6.fc12_2.6.3-1.fc12.x86_64.drpm:[Errno14]HTTPError404:/pub/linux/fedora/linux/updates/12/x86_64/drpms/grep-2.5.3-6.fc12_2.6.3-1.fc12.x86_64.drpmTryingothermirror.(1/2):grep-2.5.3-6.fc12_2.6.3-1.fc12.x86_64.drpm|214kB00:00(2/2):groff--18.fc12_-20.fc12.x86_64.drpm|640kB00:00Finishingrebuildofrpms,fromdeltarpms<deltarebuild>|1.7MB00:02Prestoreducedtheupdatesizeby52%(from1.7Mto854k).Runningrpm_check_debugRunningTransactionTestTransactionTestSucceededRunningTransactionUpdating:grep-2.6.3-1.fc12.x86_641/4Updating:groff--20.fc12.x86_642/4Cleanup:grep-2.5.3-6.fc12.x86_643/4Cleanup:groff--18.fc12.x86_644/4Updated:grep.x86_640:2.6.3-1.fc12groff.x86_640:-20.fc12Complete!如果知道RPM文件的位置,或者已經(jīng)下載了它們,那么也可以使用rpm命令執(zhí)行更新。這與安裝相似,只是要使用-U或-F選項而不是-i選項。這兩個選項的差異是,-U選項更新現(xiàn)有的包,如果這個包還沒有安裝,就安裝它;而-F選項只升級或刷新已經(jīng)安裝的包。因此,經(jīng)常使用-U選項,尤其是在命令行包含RPM列表的情況下。這樣的話,就會安裝未安裝的包,升級已經(jīng)安裝的包。常常使用另外兩個選項-v(詳細)和-h(#標志)提供進度顯示。清單9說明如何使用rpm命令更新vim-common、vim-enhanced和vim-minimal包。我們已經(jīng)把vim-common和vim-enhanced包下載到根用戶的主目錄中,而vim-minimal包要從一個更新鏡像獲取。清單9.用rpm更新包[root@echidna~]#ls*.rpmvim-common-7.2.411-1.fc12.x86_64.rpmvim-enhanced-7.2.411-1.fc12.x86_64.rpm[root@echidna~]#rpm-Uvh*.rpm/pub/linux/distributions\>/fedora/linux/updates/12/x86_64/vim-minimal-7.2.411-1.fc12.x86_64.rpmRetrieving/pub/linux/distributions/fedora/linux/updates/12/x86_64/vim-minimal-7.2.411-1.fc12.x86_64.rpmPreparing...###########################################[100%]1:vim-common###########################################[33%]2:vim-enhanced###########################################[67%]3:vim-minimal###########################################[100%]查詢RPM包您在前面的示例中看到,用rpm命令安裝rpm需要包文件的完整名稱(或URL),比如gcl-2.6.8-0.6.20090701cvs.fc12.x86_64.rpm。另一方面,用yum安裝或用這兩個命令刪除rpm只需要包名,比如gcl。與APT一樣,RPM在內(nèi)部數(shù)據(jù)庫中維護安裝的包的信息,因此允許使用包名操作安裝的包。在本節(jié)中,看看可以使用rpm的-q(代表查詢)選項或相關(guān)聯(lián)的yum查詢從數(shù)據(jù)庫獲取的一些信息?;静樵冎粰z查包是否已經(jīng)安裝了,如果安裝了,就查詢版本。增加-i選項會得到包的相關(guān)信息。注意,安裝、升級或刪除包需要根權(quán)力,但是非根用戶也可以查詢rpm數(shù)據(jù)庫。清單10.顯示gcl的相關(guān)信息[ian@echidna~]$yumlistgclLoadedplugins:presto,refresh-packagekitInstalledPackagesgcl.x86_642.6.8-0.7.20100201cvs.fc12@updates[ian@echidna~]$rpm-qgclgcl-2.6.8-0.7.20100201cvs.fc12.x86_64[ian@echidna~]$yuminfogclLoadedplugins:presto,refresh-packagekitInstalledPackagesName:gclArch:x86_64Version:2.6.8Release:0.7.20100201cvs.fc12Size:40MRepo:installedFromrepo:updatesSummary:GNUCommonLispURL:/software/gcl/License:GPL+andLGPLv2+Description:GCLisaCommonLispcurrentlycompliantwiththeANSIstandard.:Lispcompilationproducesnativecodethroughtheintermediaryof:thesystem'sCcompiler,fromwhichGCLderivesefficient:performanceandfacileportability.CurrentlyusesTCL/TkasGUI.[ian@echidna~]$rpm-qigclName:gclRelocations:(notrelocatable)Version:2.6.8Vendor:FedoraProjectRelease:0.7.20100201cvs.fc12BuildDate:Tue23Mar201003:20:36PMEDTInstallDate:Wed05May201001:01:34PMEDTBuildHost:Group:Development/LanguagesSourceRPM:gcl-2.6.8-0.7.20100201cvs.fc12.src.rpmSize:41667750License:GPL+andLGPLv2+Signature:RSA/8,Tue23Mar201004:14:06PMEDT,KeyID9d1cc34857bbccbaPackager:FedoraProjectURL:/software/gcl/Summary:GNUCommonLispDescription:GCLisaCommonLispcurrentlycompliantwiththeANSIstandard.Lispcompilationproducesnativecodethroughtheintermediaryofthesystem'sCcompiler,fromwhichGCLderivesefficientperformanceandfacileportability.CurrentlyusesTCL/TkasGUI.詳細的清單顯示與RPM包相關(guān)聯(lián)的一些標記。注意,rpm和yum以不同的格式顯示不同的信息。在本文中,我們都使用標準命令選項提供的基本輸出。如果希望使用rpm
--queryformat選項定制查詢輸出,請參考手冊頁。如果希望了解您的rpm版本支持的所有標記,應(yīng)該運行rpm
--querytags。如清單10所示,可以使用yum列出安裝的包。還可以用它列出有更新可用的包、可以安裝的包以及具有其他性質(zhì)的包,比如廢棄的包或存儲庫中最近添加的包。甚至可以使用yum搜索包。在清單11中可以看到,texmacs包還沒有安裝,但是可以從fedora存儲庫獲取它。如果搜索“texmacs”,會看到提到它的四個包。很容易看出為什么會找到TeXmacs*包。使用yum
info
pydot查明為什么也會找到pydot包。清單11.搜索"texmacs"[ian@echidna~]$yumlisttexmacsLoadedplugins:presto,refresh-packagekitAvailablePackagesTeXmacs.x86_64-2.fc12fedora[ian@echidna~]$yumsearchtexmacsLoadedplugins:presto,refresh-packagekit=================================Matched:texmacs==================================TeXmacs-devel.i686:DevelopmentfilesforTeXmacsTeXmacs-devel.x86_64:DevelopmentfilesforTeXmacsTeXmacs.x86_64:Structuredwysiwygscientifictexteditorpydot.noarch:PythoninterfacetoGraphviz'sDotlanguage對于后面的查詢示例,我們主要使用rpm,因為它的選項更豐富。許多示例也可以使用yum完成,yum有一些基本rpm選項不具備的功能。RPM包和其中的文件用戶常常希望知道一個包中有哪些文件,或者某個文件來自哪個包。使用-ql選項列出gcl包中的文件,見清單12。這個包中有許多文件,所以這里只給出部分輸出。清單12.顯示gcl包中的文件[ian@echidna~]$rpm-qlgcl/usr/bin/gcl/usr/lib/gcl-2.6.8/usr/lib/gcl-2.6.8/clcs/usr/lib/gcl-2.6.8/clcs/sys-proclaim.lisp/usr/lib/gcl-2.6.8/cmpnew/usr/lib/gcl-2.6.8/cmpnew/gcl_cmpmain.lsp/usr/lib/gcl-2.6.8/cmpnew/gcl_cmpopt.lsp/usr/lib/gcl-2.6.8/cmpnew/gcl_collectfn.lsp.../usr/share/info/.gz/usr/share/info/-1.gz/usr/share/info/-2.gz/usr/share/info/-3.gz/usr/share/info/-4.gz/usr/share/info/-5.gz/usr/share/info/-6.gz/usr/share/info/-7.gz/usr/share/info/-8.gz/usr/share/info/-9.gz/usr/share/info/.gz/usr/share/man/man1/gcl.1.gz通過在查詢中添加-c選項,可以把列出的文件限制為配置文件。-d選項把輸出限制為文檔文件。查詢包文件上面的包查詢命令在RPM數(shù)據(jù)庫中查詢已經(jīng)安裝的包。如果剛下載了一個包,想獲取同類信息,可以在查詢中使用-p(代表包文件)選項并指定包的文件名(與安裝包時一樣)。清單13顯示前面下載的兩個vim包的信息。我們只作為根用戶運行它,因為文件在根用戶的主目錄中。可以添加其他查詢選項,比如用-l列出文件,用-i列出信息。清單13.顯示兩個vim包的包文件信息[root@echidna~]#rpm-qp*.rpmvim-common-7.2.411-1.fc12.x86_64vim-enhanced-7.2.411-1.fc12.x86_64查詢安裝的所有包-a選項把查詢應(yīng)用于安裝的所有包。這會生成許多輸出,所以通常同時使用一個或多個篩選器,比如用sort進行排序,用more或less進行分頁輸出,用wc獲取包或文件內(nèi)容,用grep搜索您不確定名稱的包。清單14給出以下查詢:系統(tǒng)上所有包的排序列表系統(tǒng)上所有包的數(shù)量系統(tǒng)上所有包中的所有文件的數(shù)量用RPM安裝的所有文檔文件的數(shù)量搜索名稱中包含“gcl”的所有包(區(qū)分大小寫)清單14.對所有包執(zhí)行查詢[ian@echidna~]$rpm-qa|sort|moreaalib-libs-1.4.0-0.18.rc5.fc12.x86_64abrt-1.0.8-2.fc12.x86_64abrt-addon-ccpp-1.0.8-2.fc12.x86_64abrt-addon-kerneloops-1.0.8-2.fc12.x86_64abrt-addon-python-1.0.8-2.fc12.x86_64abrt-desktop-1.0.8-2.fc12.x86_64abrt-gui-1.0.8-2.fc12.x86_64abrt-libs-1.0.8-2.fc12.x86_64abrt-plugin-bugzilla-1.0.8-2.fc12.x86_64abrt-plugin-logger-1.0.8-2.fc12.x86_64abrt-plugin-runapp-1.0.8-2.fc12.x86_64abyssinica-fonts-1.0-5.fc12.noarchacl-2.2.49-2.fc12.x86_64...[ian@echidna~]$rpm-qa|wc-l1792[ian@echidna~]$rpm-qal|wc-l281052[ian@echidna~]$rpm-qad|wc-l45686[ian@echidna~]$rpm-qa|grep-igclgcl-selinux-2.6.8-0.7.20100201cvs.fc12.x86_64gcl-2.6.8-0.7.20100201cvs.fc12.x86_64使用rpm-qa可以簡化對多個系統(tǒng)的管理。如果把排序的輸出重定向到一臺機器上的文件,然后在另一臺機器上也這么做,就可以使用diff程序?qū)ふ也町?。哪個包包含某一文件?既然可以列出所有包和一個包中的所有文件,現(xiàn)在就掌握了查明哪個包包含某一文件所需的所有信息。但是,rpm命令的-f(或--file)選項可以幫助找到包含某一文件的包。假設(shè)您想知道前面看到的哪個vim包提供vim命令。您需要文件的完整路徑。清單15說明如何使用which命令得到vim命令的完整路徑,可以使用這個輸出作為rpm-qf命令的輸入。注意,`whichguile-config`前后的符號是反撇號。在Bashshell中,另一種使用方法是$(whichvim)。清單15.哪個包提供vim可執(zhí)行文件[ian@echidna~]$whichvim/usr/bin/vim[ian@echidna~]$rpm-qf`whichvim`vim-enhanced-7.2.411-1.fc12.x86_64[ian@echidna~]$rpm-qf$(whichvim)vim-enhanced-7.2.411-1.fc12.x86_64RPM依賴關(guān)系在前面看到刪除gcl-selinux包的操作失敗了,這是因為存在依賴關(guān)系。除了文件之外,RPM包可能包含其他包所依賴的任意功能。如您所見,依賴關(guān)系通常會正常發(fā)揮作用。如果需要同時安裝幾個包,其中一些依賴于其他包,那么只需使用yum,或者向rpm-Uvh命令提供完整的列表,它會分析依賴關(guān)系并按正確的次序執(zhí)行安裝。除了在安裝或刪除包時產(chǎn)生的錯誤消息之外,還可以通過幾種方法查明包需要或依賴的文件或功能。rpm命令提供的一個選項可以查詢安裝的包或包文件,從而查明它們依賴或需要什么功能。這個選項是--requires,它可以簡寫為-R。清單16顯示gcl需要的功能。如果要查詢包文件而不是RPM數(shù)據(jù)庫,那么添加-p選項并使用完整的RPM文件名。清單16.gcl需要什么[ian@echidna~]$rpm-qRgcl/bin/sh/bin/sh/bin/sh/sbin/install-info/sbin/install-infogcl-selinuxlibX11.so.6()(64bit)libc.so.6()(64bit)libc.so.6(GLIBC_2.11)(64bit)libc.so.6(GLIBC_2.2.5)(64bit)libc.so.6(GLIBC_2.3)(64bit)libc.so.6(GLIBC_2.3.4)(64bit)libc.so.6(GLIBC_2.4)(64bit)libc.so.6(GLIBC_2.7)(64bit)libc.so.6(GLIBC_2.8)(64bit)libdl.so.2()(64bit)libgmp.so.3()(64bit)libm.so.6()(64bit)libm.so.6(GLIBC_2.2.5)(64bit)libreadline.so.6()(64bit)libtcl8.5.so()(64bit)libtk8.5.so()(64bit)libz.so.1()(64bit)rpmlib(CompressedFileNames)<=3.0.4-1rpmlib(FileDigests)<=4.6.0-1rpmlib(PayloadFilesHavePrefix)<=4.0-1rtld(GNU_HASH)rpmlib(PayloadIsXz)<=5.2-1把功能與提供它們的包聯(lián)系起來不太容易。帶deplist選項的yum命令可以提供幫助。如果只指定包名,沒有版本號,可能會得到其他已知版本的列表。清單17說明如何獲得安裝的gcl版本的依賴列表。清單17.使用yumdeplist查明gcl需要什么[ian@echidna~]$yumdeplist$(rpm-qgcl)Loadedplugins:presto,refresh-packagekitFindingdependencies:package:gcl.x86_642.6.8-0.7.20100201cvs.fc12dependency:libc.so.6(GLIBC_2.3.4)(64bit)provider:glibc.x86_642.11-2provider:glibc.x86_642.11.1-6dependency:gcl-selinuxprovider:gcl-selinux.x86_642.6.8-0.6.20090701cvs.fc12provider:gcl-selinux.x86_642.6.8-0.7.20100201cvs.fc12dependency:libgmp.so.3()(64bit)provider:gmp.x86_644.3.1-5.fc12dependency:libc.so.6(GLIBC_2.8)(64bit)provider:glibc.x86_642.11-2provider:glibc.x86_642.11.1-6dependency:libc.so.6(GLIBC_2.4)(64bit)provider:glibc.x86_642.11-2provider:glibc.x86_642.11.1-6dependency:libc.so.6()(64bit)provider:glibc.x86_642.11-2provider:glibc.x86_642.11.1-6dependency:/sbin/install-infoprovider:info.x86_644.13a-7.fc12provider:info.x86_644.13a-9.fc12dependency:libX11.so.6()(64bit)provider:libX11.x86_641.3-1.fc12dependency:libc.so.6(GLIBC_2.7)(64bit)provider:glibc.x86_642.11-2provider:glibc.x86_642.11.1-6dependency:libtcl8.5.so()(64bit)provider:tcl.x86_641:8.5.7-4.fc12provider:tcl.x86_641:8.5.7-5.fc12dependency:libc.so.6(GLIBC_2.11)(64bit)provider:glibc.x86_642.11-2provider:glibc.x86_642.11.1-6dependency:libtk8.5.so()(64bit)provider:tk.x86_641:8.5.7-2.fc12provider:tk.x86_641:8.5.7-3.fc12dependency:libc.so.6(GLIBC_2.3)(64bit)provider:glibc.x86_642.11-2provider:glibc.x86_642.11.1-6dependency:libm.so.6()(64bit)provider:glibc.x86_642.11-2provider:glibc.x86_642.11.1-6dependency:libz.so.1()(64bit)provider:zlib.x86_641.2.3-23.fc12dependency:rtld(GNU_HASH)provider:glibc.i6862.11-2provider:glibc.x86_642.11-2provider:glibc.x86_642.11.1-6provider:glibc.i6862.11.1-6dependency:libdl.so.2()(64bit)provider:glibc.x86_642.11-2provider:glibc.x86_642.11.1-6dependency:libreadline.so.6()(64bit)provider:readline.x86_646.0-3.fc12dependency:/bin/shprovider:bash.x86_644.0.33-1.fc12provider:bash.x86_644.0.35-3.fc12dependency:libc.so.6(GLIBC_2.2.5)(64bit)provider:glibc.x86_642.11-2provider:glibc.x86_642.11.1-6dependency:libm.so.6(GLIBC_2.2.5)(64bit)provider:glibc.x86_642.11-2provider:glibc.x86_642.11.1-6這個列表還顯示每個功能可能的提供者??梢钥吹酱蠖鄶?shù)依賴功能可以由多個包級別提供。例如,/bin/sh可以來自bash的兩個級別之一。通過使用創(chuàng)造性的篩選,可以把輸出縮減為清單18所示的包名列表。清單18.把yumdeplist的輸出縮減為只列出包名[ian@echidna~]$yumdeplist$(rpm-qgcl)|grep"provider:"|\>awk'{print$2}'|sort|uniqbash.x86_64gcl-selinux.x86_64glibc.i686glibc.x86_64gmp.x86_64info.x86_64libX11.x86_64readline.x86_64tcl.x86_64tk.x86_64zlib.x86_64如果只想知道需要安裝哪些包,可以運行yum
install,查看在提示接受安裝提議之前顯示的列表。除了查明包需要的功能之外,還可能需要了解哪個包提供某一功能。前面演示了如何查明哪個包包含某一文件。清單19說明如何使用rpm或yum查明哪個包提供gcl-selinux(x86-64)功能。除了顯示提供此功能的已安裝包的信息之外,YUM還顯示存儲庫中可用的包或版本??梢钥吹?,原來的2.6.8-0.6版來自fedora存儲庫,而updates存儲庫中有更新的2.6.8-0.7版。清單19.哪個包提供gcl-selinux(x86-64)功能[ian@echidna~]$rpm-q--whatprovides'gcl-selinux(x86-64)'gcl-selinux-2.6.8-0.7.20100201cvs.fc12.x86_64[ian@echidna~]$yumwhatprovides'gcl-selinux(x86-64)'Loadedplugins:presto,refresh-packagekitgcl-selinux-2.6.8-0.6.20090701cvs.fc12.x86_64:SELinuxpolicyforGCLimagesRepo:fedoraMatchedfrom:Other:gcl-selinux(x86-64)gcl-selinux-2.6.8-0.7.20100201cvs.fc12.x86_64:SELinuxpolicyforGCLimagesRepo:updatesMatchedfrom:Other:gcl-selinux(x86-64)gcl-selinux-2.6.8-0.7.20100201cvs.fc12.x86_64:SELinuxpolicyforGCLimagesRepo:installedMatchedfrom:Other:Provides-match:gcl-selinux(x86-64)RPM包文件完整性為了確保完整性,RPM包包含一個摘要(比如MD5或SHA1),常常經(jīng)過數(shù)字簽名。數(shù)字簽名的包需要用公共密鑰進行檢驗。使用rpm的--checksig(簡寫為-K)選項檢查RPM包文件的完整性。添加-v選項以生成更詳細的輸出常常有幫助。清單20給出的示例檢查vim-enhancedRPM的完整性。清單20.檢查vim-enhanced包文件的完整性[root@echidna~]#rpm-vKvim-enhanced-7.2.411-1.fc12.x86_64.rpmvim-enhanced-7.2.411-1.fc12.x86_64.rpm:HeaderV3RSA/SHA256signature:OK,keyID57bbccbaHeaderSHA1digest:OK(f9a199545a515f7ff0716729768b41eb68fe29a8)V3RSA/SHA256signature:OK,keyID57bbccbaMD5digest:OK(d4045f1f72d48073e3f401ee9d1f71cf)可能會產(chǎn)生下面的輸出:V3DSAsignature:NOKEY,keyID16a61572這意味著這個包是經(jīng)過簽名的,但是您的RPM數(shù)據(jù)庫中沒有所需的公共密鑰。注意,以前版本的RPM可能以不同的方式提供檢驗。如果包是經(jīng)過簽名的,您希望根據(jù)簽名檢驗它,就需要找到適當?shù)暮灻募阉鼘隦PM數(shù)據(jù)庫。應(yīng)該首先下載密鑰,然后檢查它的指紋,最后使用rpm--import命令導入它。更多信息參見RPM手冊頁。還可以在RPM主頁上找到關(guān)于簽名的二進制代碼的更多信息(見參考資料中的鏈接)。檢驗安裝的包與檢查rpm的完整性一樣,還可以使用rpm-V檢查已安裝的文件的完整性。這個步驟確保從rpm安裝文件之后文件沒有修改過。如清單21所示,如果包仍然良好,這個命令沒有輸出;但是,可以添加-v選項以產(chǎn)生更詳細的輸出。清單21.檢驗已安裝的vim-common包[ian@echidna~]$rpm-Vvim-common現(xiàn)在,我們作為根用戶刪除/usr/bin/xxd并把/usr/share/vim/vim72/syntax/bindzone.vim替換為/bin/bash。然后再次檢查。結(jié)果見清單22。清單22.篡改vim-common包[root@echidna~]#rpm-qf/usr/bin/xxd/usr/share/vim/vim72/syntax/bindzone.vimvim-common-7.2.411-1.fc12.x86_64vim-common-7.2.411-1.fc12.x86_64[root@echidna~]#rm/usr/bin/xxdrm:removeregularfile`/usr/bin/xxd'?y[root@echidna~]#cp/bin/bash/usr/share/vim/vim72/syntax/bindzone.vimcp:overwrite`/usr/share/vim/vim72/syntax/bindzone.vim'?y[root@echidna~]#rpm-Vvim-commonmissing/usr/bin/xxdS.5....T./usr/share/vim/vim72/syntax/bindzone.vim輸出表明對/usr/share/vim/vim72/syntax/bindzone.vim文件的MD5和、文件大小和mtime檢查失敗了。解決這個問題的一種方法是刪除這個包,然后重新安裝,依賴于vim-common的其他已安裝包仍然可以正常運行。這個解決方案使用rpm的--force選項或yum的reinstall功能強制重新安裝。清單23演示如何用yum重新安裝,然后檢查包現(xiàn)在是否良好,檢查刪除的文件是否已經(jīng)恢復了。清單23.重新安裝vim-common包[root@echidna~]#yumreinstallvim-commonLoadedplugins:presto,refresh-packagekitSettingupReinstallProcessResolvingDependencies-->Runningtransactioncheck--->Packagevim-common.x86_642:7.2.411-1.fc12settobeupdated-->FinishedDependencyResolutionDependenciesResolved=====================================================================================PackageArchVersionRepositorySize=====================================================================================Reinstalling:vim-commonx86_642:7.2.411-1.fc12updates6.0MTransactionSummary=====================================================================================Remove0Package(s)Reinstall1Package(s)Downgrade0Package(s)Totaldownloadsize:6.0MInstalledsize:17MIsthisok[y/N]:yDownloadingPackages:SettingupandreadingPrestodeltametadataupdates/prestodelta|969kB00:00ProcessingdeltametadataPackage(s)datastilltodownload:6.0Mvim-common-7.2.411-1.fc12.x86_64.rpm|6.0MB00:01Runningrpm_check_debugRunningTransactionTestTransactionTestSucceededRunningTransactionWarning:RPMDBalteredoutsideofyum.Installing:2:vim-common-7.2.411-1.fc12.x86_641/1Installed:vim-common.x86_642:7.2.411-1.fc12Complete![root@echidna~]#rpm-Vvim-common[root@echidna~]#ls/usr/bin/xxd/usr/bin/xxd如果需要更有力的措施包管理系統(tǒng)通??梢曰謴桶?。但是,如果刪除了包中的重要文件,重新安裝包但不刪除無法解決問題,那么可能需要在重新安裝之前刪除包。對于這種情況,可能希望刪除現(xiàn)有的拷貝并重新安裝,但是不希望卸載和重新安裝依賴它的所有包。為此,在刪除包時,可以使用rpm命令的--nodeps選項繞過依賴關(guān)系檢查。在清單24中,刪除了vim-common中的/usr/bin/xxd文件,然后演示如何恢復這個包。清單24.用rpm更新包[root@echidna~]#rm/usr/bin/xxdrm:removeregularfile`/usr/bin/xxd'?y[root@echidna~]##Oops!weneededthatfile[root@echidna~]#rpm-Fvhvim-common-7.2.411-1.fc12.x86_64.rpm[root@echidna~]#ls/usr/bin/xxdls:cannotaccess/usr/bin/xxd:Nosuchfileordirectory[root@echidna~]##Oh!Fresheningthepackagedidn'treplacethemissingfile[root@echidna~]#rpm-evim-commonerror:Faileddependencies:vim-common=2:7.2.411-1.fc12isneededby(installed)vim-enhanced-2:7.2.411-1.fc12.x86_64[root@echidna~]##Can'tremovevim-commonbecausevim-enhancedneedsit[root@echidna~]#rpm-e--nodepsvim-common[root@echidna~]##Bypassingthedependencycheckallowedremoval[root@echidna~]#rpm-Uvhvim-common-7.2.411-1.fc12.x86_64.rpmPreparing...###########################################[100%]1:vim-common###########################################[100%][root@echidna~]##Update(orinstall)vim-commonagain[root@echidna~]#ls/usr/bin/xxd/usr/bin/xxd[root@echidna~]##And/usr/bin/xxdisback現(xiàn)在,如果發(fā)生意外或一般的更新失敗,您可以以幾種方法更新或修復。注意,在安裝RPM時也可以繞過依賴關(guān)系檢查,但是這通常不是好做法。從存儲庫下載RPM盡管yum會自動地從存儲庫獲取包,但是您可能希望下載并保存RPM,比如為了在不連網(wǎng)的系統(tǒng)上安裝它們、為了檢查它們的內(nèi)容或有其他原因??梢允褂们鍐?5所示的yumdownloader命令。對于我們的示例,這個包已經(jīng)安裝了,所以沒有要下載的包。如果有這樣的包,可以使用--resolve選項再次下載它們。清單25.下載gcl包[ian@echidna~]$yumdownloader--resolvegclLoadedplugins:presto,refresh-packagekitadobe-linux-i386
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 云南旅游職業(yè)學院《移動機器人導論》2023-2024學年第一學期期末試卷
- 辦公技術(shù)新動向模板
- 述職報告:智慧農(nóng)業(yè)實踐
- 職業(yè)導論-房地產(chǎn)經(jīng)紀人《職業(yè)導論》點睛提分卷2
- 心理協(xié)會辯論賽策劃書
- 二零二五年度家庭養(yǎng)老照護床位服務(wù)與環(huán)保材料采購協(xié)議3篇
- 人教版小學數(shù)學(2024)一年級下冊第一單元 認識平面圖形綜合素養(yǎng)測評 B卷(含答案)
- 2024-2025學年吉林省長春五中高三(上)期末數(shù)學試卷(含答案)
- 江西省贛州市大余縣2024-2025學年七年級上學期1月期末生物學試題(含答案)
- 二零二五年酒店客房入住體驗提升合作協(xié)議2篇
- 企業(yè)年會攝影服務(wù)合同
- 電商運營管理制度
- 2025年上半年上半年重慶三峽融資擔保集團股份限公司招聘6人易考易錯模擬試題(共500題)試卷后附參考答案
- 城市公共交通運營協(xié)議
- 內(nèi)燃副司機晉升司機理論知識考試題及答案
- 2024北京東城初二(上)期末語文試卷及答案
- 2024設(shè)計院與職工勞動合同書樣本
- 2024年貴州公務(wù)員考試申論試題(B卷)
- 電工高級工練習題庫(附參考答案)
- 村里干零工協(xié)議書
- 2024年高考八省聯(lián)考地理適應(yīng)性試卷附答案解析
評論
0/150
提交評論