軟件包管理
軟件運行和編譯
ABI:Application Binary Interfacephp
- Windows與Linux不兼容
- ELF(Executable and Linkable Format)
- PE(Portable Executable)
- 庫級別的虛擬化:
- Linux: WINE
- Windows: Cygwin
API:Application Programming Interface前端
程序源代碼 --> 預處理 --> 編譯 --> 彙編 --> 連接java
gcc編譯程序
gcc 編譯程序主要通過四個過程:node
- 預處理(Pre-Processing)
- 編譯 (Compiling)
- 彙編 (Assembling)
- 連接 (Linking)
gcc編譯過程:數據庫
- gcc -E hello.c -o hello.i 對hello.c文件進行預處理,生成了hello.i 文件
- gcc -S hello.i -o hello.s 對預處理文件進行編譯,生成了彙編文件
- gcc -c hello.s -o hello.o 對彙編文件進行編譯,生成了目標文件
- gcc hello.o -o hello 對目標文件進行連接,生成可執行文件
- gcc hello.c -o hello 直接編譯連接成可執行目標文件
靜態和動態連接
連接主要做用是把各個模塊之間相互引用的部分處理好,使得各個模塊之間可以正確地銜接,分爲靜態連接和動態連接
靜態連接:centos
- 把程序對應的依賴庫複製一份到包
- libxxx.a
- 嵌入程序包
- 升級難,需從新編譯
- 佔用較多空間,遷移容易
動態連接:緩存
- 只把依賴加作一個動態連接
- libxxx.so
- 鏈接指向
- 佔用較少空間,升級方便
開發語言
系統級開發:C,C++
應用級開發:java,Python,go,php,perl,delphi,rubyruby
包和包管理器
最初只提供了.tar.gz的打包的源碼文件,用戶必須自已編譯每一個想在GNU/Linux上運行的軟件。用戶急需系統能提供一種更加便利的方法來管理這些軟件,當Debian誕生時,這樣一個管理工具也就應運而生,它被命名爲dpkg。從而著名的「package」概念第一次出如今GNU/Linux系統中,稍後Red Hat纔開發本身的「rpm」包管理系統
包的組成:bash
程序包管理器:服務器
- debian: deb文件, dpkg包管理器
- redhat: rpm文件, rpm包管理器
- rpm:Redhat Package Manager->RPM Package Manager
包命名
源代碼:name-VERSION.tar.gz|bz2|xz
- VERSION: major.minor.release
rpm包命名方式:
- name-VERSION-release.arch.rpm
- 例:bash-4.2.46-19.el7.x86_64.rpm
- VERSION: major.minor.release
- release:release.OS
- 常見的arch:
- x86: i386, i486, i586, i686
- x86_64: x64, x86_64, amd64
- powerpc: ppc
- 跟平臺無關:noarch
包命名和工具
包:分類和拆包
- Application-VERSION-ARCH.rpm: 主包
- Application-devel-VERSION-ARCH.rpm 開發子包
- Application-utils-VERSION-ARHC.rpm 其它子包
- Application-libs-VERSION-ARHC.rpm 其它子包
包之間:可能存在依賴關係,甚至循環依賴
解決依賴包管理工具:
- yum:rpm包管理器的前端工具
- apt:deb包管理器前端工具
- zypper:suse上的rpm前端管理工具
- dnf:Fedora 18+ rpm包管理器前端管理工具
庫文件
查看二進制程序所依賴的庫文件
- ldd /PATH/TO/BINARY_FILE
管理及查看本機裝載的庫文件
- ldconfig 加載配置文件中指定的庫文件
- /sbin/ldconfig –p 顯示本機已經緩存的全部可用庫文件名及文件路徑
映射關係
- 配置文件:/etc/ld.so.conf, /etc/ld.so.conf.d/*.conf
- 緩存文件:/etc/ld.so.cache
包管理器
程序包管理器:
- 功能:將編譯好的應用程序的各組成文件打包一個或幾個程序包文件,從而方便快捷地實現程序包的安裝、卸載、查詢、升級和校驗等管理操做
包文件組成 (每一個包獨有):
- RPM包內的文件
- RPM的元數據,如名稱,版本,依賴性,描述等
- 安裝或卸載時運行的腳本
數據庫(公共):/var/lib/rpm:
- 程序包名稱及版本
- 依賴關係
- 功能說明
- 包安裝後生成的各文件路徑及校驗碼信息
程序包的來源
管理程序包的方式:
- 使用包管理器:rpm
- 使用前端工具:yum, dnf
獲取程序包的途徑:
- 系統發版的光盤或官方的服務器
- 項目官方站點
- 第三方組織:
- Fedora-EPEL:
- Extra Packages for Enterprise Linux
- Rpmforge:RHEL推薦,包很全
- 搜索引擎:
- 本身製做
- 注意:第三方包建議要檢查其合法性:來源合法性,程序包的完整性
rpm包管理
CentOS系統上使用rpm命令管理程序包:
- 安裝、卸載、升級、查詢、校驗、數據庫維護
- 安裝:
- rpm {-i|--install} [install-options] PACKAGE_FILE…
- -v: verbose
- -vv:
- -h: 以#顯示程序包管理執行進度
- rpm -ivh PACKAGE_FILE ...
rpm包安裝
[install-options]
- --test: 測試安裝,但不真正執行安裝,即dry run模式
- --nodeps:忽略依賴關係
- --replacepkgs | replacefiles
- --nosignature: 不檢查來源合法性
- --nodigest:不檢查包完整性
- --noscripts:不執行程序包腳本
- %pre: 安裝前腳本 --nopre
- %post: 安裝後腳本 --nopost
- %preun: 卸載前腳本 --nopreun
- %postun: 卸載後腳本 --nopostun
rpm包升級
升級:
- rpm {-U|--upgrade} [install-options] PACKAGE_FILE...
- rpm {-F|--freshen} [install-options] PACKAGE_FILE...
- upgrade:安裝有舊版程序包,則「升級」
- freshen:安裝有舊版程序包,則「升級」
- rpm -Uvh PACKAGE_FILE ...
- rpm -Fvh PACKAGE_FILE ...
- --oldpackage:降級
- --force: 強制安裝
注意:
- 不要對內核作升級操做;Linux支持多內核版本並存,所以直接安裝新版本內核
- 若是原程序包的配置文件安裝後曾被修改,升級時,新版本提供的同一個配置文
件不會直接覆蓋老版本的配置文件,而把新版本文件重命名(FILENAME.rpmnew)後保留
包查詢
rpm {-q|--query} [select-options] [query-options]
[select-options]:
- -a:全部包
- -f:查看指定的文件由哪一個程序包安裝生成
- -p rpmfile:針對還沒有安裝的程序包文件作查詢操做
- --whatprovides CAPABILITY:查詢指定的CAPABILITY由哪一個包所提供
- --whatrequires CAPABILITY:查詢指定的CAPABILITY被哪一個包所依賴
rpm2cpio 包文件|cpio –itv 預覽包內文件
rpm2cpio 包文件|cpio –id 「*.conf」 釋放包內文件
[query-options]:
- --changelog:查詢rpm包的changelog
- -c:查詢程序的配置文件
- -d:查詢程序的文檔
- -i:information
- -l:查看指定的程序包安裝後生成的全部文件
- --scripts:程序包自帶的腳本
- --provides:列出指定程序包所提供的CAPABILITY
- -R:查詢指定的程序包所依賴的CAPABILITY
經常使用查詢用法:
- -qi PACKAGE, -qf FILE, -qc PACKAGE, -ql PACKAGE, -qd PACKAGE
- -qpi PACKAGE_FILE, -qpl PACKAGE_FILE, ...
- -qa
包卸載:
- rpm {-e|--erase} [--allmatches] [--nodeps] [--noscripts] [--notriggers] [--test] PACKAGE_NAME ...
- 當包卸載時,對應的配置文件不會刪除, 以FILENAME.rpmsave形式保留
包校驗
rpm {-V|--verify} [select-options] [verify-options]
- S file Size differs
- M Mode differs (includes permissions and file type)
- 5 digest (formerly MD5 sum) differs
- D Device major/minor number mismatch
- L readLink(2) path mismatch
- U User ownership differs
- G Group ownership differs
- T mTime differs
- P capabilities differ
包來源的合法性驗證及完整性驗證
公鑰加密
- 對稱加密:加密、解密使用同一密鑰
- 非對稱加密:密鑰是成對兒的
- public key: 公鑰,公開全部人
- secret key: 私鑰, 不能公開
導入所須要公鑰
- rpm -K|checksig rpmfile 檢查包的完整性和簽名
- rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
- CentOS 7發行版光盤提供:RPM-GPG-KEY-CentOS-7
- rpm -qa 「gpg-pubkey*」
rpm數據庫
數據庫重建:
rpm {--initdb|--rebuilddb}
- initdb: 初始化
- 若是事先不存在數據庫,則新建之,不然,不執行任何操做
- rebuilddb:重建已安裝的包頭的數據庫索引目錄