Instalação de programas em máquinas offline

Iniciado por gnumaru, 31 de Março de 2010, 14:22

tópico anterior - próximo tópico

gnumaru

    Todos os usuários linux que algum dia não tiveram conexão com a internet (ou que ainda hoje não têm) já se perguntaram: como eu faço pra instalar programas?

    É notória a dificuldade de instalação de programas em máquinas offline que utilizam Linux. Alguns recomendam o aptoncd. Mas ele só é útil se dispomos de uma segunda máquina Linux com conexão. E se dispusermos somente de uma lanhouse com windows pra acessar a internet? o aptoncd é inútil. Se tivermos a sorte de ter um amigo que também use Ubuntu, ele pode baixar os pacotes e usar o aptoncd.
    Contudo, suponhamos o seguinte cenário. Nós queremos instalar o programa XYZ que no total tem 10 dependências (incluindo quaisquer dependências de dependências). Nosso amigo limpa seu cache com grande frequência e por coincidência ele já tem algumas das dependências do programa XYZ instaladas.
    Ao pedirmos para que ele baixe os pacotes e gere um disco com o aptoncd, o apt-get vai baixar o program XYZ e as dependências ausentes no sistema de nosso amigo. O apt-get não vai baixar de novo uma dependência que já se encontra instalada no sistema.
    Nosso amigo então vai usar o aptoncd e nos mandar os pacotes. Ao adicionar o cd como repositório e tentar instalar o programa XYZ, irão faltar dependências. O único jeito seguro de ter todo o necessário seria se o nosso colega instalasse novamente o Ubuntu, para então instalar o programa XYZ. Ai sim teriamos todas as dependências necessárias.
    Para não precisar instalar de novo o Ubuntu, nosso amigo poderia ter feito o seguinte. Sabendo de casos como o anterior, nosso amigo costuma guardar um backup do arquivo "/var/lib/dpkg/status" exatamente como era no sistema recém instalado.

# Logo após instalar o Ubuntu
# cp /var/lib/dpkg/status /var/lib/dpkg/status_original

    Ao se deparar com situações como a nossa, ele faz uma cópia de seu "/var/lib/dpkg/status", substitui o arquivo por aquele que existia no sistema recém instalado e então manda o apt-get baixar os pacotes.

# apt-get clean (pra não mandar coisas desnecessárias)
#
# mv /var/lib/dpkg/status /var/lib/dpkg/status_clone
# cp /var/lib/dpkg/status_original /var/lib/dpkg/status
# apt-get -d install programaXYZ (-d faz o apt-get baixar os pacotes sem desempacotar nem instalar nada)
# rm /var/lib/dpkg/status
# mv /var/lib/dpkg/status_clone /var/lib/dpkg/status

Dessa forma, o apt vai pensar que os únicos pacotes instalados no sistema são aqueles de um sistema recém instalado, e será impossível o apt deixar de baixar alguma dependência necessária (desde que a versão do Ubuntu presente em ambas as máquinas seja idêntica). Agora sim nosso amigo poderia usar o aptoncd para gerar um disco para nós.

    Este processo funciona bem, mas ainda é necessário ter alguém que use exatamente a mesma versão do ubuntu que a de nossa máquina, e é necessário que ele, ao instalar o Ubuntu, tenha feito um backup de /var/lib/dpkg/status. Mas, e se nós dispusermos somente da infame lanhouse que só usa windows?
    Para isso, existe uma solução apontada pela própria documentação do Ubuntu, no tópico "Installing packages without an Internet connection"

https://help.ubuntu.com/community/InstallingSoftware
https://help.ubuntu.com/community/AptGet/Offline/Repository

     A primeira solução é usar o keryx:
http://keryxproject.org/
     A segunda é criar um repositório local com as listas de pacotes, usar o synaptic para gerar o script, e modificar as urls dos scripts após gerado, e finalmente rodá-lo em uma máquina online (ou copiar e colar os links no do script no navegador para baixar os pacotes, se não for possível rodar os scripts).

     Quem quiser tentar o keryx, o link está ali em cima. Incrivelmente, eu pesquisei tanto no forum do Ubuntu em português quanto em inglês e não achei uma entrada sequer sobre o keryx. Ele é um programa muito útil, mas que ainda tem suas desvantagens (ele baixa as coisas meio devagar, ele não tem como saber o que está instalado na sua máquina, pra não baixar dependências que você já tenha, etc). Ele é escrito e Python, e pode ser instalado em um pen-drive para rodar em uma lan-house com windows, por exemplo.
    Já quem quiser tentar a segunda opção, pode utilizar uns scripts escritos por mim, que automatizam o processo. As instruções e os scripts estão a seguir.

gnumaru

Instruções para criar o repositório local.
   1)   Em uma máquina online, rode o script "clonar_estrutura_do_repositorio.sh".
   2)   Transporte o arquivo "repository.tar" para a máquina offline.
   3)   Coloque o arquivo "repository.tar" no home do usuário e rode no terminal o script "adicionar_repositorio_local.sh". O script vai pedir a senha de root porque é necessário modificar o arquivo /etc/apt/sources.list



Instruções para instalar programas (após ter feito o procedimento acima)
   1)   Na máquina offline, no Synaptic, selecione os programas a instalar e use a opção "Gerar script de download dos pacotes". Nomeie o script como "download_script.sh"
   2)   no diretório onde o script foi salvo, rode o seguinte comando:

sed -i "s/file:\/\/\/home\/$USER\/repository/http:\/\/sft.if.usp.br\/ubuntu/" download_script.sh

   3)   Leve o script para uma máquina online e rode ele (antes, mova o script para uma pasta vazia, porque o script baixará os pacotes no mesmo diretorio do script). Se não for possível rodar o script, abra como texto, copie e cole os links no navegador e baixe cada pacote.
   4)   Transporte os pacotes baixados para a máquina offline, utilize o recurso "Adicionar os pacotes baixados" do Synaptic, e selecione a pasta onde estão os pacotes. Todos os pacotes baixados serão instalados.



Opcional
   Caso não queira instalar todos os pacotes baixados, copie os pacotes baixados para a pasta /var/cache/apt/archives. Depois, com o Synaptic (ou mesmo apt-get), instale os pacotes desejados.
   Ou ainda, no Nautilus, vá até a pasta /var/cache/apt/archives e dê dois cliques no pacote a ser instalado. As dependências serão resolvidas com os pacotes presentes em /var/cache/apt/archives.

gnumaru

#!/bin/bash
# clonar_estrutura_do_repositorio.sh
##################################################
# Este script deve ser rodado em uma máquina online.
# Este script copia toda a estrutura do repositório do ubuntu Karmic, do mirror sft.if.usp.br., a fim
# de criar um repositório local em uma máquina offline. 32MB de dados são baixados no processo.
# Este script foi feito para baixar somente os dados para i386, mas pode ser facilmente alterado para
# baixar somente os dados para amd64, ou ambos.
# O mirror sft.if.usp.br foi escolhido por se situar no Brasil, e pelos usuários alvo deste script
# serem brasileiros.
# Ao fim do processo, é gerado um arquivo .tar com a estrutura do repositório, que pode ser
# transportado para qualquer máquina offline
##################################################

# Recria a estrutura de diretórios do repositório em $HOME
mkdir $HOME/repository
mkdir $HOME/repository/dists
mkdir $HOME/repository/dists/karmic
mkdir $HOME/repository/dists/karmic/restricted
mkdir $HOME/repository/dists/karmic/restricted/binary-i386
mkdir $HOME/repository/dists/karmic/multiverse
mkdir $HOME/repository/dists/karmic/multiverse/binary-i386
mkdir $HOME/repository/dists/karmic/main
mkdir $HOME/repository/dists/karmic/main/binary-i386
mkdir $HOME/repository/dists/karmic/universe
mkdir $HOME/repository/dists/karmic/universe/binary-i386

# Baixa os dados do mirror sft.if.usp.br.
cd $HOME/repository/dists/karmic
wget -c http://sft.if.usp.br/ubuntu/dists/karmic/Release
wget -c http://sft.if.usp.br/ubuntu/dists/karmic/Release.gpg
wget -c http://sft.if.usp.br/ubuntu/dists/karmic/Contents-i386.gz

