2. Linux 软件管理 001

发布时间 2023-11-29 00:09:45作者: 谱次·

重点:

  1. rpm -i -e -qi -ql -qf -qa --scripts。
  2. yum install remove info list repolist provides。
  3. 配置系统源。
  4. 搭建私有仓库服务器。
  5. 源码编译安装。
  6. ubuntu dpkg apt /etc/apt/sources.list。

1)RPM 包管理器

CentOS 系统上使用 rpm 命令管理程序包

功能:安装、卸载、升级、查询、校验、数据库维护。

1.1)安装

rpm {-i|--install} [install-options] PACKAGE_FILE…

// 选项

-v: verbose

-vv:

-h: 显示程序包管理执行进度

// 常用组合

rpm -ivh PACKAGE_FILE ...

 

案例 1

// 查询'某个软件是否安装'

1. rpm -q vsftpd

2. rpm -qa | grep vsftpd

 

// '配合脚本使用'

echo $? // 非零, 未安装

echo $? // 为零, 已安装

截图.png

截图.png

 

// 进入软件包目录

cd Packages/

 

// 过滤出软件包名称

ll | grep vsftpd

 

// '安装软件包'

rpm -ivh vsftpd-3.0.2-28.el7.x86_64.rpm

截图.png

 

案例 2

// 单独安装 httpd 软件包

rpm -ivh httpd-2.4.6-95.el7.centos.x86_64.rpm

截图.png

 

[ 报错,遇到软件包依赖关系问题。]

  1. 通常我们更倾向于使用 Yum 软件包管理器。这是因为 Yum 可以自动处理软件包之间的依赖关系,使得安装过程更加简单和可靠。在使用 Yum 安装软件时,系统会自动检测所需的依赖项并将其一并安装,减少了手动解决依赖的烦恼。
  2. 除非是那种 已经完整打包好的 rpm 软件包,如:WPS,OnlyOffice,drawio,它们通常包含了所需的所有依赖关系。这意味着我们可以直接使用 rpm 安装它们,而不必担心缺少的依赖问题。< 不过这些包往往无法自定义安装路径 >
  3. 此外,对于一些特定情况,如某些软件包没有官方的 rpm 软件包或您需要定制编译选项,您可以选择下载源代码并手动编译安装。尽管这可能需要更多的步骤,但它可以为您提供更大的灵活性和定制性。

1.2)升级 降级

rpm 包 升级

rpm {-U|--upgrade} [install-options] PACKAGE_FILE...

rpm {-F|--freshen} [install-options] PACKAGE_FILE...

// 常用组合

rpm -Uvh PACKAGE_FILE ...

rpm -Fvh PACKAGE_FILE ...

 

升级注意项:

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

 

1.3)查询

rpm {-q|--query} [select-options] [query-options]

// 常用查询用法

-qa

-q PACKAGE

-qi PACKAGE 查询'已安装软件包信息'

-qc PACKAGE 查询'指定软件包所有配置文件'

-ql PACKAGE 查询'已安装软件包产生的文件存放在哪些目录'

-qd PACKAGE 查询'指定软件包所有文档文件'

-qf FILE 查询'指定文件所属软件包'

 

案例 1

// 查询'已安装软件包'

// '产生的文件存放在哪些目录'

rpm -ql vsftpd

截图.png

 

案例 2

// 查询'已安装软件包信息'

rpm -qi vsftpd

 

Name 软件包的名称。

Version 软件包的版本号。

Install Date '软件包的安装时间。'

Size '软件包安装后占用的磁盘空间大小。'

Source RPM 软件包是从源码构建而来, 这里会显示源 RPM 的名称。

URL '软件包的官方网站或资源链接。'

截图.png

截图.png

 

案例 3

// 查询'指定文件所属软件包'

'如下: 演示查询指定命令所属哪个软件包'

rpm -qf /usr/bin/tree

rpm -qf /usr/sbin/vsftpd

截图.png

 

案例 4

// 查询'指定文件所属软件包'

rpm -qf /usr/sbin/vsftpd

 

// 查询'指定软件包所有配置文件'

rpm -qc

 

// 查询'指定软件包所有文档文件'

rpm -qd

截图.png

 

1.4)卸载

// 格式

rpm {-e|--erase} [--allmatches] [--nodeps] [--noscripts] [--notriggers] [--test]

PACKAGE_NAME ...

注意:当包卸载时,对应的配置文件不会删除, 以 FILENAME.rpmsave 形式保留。

 

案例 1 :强行卸载 rpm 包

// 查询 rpm 命令'存在于哪个软件包'

rpm -qf /usr/bin/rpm

 

