軟件包管理
軟件運行環境
軟件包基礎
Rpm包管理
Yum管理
定制yum倉庫
編譯安裝
ABI
應用程序的二進制接口,和操作系統相關,一個程序二進制編好了,想要在你的系統上跑,要符合你的操作系統的接口標準Windows:PE ?linux:ELF
WINDOWS和LINUX二進制程序是不兼容的
庫級別的虛擬化
Linux:WINE 可以讓Windows程序在linux跑
Windows:cywin
API:應用程序的開發接口
我們做軟件,不是從頭到尾所有的軟件自己構建,有些現成的功能我們可以放好,寫成模塊,,下次想用這個功能調用這個模塊就可以了,調用這個模塊,就涉及到一個接口,這個接口就是API
C語言是文本方式寫的程序,文本不能再操作系統上跑,需要最終解析成二進制,才能執行
程序源代碼——預處理——編譯—-匯編—-鏈接
靜態庫,.a最終生成的文件,既包括目標文件,也包括依賴庫文件,這個文件存放的內容全,放到任何主機上都能運行,
動態庫,.so,動態庫不會打包的一起,還是放在磁盤上,不會放到二進制文件中,只是一個指針
C語言編好的二進制程序,只能通過符合操作系統
標準的接口api來運行,和操作系統打交道,
Java的虛擬機,Java的程序是依賴虛擬機,
而Java的虛擬機有多種版本,
虛擬機幫助和操作系統打交道,
不需要程序直接和操作系統打交道
二進制應用程序的組成部分:二進制文件,庫文件,配置文件,幫助文件 ?,,還有數據文件,日志
程序不僅需要程序本身而且嚴重依賴于庫文件,
復雜的程序都有配置文件,稍微小點的工具ls,就沒有配置文件,要想配置加個選項就好啦 ls -a
一些大型的軟件,都有配置文件,用來設置程序不同的工作,配置文件的功能相當于選項的功能
加上選項就有不同的效果,對于大軟件來說由于太復雜了,加單一選項沒法加,只能加到配置文件當中,而且加到配置文件能夠存的住,(ls -a)的選項存不住,下次還需要重新加,
Bash
程序包管理器,
對于linux來講,安裝一個軟件,使用一個軟件,最早以前,源碼編譯,C語言的源代碼(hello.c)直接運行是不可以的,需要用jcc工具把它編譯成二進制才能運行,
編譯成二進制進行運行,對普通用戶,太難
為了降低難度,提供軟件包的管理器,軟件包的管理器,就相當于,你不需要記二進制的編譯器,只需要記最基本的工具,
在linux中,都是以統一的文件后綴,組織這些文件的, ?不同的版本使用的工具是不一樣的,
Debian:deb文件,dpkg包管理器
Redhat:rpm文件,rpm包管理器
對于紅帽來講,所有的安裝包都是統一后綴的,
rpm中集成了很多軟件,安裝管理,rpm -i 安裝的時候,自動就把rpm解開,按事先預定好的路徑放好,設置好
Rpm包的命名格式,包名,包的版本號,作者自己加的版本信息,CPU架構,rpm
Name-VERSION-release.arch.rpm
包的分類和拆包
Application-VERSION-ARCH.rpm:主包
Application-devel-VERSION-ARCH.rpm:開發子包
Application-utils-VERSION-ARCH.rpm:工具子包
Application-libs-VERSION-ARCH.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.sl.cache
程序包管理器
Rpm
不僅是個后綴也是個命令
功能:將編譯好的應用程序的各組成文件打包一個或幾個程序包文件,從而方便快捷地實現程序包的安裝、卸載、查詢、升級和校驗 等管理操作
包文件組成(每個包獨有)
Rpm包內的文件
Rpm的元數據,如名稱,版本,依賴性,描述等
安裝或卸載時運行的腳本
所謂的安裝其實就是把里面包含的文件給解開,按事先規定好的路徑一個一個給復制過去,(按規定好的目錄,設好相應的屬性,所有者,所屬組)
系統安裝好的rpm包,在linux系統中有個數據庫,存你安裝了那些rpm包,詳細的rpm信息,什么時候安的,生成了那些文件,都放在那些目錄中
數據庫(公共)目錄:/var/lib/rpm
程序包名稱及版本
依賴關系
功能說明
包安裝后生成的各文件路徑及校驗碼信息
這里面信息很重要,含有你裝了那些包,
管理程序包的方式:
使用包管理器:rpm
使用前端工具:yum,dnf
獲取程序包的途徑
1系統發布的光盤或官方的服務器
Centos鏡像
https://www.centos.org/download/
http:mirrors.sohu.com
http:mirrors.163.com
- 目官方站點
3第三方組織 Fedora-epel
企業版額外附加的程序包,光盤放不下,經紅帽官方測試,可以使用
Centos系統上使用rpm命令管理程序包:
安裝、卸載、升級、查詢、校驗、數據庫維護
安裝:rpm{-i|–install} [install-aptions ]PACKAGES_FILE…
-v verbose ?冗長
-vv ????????詳細信息
-h:以#顯示程序包管理執行進度
Rpm -ivh PACKAGE_FILE…安裝包
Rpm -e 卸載包
[install-options]
–test:測試安裝,但不真正執行安裝,
–nodeps:忽略依賴關系
–replacepkgs ??覆蓋安裝 ?–replacefiles 替換文件
–nosignature:不檢查來源合法性
–nodigest:不檢查包的完整性
–noscripts:不執行程序腳本
%pre
%post
%preun
%postun
Rpm ???-ivh ?
Rpm ???-ql ?
Rpm ???-qa
Rpm升級
Rpm{-U|–upgrade}[jinstall-options] PACKAGE_FILE…
Rpm{-F|–upgrade}[jinstall-options] PACKAGE_FILE…
Upgrade:安裝有舊版本程序包,則升級
如果不存在就版本程序包,則安裝
Freshen:安裝有舊版本程序包,則升級
如果不存在舊版程序包,則不執行升級操作
Rpm ??-Uvh ??PACKAGE_FILE…
Rpm ??-Fvh ??PACKAGE_FILE…
–oldpackage:降級
–force :強制安裝
注意:1不要對內核做升級操作;linux支持多內核版本并存,因此,對直接安裝新版本內核
- 如果原程序包的配置文件安裝后曾被修改,升級時,新版本的提供的同一個配置文件并不會直接覆蓋老版本的配置文件,而把新版本的文件重命名后保留
包查詢
Rpm ?-qa 查詢所有安裝的包
Rpm -q ?tree 查找該包有沒有安裝
Rpm -qa | grep tre
Rpm -qa “tre”
Rpm -qf /usr/bin/tree ?該文件來自哪個包
Rpm
-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
-qf
-qc 只是配置文件
-ql 所有文件
-qpi
-qpl
-qa
包卸載
Rpm{-e|–erase}[-allmatchses][–nodeps] ???[–nosctipts][–notriggers][test]
全部匹配 ????忽略依賴性
包校驗
Rpm {-V|–verify}[select-options][verify-options]
包來源合法性及完整性驗證
完整性驗證:SHA256
來源合法性驗證:RSA
公鑰加密:加密解密使用同以秘鑰
非對稱加密:密鑰是成對的
導入所需要公鑰
Rpm -K|checksig rpmfile 檢查包的完整性和簽名
Rpm –import/etc/pki/rpm-gpg/RPM-GPG-KEY-CectOS-7
CentOS 7 發行版光盤提供:RPM-GPG-KEY-CectOS-7
Rpm -qa “gpg-pubkey”
Centos:yum dnf
?
Yum是依賴于yum數據庫的,一般叫yumrepo倉庫
客戶端要想利用yum安裝,需要做一下配置,在自己的電腦上配置倉庫在哪,倉庫可能不在同一臺電腦上,可能在網絡上另外一個主機,所以需要在客戶端配置一個yum倉庫的路徑,baseurl=ftp http/s
可以通過網絡路徑尋找yum的路徑,
配置好軟件,客戶安裝軟件,yum install http(包名)
當敲命令,它就可以查它的配置,通過路徑找倉庫的服務器,在倉庫的服務器上存了倉庫的服務信息
除了必須的rpm包文件,倉庫還記錄的這些包之間的依賴關系,這些包是怎么分組的(同類型的包在一組),記錄包元數據,包組信息,
可以理解為一個數據庫,表現為目錄repodata 信息存在這個目錄中
Rhel5 /server/repodata
/server/*.rpm
Centos6 /Packages/*rpm
dir /repodata/*
?
Baseurl,路徑必須是repodata所在文件夾的上一級目錄
?
在本機上baseurl=file:///dir ?dir在目錄的根下
?
?
?
當客戶端敲yuminstall httpd的時候,連到服務器上查,有這個包嗎,有依賴性嗎,這些信息會自動下載下來,緩存在自己的機器上,下一次就不需要連到服務器上,直接查緩存,現在需要裝包http,需要再次下載下來rpm文件,下載到本機的某一個目錄里,安裝完成,包就默認刪除了,發現依賴別的包,就同時下載下來,安裝,(安裝完,只留緩存)
?
對于yum重要的兩點
1配置文件,路徑
2清緩存
?
本地yum的配置文件,/etc/yum.conf
Yum倉庫配置文件的客戶端 /etc/yum.repo.d
Cd /etc/yum.repos.d
Mkdir bak
Mv *.repo bak/
光盤做yum源,光盤本身所有的配置,元數據,rpm包都在里面
光盤的掛載路徑,lsblk 默認為路徑 /run/media/root/ecntos 7 x86_64
神奇的目錄 ls /misc/cd/
Vim base.repo
最簡單格式
[base]
baseurl=file:///misc/cd
gpgcheck=0
緩存文件
[root@centos7 yum.repos.d]# du -sh /var/cache/yum/
92M /var/cache/yum/
Yum clean all ?清緩存
?
制作yum源服務器
共享服務,ftp ???httpd
共享資源存放的目錄ftp ??/var/ftp/pub
httpd ??var/www/html
放在,cd /var/ftp/pub
mkdir ?centos/6/os/x86_64/
Mount /dev/sr0 centos/6/os/x86_64/ ?進到這個目錄這就是光盤內容
Systemctl start vsftpd 啟動ftp服務
ftp://地址 ??訪問
關閉防火墻,
關閉安全策略
客戶端配
[base]
Name =
Baseurl=ftp://地址/pub/centos/6/os/x86_64/
Gpgcheck=0
Ls /app/ ?tree-1.5.3-3.e16.x86_64.rpm
Createrepo /var/ftp/pub/app/ ?制作倉庫
Yum install 包 ?安裝
Yum remove 包 移除
Rpm -q http 判斷
Package=http;rpm -q $package &> /dev/null || yum ?-y install package ??-y 自動裝,沒有提問yes
Yum reinstall tree ?對于破話一部分的rpm安裝
?
Yum的常見選項 ?install ?remove ?-y ??list ??repolist列出倉庫列表,clean all ?history
Yum gropeinstall
Rpm的常見選項 ?-qi顯示相關的信息 ?-ql顯示文件列表
??-qf查詢擁有指定文件的包 ??-q ??–scripts腳本 ???-qa查詢所有的安裝包
?
?
?
?
?
?
Yum rpm的前端程序,可解決軟件包相關依賴性,可在多個庫之間定位軟件包,
Yum repository(倉庫):yum repo,存儲了眾多rpm包,以及包的相關的元數據文件(放置于特定目錄repodata下)
文件服務器:http:// ??https:// ?????ftp:// ???file://
Yum客戶端配置文件:
/etc/yum.conf:為所有倉庫提供公共配置
/etc/yum.repo.d/*.repo:為倉庫的指向提供配置
倉庫指向的定義:
[repositoryID]
Name=Some name for this repository
Baseurl=url://path/to/repository/
Enable={1|0}
Gpgcheck={1|0}
Gpgkey=URL
Enablegroups={1|0}
Failovermethod={roundrobin|priority}
Roundrobin:意為隨機挑選,默認值
Priority:按順序訪問
Cost=默認為1000
本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/90787