从 apt-get 选项覆盖 dpkg admindir (debian/ubuntu linux)

从 apt-get 选项覆盖 dpkg admindir (debian/ubuntu linux)

作为操作系统部署的一部分,我需要独立于主机操作系统维护一组 debian 软件包。覆盖缓存和列表的 Apt 设置非常简单,但不能覆盖 admindir 的 dpkg 设置。例如:

apt-get -o Dir::Etc::Sourcelist='/path/to/sources.list' \
        -o Dir::Cache::Archives='/path/to/cache/apt/archives' \
        -o Dir::State::Lists='/path/to/lib/apt/lists' \
        -o DPkg::Options::='--admindir=/path/to/lib/dpkg' update

这正确地从 /path/to/sources.list 中读取了我的源,并在 /path/to/lib/apt/lists/* 中构建了软件包可用列表。但是,在更新命令结束时,我仍然收到以下错误:

E: Could not open lock file /var/lib/dpkg/lock - open (13: Permission denied)

尽管最后一个选项试图覆盖默认的 dpkg admindir '/var/lib/dpkg',但结果仍然如此。我做错了什么?根据像这样的指南,我使用 DPkg::Options 所做的事情应该可以起作用。

答案1

是的,有人会认为这是关于 dpkg --admindir 选项的,但在这种情况下,事实证明 apt-get 正在从目录::状态::状态值。我最终下载了 apt 的源代码,并在./apt-pkg/deb/debsystem.cc

// Create the lockfile
string AdminDir = flNotFile(_config->Find("Dir::State::status"));
d->LockFD = GetLock(AdminDir + "lock");
if (d->LockFD == -1)
{
   if (errno == EACCES || errno == EAGAIN)
      return _error->Error(_("Unable to lock the administration directory (%s), "
                             "is another process using it?"),AdminDir.c_str());
   else
      return _error->Error(_("Unable to lock the administration directory (%s), "
                             "are you root?"),AdminDir.c_str());
}

因此,就本次练习的目的而言目录::状态::状态/foo/bar/状态将转换为 AdminDir/foo/bar和锁定文件/foo/bar/锁

我没有进一步调查,但对我来说,apt-get 假设状态文件已经存在。使用 touch 创建一个空文件效果很好,至少不会让 apt-get 抱怨。

相关内容