本章内容

软件运行环境

软件包基础

rpm包管理

yum管理

定制yum仓库

编译安装

软件运行和编译

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

静态和动态链接

链接主要作用是把各个模块之间相互引用的部分处理好,使得各个模块之间能够正确地衔接,分为静态链接和动态链接

静态链接

把程序对应的依赖库复制一份到包

libxxx.a

嵌入程序包

升级难,需重新编译

占用较多空间,迁移容易

动态链接

只把依赖加做一个动态链接

libxxx.so

连接指向

占用较少空间,升级方便

 

开发语言

系统级开发

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包管理器的前端工具

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

包管理器

程序包管理器:

功能:将编译好的应用程序的各组成文件打包一个或几个程序包文件,从而方便快捷地实现程序包的安装、卸载、查询、升级和校验等管理操作

包文件组成 (每个包独有)

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: 强制安装

升级注意项

注意:

(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:程序包自带的脚本

--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 ...

如果把rpm本身卸了,例如rpm -e rpm --nodeps,则需进救援模式恢复

rpm -ivh /mnt/cdrom/Packages/rpm-4.8...rpm --root=/mnt/sysimage/

chroot /mnt/sysimage

可以看到rpm已经能用了,重启机器后rpm命令恢复正常

包校验

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下)

文件服务器:

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

$YUM0-$YUM9:自定义变量

实例:

http://server/centos/$releasever/$basearch/

http://server/centos/7/x86_64

http://server/centos/6/i384

yum

阿里云repo文件:

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

CentOS系统的yum源

阿里云:https://mirrors.aliyun.com/centos/$releasever/os/x86_64/

EPEL的yum源:

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

yum源地址的原则:repodata目录的父目录,repodata目录是放元数据的

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命令的用法:

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/$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 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的命令行选项:

--nogpgcheck:禁止进行gpg check

-y: 自动回答为“yes”

-q:静默模式

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

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

--noplugins:禁用所有插件

系统光盘yum仓库

系统安装光盘作为本地yum仓库:

(1) 挂载光盘至某目录,例如/mnt/cdrom

mount /dev/cdrom /mnt/cdrom

(2) 创建配置文件

[CentOS7]

name=

baseurl=

gpgcheck=

enabled=

创建yum仓库:

createrepo [options] <directory>

程序包编译

程序包编译安装:

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

注意:安装前查看INSTALL,README

开源程序源代码的获取:

官方自建站点:

apache.org (ASF:Apache Software Foundation)

mariadb.org

...

代码托管:

SourceForge.net

Github.com

code.google.com

c/c++编译器: gcc (GNU C Complier)

编译C源代码:

准备:提供开发工具及开发环境

开发工具:make, gcc等

开发环境:开发库,头文件

glibc:标准库

实现:通过“包组”提供开发组件

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,禁用依赖关系

注意:通常被编译操作依赖的程序包,需要安装此程序包的“开发”组件,其包名一般类似于name-devel-VERSION

第二步: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

练习

1、查询命令java来自于哪个rpm包

[root@centos7 ~]#which java

/usr/bin/java

[root@centos7 ~]#ll /usr/bin/java

lrwxrwxrwx. 1 root root 22 Mar 25 16:25 /usr/bin/java -> /etc/alternatives/java

[root@centos7 ~]#ll /etc/alternatives/java

lrwxrwxrwx. 1 root root 72 Mar 25 16:25 /etc/alternatives/java -> /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.131-11.b12.el7.x86_64/jre/bin/java

[root@centos7 ~]#rpm -qf /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.131-11.b12.el7.x86_64/jre/bin/java

java-1.8.0-openjdk-headless-1.8.0.131-11.b12.el7.x86_64

所以命令java来自java-1.8.0-openjdk-headless-1.8.0.131-11.b12.el7.x86_64.rpm这个rpm包

2、yum的配置和使用,包括yum仓库的创建

3、编写系统初始化脚本reset.sh,包括别名,提示符颜色,yum仓库配置文件,安装tree,ftp,lftp,telnet等包

4、在CentOS7上编译安装apache 2.4源码包,并启动此服务

5、在CentOS 6上一键编译安装httpd-2.2.34,在CentOS 7上一键编译httpd-2.4.25

答:

(1)准备工作:搭好yum源,测试能用

(2)从源服务上下载脚本并执行:curl http://testsrv/install.sh | bash

#!/bin/bash

#FileName:install.sh

#Description:Make install httpd

yum -y -q groupinstall "Development Tools"

yum -y -q install apr-devel*

yum -y -q install pcre-devel*

releasever=`cat /etc/redhat-release | egrep -ow "[0-9]+" | head -n1`

mkdir /root/src/

cd /root/src

[ $releasever = 6 ] && wget http://testsrv/httpd-2.2.34.tar.bz2 && tar xf httpd-2.2.34.t

ar.bz2 && cd ./httpd-2.2.34/

[ $releasever = 7 ] && wget http://testsrv/httpd-2.4.25.tar.bz2 && tar xf httpd-2.4.25.t

ar.bz2 && cd ./httpd-2.4.25/

./configure \

--prefix=/app/httpd \

--enable-ssl

make -j 4 && make install

pathenv=`cat /etc/profile.d/reset.sh | grep -o 'PATH=/app/bin:$PATH'`

[ -z $pathenv ] && echo 'PATH=/app/bin:$PATH' >> /etc/profile.d/reset.sh

