軟件包管理
API:Application Programming Interface
POSIX:Portable OS
程序源代碼-->預處理-->編譯-->彙編-->鏈接
靜態編譯:
共享編譯:.so
ABI:Application Binary Interface
Windows與linux不兼容
ELF(Executable and Linkable Format)
PE(Portable Executable)
庫級別的虛擬化:
Linux:WINE
Windows:Cywin
包管理器
二進制應用程序的組成部分:
二進制文件、庫文件、配置文件、幫助文件
程序包管理器:
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-VERION-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-get: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
程序包管理器:
功能:將編譯好的應用程序的各組成文件打包一個或多個程序包文件,從而方便快捷地實現程序包的安裝、卸載、查詢、升級、和校驗等管理操作
1.包文件組成(每個包獨有)
RPM包內的文件
RPM的元數據,如名稱 版本 依賴性 描述等
安裝或卸載時運行的腳本
2.數據庫(公共)
程序包名稱及版本
依賴關係
功能說明
包安裝後生成的各文件路徑及校驗碼信息
程序包的來源
管理程序包的方式:
使用包管理器:rpm
使用前端工具:yum,dnf
獲取程序包的途徑:
1.官方服務器以及國內知名站點下載;
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包管理
Centos系統上使用rpm命令管理程序包:
安裝 卸載 升級 查詢 校驗 數據庫維護
安裝:
rpm {-i|--install} [install-options] PACKAGE_FILE…
-v: verbose
-vv:
-h: 以#顯示程序包管理執行進度
rpm -ivh PACKAGE_FILE ...
[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:強行升級
升級注意項
1.不要對內核做升級操作,Linux支持多內核版本並存,因此,對直接安裝新版本內核
2.如果原程序包的配置文件安裝後曾被修改,升級時,新版本提供的同一個配置文件並不會直接覆蓋老版本 的配置文件,而把新版本的文件重命名(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:程序包自帶的腳本
-R: 查詢指定的程序包所依賴的CAPABILITY
--provides: 列出指定程序包所提供的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 ...
包校驗
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
包來源合法性驗證及完整性驗證
完整性驗證:SHA256
來源合法性驗證:RSA
公鑰加密:
對稱加密:加密、解密使用同一密鑰;
非對稱加密:密鑰是成對兒的
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數據庫重建:
/var/lib/rpm
rpm{--initdb|--rebuilddb}
initdb:初始化
如果事先不存在數據庫,則新建之
否則,不執行任何操作
rebuilddb:重建已安裝的包頭的數據庫索引目錄
yum配置:
yum客戶端配置文件:
/etc/yum.conf:爲所有倉庫提供公共配置
/etc/yum.repos.d/*.repo:爲倉庫的指向提供配置
創庫的指向的定義:
[repositoryID]
name=Some name for this repository
baseurl=url://path/to/repository/
enabled={1|0}
ggcheck={1|0}
gpgkey=URL
enablegroups={1|0}
默認爲:roundrobin,意爲隨機挑選;
cost= 默認爲1000
yum-config-manager --disable '倉庫名' 禁用倉庫
yum-config-manager --enable '倉庫名' 啓用倉庫
顯示倉庫列表
yum repolist [all|enabled|disabled]
顯示程序包
yum list
yum list[all|glob_exp1][glob_exp2] [..]
yum list{available|installed|updates} [glob_exp1] [...]
安裝程序包:
yum install package1 [package2][...]
yum reinstall package1 [package2][...](重新安裝)
升級程序包:
yum update [package1] [package2] [...]
yum downgrade package1 [package2] [...] (降級)
檢查可用升級:
yum check-update
卸載程序包:
yum remove | erase package1 [package2] [...]
查看程序包:
yum info [...]
查看指定的特性(可以是某文件)是由哪個程序包所提供:
yum provides | whatprovides feature1 [feature2] [...]
清理本地緩存:
yum clean [Packages | metadata | expire-cache | rpmdb | plugins |all ]
構建緩存:
yum makecache
搜索:
yum search string1 [string2] [...]
以指定的關鍵字搜索程序包名及summary信息
查看指定包所依賴的capabilities:
yum deplist package1 [package2] [...]
查看yum事務歷史:
yum history [info|list|packages-list|packages-info| summary|addon-info|redo|undo| rollback|new|sync|stats]
yum history
yum history info 6
yum history undo 6
日誌:/var/log/yum.log
安裝及升級本地程序包:
yum localinstall rpmfile1 [rpmfile2] [...] (用install替代)
yum localupdate rpmfile1 [rpmfile2] [...] (用update替代)
包組管理的相關命令:
yum groupinstall group1 [group2] [...]
yum groupupdate group1 [group2] [...]
yum grouplist [hidden] [groupwildcard] [...]
yum groupremove group1 [group2] [...]
yum groupinfo group1 [...]
使用光盤當做本地yum倉庫:
1.掛載光盤至某目錄,例如/media/cdrom
mount /dev/cdrom /media/cdrom
2.創建配置文件
[yum.CentOS 7]
name=
baseurl=
gpgcheck=
enabled=
yum的命令行選項:
--nogpgcheck:禁止進行gpg check
-y: 自動回答爲“yes” -q:靜默模式
--disablerepo=repoidglob:臨時禁用此處指定的repo
--enablerepo=repoidglob:臨時啓用此處指定的repo
--noplugins:禁用所有插件
yum的repo配置文件中可以用的變量:
$releasever: 當前OS的發行版的主版本號
$arch: 平臺,i386,i486,i586,x86_64等
$basearch:基礎平臺;i386 $YUM0-$YUM9:自定義變量
實例:
http://server/centos/$releasever/$basearch/
http://server/centos/7/x86_64
http://server/centos/6/i384
程序包編譯:
Application-VERSION-release.src.rpm --> 安裝後,使 用rpmbuild命令製作成二進制格式的rpm包,而後再安裝
源代碼-->預處理-->編譯-->彙編-->鏈接-->執行
源代碼組織格式:
多文件:文件中的代碼之間,很可能存在跨文件依賴關係
C、C++:make (項目管理器,configure --> Makefile.in --> makefile)
java: maven
編譯安裝:
C代碼編譯安裝三步驟:
1、./configure:
(1) 通過選項傳遞參數,指定啓用特性、安裝路徑等;執行時會參考用戶的指定以及makefile.in文件生成makefile
(2) 檢查依賴到的外部環境,如依賴的軟件包
2、make:根據makefile文件,構建應用程序 3、make install:複製文件到相應路徑
3、make install:複製文件到相應路徑
開發工具:
autoconf:生成configure腳本
automake:生成Makefile.in
#注意:安裝前查看INSTALL,README
開源程序源代碼的獲取:
官方自建站點:
apache.org (ASF:Apache Software Foundation)
mariadb.org
...
代碼託管:
SourceForge.net
Github.com
code.google.com
c/c++編譯器: gcc (GNU C Complier)
準備:提供開發工具及開發環境
開發工具:make, gcc等
開發環境:開發庫,頭文件
glibc:標準庫
實現:通過“包組”提供開發組件
CentOS 6:
Development Tools Server Platform
Development
CentOS 7:
Development Tools
Development and Creative Workstation
第一步:configure腳本 選項:指定安裝位置、指定啓用的特性
--help: 獲取其支持使用的選項
選項分類:
安裝路徑設定:
--prefix=/PATH: 指定默認安裝位置,默認爲/usr/local/
--sysconfdir=/PATH:配置文件安裝位置
System types:支持交叉編譯
Optional Features: 可選特性
--disable-FEATURE
--enable-FEATURE[=ARG]
Optional Packages: 可選包
--with-PACKAGE[=ARG],依賴包
--without-PACKAGE,禁用依賴關係
第二步:make
第三步:make install
安裝後的配置:
(1) 二進制程序目錄導入至PATH環境變量中; 編輯文件/etc/profile.d/NAME.sh export PATH=/PATH/TO/BIN:$PATH
(2) 導入庫文件路徑
編輯/etc/ld.so.conf.d/NAME.conf
添加新的庫文件所在目錄至此文件中
讓系統重新生成緩存:
ldconfig [-v]
(3) 導入頭文件 基於鏈接的方式實現: ln -sv
(4) 導入幫助手冊 編輯/etc/man.config|man_db.conf文件 添加一個MANPATH