Archive for the ‘Linux’ Category.

Mental note: Sending a SysRQ to a VM

On the host, run the following command:

  # virsh send-key rhel6 KEY_LEFTALT KEY_SYSRQ KEY_C

where rhel6 is the name of the VM, and KEY_C is the command that you want to send, in this case it will generate a crash dump.

The available commands are:

  • loglevel(0-9)
  • reboot(b)
  • crash(c)
  • terminate-all-tasks(e)
  • memory-full-oom-kill(f)
  • kill-all-tasks(i)
  • thaw-filesystems(j)
  • sak(k)
  • show-backtrace-all-active-cpus(l)
  • show-memory-usage(m)
  • nice-all-RT-tasks(n)
  • poweroff(o)
  • show-registers(p)
  • show-all-timers(q)
  • unraw(r)
  • sync(s)
  • show-task-states(t)
  • unmount(u)
  • show-blocked-tasks(w)
  • dump-ftrace-buffer(z)

Finally, it will works only if the sysctl kernel.sysrq is equals to 1:

  # sysctl  -w kernel.sysrq=1

Desenvolvimento de plugin para o eclipse

Uso o Eclipse para duas coisas: Desenvolver aplicações em C e usar com indexador para o código do kernel (também uso o cscope, mas para partes do sistema que nunca toquei, navegar com o eclipse é mais confortável).

Mas agora me surgiu uma nova necessidade, estou estendendo os plugins do LTTng para o meu tema do mestrado, então tenho que usar o eclipse para editar o próprio eclipse, e é muito bom, é muito fácil extender o eclipse.

Agora entendi porque os fabricantes de hardware como a Texas, Atmel, and so on, usam o eclipse como interface, é realmente simples. Com certeza, junto com o kernel e a gcc o eclipse é um dos meus projetos de software livre predileto, e ó que ele é escrito em Java!.

Segui o seguinte how to para montar o ambiente de desenvolvimento: http://wiki.eclipse.org/Linux_Tools_Project/LTTng_Eclipse_Plug-in_Development_Environment_Setup

VM para desenvolvimento

Desenvolver para o kernel trás um pequeno inconveniente: Esperar a máquina reinicia a cada erro no seu código.

O ideal é ter dois computadores, um para desenvolver e outro para testar (e esperar reiniciar), antigamente eu fazia isto usando meu Netbook para desenvolver e o Desktop para testar, porém, agora comprei um computador novo e é um pecado usar um Atom para desenvolver e testar em um Core i5 :-), e como meu Netbook é meu fiel escudeiro não posso arriscar fazer testes nele e correr o risco de danificar o sistema, outro fato é que meu netbook não tem porta serial o que dificulta um pouco na hora de ler um oops ou panic.

Como em casa tenho estudado sub-sistemas que não dependem de hardware, diferente do trabalho onde tudo gira em torno do Hardware e rende algumas brigas de “Caras do Hardware” vs. “Caras do software”, decidi criar uma máquina virtual para desenvolver para o kernel.

Das possíveis implementações de máquinas virtual decidi por usar o KVM e como distribuição Linux optei pelo Fedora.

No Desktop eu fiz uma instalação típica de Desktop: X, Gnome, OpenOffice, Internet Gráfica mais as “Ferramentas de desenvolvimento” e o suporte a virtualização.

Após instalar, primeiro boot, atualizar o sistema, trocar o papel de parede e tomar algum café, eu iniciei a criação de uma máquina virtual no KVM e a instalação do Fedora. Para a instalação da VM optei por fazer a instalação mínima mais os pacotes de “Ferramentas de desenvolvimento”.

Após o boot da máquina virtual, instalei o vim-enhanced e inicie a configuração de algumas facilidades.

Primeiro, configurei a interface de rede da VM para pegar endereço via DHCP criando e editando o arquivo /etc/sysconfig/network-scripts/ifcfg-eth0, qual ficou com o seguinte conteúdo:

DEVICE=eth0
ONBOOT=yes
TYPE=Ethernet
BOOTPROTO=dhcp

Após isto verifiquei os serviços do sistema com o comando “chkconfig –list | sort -k 5” (o “sort -k5” é para ordenar os dados pela quinta coluna, que são os serviços do runlevel 3, assim fica mais fácil de identificar os serviços habilitados) e após ver os necessários desabilitei alguns serviços:

[root@k ~]# chkconfig auditd off
[root@k ~]# chkconfig iptables off
[root@k ~]# chkconfig ip6tables off
[root@k ~]# chkconfig netfs off
[root@k ~]# chkconfig sendmail off

Além de desabilitar estes, foi necessário habilitar o serviço network que por padrão está desabilitado pois no fedora o gerenciamento de rede é feito pelo NetworkManager.

[root@k ~]# chkconfig network on

