Blog Nerd do Liquuid

time machine no linux com rsync



Como todos sabem, eu adoro o Leopard, e gosto muito do seu sistema de backup, é ridiculamente simples. Até mesmo sua implementação é simples, ele cria um diretório para cada hora, e a partir de um rsync de tudo vai fazendo cópias incrementais dos arquivos modificados (novos), e hardlinks de todos os outros. Então dentro de cada diretório ele tem uma cópia do sistema inteiro, mas gastando quase nada de disco, afinal são hardlinks.

time-machine-rsync

Procurando pelo sistema perfeito de backup (não existe, eu sei), acabei escrevendo um script ridiculo que funciona de forma parecida com o Time Machine da apple, mas sem todos aqueles efeitos especiais e nem a integração com os softwares do sistema. Pra usar basta instalar o rsync na máquina que vai receber os backups e na máquina que será backupeada, o código é esse :


cd /mnt/backup && \
rsync -ptvr --delete  user@maquina:/home/user/ last ; \
cd last && \
find | cpio -dplm ../new && \
cd - && \
mv last `date +%Y%m%d` && \
mv new last

O script deve rodar na máquina que vai receber o backup , o primeiro "cd" é no diretório onde o backup será realizado, depois o rsync transfere o diretório para "last". O script entra em "last" e cria hardlinks para todos os arquivos, e cria seus diretórios pais no diretório "new". Então o script volta para o diretório anterior renomeia o diretório "last" para um com a data de hoje para o nome, e finalmente move o diretório "new" para "last.

Parece confuso, mas é bem simples, ele baixa o backup para last faz o diff para new, move o last para a data de hoje, e move o new para last. Isso faz com que o rsync baixe apenas os novos arquivos do backup e armazena uma cópia completa do sistema em cada diretório datado. Assim para recuperar um arquivo do dia X , basta entrar no diretório X. Como expliquei, as cópias não ocupam espaço pois são hardlinks, genial né ? Rsyn e cpio são ferramentas antigas, pq ninguém pensou nisso antes ?

Quando mostrei esse script para alguns conhecidos, me perguntaram se eu faria uma interface bonitinha como o do Time Machine, minha resposta é não. Pois cada linux é um linux, cada distro é uma distro, cada gerenciador de arquivos é um gerenciador de arquivos. No mundo livre, não temos padrões, e escrever código pra integrar todo mundo é impossível... No mac os x o padrão existe, todas as ferramentas apple estão integradas com o Time Machine, pois a Apple define os padrões, e que não segue não desenvolve pra OSX.

Aproveite o script


1 comentários

TAGS : backup script shell time machine apple cpio rsync

Wifi na linha de comando, sem medo



Dúvida frequente de novatos é como configurar o wifi no linux via linha de comando. Não vou explicar instalar os drivers , as minhas experiências já foram relatadas nesse blog. O objetivo é como escanear, se conectar em um rede sem fio:

  • iwlist scan : Esse comando retorna todas as redes visiveis ao alcance do seu computador
  • iwconfig DEVICE essid REDE : Device é o nome da sua placa de rede pro sistema, pode ser wlan0, ath0 o uaté mesmo eth0 dependendo do driver da sua placa. REDE é o nome da rede que você vai se conectar, por exemplo Sala2 / linksys etc...
  • iwconfig DEVICE key senhadowifi : Caso a rede seja protegida por senha passe a senha por esse comando, mas só após escolher a senha com o comando anterior.
  • dhclient DEVICE : Após escolher a rede você deve atribuir um IP a sua máquina, esse comando pega o IP automáticamente.
  • ifconfig DEVICE xxx.xxx.xxx.xxx : Caso o seu roteador wifi não esteja configurado , talvez você tenha que configurar seu ip manualmente, pergunte ao administrador do router para saber qual faixa de ip você terá que usar

Esses comandinhos são os mais básicos, o suficiente pra estabelecer uma conexão. Caso o comando iwconfig não retorne nada ou retorne "No wireless interfaces found" existe uma chance boa da sua placa não estar devidamente configurada.


0 comentários

TAGS : linux wifi shell sem medo iwlist iwconfig ifconfig

printf no shell



Rolou na lista de usuários fedora-br a seguinte dúvida :

> Desisto. Ou eu sou muito burro, ou essa documentação é muito ruim.
>
> Eu quero fazer o seguinte: dado um número n (que pode ser desde 1 a 99999),
> eu quero escrevê-lo com 5 campos, precedidos por 0.
>
> Por exemplo, 42 vira 00042, e 3141 vira 03141
>
> Em C, isso é trivial: printf("%05d", n);
>
> Mas eu sou teimoso, e tentei fazer isso com sed.
>
> Teoricamente, alguma coisa do tipo:
>
> n=42
> echo "00000$n:" | sed -n 's/*([0-9]{5}):/1/p'
>
> devia funcionar, mas não funciona. Tentei acrescentar vários , sem sucesso.
>
> Obviamente, os helps e FAQs não ajudam. Alguém tem alguma idéia de
> como isso funciona?
>
> Alberto Monteiro
>