. /etc/profile.d/reset.sh

/app/bin/apachectl start

#END

转载于:https://blog.51cto.com/13695854/2106605

Linux-软件包管理相关推荐

  1. linux软件包管理详解

    linux软件包管理 在windows下安装软件很简单,大多数软件都只需要按照提示完成安装操作.但是,在linux下安装软件稍微复杂了一点,需要用到命令行工具.下面通过在Red Hat Enterpr ...

  2. linux软件包管理之rpm 、yum基本使用

    linux软件包管理之rpm .yum基本使用 一.RPM RPM是RedHat Package Manager(RedHat软件包管理工具)的缩写,这一文件格式名称虽然打上了RedHat的标志,但是 ...

  3. Linux_09 Linux软件包管理 rpm与yum

    Linux软件包管理 rpm与yum 文件的压缩与打包 rpm安装软件 yum安装删除软件 yum进阶 一. 文件的打包 与压缩 压缩:指通过某些算法,将文件尺寸进行相应的缩小,同时不损失文件的内容. ...

  4. CentOS6.4之Linux软件包管理

    二进制软件包管理(RPM.YUM) 源代码包安装 脚本安装(Shell或Java脚本) Debian系Linux软件包管理简介 一.RPM包管理 RPM软件包的一个例子: sudo-1.8.6p3-7 ...

  5. linux软件包管理学习归档-2020-0624

    linux软件包管理 这个知识点老师讲过,并且你还笑过,但是用的时候就是没想起来------罗翔 from:来源是阿里云大学上的免费课程,马哥教育的Linux软件包安装和yum仓库实战: P.S.何所 ...

  6. Linux 软件包管理

    Linux 软件包管理 1. 查看linux 文件类型,查看windows文件类型 [root@www /]# file /bin/cat /bin/cat: ELF 64-bit LSB execu ...

  7. Linux软件包管理之源码包、脚本安装包

    目录 1.源码包和RPM包的区别 RPM包和源码包默认安装位置: 由于安装位置不同带来的影响 2.源码包安装 ①.安装准备 ②.安装注意事项 ③.安装源码包 3.源码包卸载 4.脚本安装包 5.总结 ...

  8. 【linux】一篇全面的linux软件包管理的总结

    一篇全面的linux软件包管理的总结 文章目录 一篇全面的linux软件包管理的总结 零.开篇 一.查看软件包信息 (1-1)使用aptitude查看linux系统上安装了哪些软件包. (1-2)使用 ...

  9. Linux软件包管理-rpm、yum

    Linux软件包管理 软件包是什么?软件包顾名思义就是将应用程序.配置文件和数据打包的产物. 所有的linux发行版都采用了某种形式的软件包系统,这使得linux软件管理和在windows下一样方便, ...

  10. 【Linux基础】Linux软件包管理器yum的使用指南rzsz安装

    [Linux基础]Linux软件包管理器yum的使用指南|rzsz安装 前言 主页: 潮.eth的博客_CSDN博客-C学习,C++学习,数据结构and算法领域博主 Linux基础专栏: Linux基 ...

最新文章

  1. mysql运维工资_MySQL运维踩坑
  2. 分析轮子(二)- ,, (左移、右移、无符号右移)
  3. java cordova_java – Cordova android后台插件在5分钟后被杀死
  4. jdbc连接mysql数据库的常用对象_JDBC常用对象
  5. mysql下载了解压版怎么_教你安装Mysql(解压版/非安装包)图文教程
  6. B君的圆锥(51Nod-1629)
  7. infor wms 中英文对照_WMS系统中波次管理有多大作用
  8. java 取消引用_java – 如何取消方法引用谓词
  9. 【WebGIS bug】WARNING: Too many active WebGL contexts. Oldest context will be lost.
  10. 吃鸡显示连接服务器超时,吃鸡 怎么显示连接超时 | 手游网游页游攻略大全
  11. 分类问题-决策树模型
  12. php 调用格式工厂,腾讯视频文件转换格式|腾讯视频格式 格式工厂,qlv转flv格式转换器下载使用...
  13. Linux导出Excel图片水印中文乱码解决
  14. 苹果手机怎么在照片上添加文字_手机照片如何添加文字?原来方法这么简单,手把手教你学会。...
  15. 允许网页打开android应用程序,通过浏览器直接打开Android应用程序
  16. 深度学习跨层网络结构--特征融合
  17. Java初学者作业——为某超市设计管理系统,需要在控制台展示系统菜单,菜单之间可以完成跳转。
  18. aardio名字空间库的扩展方法(五)实例
  19. 武汉工商简单校园导游系统
  20. Android技术点总结

热门文章

  1. phxpaxos编译示例
  2. LeetCode 923. 3Sum With Multiplicity
  3. Java使用Lettuce操作redis
  4. netty websocket客户端_Websocket操作字节序 之 服务端
  5. ios 标签 html,ios HTML的标签的过滤
  6. Spring Cloud Alibaba 高级特性 应用性能监控:通过 SkyWalking 实施链路追踪
  7. Maven:No goals have been specified for this build. You must specify a valid lifecycle phase
  8. Spring Boot全面总结(超详细,建议收藏)
  9. python中install语法错误_在“ npm install”之后,出现有关python中语法错误的错误吗?...
  10. arm linux gdb调试工具,gdb+gdbserver调试arm-linux程序