Mostrando postagens com marcador corrigir. Mostrar todas as postagens
Mostrando postagens com marcador corrigir. 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.

segunda-feira, 14 de março de 2011

Corrigir boot de uma imagem do Windows XP

Uma das coisas que faço muito é criar uma máquina virtual a partir de uma imagem de um disco rígido com Windows. Imagem esta que foi gerada por uma ferramenta de diskdump.

Acontece que, quando se muda uma instalação do Windows para um outro hardware, quando move o disco do sistema para um outro computador, as entradas de registro para hardware de controlador de armazenamento de massa ficam erradas. E se tentar iniciar este Windows na máquina virtual, durante o boot aparece uma tela azul informando o erro Stop 0x0000007B.

Uma das formas de corrigir o Windows virtual é reinstalando o sistema a partir do CD de instalação, mas isso é demorado e pode prejudicar alguma característica do sistema, que pode servir de prova. Porém 99,9% garantido.

Outra forma é corrigir este erro com algumas ferramentas específicas para isto. O sistema "live CD" Hiren's BootCD (http://www.hirensbootcd.org/download/) contém as ferramentas necessárias.

Vamos descrever como é feito desde o começo. A imagem foi criada com uma ferramenta dd qualquer, gosto do dcfldd:

# dcfldd if=/dev/sdd of=imagem-hd.dd

Em seguida esta imagem foi convertida para o formado VDI, do VirtualBox:

# VBoxManage convertfromraw imagem-hd.dd imagem-hd.vdi --format VDI

Mova a imagem VDI para o diretório de discos rígidos do VirtualBox (~/.VirtualBox/HardDisks/), acrescente esta imagem pelo Gerenciador de Mídias Virtuais e crie a nova máquina virtual usando este disco virtual.

Ao criar e configurar a máquina virtual, é importante verificar o tipo da controladora de disco, se é IDE ou SATA, ativar o I/O APIC etc., isto é, deixar a máquina virtual o mais próximo das características do hardware real.

Em vez de iniciar a máquina virtual pelo sistema do HD, iniciei com o sistema do Hiren's BootCD, definindo o seu ISO para uma unidade óptica da máquina virtual. O famoso boot pelo CD.

No menu de inicialização do Hiren's BootCD escolha "mini Windows XP", será iniciado um Windows XP otimizado. Quando aparecer a área de trabalho deste mini Windows, dê dois cliques no ícone "HBCD Menu" para executar o "Hiren's BootCD Program Launcher". É a partir desta interface que nós vamos executar as ferramentas.

Primeiramente vamos corrigir a MBR, o setor de boot do sistema e por fim o registro do Windows.

No menu "Programs" clique e avance até:

Programs - Partition/Boot/MBR - Commandline - MbrFix

A primeira ferramenta a ser executada é esta. A interface abre um terminal DOS e uma janela com a ajuda do programa. Simplesmente execute o comando abaixo no prompt do DOS (se for Vista ou 7, adicione as opções correspondentes, para o XP ignore-as):

B:\Temp\HBCD> MbrFix /drive c: fixmbr {/vista|/win7}

A segunda ferramenta é a "Boot sector restoration tool", no menu "Programs" clique e avance até:

Programs - Partition/Boot/MBR - Commandline - BootSect

Da mesma forma, simplesmente execute o comando abaixo no prompt do DOS. Se for Vista ou 7, use a opção /nt60, para o XP use /nt52:

B:\Temp\HBCD> bootsect {/nt52|/nt60} c:

A terceira ferramenta é a BootICE, no menu "Programs" clique e avance até:

Programs - Partition/Boot/MBR - BootICE

Na aba "Physical Disk" selecione o disco em "Destination Disk".

Clique no botão "Process MBR". Na janela "Master Boot Record", em "Avaliable MBR Types" selecione "Windows NT 5.x MBR" ou "Windows NT 6.x MBR" e clique no botão "Install/Config". Feche esta janela.

