segunda-feira, 6 de agosto de 2012

Resolvendo o problema do arquivo "/proc/kcore"

Introdução
O arquivo /proc/kcore é uma referência da memória RAM no sistema Linux. Este arquivo possui o mesmo tamanho da memória RAM do computador, porém, ele não ocupa espaço em disco (é um arquivo virtual - como os arquivos de /proc). Em alguns casos, cuja identificação não foi descoberta, ao invés deste arquivo se portar como virtual, ele passa a ocupar espaço em disco. Como ele representa a memória, se estivermos trabalhando com um servidor de 4GB de RAM, somente este arquivo ocupará 4GB de RAM da partição na qual /proc foi montada (na partição /). Nas instalações Linux para servidores, é recomendado que algumas partições sejam criadas separadamente. Geralmente se cria uma pequena partição para o / (com 3 GB - ou menos), uma para /boot, uma para /usr, uma para /var, e outra para /home. Como nosso /proc estará incluído na partição / (que definimos com pouco espaço), se nosso arquivo /proc/kcore, ocupar espaço em disco (espaço igual à memória RAM), o vai acontecer?

Teremos 100% de espaço utilizado na partição /. Isso implica em vários problemas, inclusive impactando, em alguns casos, no travamento de alguns recursos do sistema.

Como resolver esse problema?
A administração do arquivo /proc/kcore é realizada nativamente pelo Kernel do Linux através do módulo "/proc/kcore support". Para resolvermos esse problema, será necessário recompilar o Kernel do Linux com essa opção desabilitada.

Onde podemos conseguir o Kernel?
Provavelmente sua instalação do SUSE já mantém uma versão atual da fonte do Kernel em /usr/src/linux. Caso contrário, realize o download do mais atual, de acordo com sua arquitetura, no site http://www.kernel.org

Procedimento para compilação do Kernel do Linux
OBS. Este procedimento foi realizado no SUSE, mas pode ser perfeitamente adaptado às outras distribuições.
Numa instalação padrão do SUSE, os pacotes e source necessário para a compilação já existem. Precisamos apenas realizar alguns procedimentos. Por default, o código fonte do Linux se encontra em /usr/src/linux, onde linux é um link simbólico para o diretório real do código fonte.
Acesse o diretório /usr/src/linux e execute o comando abaixo:

make menuconfig

Através do caminho abaixo, você poderá alterar o módulo "/proc/kcore support".

File systems -> Pseudo filesystems -> /proc/kcore support

Selecione o item respectivo e clique com a barra de espaços até que o * saia módulo.



Em seguida, clique em Exit, Exit, Exit.
Na pergunta “Do you wish to save your new Kernel configuration?”, responda Yes.

Caso você esteja compilando um Kernel de mesma versão, tome cuidado para não sobrescrever o diretório de módulos atual.
Os módulos estão guardados em “/lib/modules/versao_do_kernel”. Vamos renomear o diretório para que o mesmo não seja sobrescrito – isso só é necessário quando estivermos compilando um Kernel de mesma versão. Utilize o comando abaixo para a renomeação:
Atenção: se a versão do Kernel for distinta, não realize o comando abaixo.

mv /lib/modules/2.2.16 /lib/modules/2.2.16.old

Compilando o Kernel
Vamos agora ao processo de compilação. Dentro do diretório /usr/src/linux/, como usuário root, realize o seguinte comando:

make dep clean modules modules_install bzImage

Aguarde, pois este processo é demorado. Após a compilação, seu kernel foi salvo em:

usr/src/linux/arch/i386/boot/bzImage

Copie o arquivo conforme o comando abaixo:

cp -fr usr/src/linux/arch/i386/boot/bzImage /boot/vmlinuz_novo

Precisamos agora definir a configuração do GRUB (gerenciador de inicialização) para apontar para o novo Kernel. Nesta configuração é recomendado que se mantenha o caminho para o Kernel antigo, pois se houver falha na inicialização do Kernel novo, poderemos utilizar o Kernel antigo.
Para realizar essas alterações, modifique o arquivo /boot/grub/menu.lst
Na região delimitada para os sistemas instalados, acrescente as seguintes linhas:

title SUSE LES 10 (novo)
root (hd0,2)
kernel /vmlinuz_novo root=/dev/system_23880/LogVol1 vga=0x317 resume=/dev/system_23880/LogVol0 splash=silent showopts
initrd /initrd



Faça as devidas adaptações, configurando corretamente o disco/partição e nome do arquivo bzImage que foi copiado para boot – caso você tenha optado por outro nome diferente de vmlinuz_novo.

Possíveis problemas da compilação

Se o novo Kernel não carregar por problema nos módulos, você também poderá utilizar o diretório de módulos do Kernel antigo. Ou seja, ignore (renomeio como o mesmo nome acrescido de “.problem”) o diretório de módulos criado em “/lib/modules/”, e modifique o nome do diretório de módulos antigos para o nome do diretório de módulos que a compilação gerou. Para exemplificar melhor, vou mostrar a configuração que realizamos durante a resolução do problema no servidor Suse.
A versão do Kernel utilizada era a 2.6.16.21-0.8-smp. A compilação seria realizada com um Kernel de mesma versão, o que sobrescreveria o diretório /lib/modules/ 2.6.16.21-0.8-smp. Neste caso, renomeamos o mesmo com o seguinte comando:

mv /lib/modules/ 2.6.16.21-0.8-smp /lib/modules/ 2.6.16.21-0.8-smp.old


Após a compilação, um novo diretório /lib/modules/ 2.6.16.21-0.8-smp foi criado. Porém, ao inicializarmos o sistema (já com o novo bzImage), o mesmo informou a falta de disponibilidade de alguns módulos necessários para o sistema. Neste caso, o Kernel antigo não pode ser iniciado, pois seus verdadeiros módulos estavam em “/lib/modules/ 2.6.16.21-0.8-smp.old”, porém ele faria uma busca em “/lib/modules/ 2.6.16.21-0.8-smp” - o diretório de módulos com problema. Reiniciamos o micro com o mode de recuperação (através do DVD de instalação) e realizamos o seguinte procedimento:

mv /lib/modules/ 2.6.16.21-0.8-smp /lib/modules/ 2.6.16.21-0.8-smp.problem
mv /lib/modules/ 2.6.16.21-0.8-smp.old /lib/modules/ 2.6.16.21-0.8-smp


Nesta configuração, ambos os Kernels estariam usando o mesmo diretório de módulos. Isso não impactaria no “/proc/kcore” pois o mesmo não foi configurado como módulo, e sim retirado do núcleo do sistema.
Após reiniciar o servidor com o novo Kernel, os módulos foram carregados com sucesso, e o arquivo /proc/kcore não estava mais disponível.

Referências:
http://www.freeos.com/articles/2589/

Obrigado pela leitura.

Nenhum comentário:

Postar um comentário