Substituindo o dpkg admindir das opções do apt-get (debian / ubuntu linux)

2

Como parte de uma implementação do SO, preciso manter conjuntos de pacotes do Debian independentemente do sistema operacional do host. É bastante simples de sobrescrever as configurações do Apt para o cache e as listas, mas não a configuração do dpkg para o admindir. Por exemplo:

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

Isso lê corretamente minhas fontes de /path/to/sources.list e constrói as listas de pacotes disponíveis em / path / to / lib / apt / lists / *. No entanto, no final do comando update, ainda recebo o seguinte erro:

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

Isso ocorre apesar da última opção que tentou substituir o padrão dpkg admindir de '/ var / lib / dpkg'. O que estou fazendo de errado? De acordo com guias como esse , o que estou fazendo com o DPkg :: Options deve funcionar.

    
por Alex G 12.09.2012 / 00:50

1 resposta

1

Sim, alguém poderia pensar que isto era sobre a opção dpkg --admindir, mas neste caso acontece que o apt-get está derivando o AdminDir do Dir :: State :: status valor. Acabei de baixar o código-fonte do apt e encontrei o seguinte trecho em ./ 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());
}

Portanto, para o propósito deste exercício, Dir :: State :: status para / foo / bar / status será traduzido para o AdminDir / foo / bar e o arquivo de bloqueio / foo / bar / lock .

Eu não investiguei isso ainda mais, mas para mim o apt-get assumiu que o arquivo de status já existia. Criar um arquivo vazio usando o touch funcionou bem o suficiente para pelo menos não fazer o apt-get reclamar.

    
por 03.11.2012 / 00:06