Funcionamento Kernel
Funcionamento Kernel
Funcionamento Kernel
Ao procurar a definio da palavra "Kernel" em um dicionrio (ingls/ingls) percebi que ele deu nfase ao seguinte ponto: The most important part of a statement, idea, plan, etc e tambm a very small part or amount of something. A partir daqui j temos uma idia de que algo muito importante, pois mesmo sendo muito pequeno o kernel o cara que gerencia a interface de comunicao entre o hardware o os programas instalados no computador. Quando falamos do Linux estamos falando exclusivamente deste kernel, todo o resto como gnome, firefox e at mesmo o bash tratam-se apenas de programas que rodam no Linux e no fazem parte do Sistema Operacional (kernel linux).
Entendendo o kernel
OK, mas oque exatamente faz esse tal de kernel? A figura a seguir mostra de uma forma geral como o kernel disponibiliza servio para os aplicativos rodando atravs de inmeros pontos de entrada conhecidas como chamadas de sistema (system calls).
O kernel utiliza chamadas de sistema como leitura e escrita pra prover acesso ao hardware. Do ponto de vista de um programador isso parece uma funo comun, embora na realidade uma chamada de sistema envolva diferentes interruptores no modo de operao do "kernel space" para o "user space" Juntos esse conjunto de chamadas de sistema formam uma especie de "maquina virtual" que trabalha antes do hardware real. Um exemplo claro disso o sistema de arquivos.
Kernel Modular
Agora que entendemos melhor o que o kernel faz, vamos olhar mais atentamente a sua organizao fsica. As primeiras verses do kernel eram monolticas, ou seja, todos os mdulos estavam compilados dentro de um nico arquivo executavel. O kernel das distribuies mais novas so modulares, ou seja, os mdulos podem ser carregados no kernel em tempo de execuo, isso faz com que o ncleo do kernel fique menor e no seja necessrio reiniciar a maquina para carregar ou substituir novos mdulos. O ncleo do kernel carregado na memria na hora do boot e lido de um arquivo no diretrio /boot na maioria das vezes este arquivo chamado de vmlinuz-VERSO_DO_KERNEL. Para ver a verso do kernel corrente utilize o comando: --#uname -r --Os mdulos ficam no diretrio /lib/modules/VERSO_DO_KERNEL/
Gerenciando mdulos.
Veremos agora alguns comandos para gerenciar os mdulos do seu kernel, como por exemplo o comando para listar os mdulos carregados que o lsmod, o lsmod vai te mostrar uma sada semelhante a esta: --Module vfat isofs fat nfs lockd nfs_acl sunrpc bridge tun usb_storage libusual --Size Used by 14464 0 36388 0 54556 1 vfat 262540 0 67720 1 nfs 4608 1 nfs 185500 5 nfs,lockd,nfs_acl 55576 0 12672 0 73792 4 19236 1 usb_storage
Esta sada possui quatro campos divididos por nome do mdulo que esta carregado, o tamanho do mdulo, quantas vezes ele esta sendo utilizado e quais os mdulos que dependem dele. Podemos carregar um mdulo utilizando o comando modprobe (podemos tambm utilizar o comando insmod porm o modprobe mais aconselhavel pois ele resolver as dependencias do mdulo). Outro ponto muito importante na sada do comando lsmod o terceiro campo que indica a quantidade de vezes que o mdulo esta sendo utilizado pois o linux no vai permitir a remoo de um mdulo cujo o campo used seja diferente de zero, no exemplo acima vemos o mdulo isofs (utilizado para dar suporte ao sistema de arquivos ISO que utilizado em Cds) com o campo used 0 neste caso podemos remover o mdulo com o comando modprobe -r isofs, aps executar este comando o mdulo isofs no vai aparecer mais quando executarmos o lsmod. No muito comum carregar mdulos manualmente no dia a dia, porm se voc precisar carregar um mdulo manualmente voc pode incluir parmetros especficos de cada mdulo para carrega-lo, como no exemplo a seguir:
--modprobe usb_storage delay_use:3 --No exemplo supra-citado habilitamos o parmetro delay_use:3 para o mdulo usb_storage que define um time-out de 3 segundos para o mdulo procurar um novo device. Para saber quais as opes de cada mdulo utilizamos o comando modinfo como no exemplo a seguir: --# modinfo usb_storage filename: /lib/modules/2.6.24-23-generic/kernel/drivers/usb/storage/usb-storage.ko license: GPL description: USB Mass Storage driver for Linux author: Matthew Dharm <[email protected]> srcversion: 99E0EB653929DE200DF6AF9 depends: libusual,usbcore,scsi_mod vermagic: 2.6.24-23-generic SMP mod_unload 586 parm: delay_use:seconds to delay before using a new device (uint) --A linha que nos interessa neste caso a que comea com param que mostra os parmetros aceitos pelo mdulo. Caso voc possua a source do kernel voc tambm pode encontrar uma documentao muito til em /usr/src/VERSO_DO_KERNEL/Documentation/kernelparameters.txt
Pronto agora o encaminhamento de pacotes IP esta habilitado, fcil n? Outro comando que tambm pode ser utilizado para executar a mesma tarefa o sysctl como no exemplo a seguir: --#sysctl net.ipv4.ip_forward net.ipv4.ip_forward = 0 --No exemplo acima utilizamos o comando sysctl para ver o valor do ip_forward, para alterar este valor utilizamos o comando sysctl com as seguintes opes: --#sysctl -w net.ipv4.ip_forward = 1 --Porm tem um pequeno problema aqui, se reiniciarmos a maquina este arquivo voltara a ter contedo igual a 0 (zero). E como solucionamos isso? A soluo e muito fcil utilizamos o arquivo /etc/sysctl.conf para definir os valores que sero configurados na hora do boot, ento basta acrescentarmos a linha net.ipv4.ip_forward = 1 no arquivo sysctl.conf.
Melhorando a performance.
Muitos dos parmetros do /proc/sys que permitem escrita podem ser utilizados para melhorar a performance do Linux, apesar de que a configurao padro j habilite opes que trabalham muito bem. Um exemplo de como podemos modificar o kernel para melhorar a performance de acordo com o tipo de aplicao que voc vai utilizar esta no guia de instalao do Oracle 10g (http://www.oracle.com/technology/obe/obe10gdb/install/linuxpreinst/linuxpreinst.htm) que pede pra voc configurar alguns parmetros como o kernel.shmmax=2147483648 que define o tamanho mximo de segmento de memria partilhada para 2GB. (Memria partilhada um mecanismo de comunicao entre processos que permite que um segmento de memria de ser visvel dentro do espao de endereamento de mltiplos processos.) Outra modificao que podemos fazer e definir que nossa mquina no vai responder por broadcast de icmp (o bom e velho ping -b 255.255.255.255) configurando o sysctl da seguinte forma: --sysctl -w net.ipv4.icmp_echo_ignore_broadcasts=1 --Agora fica a seguinte dvida, pra ver os valores eu vou ter que dar cat de arquivo em arquivo ou saber todos os caminhos do comando sysctl? Claro que no, basta utilizar o comando --sysctl -a --..que ele vai exibir todos os parmetros e seu valores porm ele no fala pra que serve cada um deles porm isso podemos encontrar os detalhes no bom e velho man proc Ta vendo, o kernel no aquele bicho de sete cabeas que muitos imaginam....rsrsr By CleBeer.... [email protected] clebeerpub.blogspot.com