作为操作系统部署的一部分,我需要独立于主机操作系统维护一组 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 抱怨。