Recuperando arquivos apagados

Uma hora ou outra, todos perderão alguns arquivos, corrompidos pelo sistema de arquivos, ou simplesmente deletado sem intenção. Na linha de comando é necessário ter cuidados maiores com espaços em branco. Meu problema não foi muito grave, na verdade até fiquei bem tranquilo, porém como sempre, ainda queria saber quais arquivos foram apagados para que pudesse recuperá-los. Contarei a história do que foi possível fazer neste caso.

A primeira coisa, para evitar mais perdas, aumentando as chances de recuperação, é desmontar a unidade, ou colocá-la em somente leitura, o que poderia ser feito com um umount ou mont -o remount,ro. No meu caso como era no próprio /, desliguei o computador e usei um sistema num pendrive. Isso é importante, como serão alterados alguns dados do sistema de arquivos, evita mais percas ou o corrompimento total do sistema de arquivos.

Uma ferramenta fácil e simples para recuperar os arquivos é o extundelete (pacote extundelete no Debian). Para usá-la basta executar extundelete, caminho do sistema de arquivos e uma opção de recuperação, como --restore-file caminho_do_araquivo, --restore-directory caminho_do_diretorio, ou até mesmo um --restore-all para recupera todos os arquivos. Lembrando que todos esses caminhos são relativos a raiz do sistema de arquivos, se o arquivo for o “/home/user/arquivo.txt”, sendo “/home” o ponto de montagem da partição “/dev/sdb1” seria extundelete /dev/sdb1 user/arquivo.txt.

Na maioria dos casos essa ferramenta atende, porém se quiser ir mais a fundo para buscar algum pedaço de informação que não pode ser recuperado ainda existe o debugfs. No caso executei um debugfs /dev/sdb1, executei o cd até chegar no diretório desejado e usei os comandos lsdel e ls -d para listar os arquivos. Com o ls -d consegui o número do inode aonde está o arquivo, na posse desta informação é possível utilizar várias outras técnicas, ou simplesmente a lista de arquivos que estava ali e foram apagados, mesmo que não tenha sido possível recuperá-lo anteriormente com o extundelete.

Dividir arquivos em partes

Recentemente tive que copiar um arquivo de quase 6 GB entre dois computadores que utilizo. Esses computadores não estavam perto um do outro, muito menos na mesma rede. Solução simples: utilizar um pendrive.

Meu celular tem espaço na memória interna suficiente para copiar o arquivo, porém para minha surpresa não consegui copiar o arquivo inteiro. Quando vi a mensagem de erro lembrei que o sistema de arquivos do celular é FAT, com o limite do tamanho em quase 4GB. Ou seja, o tamanho do arquivo é maior que o suportado pelo sistema de arquivos.

Como trocar o sistema de arquivos não era a opção, procurei como dividir o arquivo em partes. A solução é extremamente simples, basta utilizar o comando split. Este comando permite dividir o arquivo baseado em alguns critérios como bytes e número de linhas. Meu caso como é um arquivo binário e o que me interessava era o tamanho, fiz a divisão por bytes.

O comando utilizado foi:
split -b 1G arquivo-original prefixo-das-partes

Explicando, -b diz para o split dividir por bytes e que cada parte terá 1GB. arquivo-original é o arquivo que desejo dividir. prefixo-das-partes é o nome dado a cada parte, seguido de sua numeração, caso seja arquivo. serão criados vários arquivos como arquivo.aa, arquivo.ab e assim por diante. Se quiser números em vez de letras basta adicionar o parâmetro -d no comando.

Não foi o meu caso, porém se tiver um arquivo de texto grande, como um log, e quiser dividi-lo, basta utilizar o parâmetro -l 1000 que gerará arquivos de 1000 linhas cada, sem o risco de dividir alguma linha em dois arquivos.

Com cinco arquivos de 1GB e outro de aproximadamente 700MB, finalmente foi copiado para o celular.

Porém ainda precisava juntar as partes no destino, que bastou um:
cat prefixo-das-partes* > arquivo-original

Explicando, o cat recebeu o nome de todas as partes por causa do “*”, que também foram passadas como argumento na ordem correta, mesma coisa que executar um cat arquivo.aa arquivo.ab ... > arquivo. E assim recuperando o arquivo original.

