Ambiente de testes para módulos no Linux Kernel

fevereiro 27, 2009

De alguns dias pra cá, vim testando alguns módulos no Linux kernel que mexem com alocação de memória, doubly linked lists e algumas macros como a ‘current’ que faz referência a famosa task_struct de “linux/sched.h”, o problema é que toda vez que eu carregava um módulo que lidava diretamente com uma alocação errônia de memória em kernel-space, o kernel crashava e em consequência, a máquina também, Eis o problema na vida do indivíduo — máquina de produção travando a cada insmod executado não é boa coisa, acredite.

A solução: ambiente especial para testes, responsável: UML (user mode linux) como pode ver abaixo (note que o método aqui apresentado é uma abstração do método usual, o modo mais usual da utilização do UML como ambiente de depuração pode ser encontrado no final desde guia como indicação):

Como o user mode linux fornece um executável do sistema operacional (isso mesmo, um executável que nos dá possibilidades inclusive de rodar em cima o GNU GDB, e também profilers como gprof, gcov e etc), eliminando assim a complicação de um uso por exemplo do Kgdb que requer duas máquinas com um cabo NULL modem para comunicação entre si e uma boa dose de conhecimento, bem como kdb, porém é claro não são as mesmas coisas, o kdb não necessita de duas máquinas e a depuração é feita diretamente na máquina geradora do bug e ainda sim, no entanto, não deixa de exigir-nos bastante conhecimento.

Note que analisar a pilha de chamadas vinculadas á chamadas do kernel pode causar um grande transtorno dependendo da quantidade de chamadas que o kernel fizer, para analisar tal chamadas, você pode utilizar programas de rastreamento de chamadas como o strace (porém, como é kernel-space, não lhe dou certeza para tal, pesquise por rastreamento de chamadas em kernel-space [ http://www.writing.eng.vt.edu/Abstract/Dylan%20Klomparens.doc ] ).

Algumas perguntas posteriores que irão surgir (certeza, e é o foco desse mini-guia):

Q) A máquina que uso pra programar, neste caso, após configurado seria a host machine e não a Virtual Machine, como eu poderia compartilhar arquivos entre elas (os módulos e códigos que programo neste caso).

R) Iremos necessitar de fazer uma ponte (bridge) para a máquina virtual entrar no mesmo subnetting da máquina host, iremos utilizar para isto, inclusive uma ferramenta do próprio UML : ).

Q) Tá, a máquina está no mesmo subnetting, mais ainda assim não terá como compartilhar arquivos, como eu faço para compartilhar arquivos ?.

R) Basta configurar o servico NFS (network file system) que no caso, um kernel-newbie já deveria conhecer. Se não conhece, por favor, não continue seguindo esse tutorial : ).

Bom, depois de apresentado teoricamente o problema e a solução (coisa simples como você pode notar) vamos resolver esse algoritmo na prática. (não tratarei de como configurar o NFS aqui e nem de peculiaridade do UML, para mais informações recomendo olhar no site oficial ou se preferir em sites de terceiros).

Finalidade:
* Baixar um kernel e o rootfs no qual o kernel será montado;
* Baixar e instalar pacotes responsáveis pela configuração da bridge;
* Configurar bridge;
* Configurar o NFS.

Passos a serem seguidos:

Baixar um kernel já pronto para o ato de “virtualização” (note que se quiser configurar o seu código objeto do Linux (UML) manualmente, tenha como ponto de partida, referências de terceiros como o livro User Mode Linux pois não tratarei do assunto aqui.)
http://uml.nagafix.co.uk/uml/

Baixe um file system no qual o kernel será montado:
http://uml.nagafix.co.uk/filesystems/

Descompacte-os no local que lhe melhor convier:

Um exemplo de sintaxe utilizando o pacote Ubuntu mais o pacote do Kernel:
bunzip2 Ubuntu-IntrepidIbex-i386-root_fs.bz2 kernel32-2.6.28.1.bz2

