Pacman (Português)/Pacnew and Pacsave (Português)
Quando o pacman remove um pacote que tem um arquivo de configuração, ele normalmente cria uma cópia backup daquele arquivo de configuração e anexa .pacsave ao nome do arquivo. Da mesma forma, quando o pacman atualiza um pacote que inclui um novo arquivo de configuração pelo mantenedor, comparando-o com a configuração atualmente instalada, ele salva um arquivo .pacnew com a nova configuração. O pacman fornece um aviso quando esses arquivos são escritos.
Por que esses arquivos são criados
Um arquivo .pacnew pode ser criado durante uma atualização de pacote (pacman -Syu
, pacman -Su
ou pacman -U
) para evitar sobrescrever um arquivo que já existe e foi previamente modificado pelo usuário. Quando isso acontecer, uma mensagem como a seguir aparecerá na saída do pacman:
atenção: /etc/pam.d/usermod instalado como /etc/pam.d/usermod.pacnew
Um arquivo .pacsave pode ser criado durante a remoção de um pacote (pacman -R
) ou na atualização de um pacote (o pacote deve ser removido primeiro). Quando a base de dados do pacman tiver um registro de que deve-se fazer backup de um certo arquivo de um pacote, ele vai criar um arquivo .pacsave. Quando isso acontece, o pacman emite uma mensagem como a seguir:
atenção: /etc/pam.d/usermod salvo como /etc/pam.d/usermod.pacsave
Esses arquivos exigem intervenção manual do usuário e é uma boa prática tratar deles imediatamente a cada atualização ou remoção de pacote. Se não for tratado, configurações inadequadas podem resultar em função inadequada do software ou o software sendo incapaz de funcionar por completo.
Arquivos backup do pacote
Um arquivo PKGBUILD do pacote especifica quais arquivos devem ser preservados ou cujo backup deve ser armazenado quando o pacote é atualizado ou removido. Por exemplo, o PKGBUILD do pulseaudio contém a seguinte linha:
backup=(etc/pulse/{daemon.conf,default.pa,system.pa})
Para evitar que um pacote sobrescreva um certo arquivo, veja Pacman (Português)#Pular pacotes para não serem atualizados.
Tipos explicados
.pacnew
Para cada um dos #Arquivos backup do pacote sendo atualizado, o pacman compara três md5sums gerados do conteúdo do arquivo: uma soma para a versão originalmente instalada pelo pacote, um para a versão atualmente no sistema de arquivo e uma para a versão no novo pacote. Se a versão do arquivo atualmente no sistema de arquivos foi modificada da versão originalmente instalada pelo pacote, o pacman não consegue saber como mesclar essas alterações com a nova versão do arquivo. Portanto, em vez de escrever no arquivo modificado ao atualizar, o pacman salva a nova versão com uma extensão .pacnew e deixa a versão modificada sem alterá-la.
Entrando nos detalhes, os resultados da comparação de soma do MD5 em três vias é um dos seguintes:
- original = X, atual = X, novo = X
- Todas as três versões do arquivo possuem conteúdo idêntico, então sobrescrever não é um problema. Sobrescreve a versão atual com a nova versão e não notifica o usuário (apesar do conteúdo do arquivo ser o mesmo, isso vai sobrescrever as informações do sistema de arquivos a cerca dos tempos de instalação, modificação e acesso do arquivo, bem como garante que qualquer alteração de permissão do arquivo seja aplicada).
- original = X, atual = X, novo = Y
- O conteúdo da versão atual é idêntico ao da original, mas a nova versão é diferente. Já que o usuário não modificou a versão atual e a nova versão pode conter melhorias ou correções de erros, sobrescreve a versão atual com a nova versão e não notifica o usuário. Esse é a única automesclagem de novas alterações que o pacman é capaz de realizar.
- original = X, atual = Y, novo = X
- O pacote original e o novo pacote contêm exatamente a mesma versão do arquivo, mas a versão atualmente no sistema foi modificada. Deixa a versão atual no lugar e descarta a nova versão sem notificar o usuário.
- original = X, atual = Y, novo = Y
- A nova versão é idêntica à versão atual. Sobrescreve a versão atual com a nova versão e não notifica o usuário (apesar do conteúdo do arquivo ser o mesmo, isso vai sobrescrever as informações do sistema de arquivos a cerca dos tempos de instalação, modificação e acesso do arquivo, bem como garante que qualquer alteração de permissão do arquivo seja aplicada).
- original = X, atual = Y, nova = Z
- Todas as três versões são diferentes, então deixa a versão atual no lugar, instala a nova versão com uma extensão .pacnew e avisa o usuário sobre a nova versão. Espera-se que o usuário mescle manualmente quaisquer alterações necessárias da nova versão na versão atual.
Raramente, quando um pacote atualizado inclui um arquivo backup que a versão anterior não incluía, a situação é corretamente lidada como X/Y/Y ou X/Y/Z, com X sendo um valor não existente.
.pacsave
Se o usuário modificou um dos arquivos especificados em backup
, então aquele arquivo será renomeado com a extensão .pacsave e vai permanecer no sistema de arquivos após o resto do pacote ser removido.
-n
com pacman -R
vai resultar na remoção completa de todos os arquivos no pacote especificado, então nenhum arquivo .pacsave será criado.Localizando arquivos .pac*
O pacman não lida com arquivos .pacnew automaticamente: você deve mantê-los você mesmo. Algumas poucas ferramentas são apresentadas na próxima seção. Para fazer isso manualmente, você primeiro terá que localizá-los. Ao atualizar ou remover um grande número de pacotes, arquivos .pac* atualizados serão perdidos. Para descobrir se algum arquivo .pac* foi instalado, use um entre os seguintes:
- Para procurar no
/etc
, onde a maioria das configurações globais estão armazenadas:$ find /etc -regextype posix-extended -regex ".+\.pac(new|save)" 2> /dev/null
ou pesquisar em todo o disco substituindo/etc
por/
no comando anterior. - Se instalado, locate também pode ser usado. Primeiro reindexe a base de dados:
# updatedb
. Então, execute:$ locate --existing --regex "\.pac(new|save)$"
- Use o log do pacman para localizá-los:
$ grep --extended-regexp "\.pac(new|save)" /var/log/pacman.log
Note que o log não mantém rastro dos arquivos atualmente no sistema de arquivos nem daqueles que já foram removidos; o comando acima vai listar todos os arquivos .pac* que já existiram em seu sistema. Para apenas obter os 10 mais recentes arquivos .pac*, faça um pipe do resultado paratail
.
Gerenciando arquivos .pac*
pacdiff
pacman-contrib fornece pacdiff, uma ferramenta simples para gerenciar arquivos pac*. Com isso, pode-se vai pesquisar por todos os arquivos .pacnew e .pacsave e pedir por quaisquer ações neles. Ele usa vimdiff por padrão, mas você pode especificar uma ferramenta diferente com DIFFPROG=seu_editor pacdiff
. Veja Lista de aplicativos#Comparação, diff, merge para outras ferramentas de comparação comum.
Utilitários de terceiros
Alguns poucos utilitários de terceiros fornecendo vários níveis de automação para essas ferramentas estão disponíveis no AUR.
Você pode usar uma das seguintes ferramentas:
- dotpac — Script interativo básico com interface de texto baseada no ncurses e um passo a passo útil. Nenhum recurso de mesclagem ou automesclagem.
- etc-update — Utilitário do Gentoo compatível com outras distribuições, incluindo o Arch. Ele fornece uma CLI simples para ver, mesclar e editar interativamente alterações. Alterações triviais, como comentários, podem ser mescladas automaticamente.
- p3wm — Mesclagem em três vias de arquivos .pacnew. Ele consegue mesclar automaticamente alterações triviais. Se ocorrer conflitos, ele vai iniciar o vimdiff, meeld ou kdiff3 para resolvê-los.
- pacnews-git — Um script simples visando localizar todos os arquivos .pacnew, para então editá-los com vimdiff.
- pacfiles-mode — Um pacote para Emacs para gerenciar e mesclar arquivos .pacnew.
- https://github.com/UndeadKernel/pacfiles-mode || disponível em melpa
Veja também
- Fórum do Arch Linux: Dealing with .pacnew files ("Lidando com arquivos .pacnew")