O cat também funciona com arquivos de texto dividido pelo número de linhas. Se quiser dividir vários arquivos basta gerar um “.tar.gz” ou “.tar.bz2” antes.

Criptografando HD/HD externo/Pendrive

Já comentei em vários textos anteriores ferramentas que utilizo para o meu backup e chegou a vez da criptografia, processo que precisei refazer quando chegou meu novo HD externo. Na criptografia temos duas opções, a primeira é criptografar o arquivo, que depende do suporte do programa, ou que o mesmo seja descriptografado toda vez que for utilizado e criptografado novamente no final do processo. A segunda opção é criptografar o sistema de arquivos, que depende do suporte do sistema operacional, porém é transparente para os programas e os processos de criptografar e descriptografar é automático.

Minha opção foi criptografar o sistema de arquivos, e utilizar o recurso chamado dm-crypt, que no Debian existe um programa de configuração chamado cryptsetup, podendo ser instalado com um apt-get install cryptsetup.

Como este método de criptografia é baseado no sistema de arquivos, o particionamento ocorre da mesma forma, porém em vez de criar um sistema de arquivos Ext4, criei uma partição com o LUKS (Linux Unified Key Setup). Para explicar os comandos e quem tiver vontade poder executá-los também, em vez de criptografar uma partição, farei isso com um arquivo, já que em sistemas Unix tudo é arquivo, porém vale lembrar que todos os dados do arquivo ou partição serão perdidos.

Primeiro, para este exemplo, precisamos de um arquivo grande e existe uma forma de gerá-lo com o comando dd, exemplo: dd if=/dev/zero of=/tmp/arquivo bs=1M count=1024, se for fazer o procedimento numa partição, este comando não é necessário e troque sempre que vir o /tmp/arquivo pelo caminho da partição, exemeplo: /dev/sdb2. O parâmetro if=/dev/zero é um arquivo especial que possui zeros infinitos, então toda vez que for lido retornará “0”. O of=/tmp/arquivo é o caminho do arquivo que criarei, se for utilizado o caminho de um HD como /dev/sdb ou partição como /dev/sdb2 toda esta área será preenchida com zeros. Os parâmetros bs=1M e count=1024 representam o tamanho do bloco que será copiado e quantas vezes esse processo será repetido respectivamente, ou seja, serão copiados 1 MB 1024 vezes, gerando um arquivo de 1 GB em branco no HD.

Para formatarmos com o LUKS, podemos utilizar o comando cryptsetup luksFormat /tmp/arquivo e digitando a senha, lembrando que todos os dados do arquivo ou partição serão perdidos. Para conseguirmos utilizar a partição criptografada é preciso abri-la primeiro com o comando cryptsetup open /tmp/arquivo arquivo1, o primeiro é o caminho do arquivo o segundo é um nome para o mapeamento que será criado em /dev/mapper.

Próximo passo é a formatação do sistema de arquivos, porém em vez de formatar a partição diretamente, é preciso usar o mapeamento, no caso /dev/mapper/arquivo1. Um exemplo de formatação com Ext4 é mkfs.ext4 /dev/mapper/arquivo1. Agora podemos montar este mapeamento e gravar os arquivos normalmente que tudo salvo nesta partição será criptografada.

Na hora de remover a partição, basta fazer o procedimento na ordem inversa, primeiro desmonte o sistema de arquivo do /dev/mapper/arquivo1. Depois feche o mapeamento com o comando cryptsetup close /dev/mapper/arquivo1. Para abrir a partição novamente basta abrir o mapeamento e depois montar a partição.

Uma coisa legal do LUKS é que ele permite o uso de até 8 chaves diferentes, para adicionar uma chave nova basta executar o comando cryptsetup luksAddKey /tmp/arquivo, e agora qualquer uma das duas senhas poderão ser utilizadas para acessar a partição. Além de senhas também é possível utilizar um arquivo como chave o que pode ser um recurso interessante também. Caso deseje ver mais informações a respeito do LUKS ou chaves desta partição também é possível executar o comando cryptsetup luksDump /tmp/arquivo, um exemplo de saída é:

LUKS header information for /tmp/arquivo

