Existe alguma maneira de obter o APT para instalar pacotes no meu diretório pessoal?

42

Existe alguma maneira de obter o APT para instalar pacotes no meu diretório pessoal?

Não quero fazer alterações em todo o sistema.

Como alternativa, existem gerenciadores de pacotes linux baseados no diretório inicial?

Peter Mortensen
fonte
Consulte também Gerenciadores de pacotes não raiz .
imz - Ivan Zakharyaschev 28/03

Respostas:

17

O Dpkg não possui o recurso --relocate que o RPM possui. Vale a pena considerar quantos pacotes RPM suportam esse recurso. Basicamente, isso não pode ser feito.

O que você pode fazer é usar um chroot se quiser testar algo antes de instalá-lo globalmente no sistema. Para fazer isso, você precisa ter acesso ao root. A primeira coisa a fazer é criar um chroot básico:

# debootstrap lenny lenny-chroot

Isso cria um chroot Lenny dentro do lenny-chrootdiretório.

Agora podemos entrar no chroot:

# chroot lenny-chroot

Agora podemos fazer o que quisermos e instalar qualquer coisa sem atrapalhar o resto do sistema. Quando terminarmos, digite exit ou pressione ctrl-D

David Pashley
fonte
8

O Linuxbrew é outro gerenciador de pacotes não raiz para Linux (baseado no popular sistema de gerenciamento de pacotes Homebrew para OS X) que compila a partir da fonte e mantém os binários em seu diretório pessoal.

Citando os documentos, os recursos do Linuxbrew são:

  • Pode instalar software em um diretório inicial e, portanto, não requer sudo
  • Instale o software não empacotado pela distribuição nativa
  • Instale versões atualizadas do software quando a distribuição nativa for antiga
  • Use o mesmo gerenciador de pacotes para gerenciar suas máquinas Mac e Linux
Paolo
fonte
7

O prefixo do Gentoo faz exatamente o que você deseja.

Ele instala todos os pacotes em um diretório especificado. Não é necessário acesso root. Se você quiser se livrar dele, basta remover o diretório base.

PS: Isso não funciona no Ubuntu> = 11.04 ou em qualquer outro derivado do Debian com o Multiarch.

hayalci
fonte
1
O Gentoo constrói a partir da fonte, o poster parece querer instalar via pacote em um diretório específico. Isso não é realmente a mesma coisa.
Andrew Case
1
@AndrewCase Gentoo também tem pacotes, eu acredito. O fato de não serem binários é irrelevante para a instalação final.
jiggunjer
4

Assim como uma pequena adição à opção de compilá-lo, existe a opção intermediária de compilar em um pacote com uma opção de prefixo diferente no momento da compilação (com "checkinstall" ou talvez outro método). A vantagem é que o pacote aparecerá em gerenciadores de pacotes, como aptitude ou synaptic.

Além disso, acho que em alguns casos pode ser possível fazer o download do .deb real e forçar um prefixo diferente via instalação do dpkg, mas acho que não é algo que possa ser feito com qualquer pacote aleatório, mas eles devem ter sido compilados com alguma variável para sua localização (em vez do prefixo literal explícito) que você exportaria antes da instalação. Não sei nada sobre o procedimento, no google, para "dpkg instdir prefix".

o dsc
fonte
2

Você pode usar o fakechroot - veja a demonstração no site deles.

niutech
fonte
1

O GoboLinux sem raiz pode fazer exatamente o que você está pedindo: gerenciador de pacotes, sem privilégios elevados, em seu próprio diretório pessoal. Espero que você saiba o que está fazendo; o rootless não é o modo de instalação mais bem mantido do Gobo, e quando eu o usava há alguns anos, exigia alguns ajustes, pois o script de instalação estava um pouco desatualizado em relação a outras alterações do Gobo.

Há também o klik, que reembala alguns .debs, pode instalar pacotes no diretório inicial e não requer privilégios de root para operar ... mas a configuração inicial requer root.

efémero
fonte
1

Eu costumo pegar as fontes e verificar um arquivo como "INSTALL". Normalmente, existem instruções para fazer ./configure --prefix=somedir. Então você tem que adicionar somedir/binao seu caminho.

Ian Kelling
fonte
pode ser difícil obter, compilar e manter as dependências atualizadas.
Paolo
Isso é ao contrário. A questão é sobre como fazer com que os gerenciadores de pacotes (que são preferíveis desde os anos 90) se comportem dessa maneira.
Lightness Races com Monica
1

Não, acho que você não pode.

O melhor que posso pensar agora é usar apt-get sourcee compilar seu pacote. Talvez você possa, de alguma forma, ajustar o procedimento (que pode ser mais ou menos automatizado) para instalar os pacotes em sua casa.

Outro é usar dpkg -Xpara extraí-lo em um diretório de sua escolha.

anon
fonte
0

Existem muito poucos casos em que você precisa instalar pacotes na sua pasta pessoal.

No entanto, você pode compilar e instalar o software na sua máquina local. Basta descompactar e configurar com ./configure --prefix=$HOME/localou em algum outro diretório. Você pode então makee make installcomo normal. Isso irá compilar e instalar esse programa ~/local/, por exemplo, o programa que você executar estará ~/local/bin/programmname.

Rory
fonte
0

Pela minha própria experiência, não há maneira fácil de usar pacotes DEB existentes para instalar em outro diretório que não seja um ambiente chroot . As ferramentas de instalação do Debian / Ubuntu, dpkg / aptitude / dselect, todas requerem privilégios de root para funcionar corretamente.

