sábado, 29 de março de 2008

KVM: pisando no acelerador com o qemu

Instalar o kvm (Kernel-based Virtual Machine - http://kvm.qumranet.com/kvmwiki) num passo a passo:

1- Verificar compatibilidade do processador:
egrep '^flags.*(vmx|svm)' /proc/cpuinfo
Se não retornar nada, sinto muito, mas ainda recomendo o kqemu do primeiro post.

2- instalar o módulo no kernel:
m-a prepare
m-a a-i kvm
3- verificar os módulos (pra intel e amd):
modinfo kvm-intel kvm-amd
4- carregar o módulo conforme o seu processador e checar se carregou:
modprobe kvm-amd
lsmod| grep kvm
5- depara-se com a mensagem (se não der, vá direto para o 9):
FATAL: Error inserting kvm_amd (/lib/modules/2.6.22-3-amd64/misc/kvm-amd.ko): Unknown symbol in module, or unknown parameter (see dmesg)
6- remova todo mundo
apt-get remove --purge kvm kvm-modules-2.6.22-3-amd64 kvm-source
7- Altere no /etc/apt/preferences para usar o pacote unstable:
Package: kvm*
Pin: release a=unstable
Pin-Priority: 1000
e baixe o kvm "unstable":
apt-get install -t unstable kvm-source
8- Limpa tudo:
m-a clean kvm
m-a purge --force kvm
volte para o passo 2 e repita tudo...

9- E vc chegou aqui, ótimo.

verifique as permissões do /dev/kvm:
crw-rw---- 1 root kvm 10, 232 2008-03-15 01:11 /dev/kvm
Adicione-se no grupo "kvm" com o vigr...
Copie o arquivo /etc/qemu-ifup para /etc/kvm/kvm-ifup (se vc quiser que a rede funcione)
E inicia tudo usando o kvm:
kvm -hda windowsXP.qemu -net nic -net tap,ifname=tap0 -localtime -boot c -m 256
10- Pra iniciar tudo, criei um shell-cript. Provevelmente existam maneira melhor, mas ainda não pensei em nenhuma:
#!/bin/sh

# procura uma interface que não existe

#QEMU="qemu-system-x86_64"
QEMU="kvm"

i=0
while [ `ifconfig tap$i 2> /dev/null | cut -d " " -f 1` ]; do
i=$(($i+1))
done
IFNAME='tap'$i

# carrega o módulo tun, se não estiver carregado
if [ -z `lsmod | grep kvm-amd | cut -d " " -f 1 ` ]
then
sudo modprobe kvm-amd
fi

# carrega o módulo tun, se não estiver carregado
if [ -z `lsmod | grep tun | cut -d " " -f 1 ` ]
then
sudo modprobe tun
fi
# cria e inicia a interface de rede
sudo tunctl -t $IFNAME -u $USER

# carrega o módulo kqemu, se não estiver carregado
if [ -z `lsmod | grep kqemu | cut -d " " -f 1 ` ]
then
sudo modprobe kqemu
fi

# inicia o qemu
exec $QEMU -hda windowsXP.qemu -net nic -net tap,ifname=$IFNAME -localtime -boot c -m 256 #-cdrom /tmp/VS2008ExpressENUX1397868.iso -win2k-hack

# remove a interface de rede
sudo tunctl -d $IFNAME
Fico devendo uns testes com kvm x kqemu.
E ainda devo um teste com o vmware...

sexta-feira, 28 de março de 2008

32 bits X 64 bits

Estava eu querendo jogar um pouco no Linux. É, ninguém é de ferro e um pouco de distração faz descansar melhor do que algumas horas de sono...

Procurei diversos games, mas nenhum que me desse muuuita vontade de jogar. Até lembrar do meu antigo Master System Super Compact e do Super Nintendo. Os videogames eram fantásticos, não fritavam e proporcionavam horas de diversão.

Hoje existem emuladores para os mesmos jogos: Sonic e Mega Man X. O Gens é emulador pro Master System (conhecido como Gênesis nos EUA, por isso o nome) e o ZSnes é o do Super Nintendo. Só que eles estão disponíveis nos repositórios apenas para 32 bits. Meu amd_64 ficou sem... Mas pra tudo dá-se um jeito...

Compilando o ZSnes e gerando um pacote

Entre em ftp://ftp.br.debian.org/debian/pool/main/z/zsnes. Aqui está o pacote para o zsnes para i386. Faça download do arquivo zsnes_1.510-2.dsc. Se houver versão maior, melhor. Use o dget, pois ele vai baixar mais alguns arquivos que precisaremos:
dget ftp://ftp.br.debian.org/debian/pool/main/z/zsnes/zsnes_1.510-2.dsc
Abra o arquivo e adicione amd64 na linha "Architecture: i386"
Architecture: i386 amd64
Atualize também, nesse arquivo, o Build-Depends:
Build-Depends: debhelper (&lgt;= 4), dpatch, dpkg-dev (&lgt;= 1.13.2), g++-multilib [!i386], gcc-multilib [!i386], ia32-libs [!i386], libao-dev [i386], libgl1-mesa-dev, libpng12-dev | libpng-dev, libsdl1.2-dev (&lgt;= 1.2.2-3.1), nasm, sharutils, xutils, zlib1g-dev [i386] | lib32z1-dev [!i386]
Extraímos o pacote, aplicamos os patchs com o dpkg-source:
dpkg-source -x zsnes_1.510-2.dsc
Entramos no diretório onde estão os fontes. Instalamos alguns pacotes necessários, instalamos as dependências pra compilação, compilamos e criamos o pacote:
cd zsnes-1.510
sudo apt-get install gcc-multilib g++-multilib
sudo apt-get build-dep zsnes
dpkg-buildpackage
Agora espere compilar... Ao fim de tudo, será criado um pacote no diretório superiot. Instale-o com o "dpkg -i"...

Compilando o GENS para 32 bits "chroot"

O Gens sequer está nos repositórios do Debian. Eu não encontrei. Logo, a estratégia usada no ZSnes não vai funcionar.
Precisamos baixar os fontes e compilar. Usaremos a versão disponível no cvs (deixe a senha em branco):
cvs -d:pserver:anonymous@gens.cvs.sourceforge.net:/cvsroot/gens login
cvs -z3 -d:pserver:anonymous@gens.cvs.sourceforge.net:/cvsroot/gens co GensForLinux
O Gens é antigo e deve ser compilado com o gcc 3.4. Temos que instalá-lo:
sudo aptitude install gcc-3.4
Vamos exportar a variável CC, para indicar o uso do gcc certo, compilando 32 bits:
export CC="gcc-3.4 -m32"
Instalamos, então, algumas libs para 32bits:
sudo apt-get install ia32-libs-gtk ia32-libs
Infelizmente, isso não é tudo. Nem todos os pacotes estão nessas libs. Precisamos instalar mais alguns. Para compilar, temos que exportar outra variável, para indicar (-L) onde estão as bibliotecas (já que vamos compilar um ia32), além de indicar para usar o OpenGL (-lGL):
export LDFLAGS="-L/usr/lib32:/emul/ia32-linux/lib:/emul/ia32-linux/usr/lib:/usr/lib:/lib:/usr/local/lib/:/lib/x86_64-linux-gnu:\
/usr/lib/x86_64-linux-gnu -lGL"
Em "/emul/ia32-linux" vão as libs que precisamos para compilar. Pra descobrir quais são, fui batendo com a cabeça: tenta compilar e usar o apt-get e o apt-file para encontrar a dependência. Só que não instala-se com o apt-get, pois ele instalaria para 64 bits.
Temos que entrar em http://packages.debian.org/, procurar o pacote e descompactá-lo em
/emul/ia32-linux/. Por exemplo, para a libsdl1.2-dev:
wget http://ftp.cl.debian.org/debian/pool/main/libs/libsdl1.2/libsdl1.2-dev_1.2.13-2_i386.deb
dpkg -X libsdl1.2-dev_1.2.13-2_i386.deb /emul/ia32-linux/
Para o gens, instalei ainda:
  • libsdl1.2debian-alsa_1.2.13-2_i386.deb
  • libsdl-sound1.2-dev_1.0.1-12+b1_i386.deb
  • libasound2-dev_1.0.16-2_i386.deb
  • libdirectfb-dev_1.0.1-8_i386.deb
  • libdirectfb-1.0-0_1.0.1-8_i386.deb
  • libx86-1_0.99+ds1-2_i386.deb
Depois, o clássico, mas ele não vai encontrar o gtk nem o sdl certo, então não deixe-o testar:
./configure --disable-gtktest --disable-sdltest
make
make install
Uma dica: use o "checkinstall" para criar um pacote:
checkinstall make install
Depois disso, ainda precisa de umas bios, pra poder rodar tudo. Vc encontra elas por aqui: http://www.fantasyanime.com/emuhelp/emuhelp_gens.htm#segacdbios

Abra o gens e, em "Option" -> "Bios/Misc Files", configure os arquivos baixados da bios.

E, claro, para ambos os casos, precisa de umas boas roms... mas essas o Google encontra pra vc...

sábado, 22 de março de 2008

Codificação em nome de arquivo: mostrando o Python

Já que estou me quebrando com as músicas, deixe-me apresentar uma solução praquelas que o Exaile (meu player) não consegue ler por causa da codificação.

Como antes eu tinha tudo no Windows, quando copiei-as pro Linux, não percebi que a codificação do nome dos arquivos ficou em ISO8859-1. Como o Linux (e o Python - o Exaile é escrito em Python) usam UTF-8 como padrão, todas as que estão com acentos não são lidas...

A solução é um script Python (quem causou o problema que o resolva!). Ele pega todos os arquivos, checa se é UTF-8 e, se não for, decodifica e codifica de novo. Aqui está:
import os

def decode_all_in_dir(dir, from_cod='iso8859-1', to_cod='utf8'):
for arq in os.listdir(dir):
path = os.path.join(dir, arq);
if (os.path.isdir(path)):
decode_all_in_dir(path)
try:
arq.decode(to_cod)
except:
new_name = arq.decode(from_cod).encode(to_cod)
os.rename(os.path.join(dir, arq), os.path.join(dir, new_name))
print new_name

if __name__ == '__main__':
decode_all_in_dir('.')
Renomeou todos os arquivos, listando os que ele renomeou. Se rodar de novo, nenhum deve ser listado. Pronto, codificações corrigidas!

PulseAudio - P2

Tive alguns problemas com o PulseAudio. Ele parece não gostar muito de Legião Urbana. O processo do PulseAudio morre depois de um tempo...

Pra resolver isso, fiz uma gambiarra: criei um script que re-inicia cada vez que o processo morre. Em C. O código:
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>

#define true 1
#define false 0

int main()
{
while (true) {
system("c:\\pulseaudio\\pulseaudio.exe -D");
Sleep(10000);
}
return 0;
}
Compilei e coloquei no lugar da chamada do PulseAudio, mas, por enquanto, nem precisou chamar uma segunda vez...


Ah, compilei com o Code::Blocks no Windows XP da máquina virtual do primeiro post. Na verdade, usando o kvm, mas isso é assunto pra outro post.

-----
Mais um: funcionou melhor quando criei um atalho em "%systemroot%\system32\GroupPolicy\Machine\Scripts" apontando para o executável, e apontanto para esse atalho no "gpedit.msc".

PulseAudio

Testei hoje, entre a noite de sexta-feira santa e a madrugada do sábado de aleluia um cara chamado PulseAudio (http://www.pulseaudio.org/).

Ele é um servidor de som. Meu problema é que compartilho o computador aqui em casa. O MS Windows XP que minha irmã usa está ligado no aparelho de som. Fui intimado a retirar todas minhas músicas e meus filmes dali, pois minha irmã precisa "fazer os trabalhos dela e não está conseguindo". Eu sei que não é esse o problema, mas eu preciso provar isso. Meu notebook, com Linux (Debian), está com cópia das minhas músicas.

Quero ouvir as músicas do notebook no aparelho de som ligado no Windows. Entra em cena o PulseAudio.

Em http://www.cendio.com/pulseaudio, fiz o download dos binários pra Windows e decompactei em C:\pulseaudio e executei:
pulseaudio.exe
Deu pau. É preciso criar um arquivo, chamado "default.pa". O meu ficou com o conteúdo:
load-module module-esound-protocol-tcp auth-anonymous=1
load-module module-native-protocol-tcp auth-anonymous=1
load-module module-cli
load-module module-waveout
.nofail
Executei de novo, e foi...

No Linux, instalei:
aptitude install pulseaudio
aptitude install padevchooser
E executei (no Linux) com meu usuário:
padevchooser
Ele criou um ícone no "system tray", clica nele com o direito, "Default Server" -> "Other" e coloca o nome do servidor Windows.

Pronto, é isso. O PulseAudio ainda apresenta uns bugs no Windows, mas promete...

Pra deixar melhor, no windows, pode-se deixá-lo iniciando automaticamente, sem precisar nem mesmo logar com algum usuário. Vá em "Iniciar" -> "Executar" e digite "gpedit.msc". Na janela que se abre, escolha na árvore "Configuração do Computador" -> "Configurações do Windows" -> "Scripts". Clique com o direito do mouse em "Inicializar" -> "Propriedades". Adicione uma nova entrada para o PulseAudio. Use o caminho completo e "-D" como parâmetro.

quinta-feira, 20 de março de 2008

GMail html only

Alguém mais tem problemas com o Ajax no GMail além de mim? Até agora, sou o único que eu conheço que acha o GMail pesado...

Mas, como pra tudo dá-se um jeito, vai a dica:

http://gmail.google.com/gmail/h/

Assim, vai diretamente para o acesso HTML do GMail, sem todo o "peso" do Ajax...

Funciona, pode acreditar!

quarta-feira, 19 de março de 2008

Formato de data no Oracle

Pra quem não sabe, trabalho com Oracle durante o horário comercial.

Deixo uma dica, pra formatar datas com strings no meio, algo do tipo:
19/03/2008 às 16h02min
No Mysql, seria barbada, pois ele usa o "%" na frente das expressões especiais para o formato de data. Já o Oracle...

Mas pra tudo dá-se um jeito:
select TO_CHAR(sysdate, 'DD/MM/YYYY "às" HH24"h"MI"min"') from dual
O segredo está nas ". O que colocar ali no meio, o Oracle coloca como texto.

Simples, mas até descobrir...

Outra dica, já na onda do Oracle, é um lugar pra pesquisar essas e outras coisas:

http://tahiti.oracle.com