В рамках развертывания ОС мне необходимо поддерживать наборы пакетов debian независимо от операционной системы хоста. Довольно просто переопределить настройки Apt для кеша и списков, но не настройку dpkg для admindir. Например:
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 по умолчанию из '/ var / lib / dpkg'. Что я делаю не так? В соответствии с такие гиды, то, что я делаю с DPkg :: Options, должно работать.
Да, можно было бы подумать, что речь идет о параметре dpkg --admindir, но в этом случае оказывается, что apt-get извлекает AdminDir из Dir :: State :: status стоимость. В итоге я загрузил исходный код для 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());
}
Итак, для целей этого упражнения Dir :: State :: status к / foo / bar / статус переведет в AdminDir / foo / bar и файл блокировки / фу / бар / замок.
Я не исследовал это дальше, но для меня apt-get предположил, что файл состояния уже существует. Создание пустого файла с помощью сенсорного ввода сработало достаточно хорошо, чтобы, по крайней мере, не жаловаться на apt-get.