软件包基础
包管理器
二进制应用程序的组成部分:二进制文件,库文件,配置文件,帮助文件
程序包管理器
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…
- -v:详细显示
- -vv:超级详细显示
- -h:以#显示程序包管理执行进度
- --test:测试安装,但不真正执行安装,即dry run模式
- --nodeps:忽略依赖性关系
- --replacepkgs:重复安装已安装过的包,文件覆盖
- --replacefiles:将要安装包的部分文件与其他已安装的包文件冲突,可继续安装,文件不覆盖
- --noscripts:不执行程序包脚本
- %pre: 安装前脚本;--nopre
- %post: 安装后脚本;--nopost
- %preun: 卸载前脚本;--nopreun
- %postun: 卸载后脚本;--nopostun
- --oldpackage:已安装新版程序包,再同时安装旧版程序包
- --force:强制安装,等同于--replacepkgs --replacefiles --oldpackage
rpm包升级
rpm -U/--upgrade:安装有旧版本的程序包,则升级,若不存在旧版程序包,则安装
rpm -F/--freshen:安装有旧版程序包,则升级,如果不存在旧版程序包,则不执行升级操作
注意
- 不要对内核做升级操作,Linux支持多内核版本并存,因此,直接安装新版本内核即可
- 如果原程序包的配置文件安装后曾被修改,升级时,新版本的提供的同一个配置文件并不会直接覆盖老版本的配置文件,而把新版本的文件重命名(FILENAME.rpmnew)后保留
rpm包查询
rpm -q|--query [options]
- a:所有包
- -f:查看指定的文件是由哪个程序包提供(文件用路径表示)
- -p:指定包名,配合其他选项一起用,不加-p不可直接指定包名,需要指定程序名
- --provides:查看指定包提供了哪些CAPABILITY 也可用-a --provides 查看所有CAPABILITY
- --whatprovides CAPABILITY:查询指定的CAPABILITY由哪个包所提供
- --whatrequires CAPABILITY:查询指定的CAPABILITY被哪个包所依赖
- --changelog:查询rpm包的changelog
- -c:查询程序的配置文件
- -d:查询程序的文档
- -i:查询程序的信息
- -l:查看指定程序包安装后生成的所有文件
- --scripts:查看程序包自带的脚本
- -R:查询指定的程序包所依赖的CAPABILITY
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...
- --allmatches:卸载所有版本的包
- --nodeps:不进行依赖性关系检测
- --noscripts:不执行脚本
- --test:测试卸载,但不真正执行卸载,即dry run模式
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包,用户可以通过公钥来校验包的完整性和签名
- --nosignature:不检查来源合法性
- --nodigest:不检查包完整性
[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实现原理
- 本地主机会在配置文件里面找到yum repository的指向,并建立连接
- 从yum repository获取元数据文件和特征码放在缓存里面
- 通过查看元数据文件获知需要安装的软件包和其依赖的软件的名称并向yum repository发起请求
- 本地主机获取到软件包后进行安装
- 安装好后,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
- enabled:仅显示激活的仓库,默认
- disable:仅显示禁用的仓库
- all:显示所有的仓库
createrepo dirname:创建yum仓库
查看仓库里面的软件包
yum list
- all:显示所有已安装和可以安装的包,默认
- available:显示未安装的包
- installed:显示安装的包(@anaconda:表示操作系统预装的包、installed:表示手动安装的包、其余的表示包的来源仓库)
- updates:显示可更新的包
安装包
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历史
- info #:查看第#条yum历史详情
- undo #:卸载第#条yum历史执行的包及其依赖包,可以配合-y选项,跳过交互式
- redo #:重装第#条yum历史执行的包及其依赖包,可以配合-y选项,跳过交互式
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 ...:卸载包组
命令行选项
- --nogpgcheck:禁止进行gpgcheck
- -y:自动回答为“yes”,通常配合其他选项来跳过交互式
- -q:静默模式
dnf
yum升级版,详细使用和yum类似,配置文件:/etc/dnf/dnf.conf
程序包的编译安装
我们有的时候并不能获取到相应软件的rpm包或者是原本就是没有rpm包的,但是一般项目网站都会给我们提供对应的源代码,然后我们可以使用工具进行编译安装。
安装步骤:
- 首次安装先查看INSTALL和README文件
- 运行configure脚本,生成makefile文件
- 通过传递参数,指定启动特性、安装路径等,执行时会参考用户指定以及Makefile.in文件(有的时候可能没有configure文件和Makefile.in文件,autoconf根据指定的配置文件可以生成configure文件,automake可以根据指定的配置文件生成Makefile.in文件),最终生成Makefile
- 检查依赖到的外部环境
- 常用选项:
- --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的好处就是当你想卸载软件的时候,直接删除该安装目录就行了,也可以将整个目录拷贝到其他的机器上使用,前提是同样的操作系统
- make:根据生成的makefile文件,构建应用程序
- make install:用来安装,它从Makefile中读取指令,安装到指定的位置
- 安装后的配置
- 导入二进制程序目录至PATH环境变量中:
- vim /etc/profile.d/NAME.sh
- export PATH=/PATH/TO/BIN:$PATH
- source /etc/profile.d/NAME.sh
- 导入库文件路径:
- vim /etc/ld.so.conf.d/NAME.conf
- 添加新的库文件所在目录至此文件中
- 让系统重新生成缓存:ldconfig -v
- 导入头文件:ln -sv
- 导出帮助手册:编辑/etc/man_db.config文件,添加一个MANPATH
练习
-
查询命令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
-
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/
-
在centos7上安装和使用dnf
# rz导入本地dnf包 # 安装本地dnf包 [root@centos7 dnf]# yum localinstall * -y # 用dnf重装tree和samba并跳过交互式 [root@centos7 dnf]# dnf reinsatll tree samba -y
-
编写系统初始化脚本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 "初始化完成"
-
在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
在CentOS7上编译安装apache 2.4源码包,并启动此服务