linux上,庫文件是很是重要的,由於不少的軟件都不是將全部的本身在須要的函數庫本身寫好,而是將一部分本身軟件特有的庫文件本身寫,通用的庫文件所有動態連接到公共庫上去,這樣不只節省空間,同時用起來也是十分的方便。前端
查看二進制程序所依賴的庫文件
ldd /PATH/TO/BINARY_FILEjava
[root@CT71 ~]#ldd /bin/ls linux-vdso.so.1 => (0x00007ffceaa9e000) libselinux.so.1 => /lib64/libselinux.so.1 (0x00007f282277e000) libcap.so.2 => /lib64/libcap.so.2 (0x00007f2822579000) libacl.so.1 => /lib64/libacl.so.1 (0x00007f282236f000) libc.so.6 => /lib64/libc.so.6 (0x00007f2821fae000) libpcre.so.1 => /lib64/libpcre.so.1 (0x00007f2821d4d000) libdl.so.2 => /lib64/libdl.so.2 (0x00007f2821b48000) /lib64/ld-linux-x86-64.so.2 (0x00007f28229b9000) libattr.so.1 => /lib64/libattr.so.1 (0x00007f2821943000) libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f2821727000)
管理及查看本機裝載的庫文件
ldconfig 加載庫文件
/sbin/ldconfig -p: 顯示本機已經緩存的全部可用庫文件名及文件路徑映射關係node
配置文件: /etc/ld.so.conf, /etc/ld.so.conf.d/*.conf
緩存文件: /etc/ld.so.cachelinux
[root@CT6 ~]# ldconfig -p | less 1097 libs found in cache `/etc/ld.so.cache' libz.so.1 (libc6,x86-64) => /lib64/libz.so.1 libx11globalcomm.so.1 (libc6,x86-64) => /usr/lib64/libx11globalcomm.so.1 libxul.so (libc6,x86-64) => /usr/lib64/xulrunner/libxul.so libxtables.so.4 (libc6,x86-64) => /lib64/libxtables.so.4 libxslt.so.1 (libc6,x86-64) => /usr/lib64/libxslt.so.1 libxshmfence.so.1 (libc6,x86-64) => /usr/lib64/libxshmfence.so.1 libxpcom.so (libc6,x86-64) => /usr/lib64/xulrunner/libxpcom.so libxml2.so.2 (libc6,x86-64) => /usr/lib64/libxml2.so.2 ... ...
name-VERSION-release.arch.rpm
數據庫
好比:httpd-2.2.15-15.e16.centos.1.i686.rpmcentos
httpd 軟件包名緩存
2.2.15 軟件版本服務器
15 軟件發佈次數app
e16.centos 適合的linux平臺less
i686 適合的硬件平臺
rpm rpm擴展包名
常見的arch
x86: i386, i486, i586, i686
x86_64: x64, x86_64, amd64
powerpc: ppc
跟平臺無關: noarch
rpm包依賴性
通常服務器安裝都是最小化安裝,這樣是爲了下降被攻擊的可能性,因爲服務器的最小化安裝,致使安裝一個軟件須要不少依賴,好比樹形依賴,在安裝依賴a的時候可能須要安裝依賴包g,e,y,j,u等,安裝b依賴時又須要其餘各類依賴,樹形依賴雖然麻煩,能夠依舊能夠解決。環形依賴也不是很難解決,只須要用一條命令a、b、c同時安裝就能解決依賴問題。還有一種依賴時模塊依賴,它依賴的是某個軟件中的程序,咱們能夠經過查詢www.rpmfind.net來安裝依賴。
RPM包管理包括rpm命令管理和yum在線管理,rpm命令管理如上所說,遇到各類依賴問題的時候須要咱們本身動手查找依賴包,然後手動解決依賴問題,進行後裝。後來人們發現有沒有一種什麼簡單的方法進行安裝軟件,因而就有了yum命令,事先準備一個包含全部rpm包的網站,做爲在線服務器源咱們只要使用在線命令安裝軟件,不管我去依賴那一個包,yum都會自動到服務器上把依賴下載安裝。
二進制應用程序的組成部分:
二進制文件、庫文件、配置文件、幫助文件
程序包管理器:
功能:將編譯好的應用程序的各組成文件打包一個或幾個程序包文件,從而方便快捷地實現程序包的安裝、卸載、查詢、升級和校驗等管理操做
包文件組成 (每一個包獨有)
RPM包內的文件
RPM的元數據,如名稱,版本,依賴性,描述等
安裝或卸載時運行的腳本
數據庫(公共): /var/lib/rpm
程序包名稱及版本
依賴關係
功能說明
包安裝後生成的各文件路徑及校驗碼信息
程序包管理器:
debian: deb文件, dpkg包管理器
redhat: rpm文件, rpm包管理器
rpm: Redhat Package Manager
RPM Package Manager
咱們要學習的就是Redhat系列的rpm包管理
管理程序包的方式:
使用包管理器: rpm
使用前端工具: yum, dnf (dnf還未在正式版的紅帽中使用)
獲取程序包的途徑:
(1) 系統發版的光盤或官方的服務器;
CentOS鏡像:
https://www.centos.org/download/
http://mirrors.aliyun.com
http://mirrors.sohu.com
http://mirrors.163.com
(2) 項目官方站點
(3) 第三方組織:
Fedora-EPEL:
Extra Packages for Enterprise Linux
Rpmforge:RHEL推薦,包很全
搜索引擎:
http://pkgs.org
http://rpmfind.net
http://rpm.pbone.net
https://sourceforge.net/
(4) 本身製做
注意:第三方包建議要檢查其合法性來源合法性,程序包的完整性
rpm的安裝更新與卸載
包名:如httpd,操做已經安裝的軟件包時,使用包名,是搜索/var/lib/rpm中的數據庫
包全名:如httpd-2.2.15-15.e16.centos.1.i686.rpm,操做沒有安裝的軟件包時,使用
包全名,必定要注意路徑。
rpm -ivh 包全名
-i(install) 安裝
-v(verbose) 顯示詳細信息
-h(hash) 顯示進度
--test: 測試安裝,但不真正執行安裝,即dry run模式
--nodeps:忽略依賴關係
--replacepkgs 已安裝過的包重裝。
--replacefiles 其餘已安裝的RPM包的文件,與即將裝的RPM中的文件衝突時,則覆蓋文件並安裝。
--nosignature: 不檢查來源合法性
--nodigest:不檢查包完整性
--noscripts:不執行程序包腳本
%pre: 安裝前腳本; --nopre
%post: 安裝後腳本; --nopost
%preun: 卸載前腳本; --nopreun
%postun: 卸載後腳本; --nopostun
上面就是經過rpm命令安裝的,會產生各類依賴,這是rpm安裝的缺點
rpm -Uvh 軟件包
rpm -Fvh 軟件包
-U(upgrade) 升級
upgrade:安裝有舊版程序包,則「升級」
若是不存在舊版程序包,則「安裝」
freshen:安裝有舊版程序包,則「升級」
若是不存在舊版程序包,則不執行升級操做
--oldpackage:降級
--force: 強制安裝
有時候能夠用更新命令代替安裝命令是沒問題的,這是因爲升級的本質就是將原來的所有或部分軟件包刪除再從新安裝,這對於咱們存在不少重要數據的軟件來講是絕對不容許的,因此升級命令必定要慎用,必定要慎用,除非軟件出現了什麼重大的BUG,不升級不行,這時候將重要數據進行備份,再進行升級。
用強制安裝或降級安裝會保留原來的軟件,咱們之內核爲例,進行降級操做,看看是否會保留兩個內核:
[root@CT6 app]# ll total 70964 drwxr-xr-x. 2 root root 4096 Jul 18 14:10 2048.dir drwxr-xr-x. 2 root root 4096 Jul 18 14:27 fk.dir drwxrwx---. 3 root Java_A 4096 Jul 22 15:50 java -r--r--r--. 1 root root 33563248 Aug 12 11:35 kernel-2.6.32-696.el6.x86_64.rpm -rw-r--r--. 1 root root 39071032 Aug 12 11:57 kernel-2.6.32-642.el6.x86_64.rpm drwx------. 2 root root 16384 Jul 11 15:51 lost+found
9 #boot=/dev/sda 10 default=0 11 timeout=5 12 splashimage=(hd0,0)/grub/splash.xpm.gz 13 hiddenmenu 14 title CentOS 6 (2.6.32-696.el6.x86_64) 15 root (hd0,0) 16 kernel /vmlinuz-2.6.32-696.el6.x86_64 ro root=UUID=6df0d47f-1a62-4419-a49c-e57906aa21 73 rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet 17 initrd /initramfs-2.6.32-696.el6.x86_64.img ~
進行操做:
-rw-r--r--. 1 root root 33382260 May 12 2016 kernel-2.6.32-642.el6.x86_64.rpm [root@CT6 app]# rpm -ivh kernel-2.6.32-642.el6.x86_64.rpm --force Preparing... ########################################### [100%] 1:kernel ########################################### [100%]
咱們在看/boot/grub/grub.conf(如今雙內核)
9 #boot=/dev/sda 10 default=0 11 timeout=5 12 splashimage=(hd0,0)/grub/splash.xpm.gz 13 hiddenmenu 14 title CentOS (2.6.32-642.el6.x86_64) 15 root (hd0,0) 16 kernel /vmlinuz-2.6.32-642.el6.x86_64 ro root=UUID=6df0d47f-1a62-4419-a49c-e57906aa21 73 rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet 17 initrd /initramfs-2.6.32-642.el6.x86_64.img 18 title CentOS 6 (2.6.32-696.el6.x86_64) 19 root (hd0,0) 20 kernel /vmlinuz-2.6.32-696.el6.x86_64 ro root=UUID=6df0d47f-1a62-4419-a49c-e57906aa21 73 rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet 21 initrd /initramfs-2.6.32-696.el6.x86_64.img
注意:
(1) 不要對內核作升級操做; Linux支持多內核版本並存,所以,對直接安裝新版本內核
(2)若是原程序包的配置文件安裝後曾被修改,升級時,新版本的提供的同一個配置文件並不會直接覆蓋老版本的配置文件,而把新版本的文件重命名(FILENAME.rpmnew)後保留
rpm -e 包名
-e(erase) 卸載
--nodeps 不檢查依賴性
通常rpm包的卸載順序是按照安裝順序進行的,安裝時是a->b->c,卸載時也是a->b->c。假如要卸載的rpm包是依賴於其餘包,而沒有其餘軟件包依賴要卸載的件,則卸載應該沒什麼問題,若是有其餘包依賴於要卸載的軟件,則須要考慮依賴,若是你輸入rpm -e httpd命令,系統會提示你有依賴關係,不能卸載。因此要加上--nodeps不檢查依賴強制刪除,這個結果就是隻刪除了httpd,跟他有依賴關係的其它軟件是不會刪除的,可是這些軟件由於系統裏沒有了httpd也會不能運行,這是所謂的沒有刪除乾淨,而yum -y remove httpd這種方式是把與httpd有依賴關係的全部軟件一併刪除。好比PHP,mod_ssl等等。這就乾淨了。
rpm {-q|--query} [select-options] [query-options] [select-options]
-q 軟件包名 查詢已安裝過的軟件包名。
-qa 列出全部的已安裝過的rpm包
-qa "name*"
-qa |grep name
-qf 查詢一個文件來自於哪個rpm包 (已安裝的rpm)
-q --changelog 版本更新日誌
-qc 查詢軟件包的配置文件(不是全部包都有配置文件)
-qd 查詢軟件包的幫助文檔
-qi 查詢軟件包的詳細信息
-ql 查詢軟件包所安裝到系統當中的全部文件路徑
-q --scripts 查詢軟件包自帶的腳本
-q --provides 查詢自身的功能(可以提供的依賴)
-qR 查詢實現自身的功能須要什麼能力(須要的外部依賴)
-qp[licd] rpm包 查看未安裝的rpm包的各項信息
rpm -q 包名
-q(query) 查詢
rpm -qa
-a(all) 全部
不過咱們經常使用的查詢命令是rpm -qa | grep 包名
rpm -qc
rpm -qd
rpm -qip 包名(包全名)
-i(information) 查詢軟件信息
-p(package) 查詢未安裝包信息
rpm -q --scripts
rpm -q --provides
查詢實現自身的功能須要什麼能力(須要的外部依賴)
rpm -qR
rpm -qlp 包名(包全名)
-l(list) 查詢位置
-p(package) 查詢未安裝的軟件打算安裝的位置
rpm -qf 系統文件名
-f(file) 查詢系統文件屬於哪一個軟件包
rpm -qRp 包名(包全名)
-R(requires) 查詢軟件包的依賴性
-p(package) 查詢未安裝包的信息
rpm -V 包名
-V(verify) 校驗指定rpm包中的文件
若是文件沒有進行修改,不會出現變化,若是文件被修改,則會出現修改信息
S.5. . . . T. c 是有含義的:
S 文件大小是否改變
M 文件類型或文件權限是否改變
5 文件MD5校驗和是否改變,能夠當作文件內容是否改變
D 設備的中,從代碼是否被改變
L 文件路徑是否被改變
U 文件全部者是否改變
G 文件屬組是否被改變
T 文件的修改時間是否被改變
c 配置文件
d 普通文件
g ghost文件,不該該出現的文件
l 受權文件
r 描述文件
上面的驗證是基於軟件安裝完畢後的驗證,萬一軟件在安裝前就有問題呢?如何驗證一個軟件包有沒有問題呢?方法是有的,咱們的學習平臺是基於centos的,它的軟件包是rpm包,咱們要驗證rpm包是否被人改動過,只須要將祕鑰導入到咱們的系統而後使用rpm -K 來驗證軟件包的完整性:
第一步,導入祕鑰(咱們使用的祕鑰就是光盤鏡像中的)
[root@CT6 ~]# rpm --import /mnt/cdrom/RPM-GPG-KEY-CentOS-6
第二步,驗證祕鑰是否導入(rpm -qa )
[root@CT6 ~]# rpm -qa "gpg-pubkey*" gpg-pubkey-c105b9de-4e0fd3a3
第三步,驗證軟件包的完整性
[root@CT6 ~]# cp /mnt/cdrom/Packages/httpd-2.2.15-59.el6.centos.x86_64.rpm . [root@CT6 ~]# ll total 864 -r--r--r--. 1 root root 854072 Aug 12 16:19 httpd-2.2.15-59.el6.centos.x86_64.rpm -rw-r--r--. 1 root root 27440 Aug 12 15:17 httpd_change.log [root@CT6 ~]# rpm -K httpd-2.2.15-59.el6.centos.x86_64.rpm httpd-2.2.15-59.el6.centos.x86_64.rpm: rsa sha1 (md5) pgp md5 OK
第四步,修改軟件包,再次驗證
[root@CT6 ~]# echo 123 >> httpd-2.2.15-59.el6.centos.x86_64.rpm [root@CT6 ~]# rpm -K httpd-2.2.15-59.el6.centos.x86_64.rpm httpd-2.2.15-59.el6.centos.x86_64.rpm: rsa sha1 (MD5) PGP MD5 NOT OK
rpm包中文件提取
rpm2cpio 包全名 | cpio -idv .文件絕對路徑
rpm2cpio:將rpm包轉換成cpio格式的命令
cpio:一個標準的工具,用於建立軟件檔案文件和從文檔文件中提取文件
cpio 選項 < [文件|設備]
-i copy-in模式,還原
-d 還原時自動新建目錄
-v 顯示還原過程
接下來有個示例:
咱們在安裝完軟件包以後,信息都會被保存在一個數據庫下面,只要咱們不是吧軟件直接卸載掉,咱們均可以直接使用到rpm的查詢命令查詢到咱們須要的信息。
數據庫重建:
/var/lib/rpm
rpm {--initdb|--rebuilddb}
initdb: 初始化
若是事先不存在數據庫,則新建之
不然,不執行任何操做
rebuilddb:重建已安裝的包頭的數據庫索引目錄
最好不要去動咱們的數據庫