Clique no botão "Process PBR". Na janela "Partition Boot Record", em "Avaliable PBR Types" selecione "NTLDR boot record (FAT/NTFS)" ou "BOOTMGR boot record (FAT/NTFS)" e clique no botão "Install/Config". Confirme na janela seguinte e feche esta janela.

Saia do BootICE.

O uso do BootICE pode ser redundância com o uso das ferramentas anteriores mas, em uma das vezes, só o uso das duas primeiras não tinha sido suficiente para corrigir. Como é sabido, cada caso é um caso.

O último passo é corrigir a controladora de disco no registro do Windows. Será usada a ferramenta FixHDC, no menu "Programs" clique e avance até:

Programs - Registry - Fix hard disk controller

Será aberta uma janela de terminal DOS já com a ferramenta em execução. Digite T para definir "TargetRoot" em C:\Windows e digite M para iniciar "Update MassStorage drivers". Simples e rápido.

Aliado à todos estes passos, um pouco de sorte, o sistema Windows da máquina virtual vai iniciar normalmente. Mas um aviso, outras diferenças de hardware também podem causar o erro "stop 0x7b", encontrei referências citando dispositivos USB conectados e até controle de energia. Como dito, cada caso é um caso, a solução apresentada aqui é para uma situação apenas.

terça-feira, 1 de junho de 2010

Corrigindo uma imagem ISO pelo rsync

Uma vez passei pela seguinte procedimento. Fiz o download de uma imagem ISO, gravei o conteúdo desta imagem em uma mídia DVD e apaguei o arquivo ISO de meu computador. Procedimento comum. Só que em um tempo depois precisei novamente desta imagem.

Tudo bem, usei o dd (diskdump) e fiz uma cópia 1:1 da mídia para um arquivo em meu HD, gerando uma nova imagem ISO. Esta nova imagem funcionou perfeitamente e decidi guardá-la caso precisasse novamente. Entretanto, ao verificar a assinatura digital percebi que o hash desta imagem, comparando com o fornecido pelo site o qual fiz o download, não era mais o mesmo.

Para não baixar novamente toda a imagem, usei a ferramenta rsync para apenas reparar o arquivo ISO. O rsync é uma ferramenta de cópia de arquivo remoto e local, que serve para sincronizar duas unidades de armazenamento, fazendo um espelho ou também para cópias de segurança. O rsync é famoso pelo seu algoritmo de transferência delta, o qual reduz a quantidade de dados transferidos pela rede enviando somente as diferenças entre os arquivos.

Para que o rsync funcione é necessário que o servidor de arquivos tenha o suporte ao protocolo rsync. Muitos servidores que fornecem imagens ISO de distribuições Linux trabalham também com este protocolo. Como um teste podemos usar o comando abaixo que mostra o conteúdo do diretório remoto:

rsync rsync://nome.do.servidor/diretório/

Para reparar a imagem, entre no diretório local no qual se encontra o arquivo ISO corrompido e execute um comando semelhante ao apresentado abaixo:

rsync -avc --stats --progress rsync://debian.las.ic.unicamp.br/debian-cd/5.0.4/i386/iso-dvd/debian-504-i386-DVD-1.iso .

O argumento "-a" usa o modo de arquivo, onde são preservados os atributos e permissões do arquivo. O argumento "-v" aumenta a verbosidade, junto com "--stats" que mostra uma estatística da transferência e "--progress" que mostra o progresso durante a transferência. O argumento "-c" faz com que o salto, percorrendo o arquivo, seja baseado no checksum. O ponto no final é porque o arquivo ISO local está no diretório atual, onde foi executado o comando, e possui o mesmo nome do arquivo remoto. O início do processo pode demorar um pouco pois o servidor precisa calcular o checksum do arquivo.

Não é todo servidor rsync que permite ou suporta o recurso de controle por checksum. Se o servidor não possuir então é necessário que o arquivo ISO local esteja com a data e hora diferente do arquivo remoto. Forçando assim uma checagem total do arquivo. O uso do comando "touch" pode resolver isto.

Adicionalmente pode incluir o argumento "-z", que usa uma compressão nas porções de dados para a transferência. Para mais informações consulte a página manual do rsync (man rsync).