Como usar o APT Capítulo 3 - Gerenciando pacotes

 3.1 Atualizando a lista de pacotes disponíveis
O sistema de empacotamento usa um banco de dados próprio para saber quais pacotes estão instalados, quais não estão e quais estão disponíveis para instalação. O apt-get usa esse banco de dados para saber instalar os pacotes solicitados pelo usuário e para saber quais pacotes são necessários para que o pacote selecionado rode perfeitamente.
Para atualizar essa lista, você usa o comando apt-get update. Ele procura pelas listas de pacotes nos repositórios indicados no seu arquivo/etc/apt/sources.list, veja O arquivo /etc/apt/sources.list, Seção 2.1 para maiores informações sobre esse arquivo.
É útil executar esse comando regularmente para saber de possíveis atualizações nos pacotes, principalmente de segurança.


3.2 Instalando pacotes

Finalmente um dos processos mais esperados! Com sua sources.list preparada e a lista de pacotes disponíveis, basta rodar o apt-get para ter seu pacote instalado. Por exemplo você pode fazer:
# apt-get install xchat
O APT vai buscar então em seu banco de dados a versão mais nova desse pacote e vai baixá-la do repositório correspondente na sources.list. Caso esse pacote dependa de algum outro -- o que é o caso aqui -- o APT irá conferir as dependências e instalar os pacotes necessários. Veja esse exemplo:
# apt-get install nautilus
Reading Package Lists... Done
Building Dependency Tree... Done
The following extra packages will be installed:
bonobo libmedusa0 libnautilus0
The following NEW packages will be installed:
bonobo libmedusa0 libnautilus0 nautilus
0 packages upgraded, 4 newly installed, 0 to remove and 1 not upgraded.
Need to get 8329kB of archives. After unpacking 17.2MB will be used.
Do you want to continue? [Y/n]
O pacote nautilus depende das bibliotecas compartilhadas citadas, portanto, o APT as vai buscar no repositório. Se você tivesse especificado os nomes dessas bibliotecas na linha de comando do apt-get, o APT não teria perguntado se devia continuar ou não, ele tomaria como certo o seu desejo em instalar todos aqueles pacotes.
Isso significa que o APT só pede confirmação quando precisar instalar pacotes além daqueles que foram solicitados para suprir uma dependência.
As seguintes opções podem ser de utilidade:
-h - ajuda
-d - baixar arquivos apenas, não instalar
-f - conserta erros de instalações de pacotes
-s - não agir, apenas simular operação
-y - assume `sim' para todas as perguntas
-u - mostrar pacotes que serão atualizados também
Múltiplos pacotes podem ser solicitados em uma única linha de comando. Os arquivos baixados da rede são colocados no diretório/var/cache/apt/archives para serem instalados depois.
Você pode especificar pacotes para remoção na mesma linha de comando. Para isso, basta colocar um '-' logo depois do nome do pacote a ser removido, assim:
# apt-get install nautilus gnome-panel-       
Reading Package Lists... Done
Building Dependency Tree... Done
The following extra packages will be installed:
bonobo libmedusa0 libnautilus0
The following packages will be REMOVED:
gnome-applets gnome-panel gnome-panel-data gnome-session
The following NEW packages will be installed:
bonobo libmedusa0 libnautilus0 nautilus
0 packages upgraded, 4 newly installed, 4 to remove and 1 not upgraded.
Need to get 8329kB of archives. After unpacking 2594kB will be used.
Do you want to continue? [Y/n]
Veja a seção Removendo pacotes, Seção 3.3 para maiores detalhes sobre a remoção de pacotes.
Caso você de alguma forma danifique a instalação de um pacote, ou simplesmente deseja que os arquivos do pacote sejam repostos com a versão mais nova que estiver disponível, você pode usar a opção --reinstall assim:
# apt-get --reinstall install gdm
Reading Package Lists... Done
Building Dependency Tree... Done
0 packages upgraded, 0 newly installed, 1 reinstalled, 0 to remove and 1 not upgraded.
Need to get 0B/182kB of archives. After unpacking 0B will be used.
Do you want to continue? [Y/n]

3.3 Removendo pacotes

Caso você não esteja mais querendo usar um pacote, você pode removê-lo do seu sistema usando o APT. Para isso basta usar: apt-get remove pacote. Por exemplo:
# apt-get remove gnome-panel
Reading Package Lists... Done
Building Dependency Tree... Done
The following packages will be REMOVED:
gnome-applets gnome-panel gnome-panel-data gnome-session
0 packages upgraded, 0 newly installed, 4 to remove and 1 not upgraded.
Need to get 0B of archives. After unpacking 14.6MB will be freed.
Do you want to continue? [Y/n]
Como você pode observar no exemplo acima, o APT cuida também de retirar os pacotes que dependem do pacote sendo removido. Não há como remover pacotes sem remover os que são dependentes dele.
Rodando o apt-get como acima vai levar à remoção dos pacotes, mas seus arquivos de configuração, caso existam, permanecerão intactos. Para uma remoção completa, faça:
# apt-get --purge remove gnome-panel
Reading Package Lists... Done
Building Dependency Tree... Done
The following packages will be REMOVED:
gnome-applets* gnome-panel* gnome-panel-data* gnome-session*
0 packages upgraded, 0 newly installed, 4 to remove and 1 not upgraded.
Need to get 0B of archives. After unpacking 14.6MB will be freed.
Do you want to continue? [Y/n]
Note os '*' na frente dos nomes. Eles indicam que os arquivos de configuração serão removidos.
Assim como no caso do método install, você pode usar um sinal gráfico para fazer o processo inverso. No caso da remoção, se você adicionar um sinal'+' logo depois do nome do pacote, ao invés de removido ele será instalado. Exemplo:
# apt-get --purge remove gnome-panel nautilus+
Reading Package Lists... Done
Building Dependency Tree... Done
The following extra packages will be installed:
bonobo libmedusa0 libnautilus0 nautilus
The following packages will be REMOVED:
gnome-applets* gnome-panel* gnome-panel-data* gnome-session*
The following NEW packages will be installed:
bonobo libmedusa0 libnautilus0 nautilus
0 packages upgraded, 4 newly installed, 4 to remove and 1 not upgraded.
Need to get 8329kB of archives. After unpacking 2594kB will be used.
Do you want to continue? [Y/n]
Note que o apt-get informa os pacotes extras que serão instalados, ou seja, os pacotes cuja instalação será necessária ao funcionamento do pacote cuja instalação foi solicitada, os que serão removidos e os que serão instalados (incluindo novamente os extras).

3.4 Atualizando os pacotes

A atualização de pacotes é um grande trunfo do sistema APT. Ela é feita com um simples comando: apt-get upgrade. Você pode atualizar tanto pacotes dentro de uma mesma distribuição quanto atualizar para uma nova distribuição, mas, para essa última, o comando apt-get dist-upgrade é melhor, consulte a seção Atualizando para uma nova distribuição, Seção 3.5 para maiores detalhes.
É útil usar sempre a opção -u para esse comando. Essa opção faz com que o APT mostre os pacotes que serão atualizados. Sem ela você vai fazer uma atualização no escuro. O APT irá baixar as últimas versões de cada pacote e as instalará numa ordem coerente. É sempre importante rodar o apt-get update antes. Veja a seção Atualizando a lista de pacotes disponíveis, Seção 3.1. Veja esse exemplo:
# apt-get -u upgrade
Reading Package Lists... Done
Building Dependency Tree... Done
The following packages have been kept back
cpp gcc lilo
The following packages will be upgraded
adduser ae apt autoconf debhelper dpkg-dev esound esound-common ftp indent
ipchains isapnptools libaudiofile-dev libaudiofile0 libesd0 libesd0-dev
libgtk1.2 libgtk1.2-dev liblockfile1 libnewt0 liborbit-dev liborbit0
libstdc++2.10-glibc2.2 libtiff3g libtiff3g-dev modconf orbit procps psmisc
29 packages upgraded, 0 newly installed, 0 to remove and 3 not upgraded.
Need to get 5055B/5055kB of archives. After unpacking 1161kB will be used.
Do you want to continue? [Y/n]
Esse processo é muito simples. Repare que logo no início, o apt-get diz que alguns pacotes foram kept back. Isso significa que eles têm novas versões que não serão instaladas por algum motivo. Alguns deles são: dependências quebradas (um pacote do qual ele depende não tem uma versão disponível para ser baixada), novas dependências (o pacote passou a depender de novos pacotes desde a última versão).
O primeiro motivo não tem solução limpa, para o segundo basta rodar um apt-get install específico para o pacote, que baixará suas dependências. Outra solução, ainda mais limpa, é usar o dist-upgrade. Veja seção Atualizando para uma nova distribuição, Seção 3.5.

3.5 Atualizando para uma nova distribuição

Essa característica do APT serve para atualizar uma distribuição inteira de uma única tacada, através da internet ou de um novo CD adquirido, ou uma ISO baixada.
Ela é usada também quando mudanças são feitas na interrelação de pacotes já instalados que devem ser atualizados mas são mantidos inalterados (kept back).
Por exemplo, supondo que você está usando a versão estável do Debian revisão 0 e compre o CD com a revisão 3, você pode usar o APT para atualizar seu sistema a partir desse novo CD. Para isso use o apt-cdrom (veja seção Colocando um CDROM na sources.list, Seção 2.4) para adicionar o CD ao seu arquivo /etc/apt/sources.list e rode o apt-get dist-upgrade.
É importante notar que o APT sempre busca as versões mais novas dos pacotes. Portanto, se seu arquivo /etc/apt/sources.list estiver listando um repositório que tenha uma versão mais nova de determinado pacote que contém o CD, ele tenderá a buscá-lo de lá.
No exemplo mostrado na seção Atualizando os pacotes, Seção 3.4, vimos que alguns pacotes ficaram "kept back", vamos solucionar isso agora, com o método dist-upgrade:
# apt-get -u dist-upgrade
Reading Package Lists... Done
Building Dependency Tree... Done
Calculating Upgrade... Done
The following NEW packages will be installed:
cpp-2.95 cron exim gcc-2.95 libident libopenldap-runtime libopenldap1
libpcre2 logrotate mailx
The following packages have been kept back
lilo
The following packages will be upgraded
adduser ae apt autoconf cpp debhelper dpkg-dev esound esound-common ftp gcc
indent ipchains isapnptools libaudiofile-dev libaudiofile0 libesd0
libesd0-dev libgtk1.2 libgtk1.2-dev liblockfile1 libnewt0 liborbit-dev
liborbit0 libstdc++2.10-glibc2.2 libtiff3g libtiff3g-dev modconf orbit
procps psmisc
31 packages upgraded, 10 newly installed, 0 to remove and 1 not upgraded.
Need to get 0B/7098kB of archives. After unpacking 3118kB will be used.
Do you want to continue? [Y/n]
Note agora que os pacotes serão atualizados, mas novos pacotes serão instalados (as novas dependências dos pacotes). E que o lilo continua kept back. Ele provavelmente tem algum problema mais sério, que não uma nova dependência. Podemos conferir isso rodando:
# apt-get -u install lilo
Reading Package Lists... Done
Building Dependency Tree... Done
The following extra packages will be installed:
cron debconf exim libident libopenldap-runtime libopenldap1 libpcre2
logrotate mailx
The following packages will be REMOVED:
debconf-tiny
The following NEW packages will be installed:
cron debconf exim libident libopenldap-runtime libopenldap1 libpcre2
logrotate mailx
The following packages will be upgraded
lilo
1 packages upgraded, 9 newly installed, 1 to remove and 31 not upgraded.
Need to get 225kB/1179kB of archives. After unpacking 2659kB will be used.
Do you want to continue? [Y/n]
Como notamos na saída acima, o lilo tinha um novo conflito com o pacote debconf-tiny, ou seja, não podia ser instalado (isso também implica na atualização) sem que o debconf-tiny fosse removido.
Uma maneira de saber especificamente o que leva um pacote a ser mantido ou removido é:
# apt-get -o Debug::pkgProblemResolver=yes dist-upgrade
Reading Package Lists... Done
Building Dependency Tree... Done
Calculating Upgrade... Starting
Starting 2
Investigating python1.5
Package python1.5 has broken dep on python1.5-base
Considering python1.5-base 0 as a solution to python1.5 0
Holding Back python1.5 rather than change python1.5-base
Investigating python1.5-dev
Package python1.5-dev has broken dep on python1.5
Considering python1.5 0 as a solution to python1.5-dev 0
Holding Back python1.5-dev rather than change python1.5
Try to Re-Instate python1.5-dev
Done
Done
The following packages have been kept back
gs python1.5-dev
0 packages upgraded, 0 newly installed, 0 to remove and 2 not upgraded.
Assim fica fácil perceber que o pacote python1.5-dev não pode ser instalado por culpa de uma dependência não satisfeita: python1.5

3.6 Removendo pacotes que não serão mais usados: apt-get clean e autoclean

Quando você instala um pacote o APT busca das fontes listadas em /etc/apt/sources.list os arquivos necessários e os guarda em um repositório local (/var/cache/apt/archives/), e então faz a instalação, veja Instalando pacotes, Seção 3.2.
Em algum tempo o repositório local pode crescer e ocupar muito espaço em disco. Felizmente o APT fornece ferramentas para lidar com seu repositório local: os métodos clean e autoclean do apt-get.
apt-get clean remove tudo exceto os arquivos de lock dos diretórios /var/cache/apt/archives/ e /var/cache/apt/archives/partial/. Assim, se você precisar reinstalar um pacote o APT irá buscá-lo novamente.
apt-get autoclean remove apenas os arquivos de pacotes que não possam mais ser baixados.
O exemplo a seguir mostra como o apt-get autoclean funciona:
# ls /var/cache/apt/archives/logrotate* /var/cache/apt/archives/gpm*
logrotate_3.5.9-7_i386.deb
logrotate_3.5.9-8_i386.deb
gpm_1.19.6-11_i386.deb
Em /var/cache/apt/archives há dois arquivos para o pacote logrotate e um para o pacote gpm.
# apt-show-versions -p logrotate
logrotate/stable uptodate 3.5.9-8
# apt-show-versions -p gpm
gpm/stable upgradeable from 1.19.6-11 to 1.19.6-12
apt-show-versions mostra que o arquivo logrotate_3.5.9-8_i386.deb é a última versão disponível do pacote logrotate, então ologrotate_3.5.9-7_i386.deb é inútil. O arquivo gpm_1.19.6-11_i386.deb também é inútil, já que uma versão mais nova do pacote pode ser baixada.
# apt-get autoclean
Reading Package Lists... Done
Building Dependency Tree... Done
Del gpm 1.19.6-11 [145kB]
Del logrotate 3.5.9-7 [26.5kB]
Finalmente, o apt-get autoclean remove apenas os arquivos velhos. Veja Como atualizar os pacotes de versões específicas do Debian, Seção 3.9 para obter mais informações sobre o apt-show-versions.

3.7 Usando em conjunto com o Dselect

dselect é um programa que ajuda na seleção de pacotes do Debian. Ele é considerado meio complicado e chato de se lidar, mas com alguma prática, sua interface ncurses, de console, se torna usual.
Uma de suas qualidades é que ele "sabe" como explorar a capacidade de os pacotes "recomendarem" e "sugerirem" a instalação de outros pacotes. Para usá-lo, rode `dselect' como root. Selecione como método de acesso o apt. Isso não é realmente necessário mas, caso você não esteja usando um CDROM e quiser usar a internet é o melhor jeito de usar o dselect.
Para entender melhor como usar o dselect, leia a documentação do dselect que se encontra na página do Debian http://www.debian.org/doc/ddp ou sua versão em português, encontrada na página do Debian-BR http://debian-br.cipsga.org.br/suporte/documentacao.html.
Depois de feitas as seleções adequadas no dselect, use:
# apt-get -u dselect-upgrade
Veja esse exemplo:
# apt-get -u dselect-upgrade
Reading Package Lists... Done
Building Dependency Tree... Done
The following packages will be REMOVED:
lbxproxy
The following NEW packages will be installed:
bonobo console-tools-libs cpp-3.0 enscript expat fingerd gcc-3.0
gcc-3.0-base icepref klogd libdigest-md5-perl libfnlib0 libft-perl
libgc5-dev libgcc300 libhtml-clean-perl libltdl0-dev libsasl-modules
libstdc++3.0 metamail nethack proftpd-doc psfontmgr python-newt talk tidy
util-linux-locales vacation xbill xplanet-images
The following packages will be upgraded
debian-policy
1 packages upgraded, 30 newly installed, 1 to remove and 0 not upgraded.
Need to get 7140kB of archives. After unpacking 16.3MB will be used.
Do you want to continue? [Y/n]
Veja, no mesmo sistema, se eu rodar apt-get dist-upgrade o que eu tenho:
# apt-get -u dist-upgrade   
Reading Package Lists... Done
Building Dependency Tree... Done
Calculating Upgrade... Done
The following packages will be upgraded
debian-policy
1 packages upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
Need to get 421kB of archives. After unpacking 25.6kB will be freed.
Do you want to continue? [Y/n]
Note que muitos dos pacotes do de cima estão sendo instalados porque outros pacotes os "sugerem" ou "recomendam". Outros deles estão sendo instalados ou removidos (no caso do lbxproxy por exemplo) por escolha minha, durante minha navegação pela lista de pacotes do dselect. O dselect pode ser uma poderosa ferramenta usada em conjunto com o APT.

