详细查看 https://blog.csdn.net/u010230019/article/details/130016072
rpm全称是redhat package manager
,后来改成rpm package manager
,这是根据源码包编译出来的包。以vsftpd-3.0.3-33.el8.x86_64.rpm
为例,各字段的含义:
rpm安装命令是rpm -ivh 安装包
rpm安装时已经指定了安装路径,如下:
[root@node-138 docker]# rpm2cpio docker-1.13.1-205.git7d71120.el7.centos.x86_64.rpm |cpio -id #解压rpm包
130330 blocks
[root@node-138 docker]# tree
.
├── docker-1.13.1-205.git7d71120.el7.centos.x86_64.rpm
├── etc
│ ├── docker
│ │ ├── certs.d
│ │ │ ├── redhat.com
│ │ │ │ └── redhat-ca.crt -> /etc/rhsm/ca/redhat-uep.pem
│ │ │ ├── redhat.io
│ │ │ │ └── redhat-ca.crt -> /etc/rhsm/ca/redhat-uep.pem
│ │ │ └── registry.access.redhat.com
│ │ │ └── redhat-ca.crt -> /etc/rhsm/ca/redhat-uep.pem
│ │ ├── daemon.json
│ │ └── seccomp.json
│ └── sysconfig
│ ├── docker-network
│ └── docker-storage
├── usr
│ ├── bin
│ │ ├── docker-containerd-current
│ │ ├── docker-containerd-shim-current
│ │ ├── docker-ctr-current
│ │ ├── dockerd-current
│ │ └── docker-storage-setup -> /usr/bin/container-storage-setup
│ ├── lib
│ │ ├── systemd
│ │ │ └── system
│ │ │ ├── docker-cleanup.service
│ │ │ ├── docker-cleanup.timer
│ │ │ ├── docker.service
│ │ │ └── docker-storage-setup.service
│ │ └── udev
│ │ └── rules.d
│ │ └── 80-docker.rules
│ ├── libexec
│ │ └── docker
│ │ ├── docker-init-current
│ │ ├── docker-proxy-current
│ │ └── docker-runc-current
│ └── share
│ ├── bash-completion
│ │ └── completions
│ │ └── docker
│ ├── doc
│ │ └── docker-1.13.1
│ │ ├── AUTHORS
│ │ ├── CHANGELOG.md
│ │ ├── CONTRIBUTING.md
│ │ ├── MAINTAINERS
│ │ ├── NOTICE
│ │ ├── README.md
│ │ └── README-vim-syntax.md
│ ├── fish
│ │ └── vendor_completions.d
│ │ └── docker.fish
│ ├── licenses
│ │ └── docker-1.13.1
│ │ ├── LICENSE
│ │ └── LICENSE-vim-syntax
│ ├── man
│ │ ├── man1
...
│ │ │ └── docker-wait.1.gz
│ │ ├── man5
│ │ │ ├── docker-config-json.5.gz
│ │ │ └── Dockerfile.5.gz
│ │ └── man8
│ │ └── dockerd.8.gz
│ ├── vim
│ │ └── vimfiles
│ │ ├── doc
│ │ │ └── dockerfile.txt
│ │ ├── ftdetect
│ │ │ └── dockerfile.vim
│ │ └── syntax
│ │ └── dockerfile.vim
│ └── zsh
│ └── site-functions
│ └── _docker
└── var
└── lib
└── docker
39 directories, 87 files
可以看到,我们安装rpm包时,它会把包中的内容安装这个结构拷贝到系统,所以安装的路径都是安排好的。
如果需要查询已经安装过的软件包的信息,rpm第一个选项需要使用-q
,表示查询的意思,查询所有安装使用rpm -qa
查询已安装的某个软件版本
,如下:
[root@node-138 docker]# rpm -qa vsftpd
vsftpd-3.0.2-29.el7_9.x86_64
#或
[root@node-138 docker]# rpm -qa|grep vsftpd
vsftpd-3.0.2-29.el7_9.x86_64
查询安装某个软件之后所生成的文件
用rpm -ql 包名
,如下
[root@node-138 docker]# rpm -ql vsftpd
/etc/logrotate.d/vsftpd
/etc/pam.d/vsftpd
/etc/vsftpd
/etc/vsftpd/ftpusers
/etc/vsftpd/user_list
/etc/vsftpd/vsftpd.conf
/etc/vsftpd/vsftpd_conf_migrate.sh
/usr/lib/systemd/system-generators/vsftpd-generator
/usr/lib/systemd/system/vsftpd.service
/usr/lib/systemd/system/vsftpd.target
/usr/lib/systemd/system/[email protected]
/usr/sbin/vsftpd
...
这样就可以看到软件安装位置。
查询软件包生成的配置文件
用rpm -qc 包名
,如下:
[root@node-138 docker]# rpm -qc vsftpd
/etc/logrotate.d/vsftpd
/etc/pam.d/vsftpd
/etc/vsftpd/ftpusers
/etc/vsftpd/user_list
/etc/vsftpd/vsftpd.conf
查询包的信息用rpm -qi 包名
,如下:
[root@node-138 docker]# rpm -qi vsftpd
Name : vsftpd
Version : 3.0.2
Release : 29.el7_9
Architecture: x86_64
Install Date: Thu 17 Aug 2023 09:10:25 AM CST
Group : System Environment/Daemons
Size : 361349
License : GPLv2 with exceptions
Signature : RSA/SHA256, Fri 11 Jun 2021 11:06:15 PM CST, Key ID 24c6a8a7f4a80eb5
Source RPM : vsftpd-3.0.2-29.el7_9.src.rpm
Build Date : Thu 10 Jun 2021 12:15:50 AM CST
Build Host : x86-02.bsys.centos.org
Relocations : (not relocatable)
Packager : CentOS BuildSystem <http://bugs.centos.org>
Vendor : CentOS
URL : https://security.appspot.com/vsftpd.html
Summary : Very Secure Ftp Daemon
Description :
vsftpd is a Very Secure FTP daemon. It was written completely from
scratch.
查询某个文件由哪个软件包生成的用rpm -qf /path/file
,如下
[root@node-138 docker]# rpm -qf /usr/sbin/vsftpd
vsftpd-3.0.2-29.el7_9.x86_64
[root@node-138 docker]# rpm -qf /etc/shadow
setup-2.8.71-11.el7.noarch
可以看到shadow
使用setup这个包生成的
以上是对已安装的软件包进行查询,如果要查询未安装的软件包,则需要加上-p
,如下:
[root@node-138 docker]# rpm -qcp docker-1.13.1-205.git7d71120.el7.centos.x86_64.rpm
/etc/docker/daemon.json
/etc/docker/seccomp.json
/etc/sysconfig/docker-network
/etc/sysconfig/docker-storage
卸载软件包用rpm -e 软件名
,如下
[root@node-138 docker]# rpm -e vsftpd
warning: /etc/pam.d/vsftpd saved as /etc/pam.d/vsftpd.rpmsave
[root@node-138 docker]# rpm -qa vsftpd
强制安装,场景:如果提示软件已经安装过了,无法再次安装,或者某个配置文件被误删,此时可以加上--force
选项强制安装
rpm -ivh docker-1.13.1-205.git7d71120.el7.centos.x86_64.rpm --force
此时会重新生成被误删的文件,但其他文件即使做了修改也不会被覆盖替换
所谓升级或更新,即卸载旧版本软件,然后安装新版本软件包。如果安装路径不同,则可以共存,如果相同则会冲突,此时可以使用rpm -Uvh 软件包
进行更新,如:
rpm -Uvh docker-1.13.1-205.git7d71120.el7.centos.x86_64.rpm
对于内核来说,不同的版本安装路径是不一样的,所以可同时安装多个版本而不会产生冲突。所以更新内核建议使用rpm -ivh
而不是rpm -Uvh
。因为rpm -Uvh
会卸载旧版本内核,如果新版本内核有问题则无法进入系统。
当我们安装一个软件包之后会产生许多文件,想要判断这些文件是否被修改过,可以使用rpm -V
命令,如
[root@node-138 docker]# rpm -V docker
S.5....T. c /etc/sysconfig/docker-storage
[root@node-138 docker]# rpm -V openssh
[root@node-138 docker]# rpm -qc openssh
/etc/ssh/moduli
可以看到/etc/sysconfig/docker-storage
被修改过
可以看到/etc/sysconfig/docker-storage
被修改过,我们再修改openssh的配置文件,例如
[root@node-138 docker]# touch /etc/ssh/moduli
[root@node-138 docker]# rpm -V openssh
.......T. c /etc/ssh/moduli
可以看到/etc/ssh/moduli
的时间发生了变化
红帽发行的每一个数据包都对他做了数字签名,以证明该包是红帽官方的,需要再本机用红帽密钥来验证。首先检查本机是否安装了红帽的密钥,命令如下:
[root@node-138 docker]# rpm -qa |grep pubkey
gpg-pubkey-dc6315a3-6091b7b3
gpg-pubkey-621e9f35-58adea78
gpg-pubkey-3e1ba8d5-558ab6a8
gpg-pubkey-352c64e5-52ae6884
gpg-pubkey-b6792c39-53c4fbdd
gpg-pubkey-f4a80eb5-53a7ff4b
gpg-pubkey-a621e701-63bdbc3d
如果没有安装,则需要手动导入,如:
[root@server opt]# rpm -qa |grep pubkey
[root@server opt]# rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release
[root@server opt]# rpm -qa |grep pubkey
gpg-pubkey-fd431d51-4ae0493b
gpg-pubkey-5a6340b3-6229229e
验证是否为红帽发布的包,即是否是红帽的数字签名,如下:
[root@server opt]# rpm -K dnf-4.14.0-2.fc38.noarch.rpm
dnf-4.14.0-2.fc38.noarch.rpm: digests SIGNATURES NOT OK
使用rpm安装软件包时经常会遇到一个问题就是 包依赖,所谓的包依赖就是在安装A时必须把B和C安装上去,如果用rpm一个个安装是非常困难的,这里就可以使用yum或dnf来解决。yum其实是软连接到dnf命令上的,所以输入dnf或yum都可以。
[root@server opt]# ll /usr/bin/yum
lrwxrwxrwx. 1 root root 5 Jan 19 2023 /usr/bin/yum -> dnf-3
REHL8/Centos8以前版本,yum是单独的命令
[root@node-138 docker]# uname -r
3.10.0-1160.92.1.el7.x86_64
[root@node-138 docker]# ll /usr/bin/yum
-rwxr-xr-x. 1 root root 801 Oct 2 2020 /usr/bin/yum
在yum服务器上的某个目录中存储了大量的软件包,然后通过ftp或http把这些目录进行共享,使得客户端可以通过ftp或http能够访问到这些目录。
如果按照软A,而A依赖B、C、X,而指定的yum服务器只有B、C,则需要额外指定X的源,否则会按照失败
假设光盘中已经包含了最常用的软件包,就需要把关盘的内容作为源,使用vsftpd将光盘内容共享。
修改vsftp的配置文件/etc/vsftpd/vsftpd.conf
中的annoymous_enable
选项,如下
annoymous_enable=YES
...
pasv_min_port=10010
pasv_max_port=10020
vsftp的被动模式端口区间
启动vsftpd,并设置防火墙
firewall-cmd --add-port=20-21/tcp --permanent
firewall-cmd --add-port=10010-10020/tcp --permanent
firewall-cmd --reload
设置SELinux相关的布尔值,命令如下
setsebool -P ftpd_full_access 1
创建挂载目录
mkdir /var/ftp/dvd
mount /dev/cdrom /var/ftp/dvd
可修改/etc/fstab
进行持久化和自动挂载
此时客户端不能直接把此目录作为源使用,因为服务器需要配置每个包和其他包之间的依赖关系,系统会把某个目录中的rpm包的元数据信息放在repodata
目录中。但是在/var/ftp/dvd
中并没有repodata
目录,一般dvd光盘中都会有AppStream
和BaseOS
目录,其内包含了repodata
各自的rpm信息。
所以当前服务器的源,分别是/var/ftp/dvd/AppStream
和/var/ftp/dvd/BaseOS
,客户端可以通过ftp://192.168.20.101/dvd/AppStream
和ftp://192.168.20.101/dvd/BaseOS
进行访问
我们把光盘源挂载到/mnt
目录上,并设置自动挂载,这样访问访问/mnt
就是访问光盘了,创建/etc/yum.repos.d/aa.repo
,内容如下:
cat /etc/yum.repos.d/aa.repo
[aa]
name=aa
baseurl=file:///mnt/AppStream
enabled=1
gpgcheck=0
这里的file:///
包含3个/
,其中前两个类似于http://
这样的通用写法,而第三个/
表示绝对路径
可以通过createrepo
工具生成repodata
,例如
createrepo -v /var/ftp/myrepo/
就会在myrepo目录中生成repodata
,里面包含了myrepo中所有的rpm包的信息,那么/var/ftp/myrepo
也可作为一个源使用
客户端要安装软件包必须指定使用哪些源,指定源的方法是在目录/etc/yum.repos.d/
创建后缀为repo
的文件[必须为repo
为后缀],本地配置格式如下:
[名称] --- 用于标注不同的源
name= --- 注释信息
baseurl= ---指定源的URL地址
enabled= --用于指定是否启用这个源,值为0或1 enabled也可写为enable
0---不使用此源
1---使用
gpgcheck= --用于指定安装的软件是否进行数字签名验证,值为0或1
0---不验证
1---验证
gpgkey=/path/ 如果上面设置gpgcheck=1,则需要使用此选项的公钥
例如:
[centos-kernel]
name=CentOS LTS Kernels for $basearch
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=kernel&infra=$infra
#baseurl=http://mirror.centos.org/altarch/7/kernel/$basearch/
enabled=0
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
查询当前使用的源,使用yum repolist
[root@server opt]# yum repolist
Updating Subscription Management repositories.
...
repo id repo name
AppStream CentOS-8.5.2111 - AppStream - mirrors.aliyun.com
BaseOS BaseOS
aa aa
base CentOS-8.5.2111 - Base - mirrors.aliyun.com
extras CentOS-8.5.2111 - Extras - mirrors.aliyun.com
当源内容发生变化,使用yum clean all
清空缓存
yum clean all
重建缓存,使用yum makecache
yum makecache
查询yum源是否存在某个包,可以使用yum search 或 yum list
,例如
[root@node-138 docker]# yum search lrzsz
...
========================================================== N/S matched: lrzsz ==========================================================
lrzsz-debuginfo.x86_64 : Debug information for package lrzsz
lrzsz.x86_64 : The lrz and lsz modem communications programs
Name and summary matches only, use "search all" for everything.
[root@node-138 docker]# yum list lrzsz
...
Available Packages
lrzsz.x86_64 0.12.20-36.el7 base
yum search
是通过包名查找是否包含lrzsz
,如果输入yum search lrzs
也可以找到,也就是后面可以是不完整的包名,但yum list
不可以,必须是完整的包名,否则查询不到
[root@node-138 docker]# yum list lrzs
...
Error: No matching Packages to list
yum search
无法判断包是否已安装,但是通过yum list
则可以,如下:
[root@node-138 docker]# yum list lrzsz
Loaded plugins: auto-update-debuginfo, fastestmirror, product-id, search-disabled-repos
Loading mirror speeds from cached hostfile
* base: mirrors.jlu.edu.cn
* epel: mirrors.bfsu.edu.cn
* epel-debuginfo: mirrors.bfsu.edu.cn
* extras: mirrors.jlu.edu.cn
* updates: mirrors.bfsu.edu.cn
Installed Packages
lrzsz.x86_64 0.12.20-36.el7 @base
当我们安装完该软件后,再使用yum list
查询的时候,提示信息从Available Packages
变成了Installed Packages
。
安装软件使用yum install [-y] 包名
,-y
表示在安装过程中确定信息
是yes
卸载软件包用yum remove [-y] 包名
更新软件包,使用yum update [-y] 包名
yum install -y lrzsz
yum update -y lrzsz
yum remove -y lrzsz
使用yum安装软件时,可以只下载包到本地缓存而不安装,格式
[root@node-138 docker]# yum install -y httpd --downloadonly --downloaddir ./
...
Total 5.7 MB/s | 2.7 MB 00:00:00
exiting because "Download Only" specified
[root@node-138 docker]# ll
...
-rw-r--r-- 1 root root 2849200 May 30 23:15 httpd-2.4.6-99.el7.centos.1.x86_64.rpm
该命令会把httpd及其依赖包全部下载
命令不同于包名,当我们执行某个命令却发现没有时,可以通过yum whatprovides */conmand
进行查询,如
yum whatprovides */smbclient
samba-client-4.14.5-2.el8.x86_64 : Samba client programs
Repo : base
Matched from:
Filename : /usr/bin/smbclient
这里*/
是路径通配符,即不管smbclient在哪个目录
前面安装软件都是一个个安装的,假设现在想在服务器上实现某个“功能”,这个功能需要很多个包,但不清楚需要安装哪些包,该怎么办?
可以利用yum中的group
功能,例如:
[root@node-138 docker]# yum grouplist
Available Environment Groups:
Minimal Install
Compute Node
Infrastructure Server
File and Print Server
Cinnamon Desktop
MATE Desktop
Basic Web Server
Virtualization Host
Server with GUI
GNOME Desktop
KDE Plasma Workspaces
Development and Creative Workstation
Available Groups:
Cinnamon
Compatibility Libraries
Console Internet Tools
Development Tools
Educational Software
Electronic Lab
Fedora Packager
General Purpose Desktop
Graphical Administration Tools
Haskell
LXQt Desktop
Legacy UNIX Compatibility
MATE
Milkymist
Scientific Support
Security Tools
Smart Card Support
System Administration Tools
System Management
TurboGears application framework
Xfce
Done
这里显示的可用组是系统没有安装或者组中的包没有安装完全,已安装组说明这个组已经安装完整了。
如果要查询某个组的信息,可以使用yum groupinfo 组名
,例如:
[root@node-138 docker]# yum groupinfo "Minimal Install"
Loaded plugins: auto-update-debuginfo, fastestmirror, product-id, search-disabled-repos
There is no installed groups file.
Maybe run: yum groups mark convert (see man yum)
Loading mirror speeds from cached hostfile
* base: mirrors.jlu.edu.cn
* epel: mirrors.tuna.tsinghua.edu.cn
* epel-debuginfo: mirrors.tuna.tsinghua.edu.cn
* extras: mirrors.aliyun.com
* updates: mirrors.huaweicloud.com
Environment Group: Minimal Install
Environment-Id: minimal
Description: Basic functionality.
Mandatory Groups:
+core
Optional Groups:
+debugging
可以使用yum groupinstall 组名
安装某个组,例如:
yum groupinstall "Minimal Install" -y
通过yum groupremove 组名
卸载某个组
yum groupremove "Minimal Install"
添加第三方的yum源,对于CentOS或者REHL来说,最常用的源就是epel
了,如下
[root@node-138 yum.repos.d]# yum list ansible
Loaded plugins: auto-update-debuginfo, fastestmirror, product-id, search-disabled-repos
Loading mirror speeds from cached hostfile
* base: mirrors.jlu.edu.cn
* extras: mirrors.aliyun.com
* updates: mirrors.huaweicloud.com
Error: No matching Packages to list
[root@node-138 yum.repos.d]# yum install -y https://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm
[root@node-138 yum.repos.d]# sed -i 's|^#baseurl=http://download.example/pub|baseurl=https://mirrors.aliyun.com|' /etc/yum.repos.d/epel.repo
[root@node-138 yum.repos.d]# yum list ansible
Loaded plugins: auto-update-debuginfo, fastestmirror, product-id, search-disabled-repos
...
Available Packages
ansible.noarch 2.9.27-1.el7 epel