Назад | Перейти на главную страницу

Переопределение dpkg admindir из параметров apt-get (debian / ubuntu linux)

В рамках развертывания ОС мне необходимо поддерживать наборы пакетов 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.