[Linux基础]-5-软件的安装与管理

引言

这篇文章介绍Linux五个运用最普遍的软件包管理器。使用Rocky(RHEL系)、Ubuntu(Debian系)、EndeavourOS(Arch系)这三个不同的Linux发行版,分别介绍rpm、yum、dnf、dpkg、apt-get和pacman的使用方法。

0×1.RPM、DPKG、Pacman软件管理机制浅析

RPM(Red hat Package Manage):是Red Hat公司开发的打包标准,通常以.rpm作为后缀,Linux软件包的命名有一定的规律,一般的结构是"软件名称-版本-适合的系统平台.扩展名",例如,一个rpm安装包名称是"ansible-test-2.14.9-1.el9.x86_64.rpm",那么这个软件的名称就是"ansible-test",软件版本是"2.14.9-1.el9",适用的平台"x86_64"(x86_64构架);RPM包可以安装在所有的RHEL系Linux中,例如,Rocky,Fedora等。

DPKG(Debian Package):dpkg是Debian系发行版负责管理软件包的初级工具,只有简单的安装、卸载、检查依赖等本地的功能;dpkg封装的包后缀是.deb,例如“sogoupinyin_4.2.1.145_amd64.deb”,“sogoupinyin”是软件的名称,“4.2.1.145”是版本号,“amd64”是这个包的适用平台;deb包可以安装在所有Debian系列系统上,例如,Ubuntu,Kali,Deepin等。

Pacman:是Arch系列操作系统上的默认包管理器,功能强大能,不仅能够通过软件仓库在线安装,还能够安装本地打包好的软件,在ArchLinux中,本地打包软件的后缀通常是.pkg.tar.zst,例如:“vmware-workstation-17.5.0-2-x86_64.pkg.tar.zst”;

然而,不论哪种软件管理机制封装的安装包,都存在相关软件的依存问题,比如使用rpm或者dpkg安装软件A,A则需要系统中已经安装好软件B和C,否则A将不能正常安装,这就带来一个非常麻烦的问题,如果A依赖的程序不止两个,而是几百个,这几百个被依赖的程序在安装的过程中,又存在其他的依赖关系,那么手动安装这些依存程序显然就会非常的麻烦。

所以,为了解决安装软件的依赖关系问题,Yum、Dnf、Apt-get、Pacman这几种自动解决依赖关系的包管理器就被开发了出来。Yum和Dnf是RPM软件管理机制的在线安装方式,适用于RHEL系列Linux;Apt-get是DPKG软件管理机制的在线安装方式,适用于Debian系列Linux;Pacman是Arch系列Linux的原生包管理器;它们都可以自动解决软件的依存问题,当某个需要安装的软件存在依赖软件时,安装程序会自动搜索指定的网络服务器中是否存在这些依存的软件,如果存在,会将这些软件一次性全部安装好。

0×1.1.Linux如何更换软件源

首先来看一下,为什么要更换软件源,因为大多数的Linux的软件仓库都在国外的服务器上,在网络不通达的时候,就可能访问不了,这就会导致我们更新系统或在线安装软件失败;如果遇到了这样的问题,解决它的最好办法就是将软件源更换到国内【阿里云开源镜像站】;

images/mirror.png

上图中, 假设PC连接官方软件源服务器网络不好,那么就可以通过阿里这样的镜像站,因为阿里的网络到官方软件源服务器的网络是通的,所以阿里会缓存所有官方软件源里面的资源到镜像服务器上,这样我们只需要通过阿里镜像服务器去获取软件和更新就行了。

更换软件源的方法,打开【阿里云开源镜像站】,找到自己的Linux操作系统对应的镜像,然后参考步骤就行修改。

===在没有学习权限之前,下面所有对软件源文件的修改,都暂时使用超级管理员root运行===

● Ubuntu修改软件源文件示例:

 
					
					#sed -i.hk987参数接受传入一个文件,sed首先会将这个文件复制一份并且添加.hk987后缀
					#然后再将 --- {'s|这一部分的内容|替换成这一部分|g'},在命令中使用|作为分隔符的时候斜杠/不需要用反斜杠\转义
					sed -e 's|http://cn.archive.ubuntu.com|http://mirrors.aliyun.com|g' -i.hk987 /etc/apt/sources.list
					
					

