Linux之软件包管理
一,包管理器1.1 二进制应用程序的组成部分: 二进制文件,库文件,配置文件,帮助文件1.2 程序包管理器 debian : deb文件,dpkg包管理器 redhat : rpm文件,rpm包管理器 rpm : Redhat Package Manager 源代码: name-Version.tar.gz|
一,包管理器
1.1 二进制应用程序的组成部分:
二进制文件,库文件,配置文件,帮助文件
1.2 程序包管理器
debian : deb文件,dpkg包管理器
redhat : rpm文件,rpm包管理器
rpm : Redhat Package Manager
源代码: name-Version.tar.gz|bz2|xz
Version :major.minor.release
rpm 包命名方式:
name-VERSION-release.arch.rpm
VERSION :major.minor.release
release :release.OS
arch(常见的)
x86 :i386,i486,i586,i686
x86_64 :x64,x86_64,amd64
包的分类:
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/binaryfile
管理和查看本机装载的库文件
ldconfig
ldconfig -p :显示本机已经缓存的所有可用库文件名及文件路径映射的关系
配置文件:/etc/ld.so.conf, /etc/ld.so.conf.d/*.conf
缓存文件:/etc/ld.so.cache
程序包管理器:
将编译好的应用程序的各组成文件打包一个或几个程序包文件,从而方便快捷地实现程序包的安装,卸载,查询,升级和校验等管理操作
1,包文件组成(每个包独有)
rpm包内的文件
rpm的元数据,如名称,版本,依赖性,描述等
安装或卸载时运行的脚本
2,数据库(公共)
程序包名称及版本
依赖关系
功能说明
包安装后生成的各文件路径及校验码信息
3,管理程序包的方式
使用包管理器:rpm
使用前端工具:yum,dnf
4,获取程序包的途径
a,系统发行版的光盘或官方的服务器
CentOS镜像:
https://www.centos.org/download/
http://mirrors.aliyun.com
http://mirrors.sohu.com
b,项目官方站点
c,第三方组织
Fedora-EPEL: Extra Packages for Enterprise Linux
Rpmforge:RHEL推荐,包很全
搜索引擎:
http://pkgs.org
http://rpmfind.net
http://rpm.pbone.net
https://sourceforge.net/
d,自己制作
注意:一定要检查其合法性,来源合法性,程序包的完整性
二 rpm包管理及其详细命令
centos系统上使用rpm命令管理程序包:
安装,卸载,升级,查询,校验,数据库维护
1,安装:
rpm {-i,--install}[install-options]PACKAGE_FILE...
-v :verbose 显示详细信息
-vv : 显示更加详细的信息
-h :以#显示程序包管理执行进度,每一个#代表2%
rpm -ivh PACKAGE_FILE
[install-options]
--test :测试安装,但不真正的执行安装;dry run 模式
--nodeps :忽略依赖关系(最后不要忽略,可能会造成程序执行的错误)
--replacepkgs | replacefiles :重新安装
--nosignature :不检查来源合法性
--nodigest :不检查包完整性
--noscripts :不执行程序脚本片段
自带脚本,可分为四类 都不想执行 --noscripts
preinstall 安装过程开始之前 %pre --nopre
postinstall 安装过程完成之后运行的脚本 %post --nopost
preuninstall 卸载过程真正开始执行之前运行的脚本 %preun --nopreun
postuninstall 卸载过程完成之后运行的脚本 %postun --nopostun
2,rpm包升级
rpm {-U|--upgrade}[install-opintos]package_file
rpm {-F|--freshen}[install-opintos]package_file
--upgrade:安装有旧版程序包,则升级;如果不存在旧版程序包,则安装;
--freshen:安装有就版程序包,则升级;如果不存在就版程序包,则不执行升级操作
rpm -Uvh package_file...
rpm -Fvh package_file...
--oldpackage :降级
--force :强制升级
注意:
不要对内核进行升级操作;Linux支持多内核版本并存,因此,直接安装新版本内核即可
如果某源程序包的配置文件安装后曾被修改过,升级时,新版本的程序提供的同一个配置文件不会覆盖原有的版本的配置文件,而是把新版本的配置文件重命名(filename.rpmnew)后提供
3,rpm包信息查询----非常非常非常重要-----
rpm {-q|--query}[select-options][query-opintos]
[select-options]
package_name :查询指定的程序包是否已经安装,及其版本
-a,--all :查询所有已经安装过的包
-f FILE :查询指定的文件由哪个程序包安装生成
-p,--package package_file :用于实现对未安装的程序包执行查询操作
--whatprovides CAPABILITY :查询指定的CAPANILITY由哪个程序包提供?
--whatrequires CAPABILITY :查询指定的CAPANILITY被哪个包所依赖
rpm2cpio 包文件|cpio –itv 预览包内文件
rpm2cpio 包文件|cpio –id “*.conf” 释放包内文件
复习一下命令: cpio
cpio命令是通过重定向的方式将文件进行打包备份,还原恢复的工具,它可以解压以'.cpio'或者'.tar'结尾的文件
cpio [选项] > 文件名或者设备名
cpio [选项] < 文件名或者设备名
选项:
-o :将文件拷贝打包成文件或者将文件输出到设备上
-i :解包,将打包文件解压或将设备上的备份还原到系统
-t :预览,查看文件内容或者输出到设备上的文件内容
-v :显示打包过程中的文件名称
-d :解包生成目录,在cpio还原时,自动的建立目录
-c :一种较新的存储方式
[query-opintos]
--changelog :查询rpm包的changelog
-l,list:列出一个包安装生成的所有文件的列表
-i,info:查询程序包相关的信息
-c,--configfiles:查询指定的程序提供的配置文件
-d,--docfiles :查询指定的程序包提供的文档
--provides :列出指定的程序包提供的所有CAPABILITY
-R,--requires :查询指定程序包的依赖关系
--scripts :查看程序包自带的脚本程序
用法:
-qi package #查询安装过程序的信息
-qf file #查询指定的文件由哪个程序包安装生成
-qc package #查询程序的配置文件
-ql package #查询程序安装后生成的所有文件
-qd package #查询程序安装后的文档
4,卸载
rpm {-e|--erase}[--allmatches][--nodeps][--noscripts][--test]package_name...
--allmatches :卸载所有匹配指定名称的程序包的各版本
--nodeps :忽略依赖关系
--test :测试卸载,dry run 模式
5,校验
rpm -V package
rpm {-V|--verify} [select-options] [verify-options]
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
包来源合法性验证和完整性验证
来源合法性验证:RSA
完整性验证:SHA256
公钥加密
对称加密:加密,解密使用同一密钥
非对称加密:密钥是成对的
putlic 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相关操作及其命令
yum :全称 Yellowdoy Update Modifier ,rpm的前端程序,用来解决软件包相关依赖性,可以在多个库之间定位软件包,up2date的替代工具
yum repository : yum repo ,存储了众多rpm包,以及包相关的元数据文件(放置于特定目录repodata下)
文件服务器:
1,yum配置文件
yum客户端配置文件:可以通过命令 rpm -qc yum 来查看配置文件路径
/etc/yum.conf :为所有仓库提供公共配置
/etc/yum.repos.d/*.repo :为仓库的指向提供配置
仓库指向的定义:
[repositoryID]
name=Some name for this repository
baseurl=url://path/to/repository/
enable={1|0}
gpgcheck={1|0}
gpgkey=URL
enablegroups={1|0}
failovermethod={roundrobin|priority}
默认为 roundrobin 随机挑选
cost=
默认为1000 越小,优先级越高
2,yum命令的用法
yum [options] [command] [package ...]
yum-config-manager --disable NAME :禁用仓库名为NAME的仓库
yum-config-manager --enable NAME :启用仓库
显示仓库列表: reportlist [all|enabled|disable]
显示程序包:
list
yum list [all | glob_exp1] [glob_exp2] [...]
yum list {available|installed|updates} [glob_exp1] [...]
安装程序包
install package1 [package2] [...]
reinstall package1 [package2] [...] (重新安装,基于覆盖方式安装)
升级程序包:
update [package1] [package2] [...] (升级)
downgrade package1 [package2] [...] (降级)
检查可用升级:
check-update
卸载程序包:
remove | erase package1 [package2] [...]
查看程序包information
info [...]
查看指定的特性(可以是某个文件)是由哪个程序包所提供:
provides | whatprovides feature1 [feature2] [...]
请从本地缓存:
clean [ packages | metadata | expire-cache | rpmdb | plugins | all ]
构建缓存:
makecache [fast]
搜索:
search string1 [string2] [...]
以指定关键字搜索程序包名及summary信息
查看指定包所依赖的CAPABILITIES:
deplist package1 [package2] [...]
查看yum事务历史
history [info|list|packages-list|packages-info|summary|addon-info|redo|undo|rollback|new|sync|stats]
yum history info 6 #查看详细信息
yum history undo 6 #撤销id为6的所做的所有更改
日志 :/var/log/yum.log
安装及升级本地程序包:
localinstall rpmfile1 [rpmfile2] [...]
(maintained for legacy reasons only - use install)
localupdate rpmfile1 [rpmfile2] [...]
(maintained for legacy reasons only - use update)
包组管理的相关命令:
groupinstall group1 [group2] [...]
groupupdate group1 [group2] [...]
grouplist [hidden] [groupwildcard] [...]
groupremove group1 [group2] [...]
groupinfo group1 [group2] [...]
如何使用光盘当作本地yum仓库
1,挂载光盘至某目录,例如 /media/cdrom
#mount -r /dev/sr0 /media/cdrom/
2,创建配置文件
[locate]
name=
baseurl=
gpgcheck=
enabled=
yum 的命令行选项:
--nogpgcheck : 禁止进行gpg check ;
-y :自动回答为yes
-q :静默模式
--disablerepo=repoidglob : 临时禁用此处指定的repo;
--enablerepo=repoidglob :临时启用指定的repo
--noplugins :禁止所有插件
yum的repo配置文件中可用的变量:
$releasever :当前OS的发行版的主版本号
$arch :平台
$basearch :基础平台
$YUM0-$YUM9 :自定义变量
比如: http://mirrors.aliyun.com/centos/$releasever/$basearch/os
创建yum仓库:
lftp 登陆到远程ftp, 通过 !mkdir /yum/repo 创建本地目录,通过 lcd /yum/repo 进入本地目录,通过 mget *.rpm 将远程的rpm包下载到 /yum/repo 目录下
createrepo 目录 # createrepo /yum/repo 直接创建
createrepo [options] <directory>
程序包编译安装:
testapp-VERSION-release.src.rmp --> 安装后,使用rpmbuild 命令制作成二进制rpm包,而后再安装
源代码 --> 预处理 --> 编译(gcc) --> 汇编 --> 链接 --> 执行
源代码组织格式:
多文件:文件中的代码之间,很可能存在跨文件依赖关系;
C,C++ :make (configure --> Makefile.in --> makefile)
java :maven
编译安装三个步骤
1, ./configure
a,通过选项传递参数,指定启用特性,安装路径等:执行时,会参考用户的指定以及Makefile.in文件生成makefile;
b,检查依赖到的外部环境
2, make
根据makefile文件,构建应用程序;
3, make install
复制文件到相应路径
开发工具:
autoconf :生成configure脚本
automake :生成Makefile.in
建议:安装前查看INSTALL,README
开源程序源代码的获取:
官方自建站点
代码托管:
SourceForge
Github.com
code.google.com
c/c++ :gcc (GNU C Complier)
编译C源代码:
前提:提供开发工具及开发环境
开发工具:make,gcc等
开发环境:开发库,头文件
glibc:标准库
通过“包组”提供开发组件
第一步:configure脚本
选项:指定安装位置,指定启用的特性
--help :获取其支持使用的选项
选项分类:
安装路径设定:
--prefix=/PATH/TO/SOMEWHERE:指定默认安装位置 默认为/usr/local
--sysconfdir=/PATH/TO/SOMEWHERE :指定配置文件的位置
System types:
Optional Features:可选特性
--disable-FEATURE
--enable-FEATURE[=ARG]
Optional Packages:可选包
--with-PACKAGE[=ARG]
--without-PACKAGE
第二步:make
第三步:make install
安装后的配置:
1,导出二进制程序目录至PATH环境变量中
编辑文件 /etc/profile.d/NAME.SH
export PATH=/PAHT/TO/BIN:$PATH
2,导出库文件路径
编辑文件 /etc/ld.so.conf.d/NAME.conf
添加新的库文件所在目录至此文件中
让系统重新生成缓存:
ldconfig [-v]
3,导出头文件默认在/user/include/目录下
基于链接的方式实现:
ln -sv
4,导出帮助手册
编辑 /etc/man.conf 文件
MANPATH /FILE/TO/MAN
练习:
1、yum的配置和使用;包括yum repository的创建
[root@centos7 bin]# lftp 10.1.0.1 lftp 10.1.0.1:/pub/Sources/7.x86_64> cd zabbix/ lftp 10.1.0.1:/pub/Sources/7.x86_64/zabbix> ls -rw-r--r-- 1 500 500 144896000 Nov 11 2015 alert-agent-4.0.1-RC4.tar.gz -rw-r--r-- 1 500 500 293144 Nov 11 2015 trousers-0.3.11.2-4.el7_1.x86_64.rpm -rw-r--r-- 1 500 500 295992 Feb 27 06:19 trousers-0.3.13-1.el7.x86_64.rpm drwxr-xr-x 3 0 0 4096 May 16 07:42 x86_64 -rwxr--r-- 1 500 500 774903 May 16 08:01 zabbix_agents_2.2.9.win.zip -rwxr--r-- 1 500 500 861877 May 16 08:01 zabbix_agents_3.0.0.win.zip lftp 10.1.0.1:/pub/Sources/7.x86_64/zabbix> lmkdir /testdir/repodb Unknown command `lmkdir'. lftp 10.1.0.1:/pub/Sources/7.x86_64/zabbix> !mkdir /testdir/repodb #在本地创建一个文件夹 lftp 10.1.0.1:/pub/Sources/7.x86_64/zabbix> lcd /testdir/repodb/ #切换本地路径 lcd ok, local cwd=/testdir/repodb lftp 10.1.0.1:/pub/Sources/7.x86_64/zabbix> mget * . mget: Access failed: 550 Failed to open file. 147121916 bytes transferred in 2 seconds (88.69M/s) Transfer of 1 of 6 files failed lftp 10.1.0.1:/pub/Sources/7.x86_64/zabbix> bye [root@centos7 bin]# cd /testdir/repodb/ [root@centos7 repodb]# ll total 143684 -rw-r--r--. 1 root root 144896000 Nov 11 2015 alert-agent-4.0.1-RC4.tar.gz -rw-r--r--. 1 root root 293144 Nov 11 2015 trousers-0.3.11.2-4.el7_1.x86_64.rpm -rw-r--r--. 1 root root 295992 Feb 27 14:19 trousers-0.3.13-1.el7.x86_64.rpm -rw-r--r--. 1 root root 774903 May 16 16:01 zabbix_agents_2.2.9.win.zip -rw-r--r--. 1 root root 861877 May 16 16:01 zabbix_agents_3.0.0.win.zip [root@centos7 repodb]# createrepo . Spawning worker 0 with 1 pkgs Spawning worker 1 with 1 pkgs Workers Finished Saving Primary metadata Saving file lists metadata Saving other metadata Generating sqlite DBs Sqlite DBs complete [root@centos7 repodb]# ll total 143688 -rw-r--r--. 1 root root 144896000 Nov 11 2015 alert-agent-4.0.1-RC4.tar.gz drwxr-xr-x. 2 root root 4096 Aug 22 22:05 repodata #通过createrepo创建出来的数据文件 -rw-r--r--. 1 root root 293144 Nov 11 2015 trousers-0.3.11.2-4.el7_1.x86_64.rpm -rw-r--r--. 1 root root 295992 Feb 27 14:19 trousers-0.3.13-1.el7.x86_64.rpm -rw-r--r--. 1 root root 774903 May 16 16:01 zabbix_agents_2.2.9.win.zip -rw-r--r--. 1 root root 861877 May 16 16:01 zabbix_agents_3.0.0.win.zip [root@centos7 repodb]# vim /etc/yum.repos.d/minebase.repo [minedb] name=mine repo db baseurl=file:///testdir/repodb gpgcheck=0 [root@centos7 repodb]# yum repolist BDB2053 Freeing read locks for locker 0xa8: 87680/140405761406784 BDB2053 Freeing read locks for locker 0xaa: 87680/140405761406784 BDB2053 Freeing read locks for locker 0xab: 87680/140405761406784 BDB2053 Freeing read locks for locker 0xac: 87680/140405761406784 Loaded plugins: fastestmirror, langpacks Loading mirror speeds from cached hostfile * base: mirrors.tuna.tsinghua.edu.cn * extras: mirrors.yun-idc.com * updates: mirrors.yun-idc.com repo id repo name status base/7/x86_64 CentOS-7 - Base 9,007 extras/7/x86_64 CentOS-7 - Extras 375 minedb mine repo db 2 updates/7/x86_64 CentOS-7 - Updates 2,297 repolist: 11,681 [root@centos7 repodb]# yum install trousers
2、编译安装apache 2.2,并启动此服务
1,先登陆ftp服务器获取源码包,发现lftp命令不存在,通过yum安装
2,/pub/Sources/sources/httpd/下httpd源码
3,解压
4,竟然直接报错了,提示缺少APR
5,发现缺少 apr pcre apr-util 三个包
直接从网络获取,下载自己所需要的包
-
wget http://archive.apache.org/dist/apr/apr-1.4.5.tar.gz
wget http://archive.apache.org/dist/apr/apr-util-1.3.12.tar.gz
wget http://jaist.dl.sourceforge.net/project/pcre/pcre/8.10/pcre-8.10.zip
6,先解压编译安装apr包,然后在安装其他两个包
安装时如果提示缺失什么包,然后在编译命令后加上
--with-apr=/usr/local/apr --with-apr-util=/usr/local/apt-util --with-pcre=/usr/local/pcre
提示缺失哪一个就添加哪一个,三个可以同时添加
比如我安装时的问题
7,安装时务必保证没有其他错误提示,若有错误,要解决,否则可能会失败
8,启动apache服务
cd /usr/local/apache2/bin apachectl start
查看80端口处于监听状态
9,测试
发现电脑不能访问,原来没有关闭防火墙
iptables -F #临时关闭防火墙
然后测试成功
10,安装后配置
1,导出二进制程序目录至PATH环境变量中
编辑文件 vim /etc/profile.d/apache2.sh 添加内容如下
PATH=$PATH:/usr/local/apache2
2,导出库文件路径
编辑文件 vim /etc/ld.so.conf.d/apache2.conf 添加内容如下
/usr/local/pcre/lib/
/usr/local/apr-util/lib/
/usr/local/apr-util/lib/
让系统重新生成缓存:
ldconfig [-v]
3,导出头文件
基于链接的方式实现:
ln -s /usr/local/apache2/include/ apache2
4,导出帮助手册
编辑 vim /etc/man_db.conf 文件
MANDATORY_MANPATH /usr/local/apache2/man
更多推荐
所有评论(0)