软件包管理

2018-06-05  本文已影响0人  毛利卷卷发

软件包基础

包管理器

二进制应用程序的组成部分:二进制文件,库文件,配置文件,帮助文件

程序包管理器

debian:deb文件,dpkg包管理器
redhat:rpm文件,rpm包管理器

包命名

源代码:name-VERSION.tar.gz|bz2|xz

rpm包命名方式:name-VERSION-release.arch.rpm

包分类

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:ldd `which ls`

管理及查看本机装载的库文件
ldconfig:加载库文件
/sbin/ldconfig -p:显示本机已经缓存的所有可用库文件名及文件路径

映射关系
配置文件:/etc/ld.so.conf,/etc/ld.so.conf.d/*.conf
缓存文件:/etc/ld.so.cache

包管理器

程序包管理器

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

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

rpm包内的文件
rpm的元数据,如名称、版本、依赖性、描述等
安装或卸载时运行的脚本

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

程序包的来源

系统发版的光盘或官方服务器

https://www.centos.org/download/
http://mirror.aliyun.com
http://mirrors.souhu.com
http://mirrors.163.com

项目官方站点

第三方组织

注意检查包的来源合法性和完整性

http://fedoraproject.org/wiki/EPEL
http://repoforge.org/
http://pkgs.org
http://rpmfind.net
http://rpm.pbone.net
https://sourceforge.net/

自己制作

rpm

rpm包安装

rpm -i/--install [install-options] PACKAGE_FILE…

rpm包升级

rpm -U/--upgrade:安装有旧版本的程序包,则升级,若不存在旧版程序包,则安装
rpm -F/--freshen:安装有旧版程序包,则升级,如果不存在旧版程序包,则不执行升级操作

注意

  1. 不要对内核做升级操作,Linux支持多内核版本并存,因此,直接安装新版本内核即可
  2. 如果原程序包的配置文件安装后曾被修改,升级时,新版本的提供的同一个配置文件并不会直接覆盖老版本的配置文件,而把新版本的文件重命名(FILENAME.rpmnew)后保留

rpm包查询

rpm -q|--query [options]

rpm2cpio

rpm2cpio PACKAGE | cpio -itv:预览包内文件
rpm2cpio PACKAGE | cpio -idv:释放包

# 文件缺失
[root@centos7 ~]# rm -rf /etc/inittab
# 查看文件是由哪个rpm包生成的
[root@centos7 ~]# rpm -qf /etc/inittab
initscripts-9.49.41-1.el7.x86_64
# 在光盘中找到这个rpm包,并赋值到指定目录
[root@centos7 ~]# cp /media/cd1/Packages/initscripts-9.49.41-1.el7.x86_64.rpm /app
# 使用rpm2cpio进行转换,并将命令结果直接给cpio处理,这里是解包
[root@centos7 app]# rpm2cpio initscripts-9.49.41-1.el7.x86_64.rpm |cpio -id
3039 blocks
[root@centos7 app]# ll
total 444
drwxr-xr-x. 10 root root   4096 Jun  2 16:15 etc
-rw-r--r--.  1 root root 447444 Jun  2 16:11 initscripts-9.49.41-1.el7.x86_64.rpm
drwxr-xr-x.  7 root root     68 Jun  2 16:15 usr
drwxr-xr-x.  4 root root     28 Jun  2 16:15 var
# 再将缺失的文件复制到/etc/目录下即可
[root@centos7 app]# cp etc/inittab /etc/

rpm包卸载

rpm -e/-erase [OPTIONS] PACKAGE...

rpm包校验

rpm -V|--verify

[root@centos7 ~]# rpm -V tree
S.5....T.  d /usr/share/doc/tree-1.6.0/LICENSE

S:大小改变
M:权限和类型等改变
5:MD5改变
D:设备版本号改变
L:指向路径改变
U:属主改变
G:属组改变
T:修改时间改变
P:功能改变

rpm -K/--checksig:公司通过私钥加密的rpm包,用户可以通过公钥来校验包的完整性和签名

[root@centos7 app]# rpm -K /media/Packages/tree-1.6.0-10.el7.x86_64.rpm 
/media/Packages/tree-1.6.0-10.el7.x86_64.rpm: rsa sha1 (md5) pgp md5 OK

rpm -qa "gpg-pubkey*":查看公钥

rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7:导入公钥

rpm数据库

/var/lib/rpm

rpm --initdb:初始化数据库,如果实现不存在,则新建,否则,不执行任何操作

rpm --rebuilddb:重建已安装的包头的数据库索引目录

yum

yum实现原理

  1. 本地主机会在配置文件里面找到yum repository的指向,并建立连接
  2. 从yum repository获取元数据文件和特征码放在缓存里面
  3. 通过查看元数据文件获知需要安装的软件包和其依赖的软件的名称并向yum repository发起请求
  4. 本地主机获取到软件包后进行安装
  5. 安装好后,rpm包会被删除,但是元数据文件和特征码会被保存下来,其目的是为了当你再向yum repository发起连接的时候,先会向yum repository获取到特征码和本地缓存的特征码做对比,如果相同则说明yum repository里面的文件没有发生改变,如果不同,则说明yum repository里面的文件发生了改变,这时候就需要重新向yum repository获取元数据文件了

通常情况下yum repository都是文件服务器,你可以通过URL进行访问,如:

ftp://path/to/repository/
http://path/to/repository/
https://path/to/repository/
file://path/to/repository/

yum配置文件

/etc/yum.conf

为所有仓库提供公共配置

cachedir=缓存目录,默认情况下在/var/cache/yum/
keepcache=是否保持缓存,0时不保存,1是保存
debuglevel=Debug信息的输出等级,范围是0-10,默认是2
logfile=存放log文件的路径
exactarch=是否精准匹配平台,默认是1,精确匹配
obsoletes=仅仅会影响升级,简单的说相当于upgrade,允许更新旧版本的rpm包
gpgcheck=是否检验安装包的来源合法性
plugins=是否允许使用插件,默认为1,表示安装
installonly_limit=允许同时保持的内核包
bugtracker_url=bug的追踪的url

/etc/yum.repos.d/.repo*

为仓库的指向提供配置

[repositoryID]具有唯一性
name=可以重复
baseurl=可以为多个,路径下必须有repodata
enable=是否开启,1为开启,0为关闭,默认开启
gpgckeck=是否检查公钥
gpgkey=公钥
cost=超时时间
enablegroup=是否允许使用包组,默认是允许

yum的repo配置文件中可用的变量: $releasever、 $arch、$basearch、$YUM0-$YUM9

[base]
name=base
baseurl=file:///media
enable=1
gpgcheck=0

[tsinghua]
name=tsinghua
baseurl=https://mirrors.tuna.tsinghua.edu.cn/epel/$releasever/$basearch/
enabled=0
gpgcheck=0

/var/log/yum.log

yum日志

yum命令

man 5 yum.conf

查看仓库

yum repolist

createrepo dirname:创建yum仓库

查看仓库里面的软件包

yum list

安装包

yum install package1 package2 ...:安装包,可以跟-y选项,跳过交互式
yum install --downloadonly--downloaddir=/目录名 软件包名:仅下载包,不安装

yum reinstall package1 package2 ...:重新安装包,可以跟-y选项,跳过交互式

升级包

yum update package1 package2 ...:升级包,可以配合-y选项,跳过交互式

yum downgrade package1 package2 ...:升级包,可以配合-y选项,跳过交互式

yum check-update:检查可用升级

卸载包

yum remove/erase package1 package2 ...:卸载包,但不卸载安装时依赖的包,可以配合-y选项,跳过交互式

其他

yum info ...:查看包信息,和rpm -qi类似
yum provides/whatprovides feature1 feature2 ...:查看指定的特性(可以是某文件)是由哪个程序包提供

yum clean all:清空缓存
yum makecache:构建缓存

yum search string1 string2 ...:以指定的关键字搜索程序包包名及sunmary信息
yum deplist package1 package2 ...:查询指定的包依赖哪些能力及所提供的包

yum history:查看yum历史

yum localinstall rpmfile1 rpmfile2 ...:安装本地程序包,依赖性关系还交给yum处理,可以配合-y选项,跳过交互式
yum localupdate rpmfile1 rpmfile2 ...:更新本地程序包,依赖性关系还交给yum处理,可以配合-y选项,跳过交互式

包组相关

yum grouplist:查看当前所有包组
yum groupinfo group1 ...:查看包组信息
yum groupinstall group1 ...:安装包组
yum groupupdate group1 ...:升级包组
yum groupremove group1 ...:卸载包组

命令行选项

dnf

yum升级版,详细使用和yum类似,配置文件:/etc/dnf/dnf.conf

程序包的编译安装

我们有的时候并不能获取到相应软件的rpm包或者是原本就是没有rpm包的,但是一般项目网站都会给我们提供对应的源代码,然后我们可以使用工具进行编译安装。

安装步骤:

  1. 首次安装先查看INSTALL和README文件
  2. 运行configure脚本,生成makefile文件
    1. 通过传递参数,指定启动特性、安装路径等,执行时会参考用户指定以及Makefile.in文件(有的时候可能没有configure文件和Makefile.in文件,autoconf根据指定的配置文件可以生成configure文件,automake可以根据指定的配置文件生成Makefile.in文件),最终生成Makefile
    2. 检查依赖到的外部环境
    3. 常用选项:
    • --help:获取其他支持的使用选项
    • --prefix=/PATH/TO/SOMEWHERE:指定默认安装位置,默认为/usr/local/
    • --sysconfdir=/PATH/TO/SOMEWHERE:指定默认配置文件安装位置,默认为/usr/local
    • 如果不指定--prefix选项,安装后可执行文件默认放在/usr/local/bin,库文件默认放在/usr/local/lib,配置文件放在/usr/local/etc,其他的资源文件放在/usr/local/share。指定prefix的好处就是当你想卸载软件的时候,直接删除该安装目录就行了,也可以将整个目录拷贝到其他的机器上使用,前提是同样的操作系统
  3. make:根据生成的makefile文件,构建应用程序
  4. make install:用来安装,它从Makefile中读取指令,安装到指定的位置
  5. 安装后的配置
    1. 导入二进制程序目录至PATH环境变量中:
    • vim /etc/profile.d/NAME.sh
    • export PATH=/PATH/TO/BIN:$PATH
    • source /etc/profile.d/NAME.sh
    1. 导入库文件路径:
    • vim /etc/ld.so.conf.d/NAME.conf
    • 添加新的库文件所在目录至此文件中
    • 让系统重新生成缓存:ldconfig -v
    1. 导入头文件:ln -sv
    2. 导出帮助手册:编辑/etc/man_db.config文件,添加一个MANPATH

练习

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

    [root@centos7 app]# rpm -qa |grep java
    
    [root@centos7 app]# which java
    /usr/bin/java
    [root@centos7 app]# rpm -qf /usr/bin/java
    file /usr/bin/java is not owned by any packag
    [root@centos7 app]# ls /usr/bin/java -l
    lrwxrwxrwx. 1 root root 22 May 15 22:02 /usr/bin/java -> /etc/alternatives/java
    [root@centos7 app]# ll /etc/alternatives/java
    lrwxrwxrwx. 1 root root 71 May 15 22:02 /etc/alternatives/java -> /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.161-2.b14.el7.x86_64/jre/bin/java
    [root@centos7 app]# rpm -qf /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.161-2.b14.el7.x86_64/jre/bin/java
    java-1.8.0-openjdk-headless-1.8.0.161-2.b14.el7.x86_64
    
  2. yum的配置和使用,包括yum仓库的创建

    # createrepo创建指定目录存放repodate目录
    [root@centos7 rpm]# createrepo /app/rpm/
    Spawning worker 0 with 5 pkgs
    Workers Finished
    Saving Primary metadata
    Saving file lists metadata
    Saving other metadata
    Generating sqlite DBs
    Sqlite DBs complete
    
    # 将指定目录写入repository,这样才能生效
    [root@centos7 rpm]# cat /etc/yum.repos.d/base.repo 
    [base]
    name=base
    baseurl=http://172.18.0.1/centos/$releasever/
    
    [base1]
    name=base1
    baseurl=file:///media/
    
    [base2]
    name=base2
    baseurl=file:///app/rpm/
    
    [base3]
    name=base3
    baseurl=https://mirrors.tuna.tsinghua.edu.cn/epel/7/x86_64/
    
  3. 在centos7上安装和使用dnf

    # rz导入本地dnf包
    # 安装本地dnf包
    [root@centos7 dnf]# yum localinstall * -y
    # 用dnf重装tree和samba并跳过交互式
    [root@centos7 dnf]# dnf reinsatll tree samba -y
    
  4. 编写系统初始化脚本reset.sh,包括别名,提示符颜色,yum仓库配置文件,安装tree,ftp,lftp,telnet等包

    #!/bin/bash
    
    # 设置别名、提示符颜色和PATH
    cat > /etc/profile.d/env.sh << EOF
    alias cdnet="cd /etc/sysconfig/network-scripts"
    alias editnet="vim /etc/sysconfig/network-scripts/ifcfg-ens33"
    export PS1="[\[\e[31m\]\u\e[0m\]@\h \W]\\$ "
    export PATH=/app/bin:$PATH
    EOF
    source /etc/profile.d/env.sh
    
    # 设置vim
    cat > ~/.vimrc << EOF
    set nu
    EOF
    source ~/.vimrc
    
    # 配置yum仓库
    cat > /etc/yum.repos.d/env.repo << EOF
    [mage]
    name=mage
    baseurl=http://172.18.0.1/centos/$releasever/
    enable=1
    
    [tsinghua]
    name=tsinghua
    baseurl=https://mirrors.tuna.tsinghua.edu.cn/epel/7/x86_64/
    enabled=1
    
    [dvd]
    name=dvd
    baseurl=file:///media/
    enabled=0
    EOF
    
    # 安装常用包
    rpm -q tree &> /dev/null && echo "tree已安装" || ( yum install tree -y &> /dev/null && echo "tree安装成功" || echo "tree安装失败")
    rpm -q ftp &> /dev/null && echo "ftp已安装" || ( yum install ftp -y &> /dev/null && echo "ftp安装成功" || echo "ftp安装失败" )
    rpm -q lftp &> /dev/null && echo "lftp已安装" || ( yum install lftp -y &> /dev/null && echo "lftp安装成功" || echo "lftp安装失败" )
    rpm -q telnet &> /dev/null && echo "telnet已安装" || ( yum install telnet -y &> /dev/null && echo "telnet安装成功" || echo “telnet安装失败”)
    
    echo "初始化完成"
    
  5. 在CentOS6上编译安装apache 2.2源码包,并启动此服务

    # 服务器下载apache2.2源码包,也可以rz本地上传
    [root@centos6 ~]# lftpget ftp://172.18.0.1/pub/Sources/sources/httpd/httpd-2.2.29.tar.bz2
    # 解压源码包
    [root@centos6 ~]# tar -xvf httpd-2.2.29.tar.bz2
    # 安装Development Tools
    [root@centos6 ~]# yum groupinstall "Development Tools" -y
    # 安装第一步:./configure
    [root@centos6 ~]# ./configure --prefix=/app/apache22 --sysconfdir=/etc/apache22
    # 安装第二步:make
    [root@centos6 ~]# make
    # 安装第三步:make install
    [root@centos6 ~]# make install
    # 配置环境变量
    [root@centos6 ~]# cat /etc/profile.d/env.sh << EOF
    export PATH=/app/apache24/bin/:$PATH
    EOF
    [root@centos6 ~]# source /etc/profile.d/env.sh
    # 启动服务并关闭防火墙
    [root@centos6 ~]# apachectl start
    [root@centos6 ~]# iptables -F
    
  6. 在CentOS7上编译安装apache 2.4源码包,并启动此服务

上一篇 下一篇

猜你喜欢

热点阅读