软件包管理器功能:
将编译好的应用程序的各组成文件打包一个或几个程序包文件,利用包管理器可以方便快捷地实现程序包的安装、卸载、查询、升级和校验 等管理操作
主流的程序包管理器:
redhat:rpm文件, rpm 包管理器,( rpm:Redhat Package Manager )
debian:deb文件, dpkg 包管理器
1、rpm
★ 安装
rpm {-i|--install} [install-options] PACKAGE_FILE…
-v|verbose #显示详细信息
-vv #更详细
-h #显示安装进度条
--test #测试安装,但不真正执行安装,即dry run模式
--nodeps #忽略依赖关系
--replacefiles #忽略软件包之间的冲突的文件
--replacepkgs #如果软件包已经有了,重新安装软件包
--nosignature #不检查来源合法性
--nodigest #不检查包完整性
--noscripts #不执行程序包脚本,相当于 --nopre --nopost --nopreun --nopostun --nopretrans --noposttrans
--nopre #不执行程序包中安装前脚本
--nopost #不执行程序包中安装前脚本
--nopreun #不执行程序包中卸载前脚本
--nopostun #不执行程序包中卸载后脚本
--nopretrans #安装前不执行与程序同名脚本
--noposttrans #安装后不执行与程序同名脚本
常用组合
rpm -ivh PACKAGE_FILE ...
★ 升级和降级
rpm {-U|--upgrade} [install-options] PACKAGE_FILE...
rpm {-F|--freshen} [install-options] PACKAGE_FILE...
upgrade #安装有旧版程序包,则“升级”,如果不存在旧版程序包,则“安装”
freshen #安装有旧版程序包,则“升级”, 如果不存在旧版程序包,则不执行升级操作
--oldpackage #降级
--force #强制安装
常用组合
rpm -Uvh PACKAGE_FILE ...
rpm -Fvh PACKAGE_FILE ...
升级注意项:
不要对内核做升级操作;Linux支持多内核版本并存,因此直接安装新版本内核
如果原程序包的配置文件安装后曾被修改,升级时,新版本提供的同一个配置文件不会直接覆盖老版本的配置文件,而把新版本文件重命名 (FILENAME.rpmnew)后保留
★ 包查询
rpm {-q|--query} [select-options] [query-options]
[select-options]
-a #所有包
-f #查看指定的文件由哪个程序包安装生成
-p rpmfile #针对尚未安装的程序包文件做查询操作
--whatprovides CAPABILITY #查询指定的CAPABILITY由哪个包所提供
--whatrequires CAPABILITY #查询指定的CAPABILITY被哪个包所依赖
[query-options]
--changelog #查询rpm包的changelog
-c #查询程序的配置文件
-d #查询程序的文档
-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 ...
注意:当包卸载时,对应的配置文件不会删除, 以FILENAME.rpmsave形式保留
★ 包校验
软件在安装时,会将包里的每个文件的元数据,如:大小,权限,所有者,时间等记录下来,
可以用来检查包中的文件是否和当初安装时有所变化
rpm {-V|--verify} [select-options] [verify-options]
字段说明
S #文件大小不一样
M #文件权限不一样或文件类型不一样
5 #md5 校验值不一样
D #版本号值不一样
L #链接路径不一样
U #属主发生了改变
G #属组发生了改变
T #修改时间发生了改变
P #功能发生了改变
c|d|g|l|r #文件类型 c配置文件, d数据文件,g该文件不属于此处,l许可文件(licens file),r自述文件(READ ME)
如果占位符是 . 则表示该处与安装时没有任何改变
2、yum客户端配置 (repo仓库配置)
yum/dnf 是基于C/S 模式 :
yum 服务器存放rpm包和相关包的元数据库
yum 客户端访问yum服务器进行安装或查询等
yum 实现过程 :
先在yum服务器上创建 yum repository(仓库),在仓库中事先存储了众多rpm包,以及包的相关的元数据文件(放置于特定目录 repodata下),当yum客户端利用yum/dnf工具进行安装时包时,会自动下载repodata中的元数据,查询元数据是否存在相关的包及依赖 关系,自动从仓库中找到相关包下载并安装
★ yum客户端配置文件
/etc/yum.conf #为所有仓库提供公共配置
/etc/yum.repos.d/*.repo #为每个仓库的提供配置文件
★ yum仓库指向的路径一定必须是repodata目录所在目录
★ repo仓库配置文件指向的定义
[repositoryID]
name=Some name for this repository #仓库名称
baseurl=url://path/to/repository/ #仓库地址
mirrorlist=http://list/ #仓库地址列表,在这里写了多个 baseurl指向的地址
enabled={1|0} #是否启用,默认值为1,启用
gpgcheck={1|0} #是否对包进行校验,默认值为1
gpgkey={URL|file://FILENAME} #校验key的地址
enablegroups={1|0} #是否启用yum group,默认值为 1
failovermethod={roundrobin|priority} #有多个baseurl,此项决定访问规则,roundrobin 随机,priority:按顺序访问
cost=1000 #开销,或者是成本,YUM程序会根据此值来决定优先访问哪个源,默认为1000
★ repo仓库配置
[root@localhost ~]#cd /etc/yum.repos.d/
[root@localhost yum.repos.d]#ls
[root@localhost yum.repos.d]#cp -r ../yum.repos.d/ /tmp/
[root@localhost yum.repos.d]#ls /tmp/yum.repos.d/
[root@localhost yum.repos.d]#rm -rf *
[root@localhost yum.repos.d]#ls
[root@localhost yum.repos.d]#yum repolist
No repositories available
★ 配置南京大学的appstream.repo
[root@localhost yum.repos.d]#vim nju-appstream.repo
[nju-appstream]
name=nju appstream
baseurl=https://mirrors.nju.edu.cn/rocky/8.9/AppStream/x86_64/os/
https://mirrors.aliyun.com/rockylinux/8.9/AppStream/x86_64/os/
gpgcheck=0
[root@localhost yum.repos.d]#yum repolist
repo id repo name
nju-appstream nju appstream
[root@localhost yum.repos.d]#yum repolist -v
★ 配置本地baseos.repo
[root@localhost yum.repos.d]#ls /mnt/
hgfs
[root@localhost yum.repos.d]#mount /dev/cdrom /mnt/
mount: /mnt: WARNING: device write-protected, mounted read-only.
[root@localhost yum.repos.d]#ls /mnt/
AppStream EFI isolinux media.repo
BaseOS images LICENSE TRANS.TBL
[root@localhost yum.repos.d]#ls /mnt/BaseOS/ (路径指到repodata)
Packages repodata
[root@localhost yum.repos.d]#vim cdrom-baseos.repo
[cdrom-baseos]
name=cdrom baseos
baseurl=https://mirrors.nju.edu.cn/rocky/8.9/BaseOS/x86_64/os/
file:///mnt/BaseOS/
https://mirrors.aliyun.com/rockylinux/8.9/BaseOS/x86_64/os/
gpgcheck=0
[root@localhost yum.repos.d]#yum repolist
repo id repo name
cdrom-baseos cdrom baseos
nju-appstream nju appstream
[root@localhost yum.repos.d]#yum repolist -v --repoid=cdrom-baseos
[root@localhost yum.repos.d]#ls
cdrom-baseos.repo nju-appstream.repo
★ 配置aliyun extras.repo
[root@localhost yum.repos.d]#vim aliyun-extras.repo
[aliyun-extras]
name=aliyun extras
baseurl=https://mirrors.aliyun.com/rockylinux/8.9/extras/x86_64/os/
https://mirrors.nju.edu.cn/rocky/8.9/extras/x86_64/os/
gpgcheck=0
[root@localhost yum.repos.d]#yum repolist
repo id repo name
cdrom-baseos cdrom baseos
nju-appstream nju appstream
nju-extras nju extras
[root@localhost yum.repos.d]#yum repolist -v --repoid=nju-extras
[root@localhost yum.repos.d]#yum repolist --all
repo id repo name status
cdrom-baseos cdrom baseos enabled
nju-appstream nju appstream enabled
nju-extras nju extras enabled
★ 使用yum-config-manager配置repo
[root@localhost yum.repos.d]#yum -y install yum-utils
添加epel源
[root@rocky86 ~]# yum-config-manager --add-repo=https://mirrors.nju.edu.cn/epel/8/Everything/x86_64/
Adding repo from: https://mirrors.nju.edu.cn/epel/8/Everything/x86_64/
查看
[root@rocky86 yum.repos.d]# cat mirrors.nju.edu.cn_epel_8_Everything_x86_64_.repo
[mirrors.nju.edu.cn_epel_8_Everything_x86_64_]
name=created by dnf config-manager from https://mirrors.nju.edu.cn/epel/8/Everything/x86_64/
baseurl=https://mirrors.nju.edu.cn/epel/8/Everything/x86_64/
enabled=1
禁用源
[root@rocky86 yum.repos.d]# yum-config-manager --disable mirrors.nju.edu.cn_epel_8_Everything_x86_64_
启用源
[root@rocky86 yum.repos.d]# yum-config-manager --enable mirrors.nju.edu.cn_epel_8_Everything_x86_64_
3、实现私用 yum仓库
1.在 yum server 机上搭建 web 服务,保证其它机器能能过web服务访问本机
2.在 yum server 机上搭建 yum 仓服务
3.在 client 机上将yum 的 repos 源指向 yum server 机
★ 服务端配置
[root@localhost ~]#yum -y install httpd
[root@localhost ~]#systemctl stop firewalld.service (关闭防火墙)
[root@localhost ~]#systemctl enable --now httpd.service (开启httpd服务)
Created symlink /etc/systemd/system/multi-user.target.wants/httpd.service → /usr/lib/systemd/system/httpd.service.
[root@localhost ~]#cd /var/www/html/
[root@localhost html]#ls
[root@localhost html]#vim index.html
<style type="text/css">
html{padding:25px}
</style>
<a href="./AppStream">AppStream</a><br />
<a href="./BaseOS">BaseOS</a><br />
<a href="./extras">extras</a><br />
★ 将本地光盘中的内容CP到web目录中,给客户端使用
[root@localhost html]#ls
index.html
[root@localhost html]#mkdir AppStream
[root@localhost html]#mkdir BaseOS
[root@localhost html]#ls
AppStream BaseOS index.html
[root@localhost html]#cp -r /mnt/AppStream/* ./AppStream/
[root@localhost html]#cp -r /mnt/BaseOS/* ./BaseOS/
★ 将阿里云的extras 源的相关数据下载到本地,给客户端使用
[root@localhost html]#vim /etc/yum.repos.d/aliyun-extras.repo
[aliyun-extras]
name=aliyun extras
baseurl=https://mirrors.aliyun.com/rockylinux/8.9/extras/x86_64/os/
gpgcheck=0
[root@localhost html]#yum reposync --repoid=aliyun-extras --download-metadata -p /var/www/html/
[root@localhost html]#mv aliyun-extras/ extras
★ 客户端配置
[/dev/pts/0 15:33:04 root@localhost yum.repos.d]#vim private-appstream.repo
[private-appstream]
name=private appstream
baseurl=http://10.0.0.102/AppStream/
gpgcheck=0
[/dev/pts/0 15:36:37 root@localhost yum.repos.d]#yum repolist --repoid=private-appstream -v
[/dev/pts/0 14:21:24 root@localhost yum.repos.d]#vim private-baseos.repo
[private-baseos]
name=private baseos
baseurl=http://10.0.0.102/BaseOS/
gpgcheck=0
[/dev/pts/0 14:29:18 root@localhost yum.repos.d]#yum repolist --repoid=private-baseos -v
[/dev/pts/0 15:43:45 root@localhost yum.repos.d]#vim private-extras.repo
[private-extras]
name=private extras
baseurl=http://10.0.0.102/extras/
gpgcheck=0
[/dev/pts/0 15:45:18 root@localhost yum.repos.d]#yum repolist --repoid=private-extras -v
4、yum
yum [options] COMMAND
-c file|--config file #指定配置文件,默认使用 /etc/yum.conf
-v|--verbose #显示详细信息
-b|--best #尝试在可用包中寻找最匹配的版本
-y|--assumeyes #自动回答为 yes
--nogpgcheck #不进行包校验
--repo repoid|--repoid repoid #指定repo源
--enablerepo repoid #临时启用repo源,可用通配符
--disablerepo repoid #临时禁用repo源,可用通配符
--nodocs #不安装文档
--skip-broken #跳过有问题的包
--enable #启用源,配合 config-manager
--disable #禁用源,配合 config-manager
-x package|--exclude package|--excludepkgs package #排除指定包,可用通配符
--downloadonly #只下载,不安装
常用子命令
autoremove #卸载包,同时卸载依赖
check-update #检查可用更新
clean #清除本地缓存
downgrade #包降级
group #包组相关
help #显示帮助信息
history #显示history
info #显示包相关信息
install #包安装
list #列出所有包
makecache #重建缓存
reinstall #重装
remove #卸载
repolist #显示或解析repo源
search #包搜索,包括包名和描述
★ 显示仓库列表
yum repolist [options]
-v|--verbose #显示详细信息
--repo repoid|--repoid repoid #指定repo源
--all #显示所有源
--enabled #所有enabled状态的源,默认项(同 yum repolist)
--disabled #所有disabled 的源
★ 显示程序包
yum list [options] [PACKAGE [PACKAGE ...]
--all #显示所有包,包括己安装的和repo源中的可用包
--available #所有可用包
--installed #所有己安装的包
--extras #所有额外包
--updates #所有可更新的包
上述选项可以替换成对应的 all,installed 这种子命令,但要注意位置
--showduplicates #相同的包,显示所有版本
★ 安装程序包
yum install [options] PACKAGE [...]
yum reinstall [options] PACKAGE [...]
--installroot path #指定安装目录
--downloadonly #只下载,不安装
--downloaddir path|--destdir path #指定下载目录,如果下载目录不存在,则自动创建
★ 卸载程序包
yum remove [options] PACKAGE [...]
yum erase [options] PACKAGE [...]
★ 升级和降级
yum update [options] PACKAGE [...] #升级
yum downgrade [options] PACKAGE [...] #降级
yum check-update #检查可用升级
★ 查询
yum info [options] PACKAGE [...] #查看程序包的 information 信息
yum provides [options] PROVIDE #查看文件是由哪个包提供
yum search [options] KEYWORD #根据关健字搜索,范围包括包名和描述信息
yum deplist [options] PACKAGE [...] #查询包的依赖
★ 仓库缓存
缓存目录为 /var/cache/dnf/ ( /var/cache/yum/ )
yum clean [options] {metadata,packages,dbcache,expire-cache,all} #清空缓存
yum makecache #构建缓存
5、dnf
DNF,即DaNdiFied,是新一代的RPM软件包管理器。DNF包管理器克服了YUM包管理器的一些瓶颈,提升了包括用户 体验,内存占用,依赖分析,运行速度等
yum程序在安装的过程中,如果被终止,下次再执行将无法解决依赖,DNF可解决此问题
★ 配置文件
/etc/dnf/dnf.conf
★ 仓库文件
/etc/yum.repos.d/ *.repo
★ 日志
/var/log/dnf.rpm.log
/var/log/dnf.log
★ 使用帮助
man dnf
★ dnf 用法与yum一致
dnf [options] <command> [<arguments>...]
dnf --version
dnf repolist
dnf reposync
dnf install httpd
dnf remove httpd
dnf clean all
dnf makecache
dnf list installed
dnf list available
dnf search nano
dnf history undo 1
6、Ubuntu 软件管理
dpkg:package manager for Debian,类似于rpm, dpkg是基于Debian的系统的包管理器。可以安装,删除和构建软件包,但无法 自动下载和安装软件包或其依赖项
apt:Advanced Packaging Tool,功能强大的软件管理工具,甚至可升级整个Ubuntu的系统,基于客户/服务器架构(c/s)
7、dpkg
dpkg [<option> ...] <command>
-i|--install package.deb #安装包
--unpack package.deb #解包
-r|--remove packageName #删除包,不建议,不自动卸载依赖于它的包
-P|--purge packageName #删除包(包括配置文件)
-V|--verify packageName #检查包是否安装
--get-selections pattern #根据正则筛选包,并打出列表
--set-selections #从标准输入里读出要选择的软件。
--clear-selections #取消选中所有不必要的软件包。
--update-avail packageFile #替换现有可安装的软件包信息。
--merge-avail packageFile #把文件中的信息合并到系统中。
--clear-avail #清除现有的软件包信息。
--forget-old-unavail #忘却已被卸载的不可安装的软件包。
-s|--status packageName #显示指定软件包的详细状态,类似于 rpm -qi
-p|--print-avail packageName #显示当前机器上所有可安装的包
-L|--listfiles packageName #列出属于指定软件包的文件,类似于 rpm -ql
-l|--list [pattern] #列出当前己安装的包,类似于rpm -qa
-S|--search pattern #根据文件查询是来自于哪个包,类似于 rpm -qf
-C|--audit [pattern] #检查是否有软件包残损
--yet-to-unpack #列出标记为待解压的软件包
--predep-package #列出待解压的预依赖
--compare-vesions v1 - b #比较版本号
--force-help #显示本强制选项的帮助信息
-Dh|--debug=help #显示有关出错调试的帮助信息
--info packageFile #列出包相关信息
-c packageFile #列出包内文件,类似于 rpm -qpl
8、apt
apt [options] command
#options
-h|--help #显示帮助
-v|--version #显示版本
-y|--yes #自动回答yes
-q|--quiet #安静模式
#command
list #根据名称列出软件包
search #搜索软件包描述
show|info #显示软件包细节
install #安装软件包
remove #移除软件包
autoremove #卸载所有自动安装且不再使用的软件包
update #更新可用软件包列表,只更新索引文件,不具体更新软件
upgrade #通过 安装/升级 软件来更新系统
full-upgrade #通过 卸载/安装/升级 来更新系统
edit-sources #编辑软件源信息文件
9、编译安装
C 语言源代码编译安装过程
利用编译工具,通常只需要三个大的步骤
./configure
- (1) 通过选项传递参数,指定安装路径、启用特性等;执行时会参考用户的指定以及Makefile.in文 件生成Makefile
- (2) 检查依赖到的外部环境,如依赖的软件包
make 根据Makefile文件,会检测依赖的环境,进行构建应用程序
make install 复制文件到相应路径
注意:安装前可以通过查看README,INSTALL获取帮助
编译安装准备
准备:安装相关的依赖包
- 开发工具:make, gcc (c/c++编译器GNU C Complier)
- 开发环境:开发库(glibc:标准库),头文件,可安装开发包组 Development Tools
- 软件相关依赖包
注意:通常被编译操作依赖的程序包,需要安装此程序包的"开发"组件,其包名一般类似于name-devel-VERSION
编译安装
# 安装相关的依赖包
[root@Rocky89 ~]#yum -y install wget tar gcc openssl-devel pcre-devel make
# 下载源码并解压
[root@Rocky89 ~]#wget https://nginx.org/download/nginx-1.24.0.tar.gz
[root@Rocky89 ~]#tar -xvf nginx-1.24.0.tar.gz -C /usr/local/src/
# 进入解压缩的目录,README和INSTALL
[root@Rocky89 src]#cd /usr/local/src/nginx-1.24.0
# 第一步:运行 configure 脚本,生成 Makefile 文件
[root@Rocky89 nginx-1.24.0]#./configure --prefix=/apps/nginx
# 第二步:make
[root@Rocky89 nginx-1.24.0]#make -j 2
# 第三步:make install
[root@Rocky89 nginx-1.24.0]#make install
相关依赖包
注意:通常被编译操作依赖的程序包,需要安装此程序包的"开发"组件,其包名一般类似于name-devel-VERSION
编译安装
# 安装相关的依赖包
[root@Rocky89 ~]#yum -y install wget tar gcc openssl-devel pcre-devel make
# 下载源码并解压
[root@Rocky89 ~]#wget https://nginx.org/download/nginx-1.24.0.tar.gz
[root@Rocky89 ~]#tar -xvf nginx-1.24.0.tar.gz -C /usr/local/src/
# 进入解压缩的目录,README和INSTALL
[root@Rocky89 src]#cd /usr/local/src/nginx-1.24.0
# 第一步:运行 configure 脚本,生成 Makefile 文件
[root@Rocky89 nginx-1.24.0]#./configure --prefix=/apps/nginx
# 第二步:make
[root@Rocky89 nginx-1.24.0]#make -j 2
# 第三步:make install
[root@Rocky89 nginx-1.24.0]#make install