軟件包管理
本章內容
軟件運行環境 軟件包基礎 Rpm包管理 yum管理 定制yum倉庫 編譯安裝
軟件運行環境
API:Application Programming Interface POSIX:Portable OS 程序源代碼-->預處理-->編譯-->匯編-->鏈接 靜態編譯: .a 共享編譯: .so ABI:Application Binary Interface Windows與Linux不兼容 ELF(Exeutable and Linkable Format) PE(Portable Executable) 庫級別的虛擬化: Linux:WINE Windows:Cywin
開發語言
? 系統級開發 C C++ ? 應用級開發 java delphi Python go php perl ruby
包管理器
二進制應用程序的組成部分: 二進制文件、庫文件、配置文件、幫助文件 用庫可以節省很多代碼 程序包管理器; 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包管理器的前端工具(記住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) 系統發版的光盤或官方的服務器; 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包管理
? 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:降級 配合rpm -ivh --oldpackage 包名 --force: 強行升級(可替代之前所學的替代安裝(--replacefiles))
升級注意項
? 注意: 1) 不要對內核做升級操作; Linux支持多內核版本并存,因此對直接安裝新版本內核 2) 如果原程序包的配置文件安裝后曾被修改,升級時,新版本的提供的同一個配置文件并不會直接覆蓋老版本的配置文件,而把新版本的文件重命名(FILENAME.rpmnew)后保留
包查詢
? rpm {-q|--query} [select-options] [query-options] ? [select-options] rpm -ql 后面跟的是包名 -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(解決包依賴性的工具)
? CentOS: yum, dnf ? YUM: Yellowdog Update Modifier, rpm的前端程序,用來解決軟件包相關依賴性,可以在多個庫之間定位軟件包,up2date的替代工具 yum repository: yum repo,存儲了眾多rpm包,以及包的相關的元數據文件(放置于特定目錄repodata下)repodata下的副目錄,就是倉庫的目錄 文件服務器: ftp:// http:// file:///
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} gpgcheck={1|0} gpgkey=URL enablegroups={1|0} failovermethod={roundrobin|priority} 默認為: roundrobin,意為隨機挑選; cost= 默認為1000
教學環境yum源
? 教室里的yum源: http://172.16.0.1/cobbler/ks_mirror/CentOS-Xx86_64/ ? CentOS epel: http://172.16.0.1/fedora-epel/7/x86_64/ ? yum命令的用法: yum [options] [command] [package ...]
yum-config-manager
? 生成172.16.0.1_cobbler_ks_mirror_CentOS-Xx86_64_.repo yum-config-manager --add-repo=http://172.16.0.1/cobbler/ks_mirror/CentOS-Xx86_64/ ? yum-config-manager --disable “倉庫名" 禁用倉庫 ? yum-config-manager --enable “倉庫名” 啟用倉庫
yum
? 顯示倉庫列表: ? repolist [all|enabled|disabled] ? 顯示程序包: list # yum list [all | glob_exp1] [glob_exp2] [...] # yum list {available|installed|updates} [glob_exp1] [...] ? 安裝程序包: install package1 [package2] [...] reinstall package1 [package2] [...] (重新安裝) ? 升級程序包: update [package1] [package2] [...] downgrade package1 [package2] [...] (降級) ? 檢查可用升級: check-update ? 卸載程序包: remove | erase package1 [package2] [...] ? 查看程序包information: info [...] ? 查看指定的特性(可以是某文件)是由哪個程序包所提供: provides | whatprovides feature1 [feature2] [...] ? 清理本地緩存: clean [ packages | metadata | expire-cache | rpmdb | plugins | all ] ? 構建緩存: makecache ? 搜索: search string1 [string2] [...] 以指定的關鍵字搜索程序包名及summary信息 ? 查看指定包所依賴的capabilities: deplist package1 [package2] [...] ? 查看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 ? 安裝及升級本地程序包: * localinstall rpmfile1 [rpmfile2] [...] (用install替代) * localupdate rpmfile1 [rpmfile2] [...] (用update替代) ? 包組管理的相關命令: groupinstall group1 [group2] [...] groupupdate group1 [group2] [...] grouplist [hidden] [groupwildcard] [...] groupremove group1 [group2] [...] groupinfo group1 [...] 如何使用光盤當作本地yum倉庫: ? (1) 掛載光盤至某目錄,例如/media/cdrom # mount /dev/cdrom /media/cdrom ? (2) 創建配置文件 [CentOS7] name= baseurl= gpgcheck= enabled ? yum的命令行選項: --nogpgcheck:禁止進行gpg check -y: 自動回答為“ yes” -q:靜默模式 --disablerepo=repoidglob:臨時禁用此處指定的repo --enablerepo=repoidglob:臨時啟用此處指定的repo --noplugins:禁用所有插件
yum倉庫
? 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 ? 創建yum倉庫: createrepo [options] <directory>
程序包編譯
? 程序包編譯安裝: ? Application-VERSION-release.src.rpm --> 安裝后,使用rpmbuild命令制作成二進制格式的rpm包,而后再安裝 ? 源代碼-->預處理-->編譯(gcc)-->匯編-->鏈接-->執行 ? 源代碼組織格式: 多文件:文件中的代碼之間,很可能存在跨文件依賴關系 C、 C++: make (項目管理器, configure --> Makefile.in --> makefile) java: maven
編譯安裝
? C代碼編譯安裝三步驟: 1、 ./configure: (1) 通過選項傳遞參數,指定啟用特性、安裝路徑等;執行時會參考用戶的指定以及makefile.in文件生成makefile (2) 檢查依賴到的外部環境 2、 make:根據makefile文件,構建應用程序 3、 make install:復制文件到相應路徑 ? 開發工具: autoconf: 生成configure腳本 automake:生成Makefile.in ? 注意:安裝前查看INSTALL, README ? 開源程序源代碼的獲?。? 官方自建站點: apache.org (ASF) mariadb.org ... 代碼托管: SourceForge.net Github.com code.google.com ? c/c++編譯器: gcc (GNU C Complier) ? 編譯C源代碼: 前提:提供開發工具及開發環境 開發工具: make, gcc等 開發環境:開發庫,頭文件 glibc:標準庫 通過“包組”提供開發組件 CentOS 6: "Development Tools", "Server Platform Development", ? 第一步: 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.con 添加一個MANPATH
原創文章,作者:15152188070,如若轉載,請注明出處:http://www.www58058.com/37885
對學到的知識總結的很好,標題不要帶著日期,練習等字眼,希望下次能改進。