Baixe e instale os pacotes:

# apt-get install bridge-utils uml-utilities
# emerge bridge-utils uml-utilities (Gentoo)

Agora teremos de configurar a bridge, adicione uma configuração em seu ‘/etc/rc.local’:

tunctl -t tap0 -u ubuntu
chmod 0666 /dev/net/tun
/usr/sbin/brctl addbr br0
/sbin/ifconfig eth0 0.0.0.0 promisc
/usr/sbin/brctl addif br0 eth0
/sbin/dhclient br0
/usr/sbin/brctl addif br0 tap0
ifconfig tap0 192.168.1.108 up ( ip para a futura VM )
bash -c ‘echo 1 > /proc/sys/net/ipv4/conf/tap0/proxy_arp’
route add -host 192.168.1.101 dev tap0 ( ip da máquina na rede local )
arp -Ds 192.168.1.101 eth0 pub ( idem ao anterior )

Antes do exit 0; Contudo, adapte as suas necessidades, óbvio. (PS.: qualquer dúvida deixar um comentário que irei responder com o maior prazer http://catojo.wordpress.com ).

Após isso, você irá precisar atualizar o seu rc.local no Gentoo, utilize: rc-update.

Após atualizado, rode o sistema com o seguinte comando (não é necessário estar como root):

$ ./kernel32-2.6.28.1 ubd0=./Ubuntu-IntrepidIbex-i386-root_fs mem=128M \ eth0=tuntap,tap0,fe:f0:00:00:00:01,192.168.1.254 con0=fd:0,fd:1 root=/dev/ubda

O login é ‘root’ e o password é apenas ENTER.

E por fim, esteja seguro de que o arquivo ‘/etc/network/interfaces’ do seu sistema guest OS, ou VM, como preferir, esteja configurado da seguinte forma:

————————————–

auto lo
iface lo inet loopback

auto eth0
iface eth0 inet dhcp

————————————–

Agora teste a sua conexão e a ponte entre o UML e a máquina host:
# apt-get install traceroute
# emerge traceroute (caso esteja usando Gentoo)

# tracert www.blackhat.ru

Se o comando tracert der resposta, a máquina host está conseguindo se comunicar com a VM, deste modo, é certo de que a ponte está funcionando e a máquina está no mesmo subnetting da nossa rede física. Para desativar a VM:

# halt

Após isso você já poderá configurar o NFS para o compartilhamento de arquivos, módulos e códigos, talvez quem saiba nos próximos posts, com mais calma, eu possa apresentar algumas peculiaridades do UML e do desenvolvimento de módulos para kernel propriamente ditos, alguma correção, opinião ou crítica sobre o conteúdo é bem vinda.

Boa sorte e happy hacking : P

Referências:

http://www.biochem.ucl.ac.uk/~mckenzie/linux/uml-getting-started-20040422.html
http://user-mode-linux.sourceforge.net/hacking.html
http://www.mlaureano.org/guias-e-tutoriais/configuracao-do-user-mode-linux/
Prentice Hall PTR User Mode Linux.

Indicações:

http://www.linuxjournal.com/article/5749
http://www.ime.usp.br/~baroni/docs/uml.html

Entry Filed under: 1. .

2 Comments Add your own

  • 1. Paulo Henrique  |  fevereiro 27, 2009 at 7:34 pm

    Is my brother interessante o lance !!! po estou com debian erth na minha maquina vou dar uma vista na parada !!

    Abraços e good hacking !!!

    Responder
  • 2. Magic  |  março 10, 2009 at 1:31 am

    Muito interessante, conheci o blog agora, já tá na minha lista de feeds, abraço!

    Responder

Leave a Comment

Required

Required, hidden

Some HTML allowed:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <pre> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Trackback this post  |  Subscribe to the comments via RSS Feed


RSS Assine o Feed

Páginas

 

fevereiro 2009
S T Q Q S S D
« jan   dez »
 1
2345678
9101112131415
16171819202122
232425262728  

1356