Minha resposta :


Não manjo nada de sed, mas acho que o comando abaixo resolve seu problema :

printf formato string

Onde formato é igual ao do C %d,%c etc....

E a string é o que deve ser impresso.

Exemplo:

printf %09d 10

Serve ?



O legal do unix ser fundamentado no C é que ele herda muita coisa boa, na dúvida man printf :)

Alias, se alguém souber como deixar o sed do nosso camarada funcional, poste nos comments.


0 comentários

TAGS : fedora shell printf sed

CURD - Conversor Universal do Reino de Deus



Uma coleção de scripts, escritos em Python e Shell script, para conversão de arquivos de mídia de um jeito menos complicado.

A idéia é estruturar uma coleção de funções de modo que o uso de programas como ffmpeg, mencoder e convert seja simples mesmo a partir da linha de comando. Outra idéia é criar uma caixa de conversão, onde os arquivos a serem convertidos sejam arrastados para uma janela e convertidos por ordem de chegada, usando (se disponível) processamento paralelo de outros máquinas rodando o curd em sua rede local (ou não).

Para que o processamento paralelo seja possível será necessário a criação de um daemon, cujo o algorítmo será discutido ao longo do tempo.

Já tem uma versão alpha pra download,pra baixar :

cvs -d:pserver:anonymous@cvs.curd.berlios.de:/cvsroot/curd login
cvs -z3 -d:pserver:anonymous@cvs.curd.berlios.de:/cvsroot/curd co curd

Também tem uma lista de discussão e um site tipo forge :

http://curd.berlios.de http://groups.google.com/group/curd/


0 comentários

TAGS : conversor convert curd cvs daemon ffmpeg mencoder paralelo processamento python script shell

Funções no bash



Funções no bash são uma verdadeira mão na roda, vc pode automatizar uma porção de comandos longos e repetitivos. O Aurélio (verde) e o Tobias (http://thobias.org/) criaram uma biblioteca de funções úteis como consultar cotação de moedas, pronuncia de palavras em inglês etc...Seu nome é .
Criar uma função no bash é muito simples, abra seu editor favorito e digite :

function digaoi()
{
       echo 'filma eu galvão !!!';
}

Para carregar sua função no shell atual digite :

source arquivo.func
Onde arquivo.func é o nome do arquivo onde vc digitou os comandos :)
Pode conferir, agora no seu shell existe o comando digaoi, experimente executa-lo. Como vc percebeu ele imprime na tela a frase "filma eu galvão!!!"

Agora vamos tentar um comandinho mais útil, eu particularmente adoro animes, e muitas vezes estes vem encodados com codecs pesados demais para máquinas humildes então frequentemente eu converto um vídeo ou outro para um formato mais leve. Resumidamente (a original é 3 vezes maior ) a linha de comando que eu uso é :

mencoder -o arquivosaida.avi  -oac mp3lame   -ovc lavc -lavcopts bitrate=2000 arquivodeentrada.mkv

E teve um dia que eu me embananei e sobescrevi o arquivo original, tive que baixar o desenho de novo ..... Pra evitar problemas criei a seguinte função :

function ..pramaquinavelha () {
mencoder -o $1.avi  -oac mp3lame   -ovc lavc -lavcopts bitrate=2000 $1
}

O nome da função é "..pramaquinavelha", ela chama o mencoder com os parametros que eu quero, por exemplo:

..pramaquinavelha ghost-in-the-shell-01.mkv

E como saída ele gera o arquivo "ghost-in-the-shell-01.mkv.avi".
Como vc observou, eu passei um parâmetro para a função, para isso basta usar a variável $1, seu valor é a primeira string passada logo após o comando principal, no meu caso, o nome do arquivo que eu queria converter, ghost-in-the-shell-01.mkv.
"Mas porquê $1 ?Não poderia ser outro número ?" você pergunta. Sim ! Os números vão de 0 até infinito (nem tanto), vc pode passar multiplos parâmetros para uma função, como por exemplo o bitrate do vídeo além do nome do arquivo.A variável $0 é o próprio comando, e os parâmetros são numerados de $1 até $N, exemplo:

comando parametro1 parametro2 ... parametroN
$0        $1        $2            $N

Um outro tipo de função que eu uso bastante é um script que lista as dependêncas de um binário e quais pacotes suprem essas depências, segue a listagem :

..showdeps (){
[ "$1" ] || { echo 'uso: ..showdeps arquivo_binário'; return; }
rpm -qf `ldd $1 | awk '{print$3}'` | sort | uniq
}

