dpkg --dry-run 选项没有正确模拟安装

Arp*_*ith 3 dpkg dependencies software-installation raspbian

给定一个随机的 .DEB 文件,我们如何在没有实际安装到设备上的情况下检查安装是否成功完成?请看下面的片段:

root@VirtualBox:/Folder# dpkg -i mysql-workbench_6.2.3+dfsg-7_armhf.deb 
Selecting previously unselected package mysql-workbench.
(Reading database ... 48937 files and directories currently installed.)
Preparing to unpack mysql-workbench_6.2.3+dfsg-7_armhf.deb ...
Unpacking mysql-workbench (6.2.3+dfsg-7) ...
dpkg: dependency problems prevent configuration of mysql-workbench:
 mysql-workbench depends on libatkmm-1.6-1 (>= 2.22.1); however:
  Package libatkmm-1.6-1 is not installed.
 mysql-workbench depends on libcairo2 (>= 1.14.0); however:
  Package libcairo2 is not installed.
 mysql-workbench depends on libcairomm-1.0-1 (>= 1.6.4); however:
  Package libcairomm-1.0-1 is not installed.
 mysql-workbench depends on libctemplate2; however:
  Package libctemplate2 is not installed.
 mysql-workbench depends on libgdal1h (>= 1.8.0); however:
  Package libgdal1h is not installed.
 mysql-workbench depends on libgdk-pixbuf2.0-0 (>= 2.22.0); however:
  Package libgdk-pixbuf2.0-0 is not installed.
 mysql-workbench depends on libgl1-mesa-glx | libgl1; however:
  Package libgl1-mesa-glx is not installed.
  Package libgl1 is not installed.
 mysql-workbench depends on libglibmm-2.4-1c2a (>= 2.42.0); however:
  Package libglibmm-2.4-1c2a is not installed.
 mysql-workbench depends on libgnome-keyring0 (>= 2.22.2); however:
  Package l
dpkg: error processing package mysql-workbench (--install):
 dependency problems - leaving unconfigured
Processing triggers for mime-support (3.58) ...
Processing triggers for shared-mime-info (1.3-1) ...
Errors were encountered while processing:
 mysql-workbench
root@VirtualBox:/Folder# echo $?
1
root@VirtualBox:/Folder# dpkg --dry-run -i mysql-workbench_6.2.3+dfsg-7_armhf.deb 
(Reading database ... 49115 files and directories currently installed.)
Preparing to unpack mysql-workbench_6.2.3+dfsg-7_armhf.deb ...
root@VirtualBox:/Folder# echo $?
0
root@VirtualBox:/Folder# dpkg --dry-run --simulate -i mysql-workbench_6.2.3+dfsg-7_armhf.deb 
(Reading database ... 49115 files and directories currently installed.)
Preparing to unpack mysql-workbench_6.2.3+dfsg-7_armhf.deb ...
root@VirtualBox:/Folder# echo $?
0
root@VirtualBox:/Folder# 
Run Code Online (Sandbox Code Playgroud)

当我使用该dpkg -i选项时,命令失败,返回值为 1,但与 a 相同的命令--dry-run返回零。添加该--simulate选项似乎也不会改变行为。关于如何在不实际安装软件包的情况下始终检查 .DEB 文件的安装是否会正确进行的任何指示?

我在 Raspberry Pi 模拟器上运行它。

root@VirtualBox:/Folder# cat /etc/os-release
PRETTY_NAME="Raspbian GNU/Linux 8 (jessie)"
NAME="Raspbian GNU/Linux"
VERSION_ID="8"
VERSION="8 (jessie)"
ID=raspbian
ID_LIKE=debian
HOME_URL="http://www.raspbian.org/"
SUPPORT_URL="http://www.raspbian.org/RaspbianForums"
BUG_REPORT_URL="http://www.raspbian.org/RaspbianBugs"
Run Code Online (Sandbox Code Playgroud)

Ste*_*itt 5

要确定是否可以在不需要安装其他依赖项的情况下安装包,最好的办法是使用“模拟”模式apt

apt -s install ./mysql-workbench_6.2.3+dfsg-7_armhf.deb
Run Code Online (Sandbox Code Playgroud)

(注意./哪个是重要的)。这将输出dpkg将由实际安装执行的操作。软件包安装标有Inst; 如果有多个,则无法单独安装该软件包。

现在,进入最重要的部分......你不能使用dpkg它,不是因为dpkg不知道依赖关系(它肯定知道),而是因为依赖关系不够强大。当一个包依赖于另一个包时,如果它不满足,依赖关系不会阻止安装包,它会阻止它被配置。请参阅Debian 政策的第 7.2 节

Depends字段生效只有当一个包是进行配置。它不会阻止系统上的软件包在其依赖项不满足时处于未配置状态,并且可以将依赖项满足且正确安装的软件包替换为依赖项不满足和无法满足的不同版本;完成此操作后,依赖包将处于未配置状态(因为尝试配置它会出错)并且无法正常运行。

您可以在自己的测试中看到这一点:该过程失败

dpkg: dependency problems prevent configuration of mysql-workbench
Run Code Online (Sandbox Code Playgroud)

注意“配置”,而不是“安装”。如果您查看 的输出dpkg -l mysql-workbench,您应该会看到iU,这意味着该软件包已安装但未配置。

当您在 中启用“模拟”模式时dpkg,它基本上以只读模式运行。它通过设置一个f_noact标志来做到这一点;您可以在源代码中查找此内容。安装包时,模拟通过安装动作(不写任何东西),然后进入配置阶段;但这只是伪造 success,这是模拟唯一可以做的事情 - 配置涉及在包中运行维护者脚本,并且很难确保这些脚本没有进行更改,或者确保可以确定它们的成功不允许他们进行更改。因此,在您的情况下,模拟安装成功的包(如在您的非模拟测试中),并伪造配置。因此没有检测到错误......