• 软件包管理rpm、yum及编译安装


    库文件
    查看二进制程序所依赖的库文件
    ldd /PATH/TO/BINARY_FILE
    管理及查看本机装载的库文件
    ldconfig 加载库文件
    /sbin/ldconfig -p: 显示本机已经缓存的所有可用库文件
    名及文件路径映射关系
    配置文件:/etc/ld.so.conf, /etc/ld.so.conf.d/*.conf
    缓存文件:/etc/ld.so.cache

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

    包文件组成 (每个包独有)
    RPM包内的文件
    RPM的元数据,如名称,版本,依赖性,描述等
    安装或卸载时运行的脚本

    数据库(公共):/var/lib/rpm
    程序包名称及版本
    依赖关系
    功能说明
    包安装后生成的各文件路径及校验码信息

    rpm {-i|--install} [install-options] PACKAGE_FILE...
    -v: verbose
    -vv:更加详细的过程(用于排错)
    -e:卸载
    直接接basename即可
    如:rpm -e tree
    -h:以#显示程序包管理执行进度
    -q:查询
    -ql:包的文件列表
    解压是要完整的路径,而查询和卸载只需要名字,因为是根据数据库查的;
    rpm -ivh PACKAGE_FILE ...

    rpm包安装
    [install-options]
    --test: 测试安装,但不真正执行安装,即dry run模式
    可以用v来看到完整的过程,但是不是真的安装
    --nodeps(忽略依赖关系):
    使用时机:
    当发生依赖关系无法安装时;
    危险性:
    强制操作可能会造成软件无法正常使用;
    --replacepkgs
    面向全局:
    用于在解压开来后的文件缺失或者误改,少的补,多的用原来的覆盖,所以他会带来一个问题就是如果你加了很多自己的配置文件,运行此选项也会被覆盖;
    面向局部:
    rpm2cpio tree-1.6.0-10.el7.x86_64.rpm | cpio -id ./usr/bin/tree,把rpm转成cpio然后再来对某一个文件解开,在复制过去就好了,但这样也会带来一个问题是文件的属性可能会有不同,而上面的直接用rpm覆盖安装是不会存在这样的问题的;
    --replacefiles
    对于A,B两个包解压出来同名的文件进行覆盖,但一般都是版本的原因才会出现这样的情况。如果有添加版本号的,那么2者可以共存,如果都是以名字命名的那么会覆盖;
    --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.rpmnsave)后保留
    1.rpm -ivh /run/media/root/CentOS\ 7\ x86_64/Packages/vsftpd-3.0.2-22.el7.x86_64.rpm
    Preparing... ################################# [100%]
    package vsftpd-3.0.2-22.el7.x86_64 is already installed

    2.rpm -ql vsftpd
    选择一个配置文件/etc/vsftpd/vsftpd.conf

    3.ll /etc/vsftpd/vsftpd.conf并添加一行
    -rw-------. 1 root root 5030 Aug 3 2017 /etc/vsftpd/vsftpd.conf
    [root@centos7 ~]# echo >> /etc/vsftpd/vsftpd.conf
    [root@centos7 ~]# ll /etc/vsftpd/vsftpd.conf
    -rw-------. 1 root root 5031 Jul 6 15:49 /etc/vsftpd/vsftpd.conf

    4.删除文件时,会提示你有修改过的文件,并将其命名为以.rpmsave结尾的文件,其他均被删除,
    后期如果需要用到可以直接覆盖使用;
    [root@centos7 ~]# rpm -e vsftpd
    warning: /etc/vsftpd/vsftpd.conf saved as /etc/vsftpd/vsftpd.conf.rpmsave

    5.重新安装一次
    [root@centos7 vsftpd]# ll
    total 28
    -rw-------. 1 root root 125 Aug 3 2017 ftpusers
    -rw-------. 1 root root 361 Aug 3 2017 user_list
    -rw-------. 1 root root 5030 Aug 3 2017 vsftpd.conf
    -rwxr--r--. 1 root root 338 Aug 3 2017 vsftpd_conf_migrate.sh
    -rw-------. 1 root root 5031 Jul 6 15:49 vsftpd.conf.rpmsave
    rpm查询包
    rpm {-q|--query} [select-options] [query-options]
    [select-options]
    -q:仅查询
    -a: 所有包
    -l:列出该软件所以的文件与目录所在的完整的文件名;
    -f: 查看指定的文件由哪个程序包安装生成
    ql与qf是相反的,一个是解开是哪些,一个是这属于哪个包
    其实文件本删除了也可以查询,因为他查询的是数据库;
    -p :针对尚未安装的程序包文件做查询操作
    也可以用cpio -itv来预览
    --whatprovides CAPABILITY:查询指定的CAPABILITY由哪个包所提供
    CAPABILITY相当于关键字bash、tree等,这个tree或者bash是由哪个包提供
    --whatrequires CAPABILITY:查询指定的CAPABILITY被哪个包所依赖
    哪些包会用到(依赖)这个CAPABILITY
    rpm2cpio 包文件|cpio –itv 预览包内文件
    rpm2cpio 包文件|cpio –id “*.conf” 释放包内文件

    1.查询/usr/bin/java来自哪个rpm?

    [query-options]
    --changelog:查询rpm包的changelog
    更改日志
    -c: 查询程序的配置文件
    -d: 查询程序的文档
    cd为l的部分文件
    -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 {-V|--verify} [select-options] [verify-options]
    -V:接软件名,如果文件被更改过,才会列出来;
    -Va:列出目前系统上面所以可能被更改过的文件;
    -Vp:接文件名,列出该软件内可能背更改的文件;
    -Vf:列出系统上的某个文件是否被更动过;
    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

    c:配置文件(config file)
    d:文件数据文件(documentation)
    g:鬼文件~通常是该文件不被某个软件所包含,较少发生(ghost file)
    l:授权文件(license file)
    r:读我文件(read me)


    包来源合法性验正及完整性验正
    完整性验正: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(Yellowdog Update Modifier):
    rpm的前端程序,可解决软件包相关依赖性,可在多个库之间定位软件包,up2date的替代工具
    yum repository: yum repo,存储了众多rpm包,以及包的相关的元数据文件(放置于特定目录repodata下)
    文件服务器:
    http://
    https://
    ftp://
    file://
    学习yum无非这2点:
    1:会写配置文件(路径)
    2:会清缓存,因为可能因为路径修改之后,与本地的源数据有所变化(因为yum都是从仓库上下载下来放到自己的本机上的),所以需要清缓存

    这是本地的文件
    cd /var/cache/yum/x86_64/7/base/
    [root@centos7 base]# ll
    total 6052
    *-rw-r--r--. 1 root root 6023293 Sep 6 2017 0c34273ad0292747ee5e15c047d3e51c67ca59861a446972db45d71abacc7ad7-primary.sqlite.bz2
    *-rw-r--r--. 1 root root 159667 Sep 6 2017 9346184be1deb727caf4b1ecf4a7949155da5da74af9b92c172687b290a773df-c7-x86_64-comps.xml.gz
    -rw-r--r--. 1 root root 0 Jul 6 20:14 cachecookie
    drwxr-xr-x. 2 root root 48 Jul 6 20:14 gen
    drwxr-xr-x. 2 root root 6 Jul 4 22:11 packages
    -rw-r--r--. 1 root root 3735 Sep 6 2017 repomd.xml

    这是yum仓库上的文件(这里暂时为光盘)
    [root@centos7 base]# ll /run/media/root/CentOS\ 7\ x86_64/repodata/
    total 27222
    *-rw-rw-r--. 1 root root 6023293 Sep 6 2017 0c34273ad0292747ee5e15c047d3e51c67ca59861a446972db45d71abacc7ad7-primary.sqlite.bz2
    -rw-rw-r--. 1 root root 751786 Sep 6 2017 38b60f66d52704cffb8696750b2b6552438c1ace283bc2cf22408b0ba0e4cbfa-c7-x86_64-comps.xml
    -rw-rw-r--. 1 root root 7019993 Sep 6 2017 6cd606547d4f569538d4090e9accdc3c69964de1116b9ab1e0a7864bb1f3ec98-filelists.sqlite.bz2
    *-rw-rw-r--. 1 root root 159667 Sep 6 2017 9346184be1deb727caf4b1ecf4a7949155da5da74af9b92c172687b290a773df-c7-x86_64-comps.xml.gz

    以上可以看出yum仓库上的文件会下载到本地;

    yum配置文件:
    yum客户端配置文件: /etc/yum.conf:为所有仓库提供公共配置
    /etc/yum.repos.d/*.repo:为仓库的指向提供配置
    必须在这个文件下,而且扩展名为.repo
    仓库指向的定义:
    [repositoryID]
    软件库的名字可以随意取,但不能重名;
    name=Some name for this repository
    说明下软件库的意义,重要性不大,但是不写,系统每次都有一句提示Repository 'base' is missing name
    baseurl=url://path/to/repository/ enabled={1|0}
    需要是热破data的父目录;
    enable
    软件库是否启动;
    gpgcheck={1|0}
    是否需要查阅RPM文件内的数码签章;
    gpgkey=URL
    数码签章的公钥所在位置,使用默认值即可;
    enablegroups={1|0}
    failovermethod={roundrobin|priority}
    roundrobin:意为随机挑选,默认值
    priority:按顺序访问
    cost= 默认为1000

    搭建本地仓库(用光盘来作为源):
    1.写一个后缀为.repo的文件,名字不重要,取base.repo;
    2.编辑这个文件,vim base.repo
    3.[base]
    baseurl=file:///run/media/root/CentOS\ 7\ x86_64/ (baseurl需要是repodata的父目录)
    4.写了这两行之后yum repolist就会有一个名字为base的源;
    5.继续编写base.repo
    [base]
    name=centos7.4 cdrom
    baseurl=file:///run/media/root/CentOS\ 7\ x86_64/(需要写repodata的父目录)
    gpgkey=file:///run/media/root/CentOS\ 7\ x86_64/RPM-GPG-KEY-CentOS-7
    不想装钥匙第4句改为gpgcheck=0
    enabled=0(不使用时,临时禁用)

    yum clean all:删除所有数据库数据
    packages:将已下载的软件文件删除
    headers:将下载的软件文件开始删除
    yum repolist查看仓库列表
    yum install ** 安装
    -y:不交互,默认yes
    -q:静默安装;
    --installroot=/some/path:该软件安装在/some/path下而不是用默认路径;
    yum remove ** 卸载
    search :搜寻某个软件名称或者是描述(description)的重要关键字
    list:列出目前yum所管理的所有软件名称与版本,类似rpm -qa
    info:类似 rpm -qai
    provides:从文件去搜寻软件,类似于rpm -qf
    update:后面接要升级的文件!如要整个系统都升级,就直接update;


    *把自己搭建为搭建yum仓库服务器:
    准备工作
    关闭SElinux
    enforcing改为permissive
    setenforce 0

    关闭iptables
    centos7
    systemctl stop firewalld 关闭当前防火墙
    systemctl disable firewalld 关闭开机自启动

    centos6
    chkconfig iptables off关闭开机自启动
    service iptables stop 关闭当前防火墙

    systemctl start vsftpd 现在启动
    systemctl enable vsftpd 开机启动


    共享服务:httpd、ftp
    /var/www/html
    /var/ftp/pub
    当你完成一个项目的时候已经做出了rpm包了,但是要在共享服务上显示,还需要rpm包元数据
    createrepo /some/to/file 一个命令就可以制作rmp包元数据
    上面的操作可以把磁盘内容拷过到这2个文件里,也可以直接把光盘挂载到其下面。

    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命令的用法:
    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-config-manager
    yum-config-manager --add-repo=url
    yum-config-manager --disable “仓库名" 禁用仓库
    yum-config-manager --enable “仓库名” 启用仓库

    升级程序包:
    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 repolist 的时候会自动构建)

    搜索: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(撤销第6步)
    redo 6(重做第6步)
    用于删除某个文件,而且确定他的所以依赖文件都不需要的时候使用,因为默认yum remove **只会删除后面接的文件;
    日志 :/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:禁用所有插件

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

    编译安装httpd(网上下载一个最新的版本)
    1.yum groupinstall "Development Tools"
    2.cat README
    cat INSTALL
    参考格式:
    $ ./configure --prefix=PREFIX
    $ make
    $ make install
    $ PREFIX/bin/apachectl start
    3.进入到httpd那个目录(./configure --help)
    ./configure --prefix=/app/httpd24 --sysconfdir=/etc/httpd24/ --enable-ssl
    --enable-proxy-fcgi
    报错:
    checking for APR... no
    configure: error: APR not found. Please read the documentation.
    缺啥补啥:
    yum install apr-devel(缺什么后面跟-devel补上就行)
    再次报错:
    checking for APR-util... no
    configure: error: APR-util not found. Please read the documentation.
    继续补:
    yum install apr-util-utildevel
    再次报错:
    checking for pcre-config... false
    继续补:
    yum install pcre-devel
    再次报错:
    checking whether to enable mod_ssl... configure: error: mod_ssl has been requested but can not be built due to prerequisite failures
    继续补:
    yum install openssl-devel
    成功之后会生成Makefile文件;

    4.make -j 2 (-j指定cpu个数,多线程)
    5.make install
    45可以合成一句:
    make;make install && echo -e "\a"
    6.配置运行环境
    1.修改PATH
    vim /etc/profile.d/httpd24.sh
    PATH=/app/httpd24:$PATH
    . /etc/profile.d/httpd24.sh
    7.apachectl 启动apache服务;

  • 相关阅读:
    【Azure API 管理】解决API Management添加AAD Group时遇见的 Failed to query Azure Active Directory graph due to error 错误
    【Azure 云服务】Azure Cloud Service (Extended Support) 云服务开启诊断日志插件 WAD Extension (Windows Azure Diagnostic) 无法正常工作的原因
    【Azure 应用服务】App Service For Linux 环境中,如何从App Service中获取GitHub私有库(Private Repos)的Deploy Key(RSA key)呢?
    【Azure 应用服务】App Service与Application Gateway组合使用时发生的域名跳转问题如何解决呢?
    【Azure 应用服务】App Service"访问控制/流量监控"四问
    【Azure 应用服务】在创建Web App Service的时候,选Linux系统后无法使用Mysql in App
    【Azure Fabric Service】Service Fabric 遇见错误信息记录 The process/container terminated with exit code:2148734499
    【Azure Developer】使用PowerShell WhereObject方法过滤多维ArrayList时候,遇见的诡异问题 当查找结果只有一个对象时,返回结果修改了对象结构,把多维变为一维
    【Azure 事件中心】Spring Boot 集成 Event Hub(azurespringcloudstreambindereventhubs)指定Partition Key有异常消息
    Spring系列28:@Transactional事务源码分析
  • 原文地址:https://www.cnblogs.com/wuyanzu123/p/9276817.html
Copyright © 2020-2023  润新知