Nesse exemplo alé da variável de argumento ($1), também fiz uso do comando de testes "[" e "]" e de um operador lógico "ou" ("||"). As chaves testam se algum parâmetro foi passado e caso positivo prossegue com a função, se não imprime uma mensagem ensinando ao usuário como usar a dita função. O resto da função é pauta para outro post, o que vale dessa vez é a idéia, funções são poderosas, implemente as suas, e divida com os amigos :)

Para ter suas funções favoritas sempre carregadas no shell, adciona a linha "source arquivo.func" à configuração do seu shell, por exemplo ~/.bashrc.

Depois falo mais de shell e seus truques.


0 comentários

TAGS : bash mencoder shell

Episódio 01



Esse podcast tem um formato flexível, mas pelos próximos episódios vai ter sempre dois petardos de entrada, um papo nerd com alguma música retiscente ao fundo e algo zen pra terminar o episódio.... Quando encher eu mudo :)

Nesse primeiro programa tem : Becoming The Archetype com Into Oblivion do disco Terminate Damnation , Fantômas com Rosemary's Baby do disco The Director's Cut e Inner Universe do anime Ghost In The Shell: Stand Alone Complex.

Tem também um pequeno review do songbird, que vai ser o firefox do tocadores de música :)

Assine o podcast e seja feliz , é isso, semana que vem tem mais :)


0 comentários

TAGS : archetype becoming fantomas firefox ghost nerd papo podcast shell songbird zen

Rodando o Parallels em um HackIntel (iPC) AMD



Fiquei muito triste quando fui instalar o parallels no meu hackintel, ele dizia que minha máquina não tinha os requisitos mínimos... Bom, eu tenho 1Gb de ram 420 gb de hd, qual seria o requisito ? "Só pode ser o processador, claro !"
Então entrei na imagem dmg, e verificando o programa de instação encontrei dentro do script Parallels-Desktop.pkg/Contents/Resources/InstallationCheck , isso :

#!/bin/bash
PKMKSHELLUTILITY=$1/Contents/Resources/pkmkshellutility
RESULT=`$PKMKSHELLUTILITY --sysctl machdep.cpu.vendor`
if [ $RESULT != 'GenuineIntel' ];
then exit 97
fi
exit 0

Ele diz o seguinte se não for intel, termine o instalador .

Procurei pela string GenuineIntel em outros arquivos, e encontrei no arquivo Parallels-Desktop.pkg/Contents/Info.plist , em :

<string>GenuineIntel</string>

Então, para descobrir qual era o meu processador, para os scripts do parallels, executei o comando (no terminal) :

 Parallels-Desktop.pkg/Contents/Resources/pkmkshellutility --sysctl machdep.cpu.vendor 

e ele devolveu :

 AuthenticAMD 

Então bastou trocar a string GenuineIntel pelo AuthenticAMD. Mas como a imagem dmg em questão é read-only, copie todo o conteúdo da imagem para um diretório qualquer. Altere o conteúdo desses dois arquivos que mencionei, trocando GenuineIntel por AuthenticAMD usando um editor de textos qualquer. Pra trocar as strings eu usei o sed, da seguinte forma :

 
sed -i .bak "s/GenuineIntel/AuthenticAMD/g" Parallels-Desktop.pkg/Contents/Info.plist 
sed -i .bak "s/GenuineIntel/AuthenticAMD/g" Parallels-Desktop.pkg/Contents/Resources/InstallationCheck 

Feito isso, pude desfrutar do parallels como em um legítimo macintel :)




0 comentários

TAGS : amd bash hack hackintel hackintosh ipc mac macintel osx parallels script sed shell

Recuperando dados deletados de uma partição reiserfs



Assunto delicado, perder um dado importante ou todos os dados de uma partição ou uma partição inteira é como um incêndio na casa de um geek.... Eu mesmo já surtei inúmeras vezes nessa lista por ter perdido partições inteiras ao instalar uma distro nova (Conectiva 7 e depois nunca mais usei conectiva), ao dar um comando errado na hora errada na partição certa ou por falha de disco.... alias meu HD aqui já tem 3 anos......
Bom Após passar 2 semanas puxando um game de playstation ( Valkyrie Profile= RPG ambientado nas culturas nórdicas, asgard, odim, vicking e tals...) para curtir nas férias, hoje finalmente o jogo veio ! Tava puxando por bittorrent e no ápice do meu egoísmo, fui deletar o torrent para não fazer mais upload |:-> mas cai na pegadinha do tab-completion do shell que completou com o arquivo rar em vez do torrent X-(
Digamos que nenhuma política de backup poderia ter me salvado dessa tragédia...
Então vou descrever aqui como recuperar dados deletados de uma partição reiserfs incluindo os passos que dei para recuperar meus dados :)

