zoukankan      html  css  js  c++  java
  • 软件包管理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服务;

  • 相关阅读:
    不可重叠最长重复子串
    离散化
    hash是一门优雅的暴力
    Detect the Virus (字符串转化+AC自动机)
    病毒侵袭(AC自动机变形)
    hdu2069(Coin Change)
    Hie with the Pie(poj3311)
    poj3254(状压dp入门第一道题,很详细)
    map系统学习
    ACM-ICPC 2018 南京赛区网络预赛 B. The writing on the wall
  • 原文地址:https://www.cnblogs.com/wuyanzu123/p/9276817.html
Copyright © 2011-2022 走看看