3.8 Como manter um sistema misto

As pessoas têm o interesse, as vezes, de usar uma das distribuições Debian como principal e utilizar um ou mais pacotes de uma outra versão.
Para definir qual sua versão principal do Debian, você deve editar o arquivo /etc/apt/apt.conf (ele normalmente não existe, crie o arquivo caso não exista) e adicionar a ele:
APT::Default-Release "versão";
Onde versão é a versão do Debian que você quer usar como principal. Os nomes aceitos para `versão' são: stabletestingunstable. Para instalar pacotes de uma outra versão, então, você usa o APT da seguinte forma:
# apt-get -t distribuição install pacote
Para que isso funcione, no ententanto, é necessário haver pelo menos uma fonte do APT listada no arquivo /etc/apt/sources.list para a distribuição de que você quer o pacote, e que ela contenha o pacote pedido.
Você pode também pedir a instalação de uma versão específica com a seguinte sintaxe:
# apt-get install pacote=versão
Por exemplo, a linha abaixo irá instalar a versão 2.2.4-1 do pacote nautilus:
# apt-get install nautilus=2.2.4-1
IMPORTANTE: a versão `unstable' do Debian é a versão na qual as últimas versões dos pacotes Debian entram. Essa distribuição recebe todas as mudanças pelas quais os pacotes passam, desde as pequenas até as drásticas, que afetam muitos pacotes ou todo o sistema. Por essa razão, essa versão não deve ser usada por usuários inexperientes ou que precisem de estabilidade à toda prova.
A versão `testing' não é necessariamente melhor que a `unstable', porque não recebe atualizações de segurança rapidamente. Para servidores e outros sistemas de produção deve-se usar a versão estável, sempre.

