Ubuntu和Debian软件包管理要点

包管理软件可以让你轻松地控制服务器上的软件。这些工具允许您安装,删除,更新,并通过统一的接口配置上千包。在本指南中,我们将讨论一些可与Ubuntu和Debian系统中最常用的包管理程序。

介绍

软件包管理是Linux系统提供的基本优势之一。 包装格式和包管理工具从分发到分发是不同的,但是两个一般家庭已经成为最常见的。

对于基于RHEL的发行,RPM的包装形式和包装工具,如rpmyum是常见的。 其他主要的家庭,由Debian的,Ubuntu和相关发行版中使用,使用.deb封装格式和工具,如aptdpkg 后一组是我们将在本指南中讨论的家庭。

在这个Cheat表格式指南中,我们将介绍系统管理员在Debian和Ubuntu系统上使用的一些最常见的包管理工具。 当您需要知道如何在这些系统中完成软件包管理任务时,可以将其用作快速参考。

如何使用本指南

本指南将介绍在Debian和Ubuntu系统上常用的用户级包管理工具。 我们不会覆盖创建包所需的工具,因为不同发行版之间的政策存在不同的观点,以及涉及非平凡例子的复杂性。

我们将在Debian包管理工具概述中单独讨论每个常用工具,但本指南的大部分将按功能而不是工具组织。 这个组织更有意义,因为本指南被概念化为一个功能参考。

要充分利用本指南,请注意以下几点:

  • 如果您不熟悉Debian系列软件包管理工具,请阅读下面的Debian软件包管理工具概述部分。 这将粗略概述每个工具的目的是什么以及它们之间的相关性。
  • 根据需要使用本指南的每个部分以产生所需的效果。 这不是程序性的,所以随时跳到任何对你最相关的一刻。
  • 使用此页面左侧的内容菜单(以宽页面宽度)或浏览器的查找功能,找到所需的部分。
  • 复制并粘贴指定的命令行示例,替换中的值red与自己的价值观。

Debian软件包管理工具概述

Debian / Ubuntu生态系统采用了不同的软件包管理工具来管理系统上的软件。

大多数这些工具是相互关联的,并在相同的包数据库上工作。 这些工具中的一些尝试向包装系统提供高级接口,而其他工具集中于提供低级功能。

Apt-get

apt-get命令可能是最经常使用的成员apt包装工具套件。 其主要目的是与分发包装团队维护的远程存储库连接,并对可用包执行操作。

apt拉从远程仓库信息放入高速缓存套件一般功能保持在本地系统上。 apt-get命令用于刷新本地缓存。 它还用于修改程序包状态,意味着从系统中安装或删除程序包。

在一般情况下, apt-get将用于更新本地高速缓存中,并进行修改到实时系统。

Apt-cache

在另一个重要的成员apt套件是apt-cache 此实用程序使用本地缓存来查询有关可用软件包及其属性的信息。

举例来说,任何时候你要搜索一个特定的软件包或将执行特定功能的工具, apt-cache是一个良好的开端。 它还可以提供关于程序将确定的目标软件包版本的信息。 依赖和反向依赖信息是另一个领域apt-cache是很有用的。

能力

aptitude命令结合多以上两个命令的功能。 它具有作为命令行工具操作的优点,组合了上述两个工具的功能,并且还可以使用基于文本的菜单化界面来操作。

当从命令行运行,大多数命令镜像的能力, apt-getapt-cache完全吻合。 由于这种重叠,我们不会讨论aptitude广泛本指南的 你可以经常使用aptitude代替或者apt-getapt-cache ,如果你喜欢这个工具。

Dpkg

而以前的工具被集中于管理保持在储存库封装, dpkg命令也可以被用来对个别操作.deb软件包。 dpkg工具,实际上是负责最上面的命令背后的幕后工作。

不同于apt-*命令, dpkg不具备自动解决依赖关系的能力。 它的主要特点是能够轻松地与工作能力.deb直接封装,其解剖一个包,并了解更多有关其结构的能力。 虽然它可以收集有关系统上安装的软件包的一些信息,但其主要目的是在单个软件包级别。

Tasksel