● Rocky修改软件源文件示例:

 
					
					#查看系统版本命令(或lsb_release -a)
					more /etc/os-release  

					#针对Rocky8
					sed -e 's|^mirrorlist=|#mirrorlist=|g' \
					's|^#baseurl=http://dl.rockylinux.org/$contentdir|baseurl=https://mirrors.aliyun.com/rockylinux|g' \
					-i.hk987 \
					/etc/yum.repos.d/Rocky-AppStream.repo \
					/etc/yum.repos.d/Rocky-BaseOS.repo \
					/etc/yum.repos.d/Rocky-Extras.repo \
					/etc/yum.repos.d/Rocky-PowerTools.repo

					#针对Rocky9
					sed -e 's|^mirrorlist=|#mirrorlist=|g' \
					's|^#baseurl=http://dl.rockylinux.org/$contentdir|baseurl=https://mirrors.aliyun.com/rockylinux|g' \
					-i.hk987 \
					/etc/yum.repos.d/rocky-extras.repo \
					/etc/yum.repos.d/rocky-addons.repo \
					/etc/yum.repos.d/rocky-devel.repo \
					/etc/yum.repos.d/rocky.repo
					
					

以上命令只替换了默认启用的仓库。替换之后请运行 dnf makecache 更新缓存。

● Archlinux修改软件源文件示例:

 
					
					#针对Archlinux
					sed -e 's|^|#|g' -e '1i Server = http://mirrors.aliyun.com/archlinux/$repo/os/$arch' -i.hk987 /etc/pacman.d/mirrorlist
					
					

0×2.使用rpm命令安装卸载软件

● 查询软件安装到系统的哪些目录中:

 
					
					#对已安装的软件,通过软件名查询安装到了系统哪些目录中
					rpm -ql openssh-server
					#查询rpm软件包,包含哪些文件
					rpm -qlp openssh-server-8.7p1-34.el9.x86_64.rpm
					
					

● 查询软件安装需要哪些依赖软件包:

 
					
					#对已安装的软件
					rpm -qR openssh-server
					#对软件包
					rpm -qRp openssh-server-8.7p1-34.el9.x86_64.rpm
					
					

● 查询某个文件属于哪个软件包:

 
					
					#查询sshd_config这个配置文件属于哪个软件包
					rpm -qf /etc/ssh/sshd_config
					openssh-server-8.7p1-34.el9.x86_64
					
					

● 安装和卸载rpm软件包:

 
					
					#安装ssh服务端
					rpm -ivh openssh-server-8.7p1-34.el9.x86_64.rpm
					#卸载ssh客户端,通过rpm卸载软件的时候,能不能卸载的前提条件是被卸载的软件不被其它软件包依赖
					rpm -evh openssh-server
					
					

0×3.使用yum安装卸载软件

在我们使用rpm安装软件的包的时候,会出现大量的软件依存关系问题,手动解决十分麻烦,所以yum包管理器被开发出来,用来自动解决软件之间的依存关系,yum默认使用联网安装的方式,从指定的服务器中搜索我们需要安装的软件,如果有依存关系的软件,也会被一并自动安装。

● yum查找在线仓库中是否存在某软件包:

 
					
					#使用search参数查找仓库中是否存在vim程序的安装包
					yum search vim
					===== 名称 和 概况 匹配:vim =====
					vim-X11.x86_64 : The VIM version of the vi editor for the X Window System - GVim
					vim-common.x86_64 : The common files needed by any version of the VIM editor
					vim-enhanced.x86_64 : A version of the VIM editor which includes recent : enhancements
					vim-filesystem.noarch : VIM filesystem layout
					vim-minimal.x86_64 : A minimal version of the VIM editor
					
					

● yum查询某个软件包详细信息:

 
					
					#使用list或者info参数查找系统中是否已经安装了vim
					yum list vim
					#如果vim已经安装,显示详细信息
					yum info vim
					
					

● yum安装软件:

 
					
					#安装vim
					yum install vim
					#添加-y参数,不用手动输入yes,自动安装
					yum install vim -y
					
					

● yum更新软件:

 
					
					#单独更新vim软件到最新版本,并且保留旧版本安装包
					yum update vim

					#单独更新vim软件到最新版本,并且删除旧版本安装包
					yum upgrade vim

					#更新系统中所有已安装的软件包到最新版本,并且保留旧版本安装包
					yum update

					#更新系统中所有已安装的软件包到最新版本,并且删除旧版本安装包
					yum upgrade
					
					

注意:yum update和yum upgrade的功能都是一样的,都是将需要更新的package更新到源中的最新版。唯一不同的是,yum upgrade会删除旧版本的package,而yum update则会保留旧版本的package(obsoletes=0)。所以,生产环境中建议使用yum update,防止因为替换,导致旧的软件包依赖出现问题。

