Mostrando postagens com marcador atualizar. Mostrar todas as postagens
Mostrando postagens com marcador atualizar. Mostrar todas as postagens

domingo, 26 de maio de 2013

Atualizando o caminho dos arquivos numa listagem de hash

Recentemente, eu estava com uma estrutura de arquivos em diversos diretórios e subdiretórios e todos eles já estavam com os respectivos hashes MD5 armazenados em um arquivo texto (hash.md5) no diretório raiz. Bastava executar o comando "md5sum -c hash.md5" na raiz para a ferramenta verificar a integridade de todos os arquivos.

Entretanto, resolvi reorganizar a localização dos arquivos, mudando os arquivos de subdiretórios, criando diretórios novos etc. Eram os mesmos arquivos só que agora estavam em caminhos de diretórios diferentes. Com isso, após estas mudanças, o arquivo texto com os hashes MD5 também precisava ser atualizado para os novos caminhos dos arquivos.

Algumas soluções poderiam ser aplicadas. Uma seria recalcular todas as somas MD5, gerando novamente os hash de todos os arquivos, mas esta solução iria expor novamente o disco rígido em um uso intenso. Eram muitos gigabytes de dados armazenados. Outra solução seria editar o arquivo texto com os hashes, alterando cada linha para o novo caminho do respectivo arquivo. Mas era um arquivo com 1650 linhas e fazer isso manualmente torna impraticável, levaria uma eternidade.

Contudo a segunda era a solução que deveria ser aplicada, afinal os hashes dos arquivos já estavam gerados e só precisava atualizar os caminhos. O que poderia executar esta tarefa rapidamente? Simples, um script no interpretador de comandos.

A seguir, está o código do script que realizou a atualização dos caminhos, de cada arquivo, nas linhas do arquivo texto com os hashes MD5. É um script para o interpretador de comandos Bash, do Linux.

O que ele faz é, primeiramente, uma cópia de segurança do arquivo texto com os hashes. Depois será lida cada linha deste arquivo, onde serão armazenados em variáveis o hash (incluindo os espaços) que está no início da linha e o nome do respectivo arquivo, ignorando o caminho antigo. Então será realizada uma busca pelo arquivo e seu caminho atual é armazenado em outra variável. Por fim, as strings com o hash e o caminho atual são concatenadas e direcionadas para um novo arquivo texto com os hashes MD5.


#!/bin/bash
#

cp -f hash.md5 hashantigo.md5

while read LINHA
do

  HASH=`echo "$LINHA" | cut -c 1-34`
  ARQUIVO=`echo "$LINHA" | sed 's/^.\{34\}//' - | sed 's/.*\///' -`
  NOVODIR=`find */ -iname "$ARQUIVO" -type f -print`
  if [[ $NOVODIR ]]
  then
    echo "$HASH""$NOVODIR" >> novohash.md5
  fi

done < hashantigo.md5

mv -f novohash.md5 hash.md5

echo "Feito!"



Este script torna o processo muito mais rápido e menos traumático no acesso ao disco. Nesta reorganização, eu também separei os arquivos em volumes de aproximadamente 4.4 GB (capacidade de DVDs) pois foram gravados em mídias óticas. Cada volume tinha o seu "diretório raiz" com uma cópia do arquivo texto original com os hashes e o script. O script foi executado para cada volume. Por isso a necessidade do if no script, alguns arquivos não estavam no respectivo volume.

São diversos comandos do Bash, internos e externos, utilizados neste script. As páginas manuais de cada um deles podem ajudar no entendimento de sua execução.

domingo, 8 de julho de 2012

Atualizando as principais distros Linux

Existem dezenas de distribuições Linux, entretanto a grande maioria são baseadas nas quatro principais, Slackware, Debian, Suse e Red Hat, herdando as principais características e funcionalidades. Demonstrar o modo de operação destas quatro distros já é suficiente para abranger quase todas.

Uma das grandes características das distribuições Linux está na funcionalidade de atualização de todo o sistema. Independente do formato do pacote adotado, seja .rpm, .deb ou .txz, as distros dispõem de ferramentas que gerenciam a base de pacotes instalada. Cada distribuição, dentre as quatro base, terão ferramentas distintas para esta operação.

Apenas pela linha de comando, é possível executar esta atualização geral do sistema, substituindo os pacotes antigos por versões novas. A seguir veremos as particularidades de cada uma delas e os respectivos comandos básicos:

Red Hat, Fedora, CentOS:

Estas distribuições utilizam a ferramenta YUM no processo e usam o formato RPM nos pacotes. As configurações ficam no arquivo "/etc/yum.conf" e no diretório "/etc/yum.repos.d/". Para atualizar os pacotes instalados, execute o comando a seguir:

# yum update


Debian, Ubuntu:

Estas duas distros e suas descendentes, utilizam as ferramentas apt-get ou aptitude, em comandos semelhantes, e usam o formato DEB nos pacotes. As configurações de repositórios ficam no arquivo "/etc/apt/sources.list". Para atualizar os pacotes instalados, execute os comandos:

# apt-get update
# apt-get upgrade


openSUSE:

O openSUSE utiliza na linha de comando a ferramenta Zypper e usa o formato RPM nos pacotes. As configurações ficam no arquivo "/etc/zypp/zypper.conf". Para atualizar os pacotes instalados, execute os comandos:

# zypper list-updates
# zypper update


Slackware:

O Slackware utiliza na linha de comando a ferramenta slackpkg e usa o formato TXZ nos pacotes. As configurações de repositórios ficam no arquivo "/etc/slackpkg/mirrors". Para atualizar os pacotes instalados, execute os comandos:

# slackpkg update
# slackpkg check-updates
# slackpkg install-new
# slackpkg upgrade-all


O procedimento de atualização envolve primeiro atualizar a lista dos pacotes fornecidos pelos repositórios, para o sistema saber o que há de novo, e então atualizar os pacotes instalados por novos pacotes. Os comandos foram apresentados em ordem. A ferramenta YUM faz isto em apenas um comando, nas outras são necessários dois ou mais comandos.

Os comandos apresentados neste artigo são para uma atualização dos pacotes dentro da mesma versão da distribuição. É possível também atualizar os pacotes de modo que atualize a versão da distribuição, por exemplo de Debian 5 para Debian 6. Os comandos para este procedimento não estão demonstrados neste artigo.

Apenas o superusuário (root) tem a permissão para executar estes comandos, um usuário comum não é capaz de atualizar o sistema.