tasksel程序是一个不同类型的工具,用于管理软件。 相反,管理单个包装,甚至应用程序, tasksel专注于组合在一起需要完成具体的“任务”的软件。

有组织的任务可以使用基于文本的界面来选择,或者它们可以像在传统打包工具中定向包一样进行定向。 虽然不是最外科的方法,它可以非常有用的启动和运行快速。

其他

还有许多其他软件包管理工具可用于提供不同的功能或以不同的方式呈现信息。 我们只会在必要时触及这些,但在某些情况下它们可能非常有用。

有些是属于这一类的工具是apt-filedselectgdebi

更新包高速缓存和系统

Debian和Ubuntu包管理工具提供了一个很好的方法来保持系统的可用包的列表是最新的。 它还提供了更新当前在服务器上安装的软件包的简单方法。

更新本地包高速缓存

包装工具依赖的包信息的远程存储库将始终更新。 然而,大多数包管理工具使用本地缓存的这些信息。

在执行其他软件包命令之前,每次会话更新本地软件包缓存通常是个好主意。 这将确保您正在使用有关可用软件的最新信息。 更重要的是,如果您使用过时的包信息操作,某些安装命令将失败。

要更新本地缓存,使用apt-get使用命令update子命令:

sudo apt-get update

这将下拉您正在跟踪的存储库中的可用软件包的更新列表。

更新无程序包删除的程序包

apt包装套件使得它琐碎让所有在服务器上安装该软件的先进的日期。

apt命令两个不同的更新过程进行了区分。 第一个更新过程(本节中介绍的)可用于升级不需要删除组件的任何组件。 要了解如何更新,并允许apt拆除和交换组件在必要时,请参见下面的部分。

当您不想在任何情况下删除任何已安装的软件包时,这可能非常重要。 但是,某些更新涉及更换系统组件或删除冲突文件。 此过程将忽略任何需要删除软件包的更新:

sudo apt-get upgrade

执行此操作后,将应用不涉及删除组件的任何更新。

更新软件包并根据需要删除

apt包装套件使得它琐碎让所有在服务器上安装该软件的先进的日期。

apt命令两个不同的更新过程进行了区分。 第一个更新过程忽略需要删除软件包的任何更新。 这在上面的部分。

第二个过程(在本节中介绍)将更新所有包,即使是需要删除包的那些包。 这通常是必需的,因为包的依赖关系改变。

通常,正在移除的包将在升级过程期间被功能等同替换,因此这通常是安全的。 然而,最好注意要移除的包装,只是在某些必要组件被标记为要移除的情况下。 要预制此操作,请键入:

sudo apt-get dist-upgrade

这将更新系统上的所有软件包。 这是比上次升级更完整的升级过程。

下载和安装软件包

包管理工具的主要功能之一是便于下载和安装包到系统上。

搜索包

下载和安装软件包的第一步通常是在分发包的存储库中搜索您要寻找的软件包。

多数apt命令上保持在本地计算机上的包信息的缓存主要工作。 这允许更快的执行和更少的网络流量。

搜索包是一种将包缓存作为信息目标的操作。 apt-cache search子命令来搜索可用的软件包所需的工具。 请记住,你要保证你的本地缓存是使用最多最新的sudo apt-get update搜索包之前:

apt-cache search package

因为此过程仅在查询信息,它不需要sudo权限。 任何搜索都将查看包名称以及包的完整描述。

例如,如果你搜索htop ,你会看到这样的结果:

apt-cache search htop
aha - ANSI color to HTML converter
htop - interactive processes viewer
libauthen-oath-perl - Perl module for OATH One Time Passwords

正如你所看到的,我们有一个名为包htop ,但是我们也看到另外两个程序,每个程序的提起htop在包的完整描述字段(描述旁边的产量只有一个简短的摘要)。

从Repos安装软件包

从仓库安装包,以及所有必要的相关性,我们可以使用apt-get使用命令install子命令。

此命令的参数应为程序包名称或在存储库中标记的名称:

sudo apt-get install package

您可以一次安装多个包,以空格分隔:

sudo apt-get install package1 package2

如果您请求的包需要额外的依赖关系,这些将打印到标准输出,您将被要求确认该过程。 它看起来像这样:

sudo apt-get install apache2
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following extra packages will be installed:
  apache2-data
Suggested packages:
  apache2-doc apache2-suexec-pristine apache2-suexec-custom
  apache2-utils
The following NEW packages will be installed:
  apache2 apache2-data
0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded.
Need to get 236 kB of archives.
After this operation, 1,163 kB of additional disk space will be used.
Do you want to continue [Y/n]?

正如你所看到的,即使我们的目标安装的是apache2包, apache2-data包需要作为一个依赖。 在这种情况下,可以按ENTER或“y”继续,或通过键入“n”中止操作。

从Repos安装特定软件包版本

如果您需要安装特定版本的软件包,则可以提供要使用等号进行定位的版本,如下所示:

sudo apt-get install package=version

此情况下的版本必须与存储库中可用的软件包版本号之一匹配。 这意味着利用您的发行版所采用的版本控制方案。 您可以通过键入可用版本apt-cache policy package

重新配置包

许多软件包包括在安装完成后运行的安装后配置脚本。 这些通常包括管理员进行配置选择的提示。

如果你需要通过这些(和附加)配置步骤在稍后的时间来运行,则可以使用dpkg-reconfigure命令。 此命令查看传递给它的包,并重新运行包规范中包含的任何后配置命令:

sudo dpkg-reconfigure package

这将允许您访问在安装时运行的相同(通常更多)提示。

执行包运行的干运行

很多时候,您将希望看到过程的副作用,而不实际提交执行命令。 幸运的是, apt让你添加-s标志,以“模拟”的过程。

例如,要查看如果您选择安装软件包将做什么,您可以键入:

apt-get install -s package

这将让你看到所有的依赖和更改系统将会发生的,如果你删除-s标志。 这样做的一个好处是,你可以看到,通常需要root权限的进程的结果,而无需使用sudo

举例来说,如果我们要评估哪些将与安装apache2包,我们可以输入:

apt-get install -s apache2
NOTE: This is only a simulation!
      apt-get needs root privileges for real execution.
      Keep also in mind that locking is deactivated,
      so don't depend on the relevance to the real current situation!
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following extra packages will be installed:
  apache2-data
Suggested packages:
  apache2-doc apache2-suexec-pristine apache2-suexec-custom
  apache2-utils
The following NEW packages will be installed:
  apache2 apache2-data
0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded.
Inst apache2-data (2.4.6-2ubuntu2.2 Ubuntu:13.10/saucy-updates [all])
Inst apache2 (2.4.6-2ubuntu2.2 Ubuntu:13.10/saucy-updates [amd64])
Conf apache2-data (2.4.6-2ubuntu2.2 Ubuntu:13.10/saucy-updates [all])
Conf apache2 (2.4.6-2ubuntu2.2 Ubuntu:13.10/saucy-updates [amd64])

我们获得有关要安装的软件包和版本的所有信息,而无需完成实际过程。

这也可以与其他程序,如做系统升级:

apt-get -s dist-upgrade

不提示包操作的批准

默认情况下, apt将提示您确认了许多进程的用户。 这包括需要额外依赖关系的安装和软件包升级。

为了绕过这些升级,默认为接受任何这些提示,你可以通过-y执行这些操作时,标志:

sudo apt-get install -y package

这将安装软件包和任何依赖关系,而无需用户进一步提示。 这也可以用于升级过程:

sudo apt-get dist-upgrade -y

修复断开的依赖关系和包

有时,由于依赖性或其他问题,安装可能无法成功完成。 一个常见的场景,这可能发生的是安装时.debdpkg ,它不解决依赖关系。

apt-get命令可以尝试通过它传递理清这种情况-f命令。

sudo apt-get install -f

这将搜索任何不满足的依赖项,并尝试安装它们以修复依赖关系树。 如果您的安装抱怨依赖性问题,这应该是您尝试解决它的第一步。

从Repos下载软件包

有些主要实例可能有助于从存储库下载包,而不实际安装它。 你可以用做download的子命令apt-get

因为这只是下载文件,而不是影响实际系统中,没有sudo是必需的权限:

apt-get download package

这将下载指定的软件包到当前目录。

从存储库下载包源代码