● yum从系统中删除软件:

 
					
					#从系统中删除vim软件
					yum remove vim
					
					

● yum从系统中清除下载的软件包缓存:

 
					
					#从系统中删除所有缓存,在最新版本的Rocky系统中,yum已经被dnf取代,缓存目录通常位于 /var/cache/dnf/
					yum clean all
					
					

0×4.使用dnf安装卸载软件

dnf命令来自英文词组“Dandified YUM”的缩写,是新一代的软件包管理器,dnf开发的初衷是作为yum包管理器的替代版本,其功能是用于安装、更新、卸载Linux系统中的软件。 最初应用于Fedora 18系统中,目标非常明确的想要解决掉yum命令的诸多瓶颈问题,例如占用大量内存、臃肿的软件依赖关系、运行速度缓慢等等诟病。

dnf命令的参数和用法与yum完全一样,只需要将命令中的yum替换成dnf即可,请看下面的演示:

● dnf查找在线仓库中是否存在某软件包:

 
					
					#使用search参数查找仓库中是否存在vim程序的安装包
					dnf search vim
					===== 名称 和 概况 匹配:vim =====
					vim-X11.x86_64 : The VIM version of the vi editor for the X Window System - GVim
					vim-common.x86_64 : The common files needed by any version of the VIM editor
					vim-enhanced.x86_64 : A version of the VIM editor which includes recent : enhancements
					vim-filesystem.noarch : VIM filesystem layout
					vim-minimal.x86_64 : A minimal version of the VIM editor
					
					

● dnf查询某个软件包详细信息:

 
					
					#使用list或者info参数查找系统中是否已经安装了vim
					dnf list vim
					#如果vim已经安装,显示详细信息
					dnf info vim
					
					

● dnf安装软件:

 
					
					#安装vim
					dnf install vim
					#添加-y参数,不用手动输入yes,自动安装
					dnf install vim -y
					
					

● dnf更新软件:

 
					
					#单独更新vim软件到最新版本,并且保留旧版本安装包
					dnf update vim

					#单独更新vim软件到最新版本,并且删除旧版本安装包
					dnf upgrade vim

					#更新系统中所有已安装的软件包到最新版本,并且保留旧版本安装包
					dnf update

					#更新系统中所有已安装的软件包到最新版本,并且删除旧版本安装包
					dnf upgrade
					
					

注意:dnf update和dnf upgrade的功能都是一样的,都是将需要更新的package更新到源中的最新版。唯一不同的是,dnf upgrade会删除旧版本的package,而dnf update则会保留旧版本的package(obsoletes=0)。所以,生产环境中建议使用dnf update,防止因为替换,导致旧的软件包依赖出现问题。

● dnf从系统中删除软件:

 
					
					#从系统中删除vim软件
					dnf remove vim
					
					

● dnf从系统中清除下载的软件包缓存:

 
					
					#从系统中删除所有缓存,dnf 的缓存目录通常位于 /var/cache/dnf/
					dnf clean all
					
					

0×5.使用dpkg命令安装卸载软件

dpkg是Debian系列linux的默认包管理器,在Debian系列linux中,所有封装好的安装包都是以.deb后缀结尾,例如搜狗拼音输入法:sogoupinyin_4.2.1.145_amd64.deb,下面是dpkg包管理器的命令实例。

● dpkg查询已安装好的软件的版本信息:

 
					
					#通过dpkg的-l参数查询已经安装好的vim软件的版本信息
					dpkg -l vim
					
					

● dpkg查询已安装好的软件在系统中的位置:

 
					
					#通过dpkg的-L参数查询vim软件包释放到系统的哪些位置
					dpkg -L vim
					
					

● dpkg查询已经安装的软件包详情:

 
					
					#通过dpkg的-s参数查询vim软件包详情
					dpkg -s vim
					
					

● dpkg列出deb安装包中的内容:

 
					
					#通过dpkg的-c参数列出搜狗拼音输入法deb包的内容(包含的文件以及路径)
					dpkg -c sogoupinyin_4.2.1.145_amd64.deb
					
					

● dpkg安装deb软件包:

 
					
					#通过dpkg的-i参数安装搜狗拼音输入法软件包(安装不会成功,因为会遇到依赖软件没有安装的问题)
					dpkg -i sogoupinyin_4.2.1.145_amd64.deb
					
					