// 卸载 rpm [ '版本信息可以不写全' ]

rpm -e rpm-4.11.3-45.el7.x86_64

 

// '强行卸载 rpm 包'

rpm -e rpm --nodeps

截图.png

 

// 没法正常安装回 rpm 包咯

rpm

 

yum install rpm

截图.png

 

光盘 救援模式

[ 重启计算机 ]

截图.png

// 内核选项界面, 输入如下快捷键

Ctrl + Alt + Insert

 

// 0.5 秒内按下 ESC !!!

Esc

 

// 出现如下界面, 选择 CD-ROM Drive

截图.png

 

Troubleshooting

截图.png

 

Rescue a CentOS Linux System

截图.png

 

Continue

截图.png

 

/mnt/sysimage

截图.png

// 根目录

ls /mnt/sysimage

 

// 查看光盘挂载点

df -h | grep sr0

 

// 安装 rpm

// --root 指定光盘根目录

rpm -ivh /run/install/repo/Packages/rpm-4.14.3-4.el8.x86_64.rpm --root=/mnt/sysimage

截图.png

reboot

截图.png

已修复

 

案例 2 :

< Linux 小技巧 >

// 查询'已安装软件'产生的文件存放在哪些目录

rpm -ql tree

 

// 删除该命令的'二进制文件'

rm -rf /usr/bin/tree

 

// 命令无法执行啦..

tree

 

// 准备使用 rpm 命令安装回该软件 [ '但貌似无法成功安装' ]

// '显示该软件已经安装'

rpm -ich /misc/cd/Packages/tree-1.6.0-10.el7.x86_64.rpm

 

tree

截图.png

 

使用 强制安装

// '强制安装'

rpm -ich /misc/cd/Packages/tree-1.6.0-10.el7.x86_64.rpm --force

 

// '完成'

tree

截图.png

 

案例

// 卸载软件包

// 只需填写软件名称即可

rpm -e vsftpd

截图.png

 

1.5)校验<了解>

2. 在安装包时,检查包的来源是否是合法的。

// 检查包的完整性和签名'是否正常'

// 也就是'是否合格'

// 3. 检查软件包的'合法性'

rpm -K tree-1.6.0-10.el7.x86_64.rpm

 

// 4. '破坏安装包'

// 5. '再次验证'

echo xx >> tree-1.6.0-10.el7.x86_64.rpm

截图.png

 

1. 在检查包的来源和完整性前,需要先导入所需要公钥。

// 1. 导入公钥 '得以获得验证软件包是否合法的能力'

rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

 

// 2. 验证'是否已安装公钥'

rpm -qa "gpg-pubkey*"

截图.png

 

案例 2

软件在安装时,会将包里的每个文件的元数据,如:大小,权限,所有者,时间等 记录至 rpm 相关的数据库中,可以用来检查包中的文件是否和当初安装时有所变化。

这种方法可以帮助系统管理员检测文件是否被篡改或损坏,以保持系统的安全性和稳定性。

[00:25:13 root@blog ~]# rpm -V tree

 

[00:32:51 root@blog ~]# rpm -ql tree

/usr/bin/tree

/usr/share/doc/tree-1.6.0

/usr/share/doc/tree-1.6.0/LICENSE

/usr/share/doc/tree-1.6.0/README

/usr/share/man/man1/tree.1.gz

 

[00:32:56 root@blog ~]# echo 123 >> /usr/share/doc/tree-1.6.0/README

[00:33:26 root@blog ~]# rpm -V tree

S.5....T. d /usr/share/doc/tree-1.6.0/README

截图.png

 

1.6)数据库维护

这两个命令在管理和维护 RPM 包的系统中有点用。

通常情况下,你不需要频繁运行这些命令,除非你遇到了 RPM 数据库的问题,比如软件包信息不同步、依赖关系出错等情况。

// 初始化 RPM 包数据库

rpm --initdb

 

// 重建 RPM 包数据库

rpm --rebuilddb

 

2)yum 工作原理

CentOS 使用 yum 解决 rpm 的包依赖关系。

2.1)yum 工作原理

yum 是基于 C/S 模式。

  1. yum 服务端 存放 rpm 包和相关包的元数据库。
  2. yum 客户端 访问 yum 服务器进行安装或查询等。

 

yum 实现过程

先在 yum 服务器上创建 yum repository(仓库),在仓库中事先存储了 众多 rpm 包,以及 包相关的元数据文件(放置于特定目录 repodata 下),

当 yum 客户端利用 yum 工具进行安装时包时,会自动下载 repodata 中的元数据,查询源数据是否存在相关的包及依赖关系,自动从仓库中找到相关包下载并安装。