虽然apt主要是所涉及.deb软件包,你还可以得到源文件包,只要你的apt源列表与该信息进行配置。

要下载包的源,你必须有一个相应deb-src在你行source.list文件apt 你可以在添加apt存储库的部分找到如何做到这一点。

一旦配置了源存储库,就可以通过键入以下内容来下载包的源代码:

sudo apt-get source package

这将下载软件包文件到当前目录。 这通常包括一个包目录,一个的dsc说明文件以及tar和压缩包:

ls -F
sublime-text-2.0.2/                 sublime-text_2.0.2-1~webupd8~3.tar.gz
sublime-text_2.0.2-1~webupd8~3.dsc

如果您想使用分发包的包作为进一步修改的基础,可以使用此选项。

安装.deb软件包

虽然大多数发行建议从维护仓库安装软件,一些厂商提供原材料.deb ,你可以在你的系统上安装的文件。

为了做到这一点,我们使用一个名为工具dpkg dpkg工具主要用于单独的软件包工作。 它不会尝试从资源库中进行安装,而是寻找.deb软件包在当前目录下,或者所提供的路径:

sudo dpkg --install debfile.deb

值得注意的是,它是重要dpkg工具不执行任何依赖性的处理。 这意味着如果有任何未满足的依赖项,安装将失败。 幸运的是,它标记了所需的依赖,所以如果所有的依赖在仓库中可用,你可以很容易地通过键入以后满足他们:

sudo apt-get install -f

这将安装任何未满足的依赖,包括那些由标记dpkg

使用Tasksel安装软件“任务”

通过使用“任务”可以安装大量的相关软件。 任务是简单的组合,当安装在一起时建立一个特定的环境。 任务的示例包括LAMP服务器,桌面环境和应用程序服务器。

有些系统可能没有足够的tasksel默认安装包。 要获得它,您可以键入:

sudo apt-get update
sudo apt-get install tasksel

您可以通过键入以交互方式选择不同的任务包组:

sudo tasksel

这将显示一个界面,允许您选择不同的软件包组并应用更改。

您还可以通过键入以下内容打印可用任务的列表及其安装状态:

tasksel --list-task

之后,您可以通过键入以下命令从命令行选择安装任务:

sudo tasksel install task_name

删除软件包和删除文件

包管理器也可以执行与安装和下载包相反的操作。 本节将讨论如何卸载软件包和清除软件包操作可能遗留的文件。

卸载软件包

为了删除已安装的软件包,该remove的子命令可以给apt-get 这将删除程序包安装到系统的大多数文件,有一个显着的例外。

此命令将配置文件保留在适当位置,以便您的配置将可用,如果您需要在以后重新安装应用程序。 这是有帮助的,因为这意味着您自定义的配置文件将不会被删除,如果你不小心摆脱一个包。

要完成此操作,您只需提供要卸载的程序包的名称:

sudo apt-get remove package

该软件包将被卸载,除了您的配置文件。

卸载软件包和所有关联的配置文件

如果你想从系统中移除一个软件包和所有相关的文件,包括配置文件,您可以用purge的子命令apt-get

不同于remove上述命令后, purge命令除去一切。 如果您不想保存配置文件,或者您遇到问题并希望从干净的平板开始,这将非常有用。

请注意,一旦您的配置文件被删除,您将无法让他们回来:

sudo apt-get purge package

现在,如果您需要重新安装该软件包,将使用默认配置。

删除不再需要的任何自动依赖关系

当从您的系统删除软件包apt-get removeapt-get purge ,包装目标将被删除。 但是,为了满足安装要求而自动安装的任何依赖项将保留下来。

为了自动删除已安装的由任何软件包不再需要依赖任何软件包,可以使用autoremove命令:

sudo apt-get autoremove

如果你想删除所有被删除的依赖关系相关的配置文件,你将要添加--purge选项中autoremove命令。 这将清除配置文件为好,就像purge命令对有针对性的去除:

sudo apt-get --purge autoremove

清除已下载的软件包文件

当分发包的包维护者从包中添加和删除包时,一些包将变得过时。

apt-get工具可以删除与使用不再可从仓库包关联的本地系统上的任何程序包文件autoclean命令。

