如何从 preinst 脚本中安装 .deb 文件?

如何从 preinst 脚本中安装 .deb 文件?

我有使用 dpkg 打包的自己的应用程序。该应用程序依赖于几个 .deb 文件,我正尝试从应用程序的 preinst 脚本中安装这些文件。preinst 脚本会检查依赖的 deb 文件是否已安装,如果没有,则会使用命令进行安装dpkg -i。对主应用程序所需的所有依赖 deb 文件重复此操作。

当我尝试使用 安装主应用程序时dpkg -i,命令在尝试执行预安装脚本时返回失败。以下是错误消息:

dpkg: error: dpkg status database is locked by another process

我删除了/var/lib/dpkg/lock文件并重新尝试安装该应用程序。但无济于事。如果我像任何其他 shell 脚本一样单独运行 preinst 脚本,它运行起来没有任何问题。所有 deb 文件都将正确安装。因此,问题仅在此 preinst 脚本由 自动运行的情况下出现dpkg -i command

我不知道该如何找出根本原因。如果有人能解释一下真正的问题是什么,我将不胜感激。


感谢 ObsessiveSS0F 的快速回复。

我理解你的意思,但这对我的情况没有帮助。让我告诉你原因。

  1. 我的主应用程序(假设为 mainapp.deb)依赖于其他五个 .deb 文件
    (假设为 1.deb、2.deb 等等)。
  2. 依赖的 .deb 文件是我自己私有的包/库。因此这些文件无法从网上下载。因此,我无法使用 apt-get 自动安装它们。
  3. 我会让控制文件中的“Depends”字段指向 1.deb、2.deb 等,但正如您所知,dpkg -i 不会自动安装依赖项。
  4. 我可以执行 dpkg -i,然后执行 apt-get -f install,但是为了使 apt-get 工作,我必须编辑 /etc/apt/sources.list 文件以添加对系统上存储依赖 .deb 文件的本地目录的引用。
  5. 嗯,#4 似乎可行,但对我来说不是一个选择,因为这个应用程序将安装在许多服务器上,并且安装程序必须完全自动化。

我继续调查 preinst 无法安装 .deb 文件的原因,我想我已经找到了原因。

  1. 当我运行 dpkg -i mainapp.deb 时,dpkg 进程正在创建 /var/lib/dpkg/lock
    和 /var/lib/dkpg/updates 目录下的一些文件。
  2. 现在,preinst 脚本有一系列 dpkg -i 命令来安装依赖的
    .deb 文件。因此,一旦执行 preinst 脚本中的第一个 dpkg -i 命令,它就会因为之前的 dpkg 命令创建的锁而失败。
  3. 看起来由于锁的存在,两个 dpkg 命令无法并行执行。

我修改了 preinst 脚本,将 dpkg 进程创建的锁备份到临时位置,并删除了原始锁。(lsof 命令确实报告了锁已被删除)。现在锁已经消失,preinst 脚本中的 dpkg -i 命令可以毫无问题地执行。我在退出 preinst 脚本之前恢复了锁,以便主 dpkg -i 命令可以继续。这有效,但我觉得这不是正确的方法。

我仍在尝试找出安装 .deb 文件及其依赖项的其他方法。

答案1

无需使用 preinst 脚本来安装 .deb 文件。您只需添加依赖项,然后使用存档进行打包,所有依赖项和预依赖项都会自动安装。

答案2

想到要对锁定文件进行改组,我就感到很不舒服。如果保证不会干扰应用程序安装,那么似乎不应该有问题,但我相信预安装脚本更多是用于停止受安装影响的服务等。

问题的根本原因似乎是在设置锁定文件后,预安装脚本被从 dpkg 操作中剥离出来。似乎正确的做法是将依赖项的安装完全分开,或者重新打包应用程序,以便它与本地 ppa 一起工作并正确安装依赖项。

我想知道在安装应用程序之前或之后使用 --set-selection 设置依赖项并使用 dpkg 处理它们是否更好。可以使用以下命令加载依赖项:

sudo dpkg --set-selections < dependency_files

其中 dependency_files 的格式为例如:

samba                   install
samba-common            install
samba-common-bin        install
samba-ldb-tools         install
samba4                  install
samba4-common-bin       install

我相信文件可以安装

dpkg --selected-only

您的预安装脚本至少可能可用于操作的 --set-selections 部分。

至于重新打包,我无法提供任何帮助,但似乎有一个软件包维护者社区可以提供帮助:

http://www.debian.org/devel/join/newmaint

http://www.debian.org/support

相关内容