3.9 Como atualizar os pacotes de versões específicas do Debian

Você usa uma distribuição mixada e agora quer atualizar os pacotes de uma dela. O apt-show-versions entra aqui. Você pode usar uma linha como a seguinte para atingir esse objetivo, depois de instalar o pacote apt-show-versions:
# apt-get install `apt-show-versions -u -b | grep unstable | cut -d ' ' -f 1`

3.10 Como manter versões específicas de pacotes instaladas (complexo)

Algumas vezes você fez uma modificação em um programa e não tem tempo ou vontade de portar aquelas mudanças para um versão nova do programa. Então você "prega" a versão que você tem instalada para que não seja feita a atualização. Ou você acaba de atualizar sua distribuição Debian para a 3.0 mas quer continuar com um certo pacote da 2.2.
É para esse propósito que serve o "pinning". A utilização desse recurso é simples. Basta editar o arquivo /etc/apt/preferences.
O formato é simples:
Package: 
Pin:
Pin-Priority:
Cada entrada deve ser separada de qualquer outra por uma linha em branco. Por exemplo, para manter o pacote sylpheed que eu modifiquei para aceitar "responder para a lista" na versão 0.4.99, eu adiciono:
Package: sylpheed
Pin: version 0.4.99*
Note que eu usei um * (asterisco). Isso serve para dizer que quero que esse "pin" sirva para todas as versões que comecem com 0.4.99. Isso porque o Debian versiona seus pacotes com uma "revisão Debian" e eu não quero impedir essas revisões de entrar. Ou seja, as versões 0.4.99-1 e 0.4.99-10 seriam instaladas a partir do momento em que existissem. Se você modificou uma versão do pacote você não vai querer que isso aconteça assim, no entanto.
A prioridade do pin ajuda a determinar se um pacote que case com as linhas "Packages:" e "Pin:" será instalado, com as prioridades maiores aumentando a possibilidade de que isso aconteça. Você pode ler apt_preferences(7) para uma discussão detalhada de prioridades, mas uns poucos exemplos devem dar uma boa idéia básica. Vejamos uma lista descrevendo o efeito de definir a opção do campo prioridade para diferentes valores no exemplo do sylpheed acima.
1001
A versão 0.4.99 do Sylpheed nunca será trocada pelo apt. Se estiver disponível o APT irá instalar a versão 0.4.99 mesmo que ela substitua um pacote já instalado com uma versão maior. Apenas pacotes com prioridade maior que 1000 terão sua versão rebaixada.
1000
O efeito é o mesmo da prioridade 1001, mas o apt se recusará a baixar uma versão instalada que seja maior que 0.4.99.
990
A versão 0.4.99 será trocada apenas por uma versão maior que esteja disponível a partir da distribuição designada como a preferida usando a variável "APT::Default-Release" (veja Como manter um sistema misto, Seção 3.8 acima).
500
Qualquer versão maior que 0.4.99 do sylpheed que esteja disponível a partir de qualquer distribuição terá preferência sobre a 0.4.99, mas a 0.4.99 será ainda preferida a qualquer versão inferior.
100
Versões maiores do sylpheed disponíveis de qualquer distribuição terão preferência sobre a versão 0.4.99, assim como qualquer versão maior que esteja instalada; então a versão 0.4.99 será instalada somente quando não houver versão alguma instalada. Essa é a prioridade dos pacotes instalados.
-1
As prioridades negativas são permitidas, também, e evitam que a versão 0.4.99 seja instalada.
As opções para o pin podem ser: versionrelease ou origin.
A opção version, como já vimos, suporta uma versão normal e uma máscara (como um asterisco, por exemplo) para definir várias verões de uma vez.
A opção release é mais ampla e depende do arquivo Release do repositório APT, ou do CD. Esta opção pode deixar a desejar pois alguns repositórios não o contém. Você pode ver o conteúdo dos arquivos Release que você tem em /var/lib/apt/lists/. As sub-opções são: a (archive), c (componente), v (versão), o (origin) e l (label).
Um exemplo:
Package: *
Pin: release v=2.2*,a=stable,c=main,o=Debian,l=Debian
Pin-Priority: 1001
Neste exemplo escolhemos versão do Debian 2.2*, que considera as "revisões" (que vêm com consertos de segurança e bugs sérios), repositório stable, seção main (poderia ser contrib e non-free, por exemplo) e origem e nome Debian. Origem (o=) define quem produziu aquele arquivo Release, o nome (l=) define o nome da distribuição: Debian para o próprio Debian e Progeny para a mesma, por exemplo. Um exemplo de arquivo Release:
$ cat /var/lib/apt/lists/ftp.debian.org.br_debian_dists_potato_main_binary-i386_Release 
Archive: stable
Version: 2.2r3
Component: main
Origin: Debian
Label: Debian
Architecture: i386

0 comentários:

Postar um comentário