这将释放您的服务器上的空间,并允许您的本地系统上的缓存是最新的,没有来自保持无用的信息的cruft。

sudo apt-get autoclean

获取包的信息

每个包都包含大量可使用包管理工具访问的元数据。 本节将演示一些常用的方法来获取有关可用和已安装软件包的信息。

显示有关软件包的信息

要显示有关发行版的仓库包的详细信息,您可以使用show的子命令apt-cache 此命令的目标是存储库中的包名称:

apt-cache show package

这将提供有关该软件包的任何安装候选程序的信息。 每个候选者将具有关于其依赖性,版本,架构,冲突,实际包文件名,包和安装的大小以及其他事物的详细描述的信息。

要显示每个候选人,包括反向相关性的完整列表(依赖于查询封装包的列表)的更多信息,请使用showpkg命令。 这将包括关于此程序包与其他程序包的关系的大量信息:

apt-cache showpkg package

显示有关.deb软件包的信息

要显示有关细节.deb文件,可以用户--info标志和dpkg命令。 该命令的目标应该是路径到.deb文件:

dpkg --info debfile.deb

这将向您显示有关该软件包的一些元数据。 这包括包名称和版本,其构建的体系结构,所需的大小和依赖性,描述和冲突。

显示依赖关系和反向依赖关系

具体列出的依赖关系(包这个软件包依赖)和反向相关性(即依赖于这个包的包),您可以使用apt-cache工具。

对于传统的相关性信息,您可以使用depends子命令:

apt-cache depends package

这将显示有关列为硬依赖关系,建议,建议或冲突的每个包的信息。

如果你需要找出哪些软件包依赖于某个软件包,可以传递包到rdepends子命令:

apt-cache rdepends package

显示已安装和可用的软件包版本

通常,存储库中有多个版本的软件包,只有一个默认软件包。 看到一个包,你可以使用的可用版本policy的子命令apt-cache

apt-cache policy package

这将显示安装了哪个版本(如果有的话),如果没有使用安装命令指定版本,则默认安装的候选人以及包版本表,其中包含表示每个版本优先级的权重。

这可以用于确定将安装什么版本以及可用的备选方案。 因为这也列出了每个版本所在的存储库,这可以用于确定是否有任何额外的存储库或PPA取代默认存储库中的包。

使用dpkg -l显示已安装的软件包

要显示系统上安装的软件包,您有几个单独的选项,具体取决于您想要的输出的格式和详细程度。

第一种方法是使用任一dpkgdpkg-query与命令-l 这两个命令的输出是相同的。 没有参数,它给出了系统上每个已安装或部分安装的软件包的列表。 输出将如下所示:

dpkg -l
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name                                        Version                                 Architecture Description
+++-===========================================-=======================================-============-=====================================================================================================================
ii  account-plugin-generic-oauth                0.10bzr13.03.26-0ubuntu1.1              amd64        GNOME Control Center account plugin for single signon - generic OAuth
ii  accountsservice                             0.6.34-0ubuntu6                         amd64        query and manipulate user account information
ii  acl                                         2.2.52-1                                amd64        Access control list utilities
ii  acpi-support                                0.142                                   amd64        scripts for handling many ACPI events
ii  acpid                                       1:2.0.18-1ubuntu2                       amd64        Advanced Configuration and Power Interface event daemon
. . .

系统上的每个包都会继续输出。 在输出的顶部,您可以看到每行上前三个字符的含义。 第一个字符表示包装的所需状态。 有可能:

  • U:未知
  • I:已安装
  • R:删除
  • 电话号码 :已清除
  • H:版本举行

第二个字符指示包装系统已知的包装的实际状态。 这些可以是:

  • N:未安装
  • I:已安装
  • C:配置文件存在,但应用程序卸载。
  • U:解压缩。 文件已解包,但尚未配置。
  • F:将软件包安装的一半,这意味着有通过该停止了操作的安装故障部位的方法。
  • W:将软件包从一个单独的包等待触发
  • 号码 :该包已被其他包触发。

第三个字符(对于大多数包只是一个空格)只有一个潜在的其他选项:

  • R:这表明重新安装是必需的。 这通常意味着包装破碎并处于非功能状态。