o sistema ficou com os seguintes serviços habilitados:

[root@k ~]# chkconfig --list | sort -k 5
auditd             0:off    1:off    2:off    3:off    4:off    5:off    6:off
cgconfig           0:off    1:off    2:off    3:off    4:off    5:off    6:off
cgred              0:off    1:off    2:off    3:off    4:off    5:off    6:off
ip6tables          0:off    1:off    2:off    3:off    4:off    5:off    6:off
iptables           0:off    1:off    2:off    3:off    4:off    5:off    6:off
netconsole         0:off    1:off    2:off    3:off    4:off    5:off    6:off
netfs              0:off    1:off    2:off    3:off    4:off    5:off    6:off
nfs                0:off    1:off    2:off    3:off    4:off    5:off    6:off
rdisc              0:off    1:off    2:off    3:off    4:off    5:off    6:off
restorecond        0:off    1:off    2:off    3:off    4:off    5:off    6:off
rpcsvcgssd         0:off    1:off    2:off    3:off    4:off    5:off    6:off
saslauthd          0:off    1:off    2:off    3:off    4:off    5:off    6:off
sendmail           0:off    1:off    2:off    3:off    4:off    5:off    6:off
svnserve           0:off    1:off    2:off    3:off    4:off    5:off    6:off
crond              0:off    1:off    2:on    3:on    4:on    5:on    6:off
network            0:off    1:off    2:on    3:on    4:on    5:on    6:off
rsyslog            0:off    1:off    2:on    3:on    4:on    5:on    6:off
sshd               0:off    1:off    2:on    3:on    4:on    5:on    6:off
udev-post          0:off    1:on    2:on    3:on    4:on    5:on    6:off

Sistema reiniciado e OK.

Após o boot, verifiquei o endereço de IP que a maquina recebeu e adicionei uma entrada no arquivo hosts para não precisar digitar o IP toda vez que conectar via SSH:

192.168.122.97  k       k.bristot.eti.br

Como vou trabalhar via SSH na VM também adicionei na VM um usuário “daniel” com o mesmo id do usuario “daniel” do PC e fiz a configuração no ssh para autenticar utilizando uma chave RSA sem senha, assim não preciso ficar digitando a senha toda vez que fizer login.

Para gerar a chave, executei o seguinte comando:

[daniel@kiron Desktop]$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/daniel/.ssh/id_rsa):  (apertei enter)
Enter passphrase (empty for no passphrase):              (apertei enter)
Enter same passphrase again:                      (apertei enter)
Your identification has been saved in /home/daniel/.ssh/id_rsa.
Your public key has been saved in /home/daniel/.ssh/id_rsa.pub.
The key fingerprint is:
18:13:bc:ed:5a:ff:d1:55:65:7b:af:83:42:5d:ea:8d daniel@kiron.bristot.eti.br
The key's randomart image is:
+--[ RSA 2048]----+
|     ..         o|
|      ..       .o|
|      oo      ..o|
|      .+.  . o  +|
|      ..S . o   o|
|        o. . = o |
|       o .. E =  |
|      .   .. . . |
|           ..    |
+-----------------+

Na máquina virtual criei o diretório /home/daniel/.ssh com permição 700 e copiei o arquivo “/home/daniel/.ssh/id_rsa.pub” do PC para o diretório “/home/daniel/.ssh” da VM com o nome authorized_keys e ajustei a permissão deste arquivo para 600:

[daniel@k ~]$ mkdir .ssh
[daniel@k ~]$ chmod 700 .ssh
[daniel@k ~]$ scp "endereço do pc":.ssh/id_pub.rsa .ssh/authorized_keys
[daniel@k ~]$ chmod 600.ssh/authorized_keys

e testei a conexão a partir do PC do PC:

[daniel@kiron Desktop]$ ssh k
Last login: Sat Jan 22 17:51:15 2011 from 192.168.122.1
[daniel@k ~]$

Pronto, login sem senha do PC para a VM.

Para facilitar a troca de arquivos entre o PC e a VM eu exportei o meu diretório de fontes via NFS4 para a VM, para isto adicionei ao arquivo /etc/exports a seguinte linha:

/home/daniel/src                  k(rw,sync,no_subtree_check,no_root_squash,no_all_squash)

Já na VM, eu tive que adicionar o pacote nfs-utils:

[root@k ~]# yum install nfs-utils

criar o diretorio de montagem:

[daniel@k ~]$ mkdir src

e adicionar a seguinte linha ao fstab:

192.168.122.1:/home/daniel/src/ /home/daniel/src/    nfs4    defaults     0 0

Pronto, maquina instalada, acesso sem senha e arquivos compartilhados.

pronta para desenvolver!

