admin 管理员组

文章数量: 887017

一、概述

  我们在Linux系统下进行项目开发时,经常会出现缺少某些依赖库或者开发包的情况,这时候一般会通过使用apt命令去联网下载。但在某些特殊情况下(例如终端硬件不支持网络连接,周边缺少有线与无线网络,或者需要批量安装程序到很多终端上时),就需要我们先将对应的依赖环境安装包下载下来,然后拷贝到对应终端上手动安装。以下就针对Linux系统下载与安装离线安装包以及依赖包的相关知识进行整理。


二、APT-Linux软件包管理工具

  APT(Advanced Packaging Tool),是一个命令行实用程序,是工作于Debian, Ubuntu等相关linux发行版上的软件包管理系统。它提供了如自动检索、配置和安装软件包等功能来简化软件的管理。通过apt命令,能够从互联网的软件仓库中搜索、安装、升级、卸载软件等。大多数apt命令必须以具有sudo权限的用户身份运行。
  APT命令可以简单分为两类,一类是apt-xxx(例如apt-get、apt-cache)系列命令,一类是apt。两者都能够用于处理软件包,但apt-xxx系列命令将对软件包的管理操作分的很细致与分散,对于新手终端用户不太友好。而apt是在原有 apt-get 和 apt-cache 基础上,对基础软件包管理操作进行简化和优化,专为新手终端用户设计的命令行工具,可以看作 apt-get 和 apt-cache 命令的子集, 可以为包管理提供必要的命令选项。

从上面的表格可以知道,使用apt命令,我们可以不用关注在进行不同操作时需要使用apt-get还是apt-cache命令,简化了软件包命令操作。不过由于apt命令是专为终端用户设计,对于基础的软件包管理操作,在交互性上相对传统的 apt-xxx 命令有了一定的提升,但这是通过牺牲向后兼容性得到的,因此在脚本等场景下,应当使用更强调向后兼容性的传统 apt-xxx 命令。并且由于apt作为一个志在简化基础软件包管理操作的命令,对于许多高级操作,例如使用 apt-mark 固定软件包版本,是完全没有涉及的,因此在需要用到一些对软件包的高级操作时,应当使用apt-xxx命令。而在进行一些软件包基础操作时,使用apt命令即可。

1、语法

apt [options] [command] [package ...]
  • options:可选,选项包括 -h,-y等等。
  • command:要进行的操作。
  • package:要进行操作的包名。

2、常用option

选项作用
-h显示帮助信息
-y在需要确认的场景中回应 yes
-v显示APT详细的版本号
-d仅下载,不安装
-f尝试修正系统依赖损坏处

3、常用command

命令作用
list根据名称列出软件包
search搜索软件包描述
show显示软件包细节
install安装软件包
reinstall重新安装软件包
remove移除软件包
autoremove卸载所有自动安装且不再使用的软件包
update更新可用软件包列表
upgrade通过安装/升级软件来更新系统
full-upgrade通过卸载/安装/升级来更新系统
edit-sources编辑软件源信息文件
download下载

以下对常用的apt命令进行简要说明:

1)sudo apt update

从远程仓库更新可用软件包列表到本地。如果长久不更新,那么新版本的软件包将不会被其他apt相关命令下载安装。

2)sudo apt upgrade [package_name]

若指定包名,则升级指定软件包;若未指定包名,则升级所有可更新的软件包。(如果升级某个包需要卸载其他包则不做处理)

3)sudo apt [-y] [-d] install package_name1 [package_name2] …

安装指定软件包,若安装多个包,则使用空格隔开,也可以用来安装本地deb文件。可以添加"-y"选项用来跳过安装过程中的确认步骤;可以添加"-d"选项用来下载对应的软件离线安装包,下载的软件包默认存放位置是/var/cache/apt/archives。

4)sudo apt remove package_name1 [package_name2] …

卸载指定软件包,若卸载多个包,则使用空格隔开。使用remove会保留配置文件,使用purge可以完全移除软件包。

5)apt download package_name

下载指定的软件包,存放位置为执行命令的窗口所在目录。

6)sudo apt list

显示出所有可用的软件包。存在以下几种扩展用法:

  • 查看某个包是否可用

sudo apt list | grep package_name

  • 查看已安装包