Version:        1
Cipher name:    aes
Cipher mode:    xts-plain64
Hash spec:      sha1
Payload offset: 4096
MK bits:        256
MK digest:      81 e6 1f 37 b2 5c 8d 97 a4 a9 57 c1 2b 1b 89 49 35 0e 59 8f 
MK salt:        3b e4 4b bc 0d 09 b1 2a 5c 38 ea e2 a1 67 e6 5e 
                39 97 05 1d d5 73 cf 33 da 08 e1 bc 73 9f d5 95 
MK iterations:  146750
UUID:           2013f2e3-1d73-429a-818d-b4a182d8658e

Key Slot 0: ENABLED
        Iterations:             587155
        Salt:                   23 e7 e8 73 a0 a5 a9 58 a6 58 ba ec 81 41 49 d1 
                                75 a8 51 89 99 fb 8d a9 87 cc e7 23 eb bf 44 cb 
        Key material offset:    8
        AF stripes:             4000
Key Slot 1: DISABLED
Key Slot 2: DISABLED
Key Slot 3: DISABLED
Key Slot 4: DISABLED
Key Slot 5: DISABLED
Key Slot 6: DISABLED
Key Slot 7: DISABLED

Para quem formatou uma partição em vez do arquivo, o navegador de arquivos pode simplificar o processo de acesso a partição, no meu caso no Thunar consigo acessar meu HD externo da mesma forma como se o mesmo não estivesse criptografado clicando no ícone do mesmo, porém aparece uma janela solicitando a chave de acesso.

Para quem quiser mais informações, ou desejar criptografar partições do sistema, recomendo dar uma olhada no texto da wiki do Arch Linux, que apesar de estar na wiki de uma distribuição específica, os programas são os mesmos para todas e a lógica é a mesma, só confirmar se os parâmetros da wiki existem na versão instalada no seu sistema, que as vezes um dos dois podem estar uma versão mais antiga.

Como funciona o computador – Sistema de arquivos

Todas as informações que são armazenadas definitivamente num computador, ou seja, que não se perderam após o mesmo ser desligado, precisam estar armazenadas dentro de uma estrutura, para posteriormente ser possível recuperá-la. Tantos HD, HD externo, CD, DVD e pendrives usam essas estruturas chamadas de sistemas de arquivos.

Porém antes de falar sobre sistema de arquivos, existe uma técnica chamada de particionamento, que divide logicamente o espaço contínuo dessas unidades. O uso de partições possibilita mais de um sistema de arquivos no mesmo dispositivo, cada um em seu pedaço do espaço disponível. O funcionamento das partições estão relacionadas a forma de particionamento, como MBR, padrão mais antigo, ou GPT.

Todas as formas de particionamento gravam em certas regiões da memória do dispositivo informações sobre a divisão do espaço, seguindo a forma de uma tabela, também conhecida como tabela de particionamento. Essas tabelas são independentes do sistema operacional, tanto que é o principal responsável por permitir ter instalado num mesmo computador dois sistemas operacionais distintos.

Após ter reservado espaço através do particionamento, é necessário criar a estrutura para organizar os arquivos dentro deste espaço, essa estrutura de organização são chamadas de sistemas de arquivos. Normalmente dentro do sistema de arquivos teremos espaços para informações relativas ao arquivo, como nome, data de criação, data de modificação, permissões de acesso, diretório onde se encontra o arquivo, além do próprio conteúdo do arquivo.

Como existem vários sistemas de arquivos, sempre existirá um que se adéque melhor as situações, quando existem mais arquivos grandes ou pequenos, isso também pode ser parametrizado ao criar a estrutura dentro da partição. Existem também sistemas de arquivos para aplicações específicas, como identificar alterações nos arquivos desde um certo ponto, podendo voltar ao estado anterior ou armazenar arquivos para processamento em big data. Esses sistemas de arquivos também podem ser utilizados dentro do espaço de outros arquivos, ganhando as funcionalidades do sistema desejado ao custo de ter que acessar dois sistemas de arquivos para recuperar as informações.

A escolha do sistema de arquivos depende do sistema operacional, não são todos que são suportados por todos os sistemas, e podem ser perdidos alguns recursos como controle de permissão, caso o mesmo não seja plenamente suportado pelo sistema operacional.

Vale lembrar que o sistema de arquivos foi uma das primeiras coisas desenvolvidas para o Unix, ainda na fase onde Ken Thompson, Dennis Ritchie não tinham um computador para desenvolver o sistema e seu projeto foi feito no quadro com giz.