// 1. 众多 rpm 包

ll /misc/cd/Packages/

 

// 2. 包相关的元数据文件

ll /misc/cd/repodata/

截图.png

 

2.2)yum 客户端 配置文件

由于系统自动的 repo 配置文件指向的仓库在国外,下载速率可能会受到影响。

因此我们一般就是就近指向仓库,比如系统的本地光盘仓库,比如自己企业内部网下的仓库地址,比如互联网上的阿里仓库等等。

// 为所有仓库提供公共配置

/etc/yum.conf // '一般默认即可', 不用管

 

// 为'每个仓库'提供配置文件

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

1.repo // 仓库 1

2.repo // 仓库 2

截图.png

 

repo 仓库 配置文件 指向定义

"格式"

[repositoryID]

name=Some name for this repository

baseurl=url://path/to/repository/

enabled={1|0}

gpgcheck={1|0}

gpgkey=URL

enablegroups={1|0}

failovermethod={roundrobin|priority}

roundrobin:意为随机挑选,默认值

priority:按顺序访问

cost= 默认为1000

 

参考 repo 仓库 配置文件

[ 这有助于防止恶意软件包的注入和损坏软件包的安装,从而增加了系统的安全性。 ]

vim /etc/yum.repos.d/CentOS-Base.repo

 

[base] // 仓库ID

name=CentOS-$releasever - Base // '仓库名称' $releasever: 当前 OS 的发行版的主版本号, 如: 8, 7, 6 [ 如: CentOS7.9 `主版本就是 7` ]

baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/ // '仓库路径' $basearch: 系统基础平台; `i386, x86_64`

gpgcheck=1 // '启用 GPG 签名验证' `Yum 在从仓库下载软件包时会检查软件包的数字签名, 以确保软件包的完整性和来源的可信性。`

gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7 // '指定 GPG 密钥的位置' `得以验证下载的软件包的数字签名`

 

0. 阿里源

https://mirrors.aliyun.com/

// 阿里云腾讯云

https://mirrors.aliyun.com/centos/7/os/x86_64/

 

// '优化'

https://mirrors.aliyun.com/centos/$releasever/os/$basearch

截图.png

 

1. 腾讯源

https://mirrors.cloud.tencent.com/

// 腾讯云

https://mirrors.cloud.tencent.com/centos/7/os/x86_64/

 

// '优化'

https://mirrors.cloud.tencent.com/centos/$releasever/os/$basearch

找到多层级目录下的 repodata。才算真正的找到了软件仓库哟!

截图.png

 

2. 华为源

https://repo.huaweicloud.com/centos/

// 华为源

https://repo.huaweicloud.com/centos/7/os/x86_64/

 

// '优化'

https://repo.huaweicloud.com/centos/$releasever/os/$basearch

截图.png

 

3. 清华源

https://mirrors.tuna.tsinghua.edu.cn

// 清华源

https://mirrors.tuna.tsinghua.edu.cn/centos/7/os/x86_64/

 

// '优化'

https://mirrors.tuna.tsinghua.edu.cn/centos/$releasever/os/$basearch

截图.png

 

注意:yum 仓库指向的路径一定必须是 repodata 目录所在目录

相关变量

// yum 的 repo 配置文件中可用的变量:

$releasever: 当前OS的发行版的主版本号, 如: 8, 7, 6

$arch: CPU架构, 如: aarch64, i586, i686, x86_64 等

$basearch: 系统基础平台; i386, x86_64

$contentdir: 表示目录, 比如: centos-8, centos-7

$YUM0-$YUM9: 自定义变量

 

[ 我们可以在一个 repo 编写多个仓库地址,也可以每个 repo 编写单独的仓库地址 ]