apt list --installed

  • 查看可升级的包

apt list --upgradeable

7)apt search package_name

用于搜索指定包。

8)sudo apt autoremove

清理不再使用的依赖和库文件。


三、dpkg

  “dpkg”是“Debian Packager ”的简写。为Debian专门开发的套件管理系统,方便软件的安装、更新及移除。所有源自Debian的Linux发行版都使用dpkg,例如Ubuntu、Knoppix等。
  dpkg是Debian软件包管理器的基础,它被伊恩·默多克创建于1993年。dpkg与RPM十分相似,同样被用于安装、卸载和供给.deb软件包相关的信息。dpkg本身是一个底层的工具。上层的工具,如APT,被用于从远程获取软件包以及处理复杂的软件包关系。

1、语法

dpkg [options] [package ...]
  • options:选项。
  • package:要进行操作的软件包。

2、常用option

选项作用
-i安装软件包
-r删除软件包(保留配置)
-P删除软件包(删除配置)
-l显示已安装软件包列表
-L显示与软件包关联的文件
-c显示软件包文件内的文件列表
-s查找软件包详细信息
-x将软件包内的文件解压到指定目录
-X将软件包内的文件解压到指定目录,并在命令行中打印

3、dpk命令常见用法

1)sudo dpkg -i [–force-overwrite] package_name.deb

安装指定的软件包文件,文件名需带有绝对路径或相对路径,若同时安装多个deb包,可以以空格隔开。添加 --force-overwrite 参数,可以进行强制覆盖安装,可以用来解决安装deb包时提示尝试覆盖部分库失败的问题。

2)sudo dpkg -r package_name

卸载指定软件包。

3)dpkg -l [package_name]

显示指定的已安装软件包的版本信息,若未指定软件包名,则显示所有已安装软件包列表信息。

4)dpkg -L package_name

显示与软件包关联的文件,可以用来查看指定软件包都安装到了哪些目录下。

5)dpkg -c package_name.deb

显示软件包文件内的文件列表,作用与 -L 类似,不过 -L是针对已安装软件的,而 -c 是针对软件包deb文件的。

6)dpkg -X package_name.deb xxx

将指定deb包中的文件解压到指定的xxx目录中,并在命令行中打印出所有的目录与文件名。


四、安装包及其依赖的下载和安装

以下在UOS系统1050版本上,进行build-essential安装包下载来举例说明。

1、获取当前系统安装build-essential软件所需的依赖软件包名称

打开终端,输入 sudo apt install build-essential 命令,但不要同意安装,这样子就看到联网下载时会进行安装或升级的软件包名称。

从上图中可以看到,若我们通过apt命令联网安装build-essential软件包,此时一共会安装build-essential、g++、g+±8和libstdc+±8-dev这4个软件包。我们可以使用apt depends命令来查看对应软件包的依赖。

其中,build-essential是目标软件包,目前系统中缺少g++依赖,而g++又缺少了g+±8依赖,g+±8缺少了libstdc+±8-dev依赖。通过这种方式,我们就直接获取到了build-essential目前系统所缺少的依赖和依赖的依赖。

2、下载离线安装包

通过apt download命令,将步骤1需要的软件包下载下来。

3、离线安装软件包

可以简单写一个sh脚本,用来进行软件包及其依赖的安装,方便操作。脚本中实现的功能很简单,就是用一条dpkg命令来安装多个deb包,这样子可以不用关心这些deb包的依赖顺序。执行脚本前,记得使用ls -l命令查看sh脚本文件是否有执行权限,若没有,则使用chmod命令赋予执行权限。

额外说明

如果我们仅安装build-essential的deb包,而不安装其依赖包,则会出现以下提示:

此时我们可以使用sudo apt -f install或sudo apt --fix-broken install命令来修复当前系统依赖存在问题的地方,从图上可以看出,也是提示缺少了g++、g+±8和libstdc+±8-dev这三个依赖软件包。

还可以参考下这篇文章(apt一键下载所有依赖的包),通过shell命令组合来一键下载所有所依赖的包。


参考

  1. APT、apt-get、apt-cache 和 apt
  2. linux中的apt命令
  3. linux系统dpkg命令

本文标签: 离线 安装包 系统 Linux