Aaaaa última dica, o grub por padrão no KVM fica com um timeout de ‘0’ e você não consegue editar a linha de comando do kernel em caso de erro, então, antes de mexer no kernel, edite o arquivo /etc/grub.conf e mude o Timeout de 0 para algum valor como 3.

Branch prediction on userspace

To use GNU C likely and unlikely in userspace, use it:

#ifdef __GNUC__
#define likely(x)       __builtin_expect((x),1)
#define unlikely(x)     __builtin_expect((x),0)
#else
#define likely(x)       (x)
#define unlikely(x)     (x)
#endif

uClibc

Para quem não entendeu porque eu gosto da uClibc…

Instalação da GNU LibC

LinuxCon Brazil 2010 slides presentation

That’s the slides of my presentation at LinuxCon Brazil 2010:

pdf: bristot_rt_tips_and_tools_linuxcon2010.pdf
odf: bristot_rt_tips_and_tools_linuxcon2010.odf

My Sons

That’s my sons:

My sons :)

The left most is  eee.bristot.eti.br: an asus eeePC that’s always with me at my bag. Is a INTEL ATOM n270, I got it because of you battery life, about 6 hour of full work, and your weight, about 1,3Kg with all packages installed and all my music inside 😉
It’s run Fedora 13 with XFCE Desktop environment.

At the middle is kiron.bristot.eti.br and amd64rt.bristot.eti.br: ok is only the screen, but is an DELL Inspiron 531 with an AMD Athlon 64 X2 3800+.
That’s my desktop and test machine, I run fedora 13 on two installations:

  • The first one is for my desktop machine, where I watch some movies , surf on internet and use to develop some embedded and kernel. The desktop environment is Gnome.
  • The second one is for test real-time Linux kernel and make some applications. It run Fedora 13 with a custom kernel with the last real time patch, the desktop environment is XFCE.

The right most computer is an at91sam9260ek called as at91.bristot.eti.br. Is an Atmel development Kit for at91sam9260 processor (an ARM 926ej-s CPU at 200Mhz).
It run Buildroot Linux with a custom kernel with preempt-rt Linux and I use it to study drivers, kernel, and hardware architecture.

Where wallpaper is possible, is always about MotoGP, preferentially pictures where Valentino Rossi #46 is at 1st position. There is more development kits here, with TI omap3, blackfin and anthers embedded processors, but, these are the computer that i use more 🙂

LinuxCon 2010: Linux on Real-Time Embedded Systems: Tips and Tools

6:00pm, Tuesday, September 1st
Location: Ballroom 2
Topic: Embedded

By supporting many hardware architectures and reducing the time-to-market, Linux became a frequently choice of operating system to embedded telecommunication devices. However, the vanilla Linux kernel is a soft real-time operating system and needs some patchs, tools an techniques to makes possible your utilization on systems with firm real-time requirements. This presentation shows some tips and tools, collected during the development of embedded telecommunication devices, that transform the vanilla Linux on a operating system able to meet the firm real-time requirements of telecommunications devices, even on small embedded systems. The target audience of this presentation is developers of embedded, real-time and telecommunication systems. It is desired an intermediate knowledge on hardware architecture and solid knowledge in operating systems (IRQ Handling, Scheduling, Real Time).


Daniel Bristot de Oliveira, Intelbras SA

Daniel Bristot de Oliveira is a Computer Scientist and currently is getting master degree in Engineering of Automation and Systems at the Federal University of Santa Catarina, where his research line is real-time operating systems. He is currently a software engineer at Intelbras, a Brazilian telecommunication devices factory, where he is responsible for the OS layer used in the development of embedded systems for telecommunication devices. His key skills are: Customization of the Linux Kernel, device drivers, Real-Time and low level network protocols. He lectured presentations on FISL (2007 and 2009), CONISLI (2006 and 2007), LinuxChix Brazil Meeting and others national and regional events in Brazil.

Linux 2.6.33

O Lançamento já foi a semana passada, mas só consegui achar um tempinho hoje…

Primeiro, dica para quem não conhece, o Kernel Newbies sempre faz um Changelog Human Readable de um release do kernel, o do .33 pode ser acessado em: http://kernelnewbies.org/Linux_2_6_33

Bom, Os drivers Nouveau, que são a novidade para os desktopinianos não são tão novidade assim, quem ja descompactou um srpm do kernel do Fedora iria ver uma penca de patchs do Nouveau… Para mim isto era um encomodo (ter o nouveau como patchs) isto porque a cada novo lançamento do patch RT eu tinha que fazer um merge entre o kernel vanilla + drivers nouveau + patch RT…
Não é de se espantar que estes drivers em grande parte sejam contribuição das Red Hat, e isto reforça mais ainda a minha opnião contrária as distribuições que só fazem uso das tecnologias Open Source… como o Ubuntu. Sinceramente, eu acompanho notícias diárias sobre Open Source e raramente vejo a Canonical ajudando algum projeto além de sí própria #Canonical = #Anti-OpenSource.