其余列包含包名称,版本,体系结构和说明。

显示已过滤包的安装状态

如果您在之后添加一个搜索模式-l模式, dpkg将列出包含该模式的所有包(是否安装或没有)。 例如,我们可以在这里搜索YAML处理库:

dpkg -l libyaml*
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name            Version      Architecture Description
+++-===============-============-============-===================================
ii  libyaml-0-2:amd 0.1.4-2ubunt amd64        Fast YAML 1.1 parser and emitter li
ii  libyaml-dev:amd 0.1.4-2ubunt amd64        Fast YAML 1.1 parser and emitter li
un  libyaml-perl    <none>                    (no description available)
un  libyaml-syck-pe <none>                    (no description available)
ii  libyaml-tiny-pe 1.51-2       all          Perl module for reading and writing

从第一列可以看出,第三个和第四个结果未安装。 这给了每个匹配模式的包,以及它的当前和期望的状态。

使用dpkg --get-selections显示已安装的软件包

渲染已安装在系统上的软件包的另一种方法是使用--get-selections用标志dpkg

这提供了安装或删除但未清除的所有软件包的列表:

dpkg --get-selections

为了这两种状态之间区分,可以使用awk由国家进行筛选。 要仅查看已安装的软件包,请键入:

dpkg --get-selections | awk '$2 ~ /^install/`

要获取未清除其配置文件的已删除软件包的列表,您可以改为输入:

dpkg --get-selections | awk '$2 !~ /^install/'

搜索已安装的软件包

要搜索已安装的软件包基地一个特定的软件包,可以在之后添加一个包过滤字符串--get-selections选项。 这可以使用通配符进行匹配。 同样,这将显示已安装或仍在系统上具有配置文件的任何软件包:

dpkg --get-selections libz*

您可以再次筛选使用awk从最后一节表现。

列出软件包安装的文件

要找出哪个文件的包负责,您可以使用-L标志和dpkg命令:

dpkg -L package

这将打印出由包控制的每个文件的绝对路径。 这将不包括由包中的进程生成的任何配置文件。

搜索什么包安装到位置

要找出哪个包负责在文件系统中某个文件,你可以传递的绝对路径dpkg使用命令-S标志。

这将打印出安装了相关文件的软件包:

dpkg -S /path/to/file

请记住,通过安装后脚本移动到位的任何文件不能使用此技术绑定到包。

找到哪个包提供文件,而不安装它

使用dpkg ,这很简单,找出哪个包拥有使用该文件-S选项。 但是,有时您可能需要知道哪个包提供了文件或命令,即使您可能没有安装关联的包。

要做到这一点,你需要安装一个工具,叫做apt-file 这保持自己的信息数据库,其中包括数据库中包所控制的每个文件的安装路径。

通过键入以下内容安装实用程序:

sudo apt-get update
sudo apt-get install apt-file

现在,更新工具的数据库并通过键入搜索文件:

sudo apt-file update
sudo apt-file search /path/to/file

这只适用于直接由包安装的文件位置。 将找不到通过安装后脚本创建的任何文件。

在系统之间传输包列表

很多时候,您可能希望从一个系统备份已安装的软件包列表,并使用它在不同的系统上安装相同的软件包。 这也有助于备份目的。 本节将演示如何导出和导入包列表。

导出软件包列表

如果需要将安装在一个系统上的软件包复制到另一个系统上,则首先需要导出软件包列表。

您可以安装的软件包列表导出到后来通过管道输出导入它们所需要的格式的文件dpkg --get-selections

dpkg --get-selections > ~/packagelist.txt

此列表然后可以复制到第二台机器并导入。

您还可以备份源列表和可信钥匙列表。 您可以通过创建包含必要文件的目录并将其复制来备份源:

mkdir ~/sources
cp -R /etc/apt/sources.list* ~/sources

可以通过键入以下内容来备份信任的密钥:

apt-key exportall > ~/trusted_keys.txt

您现在可以转让packagelist.txt文件的sources目录,并trusted_keys.txt文件到另一台计算机进口。

导入包列表

如果您已经使用创建的软件包列表dpkg --get-selections如上文所示,可以使用导入另一台计算机上的包dpkg命令也是如此。

首先,您需要添加信任的密钥并实现从第一台计算机复制的源列表。 假设您备份的所有数据已复制到新计算机的主目录,您可以键入:

sudo apt-key add ~/trusted_keys.txt
sudo cp -R ~sources/* /etc/apt/

接下来,清除新计算机中所有非必需软件包的状态。 这将确保您将更改应用到干净的平面。 这必须以root帐户或进行sudo权限:

sudo dpkg --clear-selections

这将标记所有非必要的软件包卸载。 我们应该更新本地软件包列表,以便我们的安装包含所有要安装的软件的记录。 实际的安装和升级过程将通过一个名为工具来处理dselect

我们应该确保dselect工具安装。 此工具维护自己的数据库,因此我们还需要更新它,然后我们才能继续:

sudo apt-get update
sudo apt-get install dselect
sudo dselect update

接下来,我们可以在当前列表的顶部应用程序包列表,以配置应保存或下载哪些程序包:

sudo dpkg --set-selections < packagelist.txt

这将设置我们想要的包状态。 要应用更改,我们将执行dselect-upgrade ,这是一个apt-get子命令:

sudo apt-get dselect-upgrade

这将下载并安装任何必要的软件包。 它还将删除标记为取消选择的任何包。 最后,您的包列表应该与以前的计算机匹配,虽然配置文件仍然需要复制或修改。

添加存储库和PPA

Although the default set of repositories provided by most distributions contain enough packages for most users, there are times when additional sources may be helpful. In this section, we'll discuss how to configure your packaging tools to consult additional sources.

添加PPA

An alternative to traditional repositories are PPAs, or personal package archives. At the time of this writing, PPAs are only available for Ubuntu systems. Usually, PPAs have a smaller scope than repositories and contain focused sets of applications maintained by the PPA owner.

Adding PPAs to your system allows you to manage the packages they contain with your usual package management tools. This can be used to provide more up-to-date package or packages that are not included with the distribution's repositories. Take care that you only add PPAs that you trust, as you will be allowing a non-standard maintainer to build packages for your system.

To add a PPA, you can use the add-apt-repository command. The target should include the label ppa: , followed by the PPA owner's name on Launchpad , a slash, and the PPA name:

sudo add-apt-repository ppa:owner_name/ppa_name

You may be asked to accept the packager's key. Afterwards, the PPA will be added to your system, allowing you to install the packages with the normal apt commands. Before searching for or installing packages, make sure to update your local cache with the information about your new PPA:

sudo apt-get update

Add Repositories

To add additional repositories to your Ubuntu or Debian system, you can take two different approaches.

The first is to edit the sources lists directly. You can either edit the /etc/apt/sources.list file or place a new list in the /etc/apt/sources.list.d directory. If you go this latter route, the filename you create must end in .list :

sudo nano /etc/apt/sources.list.d/new_repo.list

Inside the file, you can add the location of the new repository by using the following format:

deb_or_deb-src url_of_repo release_code_name_or_suite component_names

The different parts of the repository specification are:

  • deb or deb-src : This identifies the type of repository. Conventional repositories are marked with deb , while source repositories begin with deb-src .
  • url : The main URL for the repository. This should be the location where the repository can be found.
  • release code name or suite : This is usually the code name of your distribution's release, but it can be whatever name is used to identify a specific set of packages created for your version of the distribution.
  • component names : The labels for the selection of packages you wish to have available. This is often a distinction provided by the repository maintainer to express something about the reliability or licensing restrictions of the software it contains.

You can add these lines within the file. Most repositories will contain information about the exact format that should be used.

The second way to accomplish this is through the use of the add-apt-repository command. This is usually included by default on Ubuntu, and for Debian, it can be installed with the software-properties-common package:

sudo apt-get update
sudo apt-get install software-properties-common

Afterwards, you can supply the lines you want to add to the add-apt-repository command. These should be in the same format as you would use for manual additions:

sudo add-apt-repository 'deb url release component'

Make sure you update your local package cache after applying any repository updates so that your system is aware of the newly available packages:

sudo apt-get update

结论

There are many other package management operations that you can perform, but we have tried to cover the most common procedures here. If you have any other favorites, use the comments section below to let us know.