作为操作系统部署的一部分,我需要维护独立于主机操作系统的debian软件包。 覆盖caching和列表的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 / *中构build包列表。 但是,在更新命令结束时,我仍然收到以下错误:
E: Could not open lock file /var/lib/dpkg/lock - open (13: Permission denied)
尽pipe最后一个选项试图覆盖“/ var / lib / dpkg”的默认dpkg admindir。 我究竟做错了什么? 根据这样的指南 ,我正在做的DPkg :: Options应该工作。
是的,人们会认为这是关于dpkg –admindir选项,但在这种情况下,事实certificate,apt-get是从Dir :: State :: status值派生AdminDir。 我最终下载了apt的源代码,并在./apt-pkg/deb/debsystem.cc中find了以下代码片断。
// 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()); }
因此,为了这个练习的目的,将Dir :: State :: status设置为/ foo / bar / status会转换成AdminDir / foo / bar和locking文件/ foo / bar / lock 。
我还没有进一步调查,但对我来说,apt-get认为状态文件已经存在。 使用触摸创build一个空文件工作得很好,至less不会使得apt-get抱怨。