在上面这个实例中,安装会失败,因为搜狗输入法安装包需要先安装fcitx等输入法框架,这也是dpkg安装方法的一个弊端,无法自己识别和安装有依存关系的软件包。

● dpkg移除已经安装的软件包:

 
					
					#通过dpkg的-r参数,可以移除指定的软件,但是会保留软件包的配置文件
					dpkg -r vim

					#通过dpkg的-P参数(大写P),可以移除指定的软件,并且同时删除软件的配置文件
					dpkg -P vim
					
					

对于Debian系列Linux系统,推荐使用apt方式在线安装和卸载软件,请看下一小节的实例演示。

0×6.使用apt-get安装卸载软件

APT(英语:Advanced Packaging Tools)是高级包装工具的意思,它是Debian及其衍生发行版(如:ubuntu)的自动化软件包管理器。可以自动下载,配置,安装二进制或者源代码格式的软件包,并且自动解决软件包之间的依赖问题。

● 使用apt更新系统中所有已安装的软件包到最新版:

 
					
					#不同于RHEL系列,apt update仅用来从服务器获取最新的软件列表以及对应软件的版本号
					#apt upgrade才会根据最新的软件列表更新系统中已经安装的软件
					#所以这两条命令通常都是组合使用
					apt update && apt upgrade
					
					

● 使用apt安装软件:

 
					
					#使用apt的install参数安装vim
					apt install vim
					
					

● 使用apt解决安装依赖问题:

 
					
					#有时候使用dpkg安装软件,会出现一大堆没有安装的依赖包,这个时候就能使用apt的-f参数(--fix-broken)来自动安装依赖软件包
					apt install -f
					
					

● 使用apt卸载已经安装的软件:

 
					
					#使用apt的remove参数卸载已经安装的vim软件包
					apt remove vim
					
					

● 使用apt查看安装包的依赖关系列表:

 
					
					#使用apt的rdepends(Reverse Depends)参数,查看vim的软件依赖关系列表
					apt rdepends vim
					
					

● 使用apt清理缓存释放/空间:

 
					
					#Ubuntu下载的软件包被缓存在“/var/cache/apt/archives/”
					#自动删除不需要的软件包(不被使用和不被任何软件依赖)
					apt autoremove

					#删除过期的缓存文件,apt autoclean 命令会删除  /var/cache/apt/archives/ 目录中已经不再需要的包文件。具体来说,它会删除系统中已经没有可用版本的旧包文件,而保留当前最新版本的包文件。这种方式可以在释放空间的同时,保留当前版本的包文件,以便在需要时重新安装。
					apt autoclean

					#删除所有的软件包缓存,apt clean 命令会删除  /var/cache/apt/archives/ 目录中的所有  .deb 文件。
					apt clean
					
					

0×7.使用pacman安装卸载软件

Pacman是Arch系列Linux的包管理器,同样可以在线安装软件,请看下面的实例。

● 使用pacman更新整个系统:

 
					
					#ArchLinux是一款滚动更新的操作系统,所以只需要下面这一条命令,就能将系统更新到最新版(这条命令不会更新内核)
					pacman -Syyu
					
					

● 使用pacman安装软件:

 
					
					#使用pacman的-S参数,安装vim
					pacman -S vim

					#使用pacman的-U参数,能够安装本地软件包,在Arch中,软件包的扩展名为pkg.tar.zst
					pacman -U hk987.1.8.0-1-any.pkg.tar.zst
					
					

● 使用pacman卸载软件:

 
					
					#使用pacman的-R参数,卸载vim
					pacman -R vim
					
					

● 使用pacman查询软件信息:

 
					
					#使用pacman的-Ss参数,搜索包含关键字openssh的包
					pacman -Ss openssh 

					#使用pacman的-Qi参数,搜索openssh包的详细信息
					pacman -Qi openssh

					#使用pacman的-Ql参数,查看openssh包安装后会释放到系统哪些目录
					pacman -Ql openssh
					
					

● 使用pacman清除软件包缓存:

 
					
					#所有使用pacman安装过的软件包都会被缓存到/var/cache/pacman/pkg/目录下
					#系统这样做的好处是当我们删除某个软件之后再安装,系统会先去缓存目录寻找这个软件的安装包
					#如果有缓存,并且版本和服务器的最新版一样,那么就直接从缓存目录安装,这样也会导致这个目录越来越大
					#可以通过下面的命令清空软件包缓存目录
					pacman -Scc

					#下面的命令只会将软件包下载到缓存目录/var/cache/pacman/pkg/,不会安装
					pacman -Sw vim