Dica para
Ubuntu válida para qualquer distro que utilize o
apt como gerenciador de pacotes, com as devidas alterações dos scripts.
Todos os usuários
Linux que não tiveram ou não têm conexão com a internet, já se perguntaram: como eu faço pra instalar programas?
É notória a dificuldade de instalação de programas em máquinas offline. Alguns recomendam o aptoncd, mas só é útil se dispomos de uma segunda máquina Linux com conexão. Se houver somente uma lan house com Windows, 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.
Suponhamos o seguinte cenário: queiramos instalar o programa XYZ que tenha 10 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 que ele baixe os pacotes e gere um disco com o aptoncd, o apt-get vai baixar o programa XYZ e as dependências ausentes no sistema de nosso amigo, exceto a(s) que se encontra(m) instalada(s) no sistema. Ele 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. Aí sim teríamos todas os pacotes necessários.
Para não instalar novamente o Ubuntu, nosso amigo poderia ter guardado um becape do arquivo "/var/lib/dpkg/status" exatamente como era no sistema recém instalado. Logo após instalar o Ubuntu, rodar o comando:
# 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
O apt vai pensar que os únicos pacotes instalados no sistema são aqueles de um recém instalado, e será impossível o apt deixar de baixar alguma dependência desde que as versões do Ubuntu presente nas máquinas sejam idênticas. 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. É necessário que ele, ao instalar o Ubuntu, tenha feito um becape de /var/lib/dpkg/status.
Mas se dispusermos somente da lan house que só usa Windows? Para isso existe a solução apontada pela própria documentação do Ubuntu, nos tópicos
Installing packages without an Internet connection" e
AptGet offline repository.
A primeira solução é usar o
keryx. A segunda é criar um repositório local com as listas de pacotes, usar o Synaptic para gerar o script e modificar as URLs deste. 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 rodá-lo.
Quem quiser tentar o keryx, o link está ali em cima. Incrivelmente, eu pesquisei tanto no fórum 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: baixa as coisas meio devagar e não há como saber o que está instalado na sua máquina (pra não baixar dependências que você já tenha etc). É escrito em Python e pode ser instalado em um pendrive para rodar em uma lan house com Windows, por exemplo.
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.
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-o, movendo-o antes para uma pasta vazia, pois ele baixará os pacotes no mesmo diretório do script. Se não for possível rodar o script, abra como texto, copie e cole os links no navegador e baixe-os individualmente.
4) Transporte os pacotes para a máquina offline, utilize o recurso "Adicionar os pacotes baixados" do Synaptic e selecione a pasta onde eles estão. Todos serão instalados.
Opcional
Caso não queira instalar os pacotes, copie-os para a pasta /var/cache/apt/archives. Com o Synaptic, ou o 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.
Abaixo estão os scripts. Copie e cole-os num editor de texto, salve e dê permissão de execução para cada um. Depois utilize-os segundo as instruções acima
clonar_estrutura_do_repositorio.sh:
#!/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
adicionar_repositorio_local.sh:
#!/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.
Espero que com isso a desolação dos usuários offline diminua um pouco...