cd /etc/yum.repos.d && mkdir bak && mv ./*.repo bak/

截图.png

 

repo 仓库

---- OS

https://mirrors.cloud.tencent.com/centos/$releasever/os/$basearch

https://repo.huaweicloud.com/centos/$releasever/os/$basearch

https://mirrors.tuna.tsinghua.edu.cn/centos/$releasever/os/$basearch

 

---- extras

https://mirrors.cloud.tencent.com/centos/$releasever/extras/$basearch

https://repo.huaweicloud.com/centos/$releasever/extras/$basearch

https://mirrors.tuna.tsinghua.edu.cn/centos/$releasever/extras/$basearch

 

---- epel

https://mirrors.cloud.tencent.com/epel/$releasever/$basearch

https://repo.huaweicloud.com/epel/$releasever/$basearch

https://mirrors.tuna.tsinghua.edu.cn/epel/$releasever/$basearch

 

yum 服务器的 baseurl 形式

file://

http://

https://

ftp://

 

<示范>

[ 我们可以在一个 repo 编写多个仓库地址,也可以每个 repo 编写单独的仓库地址 ]

// 挂载光盘

yum install autofs -y

systemctl enable --now autofs.service && mount /dev/sr0 /misc/cd

 

// 编写 repo

vim 1.repo

[OS]

name=OS

baseurl=file:///misc/cd

https://mirrors.cloud.tencent.com/centos/$releasever/os/$basearch

https://repo.huaweicloud.com/centos/$releasever/os/$basearch

https://mirrors.tuna.tsinghua.edu.cn/centos/$releasever/os/$basearch

gpgcheck=0

 

[extras]

name=extras

baseurl=https://mirrors.cloud.tencent.com/centos/$releasever/extras/$basearch

https://repo.huaweicloud.com/centos/$releasever/extras/$basearch

https://mirrors.tuna.tsinghua.edu.cn/centos/$releasever/extras/$basearch

gpgcheck=0

enabled=1

 

[epel]

name=epel

baseurl=https://mirrors.cloud.tencent.com/epel/$releasever/$basearch

https://repo.huaweicloud.com/epel/$releasever/$basearch

https://mirrors.tuna.tsinghua.edu.cn/epel/$releasever/$basearch

gpgcheck=1

gpgkey=https://mirrors.tuna.tsinghua.edu.cn/epel/RPM-GPG-KEY-EPEL-7

enabled=1

截图.png

yum clean all

yum makecache

yum repolist

截图.png

 

用脚本实现 创建 Yum 仓库配置文件

vim yum.sh

 

#!/bin/bash

mkdir /etc/yum.repos.d/backup

mv /etc/yum.repos.d/*.* /etc/yum.repos.d/backup

cat > /etc/yum.repos.d/yum.repo <<EOF

[OS]

name=OS

baseurl=file:///misc/cd

https://mirrors.cloud.tencent.com/centos/\$releasever/os/\$basearch

https://repo.huaweicloud.com/centos/\$releasever/os/\$basearch

https://mirrors.tuna.tsinghua.edu.cn/centos/\$releasever/os/\$basearch

gpgcheck=0

 

[extras]

name=extras

baseurl=https://mirrors.cloud.tencent.com/centos/\$releasever/extras/\$basearch

https://repo.huaweicloud.com/centos/\$releasever/extras/\$basearch

https://mirrors.tuna.tsinghua.edu.cn/centos/\$releasever/extras/\$basearch

gpgcheck=0

enabled=1

 

[epel]

name=epel

baseurl=https://mirrors.cloud.tencent.com/epel/\$releasever/\$basearch

https://repo.huaweicloud.com/epel/\$releasever/\$basearch

https://mirrors.tuna.tsinghua.edu.cn/epel/\$releasever/\$basearch

gpgcheck=1

gpgkey=https://mirrors.tuna.tsinghua.edu.cn/epel/RPM-GPG-KEY-EPEL-7

enabled=1

EOF

bash yum.sh

yum repolist

截图.png

 

列出 仓库信息

yum repolist

截图.png

 

查询 软件包

yum list epel*

截图.png

 

安装 软件包

yum install epel-release.noarch -y

截图.png

 

[ 目录下,已自动生成 epel.repo 仓库配置信息 ]

ls

截图.png

截图.png

 

[ 如上,epel 源 baseurl 指向国外,不建议使用。]

// 卸载

yum remove epel-release.noarch -y

ls

截图.png

 

列出 仓库信息

yum repolist

截图.png

 

列出 软件包信息

// 列出 `所有` 软件包

yum list

 

// @开头 代表已安装

yum list | less

 

// 列出 `已安装` 软件包

yum list installed

 

// 列出 `未安装` 软件包

yum list available

 

// 列出 `指定名称` 软件包

yum list httpd

yum list *httpd*

 

示例

// 列出 `指定名称` 软件包

yum list sl

 

// 获取 `指定软件包` 信息

yum info sl

 

// 安装 `指定软件包`

yum install sl -y

截图.png

 

安装 epel 源中的一个 有趣小命令

// 列出 `指定软件包` 文件列表

rpm -ql sl

 

// 执行命令

sl

sl -a

截图.png

 

// 安装 cowsay 软件包

yum install cowsay -y

 

// 列出 `指定软件包` 文件列表

rpm -ql cowsay | grep bin // 过滤出命令文件

 

cowsay hello

animalsay hello

截图.png

截图.png

 

2.3)yum-config-manager 命令[ 暂省略,可查看课件 ]

可以生成 yum 仓库的配置文件及启用或禁用仓库,来自于 yum-utils 包。