API:application program interface
ABI:application binary interface
linux系統的ABI檔案是ELF格式的
windows系統的ABI檔案是exe,msi格式的
系統級開發語言:c/c++
? 作品:httpd,vsftpd,nginx
應用級開發:java/python/php
? java作品:hadoop,hbase
? python作品:openstack
在linux安裝軟體非常費勁,分源代碼編譯安裝,二進制安裝
-
編譯安裝:需要有編譯環境,比如需要有gcc等,
源代碼-->目標系統下的二進制格式(可執行程式,庫檔案,組態檔,幫助檔案)-->組織成一個或多個“包”檔案
-
二進制安裝(已經把源代碼編譯成了可以直接執行的程式了)
程式包管理器
- Debian:dpt,dpkg,檔案名后綴是".deb"
- redhat:rpm,檔案名后綴是".rpm"
- S.U.S.E:rpm,檔案名后綴是".rpm"
- Gentoo:ports
- ArchLinux
源代碼檔案名解讀:name-version.tar.gz
-
version:major.minor.release
major:主版本號,當有大的變動時,才更新主版本號
minor:添加一些小的功能,更新小版本號
release:修正bug,更新此號
rpm檔案名解讀:name-version-release.arch.rpm
-
version:major.minor.release(和源代碼一樣)
-
release:rpm包的發行號,
雖然源代碼相同,但是打包的方法不同,就更新此號
release.OS:適用的作業系統,2.el7.i386.rmp
-
arch:cpu架構,i386代表是32位系統;x64(amd64)代表是64位系統
ppc(power pc);noarch(所有架構的適用)
-
例子:redis-3.0.2-1.centos7.x64.rpm
redis是name;3.0.2是version;1是rpm包的發行號;centos7是適用的作業系統;x64是cpu架構
包組成
很多程式,都是由主程式和許多部件構成,有的用戶只想使用主程式,有的用戶使用主程式和別的部件,
所以為了能夠達到按需安裝,就把包拆成許多子包,主程式的安裝包是主包;其他部件的安裝包是子包,
-
主包的名字:name-version-release.arch.rpm
-
子包的名字:name-function-version-release.arch.rpm
function:devel,utils,libs等,其實就是部件的名字,
依賴關系
linux的哲學是,程式盡量小,組成多個小程式完成復雜功能,所以就導致了,當要安裝A,A又依賴B,等,
為了能夠自動安裝依賴,就產生了前端工具,
前端工具:自動解決依賴關系
- yum:rhel,centos系類上的rpm包管理器的前端工具
- apt-get(apt-cache):deb包管理器的前端工具
- zypper:suse的rpm包管理器的前端工具
- dnf:centos8,fedora 22+上的rpm包管理器的前端工具
程式包管理器
功能:講編譯號的應用程式,組成檔案打包成一個或幾個程式包,從而實作方便的安裝,升級,卸載,查詢等管理操作,
1,程式包的組成清單(每個程式包都單獨實作)
- 檔案清單
- 安裝或卸載時運行的腳本
2,公共資料庫:存放在/var/lib/rpm目錄
- 程式包的名稱和版本
- 依賴關系
- 功能說明
- 安裝生成的各檔案的檔案路徑和校驗碼資訊
- 等等
# ls /var/lib/rpm
Basenames __db.001 __db.003 Group Name Packages Requirename Sigmd5
Conflictname __db.002 Dirnames Installtid Obsoletename Providename Sha1header Triggername
Group:把包分組后,就可以對組管理,以組位單位的安裝,卸載等管理操作,
Sigmd5:校驗碼
Triggername:觸發器名稱
Conflictname:包有得版本沖突
獲取程式包的途徑
1,系統發行版的光碟或官方檔案服務器(或鏡像站點)
- https://mirrors.tuna.tsinghua.edu.cn/
- http://mirrors.163.com/
- http://mirrors.sohu.com/
- http://mirrors.aliyun.com/
2,開發這個程式的官方站點
比如nginx的官方站點
3,第三方組織
- EPEL
- RPM搜索站點
- https://pkgs.org/
- http://rpmfind.net/
- http://rpmfind.net/
一定要校驗獲得的程式包,防止獲得的是被別人修改過的,
一般官方提供的包都有對應的md5校驗嗎,用md5校驗器,校驗下載的包,生成的MD5校驗碼如果和官方提供的一樣,則說明此包沒有被修改過,可以放心使用,
centos上rpm命令管理程式包
通用選項:
- -v:顯示詳細資訊
- -vv:更詳細的詳細
管理包括:安裝,升級,卸載,查詢和校驗,還有資料庫維護
安裝:rpm {-i|--install} [install-options] PACKAGE_FILE ...
-
例子:
rpm -ivh Packagename# rpm -ivh zsh-5.0.2-33.el7.x86_64.rpm Preparing... ################################# [100%] Updating / installing... 1:zsh-5.0.2-33.el7 ################################# [100%] -
顯示安裝進度:-h
輸入#,每個#代表2%的進度
-
測驗安裝:--test
檢查有沒有沖突:
顯示:error: Failed dependencies,說明依賴沒有安裝,導致此包不能安裝,
# rpm -ivh --test php-common-7.3.5-3.module_el8.1.0+252+0d4e049c.x86_64.rpm warning: php-common-7.3.5-3.module_el8.1.0+252+0d4e049c.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID 8483c65d: NOKEY error: Failed dependencies: libcrypto.so.1.1()(64bit) is needed by php-common-7.3.5-3.module_el8.1.0+252+0d4e049c.x86_64 libcrypto.so.1.1(OPENSSL_1_1_0)(64bit) is needed by php-common-7.3.5-3.module_el8.1.0+252+0d4e049c.x86_64 libssl.so.1.1()(64bit) is needed by php-common-7.3.5-3.module_el8.1.0+252+0d4e049c.x86_64 libssl.so.1.1(OPENSSL_1_1_0)(64bit) is needed by php-common-7.3.5-3.module_el8.1.0+252+0d4e049c.x86_64 -
忽略依賴,強行安裝:--nodeps
不建議使用,處分依賴的是幫助檔案,
-
重新安裝:--replacepkgs
用途:當程式使用的組態檔被改壞了,自己不能修復到安裝后的狀態了,先洗掉此檔案,然后使用--replacepkgs重新安裝,就會把組態檔修復成安裝后的狀態,注意,如果不洗掉此檔案的話,即使使用--replacepkgs也沒有作業,會保留原來的組態檔,
# rpm -ivh --replacepkgs zsh-5.0.2-33.el7.x86_64.rpm Preparing... ################################# [100%] Updating / installing... 1:zsh-5.0.2-33.el7 ################################# [100%] -
安裝和卸載時的腳本:有4中腳本
- 安裝開始前運行的腳本:preinstall,不行運行此腳本:--nopre
- 安裝完成后運行的腳本:postinstall,不行運行此腳本:--nopost
- 卸載開始前運行的腳本:preuninstall,不行運行此腳本:--nopreun
- 卸載完成后運行的腳本:postuninstall,不行運行此腳本:--nopostun
- 四個腳本都不運行:--noscripts
-
安裝時不檢查包完整性:--nodigest
Don't verify package or header digests when reading.
# rpm -ivh --nodigest zsh-5.0.2-33.el7.x86_64.rpm Preparing... ################################# [100%] Updating / installing... 1:zsh-5.0.2-33.el7 ################################# [100%] -
安裝時不檢查不檢查包的簽名資訊,不檢查來源合法性:--nosignature
Don't verify package or header signatures when reading.
# rpm -ivh --nosignature zsh-5.0.2-33.el7.x86_64.rpm Preparing... ################################# [100%] Updating / installing... 1:zsh-5.0.2-33.el7 ################################# [100%]
升級:使用的選項和安裝一樣
-
安裝或升級:rpm {-U|--upgrade} [install-options] PACKAGE_FILE ...
# rpm -Uvh --nodigest zsh-5.0.2-33.el7.x86_64.rpm Preparing... ################################# [100%] package zsh-5.0.2-33.el7.x86_64 is already installed -
只能升級:rpm {-F|--freshen} [install-options] PACKAGE_FILE ...
# rpm -Fvh --nodigest zsh-5.0.2-33.el7.x86_64.rpm -
升級時專用的選項
- --oldpackage:降級,新版本有問題,所以需要降級回原來的版本
- --force:忽略依賴,強制升級
-
注意:
- 不要對內核做升級操作,linux支持多內核并存,因此直接安裝新內核,
- 如果組態檔做過修改,升級時,新版本不會覆寫原來的檔案,而是把新檔案重命名成filename.rpmnew后提供,
卸載:rpm {-e|--erase} [--allmatches][--justdb] [--nodeps][--noscripts] [--test] PACKAGE_NAME ...
卸載的時候,指定的是package_name,安裝/升級時指定的是file_name
# rpm -e zsh
# rpm -ql zsh
package zsh is not installed
- 卸載所有版本的package_name:--allmatches
- 忽略依賴關系:--nodeps
查詢:rpm {-q|--query} [select-options][query-options]
select-options:
-
查看安裝的所有包:-a,--all
# rpm -qa -
查看某個檔案是屬于哪個包的:-f file
# rpm -qf /usr/share/doc/zsh-5.0.2 zsh-5.0.2-33.el7.x86_64
query-options:
-
查看rpm包的changelog(不是原始碼的):--changelog
# rpm -q --changelog zsh -
查看rpm包安裝完成后,都生成了哪些檔案:-l
# rpm -ql zsh -
查看這個包的版本號,大小,包組等:-i
# rpm -qi zsh -
查詢包所使用的組態檔:-c
# rpm -qc bash /etc/skel/.bash_logout /etc/skel/.bash_profile /etc/skel/.bashrc -
查詢包所提供的幫助檔案:-d
# rpm -qd bash /usr/share/doc/bash-4.2.46/COPYING /usr/share/info/bash.info.gz /usr/share/man/man1/..1.gz /usr/share/man/man1/:.1.gz /usr/share/man/man1/[.1.gz ... -
查詢包所提供的capabilities:--provides
# rpm -qd bash | less [root@localhost ~]# rpm -q --provides zsh config(zsh) = 5.0.2-33.el7 zsh = 5.0.2-33.el7 zsh(x86-64) = 5.0.2-33.el7 # rpm -q --provides bash /bin/bash /bin/sh bash = 4.2.46-31.el7 bash(x86-64) = 4.2.46-31.el7 config(bash) = 4.2.46-31.el7根據capability的名字,查詢這個capability是由哪個包提供的:--whatprovides
# rpm -q --provides bash /bin/bash /bin/sh bash = 4.2.46-31.el7 bash(x86-64) = 4.2.46-31.el7 config(bash) = 4.2.46-31.el7 # rpm -q --whatprovides bash bash-4.2.46-31.el7.x86_64 # rpm -q --whatprovides 'config(bash)'#注意:需要用引號括起來,由于有括號, bash-4.2.46-31.el7.x86_64根據capability的名字,查詢這個capability是由哪些包所依賴:--whatrequires
沒有任何包依賴zsh,但有很多包依賴bash,
發信有n多包依賴:libc.so.6()(64bit)
# rpm -q --whatrequires zsh no package requires zsh # rpm -q --whatrequires bash bash-completion-2.1-6.el7.noarch dracut-033-554.el7.x86_64 initscripts-9.49.46-1.el7.x86_64 lvm2-2.02.180-8.el7.x86_64 autofs-5.0.7-99.el7.x86_64 jline-1.0-8.el7.noarch rsyslog-8.24.0-34.el7.x86_64 PackageKit-command-not-found-1.1.10-1.el7.centos.x86_64 kpatch-0.6.1-1.el7.noarch # rpm -q --whatrequires 'libc.so.6()(64bit)' -
查看某個包依賴哪些capability:-R
查看
# rpm -qR bash /bin/sh config(bash) = 4.2.46-31.el7 libc.so.6()(64bit) libc.so.6(GLIBC_2.11)(64bit) libc.so.6(GLIBC_2.14)(64bit) libc.so.6(GLIBC_2.15)(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.8)(64bit) libdl.so.2()(64bit) libdl.so.2(GLIBC_2.2.5)(64bit) libtinfo.so.5()(64bit) rpmlib(BuiltinLuaScripts) <= 4.2.2-1 rpmlib(CompressedFileNames) <= 3.0.4-1 rpmlib(FileDigests) <= 4.6.0-1 rpmlib(PayloadFilesHavePrefix) <= 4.0-1 rtld(GNU_HASH) rpmlib(PayloadIsXz) <= 5.2-1 -
查詢包里的腳本:--scripts
發現zsh包里包含:postinstall,preuninstall,postuninstall
# rpm -q --scripts zsh postinstall scriptlet (using /bin/sh): if [ ! -f /etc/shells ] ; then echo "/bin/zsh" > /etc/shells else grep -q "^/bin/zsh$" /etc/shells || echo "/bin/zsh" >> /etc/shells fi if [ -f /usr/share/info/zsh.info.gz ]; then # This is needed so that --excludedocs works. /sbin/install-info /usr/share/info/zsh.info.gz /usr/share/info/dir \ --entry="* zsh: (zsh). An enhanced bourne shell." fi : preuninstall scriptlet (using /bin/sh): if [ "$1" = 0 ] ; then if [ -f /usr/share/info/zsh.info.gz ]; then # This is needed so that --excludedocs works. /sbin/install-info --delete /usr/share/info/zsh.info.gz /usr/share/info/dir \ --entry="* zsh: (zsh). An enhanced bourne shell." fi fi : postuninstall scriptlet (using /bin/sh): if [ "$1" = 0 ] ; then if [ -f /etc/shells ] ; then TmpFile=`/bin/mktemp /tmp/.zshrpmXXXXXX` grep -v '^/bin/zsh$' /etc/shells > $TmpFile cp -f $TmpFile /etc/shells rm -f $TmpFile fi fi -
查詢為安裝的包的資訊,上面的選項都適用,但不能使用package_name,要使用package_file
# rpm -ql zsh package zsh is not installed # rpm -qpl zsh-5.0.2-33.el7.x86_64.rpm /bin/zsh /etc/skel/.zshrc /etc/zlogin /etc/zlogout ...# rpm -qpR zsh-5.0.2-33.el7.x86_64.rpm # rpm -qp --scripts zsh-5.0.2-33.el7.x86_64.rpm
校驗:rpm {-V|--verify} [select-options][verify-options]
# rpm -V zsh#沒有回顯說明沒有人篡改過
# rpm -ql zsh | less
# file /etc/zlogin
/etc/zlogin: ASCII text
# emacs -nw /etc/zlogin#故意修改一下
# rpm -V zsh#再次校驗,回顯下面的資訊
S.5....T. c /etc/zlogin
校驗結果解讀:
- S 檔案大小變了
- M Mode變了
- 5 檔案內容變了,導致MD5校驗后,和之前的不一樣
- D 設備的主/次設備號不匹配
- L readLink(2) path mismatch
- U 屬主變了
- G 屬組變了
- T mTime(修改時間)變了
- P caPabilities(功能)變了
校驗包的完整性和來源合法性
公鑰在哪里,一般在機構CA里,但是系統光碟上有公鑰,當安裝完系統后,會把光碟上的公鑰存放在/etc/pki/rpm-gpg/目錄,
# ls /etc/pki/rpm-gpg/
RPM-GPG-KEY-CentOS-7 RPM-GPG-KEY-CentOS-Debug-7 RPM-GPG-KEY-CentOS-Testing-7
匯入公鑰:# rpm --import file
# rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
公鑰匯入后,在安裝的同時會自動校驗包的完整性和來源合法性
手動校驗rmp包:前提是已經匯入了公鑰
# rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
# rpm -K zsh-5.0.2-33.el7.x86_64.rpm
zsh-5.0.2-33.el7.x86_64.rpm: rsa sha1 (md5) pgp md5 OK
第三方組織(比如epel)的公鑰去哪里找,去epel的官網下載,
rpm資料庫
想一想,rpm查詢和校驗時,是從哪里讀取的資訊呢?
當安裝rpm包時,會把包的詳細資訊插入到本地資料庫,所以才能實作以后的查詢和校驗操作,
本地rpm包的資料庫路徑:/var/lib/rpm
# ls /var/lib/rpm
Basenames __db.001 __db.003 Group Name Packages Requirename Sigmd5
Conflictname __db.002 Dirnames Installtid Obsoletename Providename Sha1header Triggername
所以rpm資料庫太重要了,如果損壞了,就需要重建,
資料庫重建:rpm {--initdb|--rebuilddb} [-v][--dbpath DIRECTORY] [--root DIRECTORY]
centos6獲取幫助:man rpm
centos7獲取幫助:man rpmdb
從0創建資料庫:--initdb
根據系統里留存的rpm的header檔案從新構建資料庫:--rebuilddb
在指定路徑創建/更新資料庫:--dbpath DIRECTORY
# rpm --initdb --dbpath=/tmp/rpmdb
# ls /tmp/rpmdb/
Basenames __db.001 __db.003 Group Name Packages Requirename Sigmd5
Conflictname __db.002 Dirnames Installtid Obsoletename Providename Sha1header Triggername
# rpm --rebuilddb --dbpath=/tmp/rpmdb
# ls /tmp/rpmdb/
Basenames Dirnames Installtid Obsoletename Providename Sha1header Triggername
Conflictname Group Name Packages Requirename Sigmd5
# c/c++ 學習互助QQ群:877684253

# 本人微信:xiaoshitou5854
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/140422.html
標籤:Linux
上一篇:linux入門系列10--firewalld防火墻管理
下一篇:Linux忘記root用戶的密碼