Agora, dado o DEB fonte, você pode modificar o arquivo Debian / rules para que o pacote seja compilado e instalado em uma árvore de diretórios diferente, mas você não está usando os pacotes binários já disponíveis.

Como outros mencionaram, você pode usar o debootstrap e criar facilmente um ambiente chroot, o que eu fiz no passado para ter um ambiente de 32 bits em um host de 64 bits, mas isso requer a instalação de um chroot com pelo menos os pacotes base duplicados. Se você tem espaço e esta é uma solução viável, é possível combiná-lo com dchroot, ou melhor ainda schroot, para permitir a execução fácil dos aplicativos instalados no ambiente chroot.

Peter Mortensen
fonte
0

Tenho problemas para imaginar como isso funcionaria com os repositórios oficiais de uma distribuição. Como deve resolver dependências? Do sistema ou dos diretórios pessoais? E se encontrar versões diferentes em ambas?

O melhor que consigo pensar seria em um ambiente chroot, como as pessoas fazem para aplicativos de 32 bits em sistemas de 64 bits. É mais sobrecarga como você estaria chamando debootstrap no chroot, mas com alguns links simbólicos , shell script wrapper divertido, ele pode fazer o que quiser.

Peter Mortensen
fonte
0

Ainda estou trabalhando no problema, mas desbootstrap basicamente o que você precisa e deve funcionar com o fakeroot. O debootstrap é apenas um monte de scripts de shell, então estou separando-o para ver o que o faz funcionar. A parte mais difícil será desinstalar os arquivos depois que eles estiverem instalados.

Perkins
fonte
Eu (e milhares de outros usuários) de todo coração encorajamos isso. Algo que explode no banco de dados rpm (ou apt alternativo) já existente em todo o sistema, bem como em um banco de dados rpm fornecido pelo usuário e instala rpms localizados pelo usuário. Isso seria incrível. Isso pode até ser mesclado na linha principal. Alguma pesquisa foi feita sobre isso anteriormente?
Andrew Case
0

Infelizmente, eu não ouvi nenhuma distro fornecer algo assim (embora eu tenha certeza que seria super popular). Você pode simular a distribuição baseada em rpm ... Não tentei isso, mas você pode criar um banco de dados rpm com base no usuário e depois instalar rpm no banco de dados do usuário.

Tente configurar uma nova distribuição baseada em usuário com:

rpm --initdb --dbpath DIRECTORY

Depois, há várias opções que podem ajudar:

  • --prefix
  • --relocate
Andrew Case
fonte
0

Eu tenho uma solução que usei com sucesso para instalar uma grande coleção de pacotes de software cooperativos em um servidor Debian escolar, onde não tenho acesso root (nem mesmo para instalar outro gerenciador de pacotes). Ele não usa deboostrapnem gerenciador de pacotes.

O método é parcialmente manual, mas eu fiz o possível para torná-lo conveniente.

Ele usa esse script que eu chamei install(não esqueça chmod +x):

#!/bin/bash

# PREFIX is the installation root, i.e. a directory you have write access to
PREFIX=$HOME

# unpack the archive to $PREFIX
ar p "$1" data.tar.xz | tar xJ -C $PREFIX

# go through all unpacked text files and search for occurences of /usr/...
# we're gonna replace some of them with $PREFIX/usr
files=$(dpkg --contents $1 | grep '^-' | awk '{print $6}' | sed 's/^..//' | sort | uniq)
for f in $files; do
    file="${PREFIX}${f}"
    if grep -Iq . "$file"; then
        if grep -q '/usr' "$file"; then
            # interactively ask for each occurence, if it should be replaced
            vim -c '%s#/usr#'$PREFIX'/usr#gc' -c 'wq' "$file"
        fi
    else
        echo "Leaving binary file $file unmodified"
    fi
done

Geralmente, eu primeiro baixa um arquivo deb usando apt-get download package_name. Então eu corro ./install package_name_blabla.debe decido manualmente sobre cada ocorrência /usrnos arquivos descompactados, se eles devem $PREFIX/usrou não ser substituídos .

Essa decisão depende completamente de quais pacotes são instalados pelo sistema e quais são instalados usando esse método. Normalmente, por exemplo, os arquivos pkg-config precisam dessa substituição, enquanto as linhas shebang #!/usr/bin/perlnão. A regra geral é o caminho resultante deve apontar para um arquivo existente.

Com os pacotes instalados dessa maneira, você obviamente precisa informar os outros programas sobre eles. Isto pode ser conseguido, acrescentando os valores correctos para LD_LIBRARY_PATH, PATH, PYTHONPATH, PKG_CONFIG_PATH, CMAKE_MODULES_PATH, CMAKE_PREFIX_PATHetc.

Há uma ressalva nessa abordagem: as dependências não são baixadas / instaladas automaticamente; você precisa acompanhá-los manualmente.

Além disso, o APT obviamente não sabe sobre esses pacotes, portanto os mostrará para sempre como ausentes. Mas isso faz sentido - quem gostaria de instalar um aplicativo em todo o sistema que depende da instalação do usuário.

Se você deseja desinstalar um programa, pode listar o conteúdo do arquivo deb usando ar p "$1" data.tar.xz | tar tJe, em seguida, excluir todos esses arquivos do arquivo PREFIX.

Martin Pecka
fonte