Lascou-se ! Tudo deu errado ! Deletou tudo ! TIRE SEU MICRO DA TOMADA IMEDIATAMENTE, isso ai puxe o fio ! Não dê shutdown !
Parece loucura, afinal , tirar o micro da tomada não é nenhum procedimento técnico não é mesmo ? Mas isso impede que o sistema operacional grave arquivos no disco... Ao deletar um arquivo na verdade o sistema operacional apenas realoca seu espaço ocupado para novos arquivos, se por um acaso o SO gravar um novo arquivo ele pode sobre-escrever seu precioso arquivo com algum arquivo temporário ou um importante log do sistema :-/

Muita calma nessa hora o computador está desligado, seu arquivo está seguro ! Para religar todo cuidado é pouco, um erro e todos seus arquivos deletados podem ir para o limbo ! Será nescessário religar seu sistema em modo reparo com as partições em RO (read-only), como fazer ?
Se vc usa lilo/yaboot, dê um tab no prompt descubra o nome do Label do seu sistema e acrescente "ro init=/bin/bash", por exemplo :

Linux ro init=/bin/bash

Se vc usa grub, no menu de opções aperte "e" no item que corresponde a sua distro, "e" na linha do kernel e adicione "ro init=/bin/bash no final.... então aperte ESC e b para bootar.

Isso vai fazer com que o sistema monte a partição root em modo ro e vai iniciar o processo bash como processo número 1 no lugar do init.... Pode acontecer do diretório dev não ser populado ou seja não será possível montar outras partições se nescessário... se isso acontecer, vc deve remontar a partição / para leitura e escrita (mount -o rw,remount /) e rodar o comando udevstart (ou devfsd para quem usa sistemas antigos como debian sarge desatualizado e etc...) e rezar para dar certo.

Se tudo der errado, a única forma é iniciar o sistema no runlevel 1 , mas isso pode ser uma péssima idéia em algumas distros... várias delas escrevem no disco antes de entrar em modo de manutenção, entre elas : Fedora, Ubuntu, gentoo... deve haver uma porção delas por ai... Tenho quase certeza que slackware e debian não o fazem.

Na distro em questão (gentoo) isso ocorreu, o sistema escreveu no disco e não foi pouco : as consequencias serão descritas no final.....

Bom com o sistema montado em ro e com o bash em mãos é hora de agir ! O sistema de arquivos reiserfs peca por não ter uma ferramenta para recuperar arquivos deletados.... ou pior se ela existe não é livre (várias ferramentas de sistema do reiserfs não são livres....), mas tem uma gambiarra que funciona bem....É o comando reiserfsck !

Use :

reiserfsck --rebuild-tree -S /dev/PARTICAO

Esse comando vai buscar por todos os arquivos e diretórios e vestígios dos mesmos na partição e vai criar um diretório chamado "lost+found" no topo da partição...
dentro desse diretório vc vai encontrar uma porção de arquivos cujo o nome são apenas números... no meu caso tive que procurar por um arquivo grande, e achei, depois para confirmar usei o programa "file" para identificar o conteúdo ,tá lá ! Arquivo RAR na cabeça, então foi só renomear....
Tive a sorte de ser um arquivo grande , fácil de identificar... mas e se fosse um arquivo pequeno ? Bem mais complicado, não tem jeito é garimpar até achar.... No caso de diretórios inteiros ou partições a sistuação é mais grave, todos eles vão ter números como nomes e muitas vezes arquivos aparecem fora de seus diretórios .... uma zona.

Bom, e como meu sistema inicializou em init 1 e escreveu no disco não deu outra, ele corrompeu partes do meu arquivo e só pude recuperar 30% do meu arquivo original, bom melhor que nada :-/


0 comentários

TAGS : asgard backup conectiva dados fedora geek gentoo grub init lilo linux odim partição profile psone rebuild-tree recuperar reiser reiserfs reiserfsck rpg shell sys tab-completion torrent ubuntu valkyrie vicking yaboot

Posts relacionados

Delicious/liquuid/shell
7 "must read" Linux tutorials | Linux Screw
Apple Mac OS X AppleScript ARDAgent Shell Local Privilege Escalation Vulnerability
Common shell script mistakes
time machine no linux com rsync :: blog do liquuid
Linux Magazine Online – Baixe o curso de shell script do Julio Cezar Neves
taw's blog: iPod-last.fm bridge
liquuid's post :: CURD - Conversor Universal do Reino de Deus
liquuid's post :: Funções no bash
liquuid's post :: Episódio 01
liquuid's post :: Rodando o Parallels em um HackIntel (iPC) AMD
liquuid's post :: Recuperando dados deletados de uma partição reiserfs
liquuid - podcast 01
bashwser
Dialog --tudo