16-Linux軟件運行和編輯

軟件運行和編輯

16-Linux軟件運行和編輯_第1张图片

ABI:Application Binary Interface :

 Windows 與Linux不兼容
	    ELF(Executable and Linkable Format)
	    PE(Portable Executable)
庫級別的虛擬化:
	    Linux:WINE
	    Windows:Cygwin

API:Application Programming Interface :

POSIX:Portable OS

程序源代碼>預處理>編譯>匯編>鏈接

靜態編譯: .a
動態編譯: .so

gcc 編譯程序

  • gcc編譯程序主要經過四個過程 :

    • 預處理(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 直接編譯鏈接成可執行目標文件

靜態和動態鏈接 :

  • 鏈接主要功能是把各個模塊之間相互引用的部分處理好,使得各個模塊之間能夠正確地鏈接,分爲靜態和動態鏈接.

靜態鏈接 :

+        把程序對應的依賴庫複製一份到包
+        libxxx.a
+        嵌入程序包
+        升級難,需要重新編譯
+        占用較多空間,遷移容易

動態鏈接 :

+        只把依賴加一個動態鏈接
+        libxxx.so
+        連接指向
+        占用較少空間,升級方便

包和包管理器 :

最初只提供了.tar.gz的打包的源码文件,用户必须自已编译每个想在 GNU/Linux上运行的软件。用户急需系统能提供一种更加便利的方法来 管理这些软件,当Debian诞生时,这样一个管理工具也就应运而生,它 被命名为dpkg。从而著名的“package”概念第一次出现在GNU/Linux 系统中,稍后Red Hat才开发自己的“rpm”包管理系统 .

  • 包的组成二进制文件、库文件、配置文件、帮助文件

程序包管理器

  • debian: deb文件, dpkg包管理器

  • redhat: rpm文件, rpm包管理器

    • rpm:Redhat Package Manager
    • RPM Package Manager
  • 包之间:可能存在依赖关系,甚至循环依赖.

  • 解决依赖包管理工具

    • 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
  • 获取程序包的途径
    • (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:降級

    • –force:强制安裝

包查詢

  • rpm {-q|–query} [select-options] [query-options]

  • [select-options]

      -a:所有包
    
      -f:查看指定文件由哪個程序包安裝生成
    
      -p:針對尚未安裝的程序包文件做查詢操作
    
      --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 PACKAGE

包卸載 :

  • rpm {-e|–erace} [–allmatches] [–nodeps] [–noscripts] [–notriggers] [–test] PACKAGE_NAME…

    儅包卸載時,對應的配置文件不會刪除,以FILENAME.rpmsave形式保留

包校驗

  • rpm {-V|–verify} [select-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下)

文件服务器

    http://   
    https://   
    ftp://   
    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:意为随机挑选,默认值    
            priority:按顺序访问   
      

      cost= 默认为1000

yum仓库

  • yum的repo配置文件中可用的变量
    • $releasever: 当前OS的发行版的主版本号
    • $arch: 平台,i386,i486,i586,x86_64等
    • $basearch:基础平台;i386, x86_64
    • Y U M 0 − YUM0- YUM0YUM9:自定义变量

示例

  • http://server/centos/ r e l e a s e v e r / releasever/ releasever/basearch/
  • http://server/centos/7/x86_64
  • http://server/centos/6/i386

yum源

阿里云repo文件 :

  • http://mirrors.aliyun.com/repo/

CentOS系统的yum源 :

  • 阿里云:https://mirrors.aliyun.com/centos/$releasever/os/x86_64/
  • 清华大学:https://mirrors.tuna.tsinghua.edu.cn/centos/$releasever/os/x86_64/

EPEL的yum源 :

  • 阿里云:https://mirrors.aliyun.com/epel/$releasever/x86_64

阿里巴巴开源软件 :

  • https://opsx.alibaba.com/

yum-config-manager

  • 生成172.16.0.1_cobbler_ks_mirror_CentOS-X-x86_64_.repo
  • yum-config-manager --add-repo= http://172.16.0.1/cobbler/ks_mirror/7/
  • yum-config-manager --disable “仓库名" 禁用仓库
  • yum-config-manager --enable “仓库名” 启用仓库

yum命令的用法

     yum [options] [command] [package ...] 

显示仓库列表

     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] […]

查看程序包information

  • yum info […]

查看指定的特性(可以是某文件)是由哪个程序包所提供

  • yum provides | whatprovides feature1 [feature2] […]

清理本地缓存

  • 清除/var/cache/yum/ b a s e a r c h / basearch/ basearch/releasever缓存
  • 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的命令行选项

	--nogpgcheck:禁止进行gpg check  

    -y: 自动回答为“yes”  

    -q:静默模式  

    --disablerepo=repoidglob:临时禁用此处指定的repo  

    --enablerepo=repoidglob:临时启用此处指定的repo  

    --noplugins:禁用所有插件

系統安裝yum倉庫

  • 系統安裝光盤作爲本地yum倉庫 :
    • 挂載光盤至某目錄,例如/mnt/cdrom

      • monut /dev/cdrom /mnt/cdrom
    • 創建配置文件:

      • [CentOS]
      • name=
      • baseurl=
      • gpgcheck=
      • enabled=
  • 創建yum倉庫 :
    • createrepo [options]

DNF

  • DNF 介绍:新一代的RPM软件包管理器。DNF 发行日期是2015年5月11日,DNF 包管理器采 用Python 编写,发行许可为GPL v2,首先出现在Fedora 18 发行版中。在 RHEL 8.0 版本正式 取代了 YUM,DNF包管理器克服了YUM包管理器的一些瓶颈,提升了包括用户体验,内存占用, 依赖分析,运行速度等.

* 下载安装所需软件包,或者利用extras仓库安装

wget http://springdale.math.ias.edu/data/puias/unsupported/7/x86_64/dnf-conf-0.6.42.sdl7.noarch.rpm

wget http://springdale.math.ias.edu/data/puias/unsupported/7/x86_64/dnf-0.6.42.sdl7.noarch.rpm

wget http://springdale.math.ias.edu/data/puias/unsupported/7/x86_64/python-dnf0.6.4-2.sdl7.noarch.rpm

wget https://mirrors.aliyun.com/centos/7/extras/x86_64/Packages/python2-libcomps0.1.8-12.el7.x86_64.rpm

wget https://mirrors.aliyun.com/centos/7/extras/x86_64/Packages/libcomps-0.1.812.el7.x86_64.rpm

配置文件:/etc/dnf/dnf.conf

仓库文件:/etc/yum.repos.d/ *.repo

日志: /var/log/dnf.rpm.log,/var/log/dnf.log

DNF使用方法:與yum一致


程序包编译

  • 程序包编译安装
  • 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 复制文件到相应路径

开发工具

  • autoconf: 生成configure脚本
  • automake:生成Makefile.in
  • 注意:安装前查看README,INSTALL

Ubuntu 软件管理

  • Debian软件包通常为预编译的二进制格式的扩展名“.deb”,类似rpm文件,因此安装 快速,无需编译软件。包文件包括特定功能或软件所必需的文件、元数据和指令.

  • dpkg:package manager for Debian,类似于rpm, dpkg是基于Debian的系统的包 管理器。可以安装,删除和构建软件包,但无法自动下载和安装软件包或其依赖项 .

  • APT:Advanced Packaging Tool,功能强大的软件管理工具,甚至可升级整个Ubuntu 的系统,基于客户/服务器架构.

  • APT工作原理:在服务器上先复制所有DEB包,然后用APT的分析工具genbasedir根据 每个DEB 包的包头(Header)信息对所有的DEB包进行分析,并将该分析结果记录在文 件夹base内的一个DEB 索引清单文件中,一旦APT 服务器内的DEB有所变动,要使用 genbasedir产生新的DEB索引清单。客户端在进行安装或升级时先要查询DEB索引清单, 从而获知所有具有依赖关系的软件包,并一同下载到客户端以便安装。当客户端需要安 装、升级或删除某个软件包时,客户端计算机取得DEB索引清单压缩文件后,会将其解 压置放于 /var/cache/apt/,而客户端使用apt-get install或apt-get upgrade命令的时 候,就会将这个文件夹内的数据和客户端计算机内的DEB数据库比对,知道哪些DEB已 安装、未安装或是可以升级的.

dpkg常见用法 : man dpkg

    dpkg -i package.deb 安装包 

    dpkg -r package 删除包,不建议,不自动卸载依赖于它的包 

    dpkg -P package 删除包(包括配置文件) 

    dpkg -l   列出当前已安装的包,类似rpm -qa 

    dpkg -l package 显示该包的简要说明,类似rpm –qi 

    dpkg -L package 列出该包中所包含的文件,类似rpm –ql  

    dpkg -S  搜索包含pattern的包,类似rpm –qf  

    dpkg -s  package 列出该包的状态,包括详细信息,类似rpm –qi 

    dpkg --configure package 配置包,-a 使用,配置所有没有配置的软件包 

    dpkg -c package.deb 列出 deb 包的内容,

    类似rpm –qpl  dpkg --unpack package.deb 解开 deb 包的内容 

apt

命令的功能

    apt install    安装软件包 

    apt remove   移除软件包

    apt purge   移除软件包及配置文件

    apt update   刷新存储库索引

    apt upgrade   升级所有可升级的软件包

    apt autoremove   自动删除不需要的包 

    apt full-upgrade  在升级软件包时自动处理依赖关系

    apt search    搜索应用程序

    apt show  显示安装细节 

apt 特有的命令 :

    apt list   列出包含条件的包(已安装,可升级等) 
    
    apt edit-sources 编辑源列表 
    
    APT包索引来自/etc/apt/sources.list文件和/etc/apt/sources.list.d目录中定义 的存储库的可用包的数据库。要使用存储库中所做的最新更改来更新本地程序 包索引 

    apt命令操作(如安装和删除软件包)记录在/var/log/dpkg.log日志文件中 

16-Linux軟件運行和編輯_第2张图片

你可能感兴趣的:(Linux)