# Baixa as listas de restricted
cd $HOME/repository/dists/karmic/restricted/binary-i386
wget -c http://sft.if.usp.br/ubuntu/dists/karmic/restricted/binary-i386/Release
wget -c http://sft.if.usp.br/ubuntu/dists/karmic/restricted/binary-i386/Packages.gz
wget -c http://sft.if.usp.br/ubuntu/dists/karmic/restricted/binary-i386/Packages.bz2

# Baixa as listas de multiverse
cd $HOME/repository/dists/karmic/multiverse/binary-i386
wget -c http://sft.if.usp.br/ubuntu/dists/karmic/multiverse/binary-i386/Release
wget -c http://sft.if.usp.br/ubuntu/dists/karmic/multiverse/binary-i386/Packages.gz
wget -c http://sft.if.usp.br/ubuntu/dists/karmic/multiverse/binary-i386/Packages.bz2

# Baixa as listas de main
cd $HOME/repository/dists/karmic/main/binary-i386
wget -c http://sft.if.usp.br/ubuntu/dists/karmic/main/binary-i386/Release
wget -c http://sft.if.usp.br/ubuntu/dists/karmic/main/binary-i386/Packages.gz
wget -c http://sft.if.usp.br/ubuntu/dists/karmic/main/binary-i386/Packages.bz2

# Baixa as listas de universe
cd $HOME/repository/dists/karmic/universe/binary-i386
wget -c http://sft.if.usp.br/ubuntu/dists/karmic/universe/binary-i386/Release
wget -c http://sft.if.usp.br/ubuntu/dists/karmic/universe/binary-i386/Packages.gz
wget -c http://sft.if.usp.br/ubuntu/dists/karmic/universe/binary-i386/Packages.bz2

# Empacota a lista para transporte para máquinas offline
tar -cf $HOME/repository.tar $HOME/repository

gnumaru

#!/bin/bash
# adicionar_repositorio_local.sh
##################################################
# Este script deve ser rodado nas máquinas offline. Ele desempacota o repositório previamente baixado e
# adiciona o repositório local na lista do apt.
##################################################

# Desempacota o arquivo do repositório
cd $HOME
tar -xf repository.tar

# Faz backup de /etc/apt/sources.list, cria uma lista somente com os repositórios locais e atualiza o apt.
gksudo cp /etc/apt/sources.list /etc/apt/sources.list.old
gksudo echo "deb file://$HOME/repository karmic main restricted universe multiverse" > /etc/apt/sources.list
gksudo apt-get update
sudo -K

# Agora é possível usar o recurso do synaptic "Gerar script de download dos pacotes"
# Crie um script com nome "download_script.sh"
# Após gerado o script, ele faz referência ao repositório local (que não tem pacote algum). Portanto, devemos
# altera-lo para ter-mos um script efetivamente funcional

## Conserta o script gerado pelo Synaptic, trocando "file://Repositorio_local/ubuntu" por "http://sft.if.usp.br/ubuntu"
# sed -i "s/file:\/\/\/home\/$USER\/repository/http:\/\/sft.if.usp.br\/ubuntu/" download_script.sh

## Agora  basta usar o recurso "Adicionar os pacotes baixados" para instalar todos os pacotes baixados.
## Se ao invés disso você quiser instalar somente alguns dos programas, então copie todos os pacotes para
## dentro de /var/cache/apt/archives
#
# sudo cp * /var/cache/apt/archives
#
## E depois instale aqueles que desejar.

gnumaru

Como nada é óbvio nesta vida...

É necessário copiar o conteúdo dos dois posts anteriores e colar em um editor de texto. Depois, salvar o arquivo e dar permissão de execução, senão não tem como utilizar os scripts.

Falco90

Keryx, era esse  nome que estava tentando lembrar!
Esse foi o melhor método que vi até ara para instalar programas em maquinas sem internet
http://keryxproject.org/

lightboy

Linux user #491316 | Ubuntu user #27683