Eu tenho uma solução que usei com sucesso para instalar uma grande coleção de pacotes de software cooperativos em um servidor Debian da escola, onde eu não tenho acesso root (nem mesmo para instalar outro gerenciador de pacotes). Não usa deboostrap
nem qualquer gerenciador de pacotes.
O método é parcialmente manual, mas fiz o meu melhor para torná-lo conveniente.
Ele usa esse script chamado install
(não se esqueça de chmod +x
it):
#!/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
Normalmente, primeiro baixo um arquivo deb usando apt-get download package_name
. Então eu corro ./install package_name_blabla.deb
, e decido manualmente sobre cada ocorrência de /usr
nos arquivos descompactados, se ele deve ser substituído por $PREFIX/usr
ou não.
Essa decisão depende completamente de quais pacotes são instalados pelo sistema e quais são instalados usando esse método. Normalmente, por ex. os arquivos pkg-config precisam dessa substituição, enquanto as linhas shebang como #!/usr/bin/perl
não. A regra geral é que o caminho resultante deve apontar para um arquivo existente.
Com os pacotes instalados dessa forma, você obviamente precisa informar os outros programas sobre eles. Isso pode ser feito anexando os valores corretos a LD_LIBRARY_PATH
, PATH
, PYTHONPATH
, PKG_CONFIG_PATH
, CMAKE_MODULES_PATH
, CMAKE_PREFIX_PATH
etc.
Há uma ressalva nessa abordagem, que as dependências não são baixadas / instaladas automaticamente; você tem que manter o controle deles manualmente.
Além disso, o APT não sabe obviamente sobre esses pacotes, então os mostrará para sempre como desaparecidos. Mas isso faz sentido - quem gostaria de instalar um aplicativo para todo o sistema que depende da instalação de um usuário.
Se quiser desinstalar um programa, você pode listar o conteúdo do arquivo deb usando ar p "$1" data.tar.xz | tar tJ
e, em seguida, excluir todos esses arquivos do PREFIX
.