Linux软件包管理

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux软件包管理相关的知识,希望对你有一定的参考价值。

软件运行和编译
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

开发语言
    系统级开发
        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 ...

包校验
    包来源合法性验正及完整性验正
        完整性验正: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源
    阿里云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命令
    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>

问题:如何创建一个本地yum仓库???
将/etc/yum.repos.d/的文件放在其他目录中自己创建一个的新的仓库
mkdir -pv /etc/yum.repo/org
mv Centos-* /org
mkdir -pv /mnt/cdrom
mount /dev/sr1 /mnt/cdrom

vim list.repo
[base]
name=base
baseurl=file:///mnt/cdrom
gpgcheck=0
可在建一个仓库
[epel]
name=epel
baseurl=https://mirrors.aliyun.com/epel/7/x86_64
gpgcheck=0

程序包编译
    程序包编译安装:
    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

编译安装
    编译C源代码:
    准备:提供开发工具及开发环境
    开发工具:make, gcc等
    开发环境:开发库,头文件
    glibc:标准库
    实现:通过“包组”提供开发组件
    Development Tools
    Server Platform Development

问题1:在centos6中如何编译安装httpd2.2版本???
1、先安装开发编译包组
yum groupinstall -y "Develoment tools"
2、解压缩
tar xvf httpd-2.2.34.tar.bz2
生成httpd-2.2.34
注意在编译时必须要进入生成的文件进行编译安装
yum -y install openssl-devel 解决依赖关系
./configure --prefix=/hh \ 用于存放文件路径
--sysconfdir=/etc/httpd223 \ 存放配置文件路径
--enable-ssl
make -j 4
make install
apache restart 启用服务

问题2:在centos7中编译安装httpd2.4版本???
1、解决开发包组和依赖关系
yum groupinstall "Develoment tools" 开发包组
yum -y install pcre-devel 解决依赖关系

httpd官方网站:httpd.apache.org www.apache.org
2、解压缩
tar xvf httpd-2.4.25.tar.bz2
生成httpd-2.4.25
编译安装时进入生成文件
./configure --prefix=/hh \ 存放文件的路径 路径可自己定义
--sysconfdir=/etc/httpd223 \ 存放主配置文件
make -j 4
make install
/hh/bin/apachectl restart 启动此服务

以上是关于Linux软件包管理的主要内容,如果未能解决你的问题,请参考以下文章

linux下的软件包管理与源代码方式安装软件

Linux学习:软件包管理+常用命令

Linux系统红帽软件包管理器(RPM)

linux基础入门之管理linux软件

vs code初体验

Linux用 RPM 管理软件包(rpm)