O DRBD Faz parte do kernel!!!!! Esta sim é uma ótima notícia. Me lembro de ter usado o DRBD em um cluster de alto desempenho, no cluster era feita a replicação de um sistema de arquivos em dois servidores HP DL350G5, estes servidores serviam imagens de instalação do sistema operacional na linha de produção de uma conhecida fábrica de computadores brasileira. Detalhe: Cada servidor possuia 9 (isto mesmo NOVE) interfaces de rede para poder dar a vasão necessária para as diversas máquinas fazendo donwload de imagem em paralelo. Na época fiquei com um pouco de receio de usar o DRBD, principalmente porque ele não era parte do kernel e sobre este eu rodava o sistema de arquivos GFS… Acho que esta feature vai alegrar muitos administradores de redes pelo mundo a fora.

Eu já havia lido este artigo sobre os SynCookies, Resumidamente, a idéia do SynCookie é tentar minimizar o consumo de recursos (principalmente memória) que um servidor precisa para armazenar os estados das conexões de redes, por exemplo, um ataque “SynFlood” distribuído pode causar um DDoS justamente pela falta de recursos no sistema operacional para manter o estado de toda estas novas conexões. Se você é um hacker de redes, aconselho a ler o aritigo.

Como eu não tenho nem um nintendo nem um game cube, não faz diferença se o Linux roda lá ou não hehehe… brincadeira 🙂

Para o mundo dos embarcados as boas notícias vem do mm, primeiro as páginas compartilhadas do KSM agora podem ir para o Swap, mas você deve estar se perguntando, com a baixíssima velocidade das memórias flash e o seu tempo de vida limitado pela quantidade de escrita, quem usa Swap em embarcados?

Com o compchache eu utilizaria. o Compcacge é uma das novas features do .33, com ele é possível criar um disco swap em ram (an? um disco de swap em RAM?) isto, só que as páginas do swap em RAM são compactadas, assim, provendo uma maneira de compactar as páginas menos utilizadas do embarcado, assim economizando ainda mais memória:

Imagine só, 10 executáveis compartilhando uma página que quando não utilizada fica em uma RAM compactada! Vou experimentar isto em um embarcado e postarei os resultados por aqui…

Além disto, os perfs foram portados para o ARM e por fim…

“Android removed from the Linux kernel”
Bom, com os acontecimentos dos últimos meses, cada dia levo-me a crer que o futuro dos celulares é usando o Linux puro, como no caso do Maemo, celulares da Motorola, o projeto do Linux da samsung que não me lembro o nome…
O Google pode ter um e-mail muito bom, um serviço de MAPS mara, mas com esta mania de dominar o mundo fazendo fork de tudo (como os Chrome*) acaba reinventado a roda, e em alguns casos se puxando para baixo pelos seu próprios cadarços…

Enfim! Seja bem vindo 2.6.33:

[daniel@darwin toolchain]$ uname -r
2.6.33-rt4

O que ando fazendo…

Nestas duas últimas semanas tenho tido bons trabalhos, o primeiro foi uma experiencia com Flash NAND e sistemas de arquivos para Flash. Nesta brincadeira fiz um “BacaSoftware” para formatar, escrever, ler, comparar flash e arquivos escritos direto na flash… ta, eu já sei que o mtd-utils faz isto, mas sabe… foi tao divertido… poxa deixa-me ser criança e brincar um pouco.

Sobre os sistemas de arquivos utilizei o UBIFS, e após muitas lidas na FAQ e um Patch fiz ele funcionar… O que valeu a pena, obtive mais de 30% de compactação dos arquivos na FLASH, isto utilizando o modo de compactação mais “performático”. Além disto gracas ao sistema de cache do sistema de arquivos as velocidades de leitura e gravação são muito boas, espero em breve fazer um melhor artigo sobre isto.

Outra coisa legal é que o patch RT para o 2.6.31.6 e o RT1 do 2.6.38-rc8 estão congelado em um kit de desenvolvimento ARM que utilizo… Depurando pude ver que isto acontece depois do asm_do_IRQ da interrupção do console serial. Em uma conversa no #linux-rt@OFTC o tglx me deu a dica de ser o terminal compartilhando o IRQ com o rtc, batata, era isto mesmo, a saída 1 seria trocar o IRQ do console para um diferente do utilizado pelo rtc… porém a AIC (advanced Interrupt controller) do embarcado não suporta isto… Bom, como não é novidade: Gostei 🙂 estou lendo todo o código de tratamento de IRQ do Linux, tanto normal quanto + rt… ainda a procura da solução…