Ambiente de testes para módulos no Linux Kernel

fevereiro 27, 2009 at 2:13 pm 2 comentários

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 https://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 http://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

Anúncios

Entry filed under: 1.

Instrumentação do kernel (SystemTap) Why I did spend a lot of time without post anything here.

2 Comentários Add your own

  • 1. Paulo Henrique  |  fevereiro 27, 2009 às 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 às 1:31 am

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

    Responder

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s

Trackback this post  |  Subscribe to the comments via RSS Feed


Páginas

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

%d blogueiros gostam disto: