Desenvolvimento

10 jan, 2013

e2fsck: Error allocating directory block array: falha na alocação de memória

Publicidade

Quando você faz um filecheck em uma grande partição em um sistema com memória RAM insuficiente, você pode encontrar o seguinte erro.

$ e2fsck -p -f /dev/vg_mnt/lv_mnt01
/dev/vg_mnt/lv_mnt01: Error allocating icount structure: Memory allocation failed
/dev/vg_mnt/lv_mnt01: Error allocating directory block array: Memory allocation failed
e2fsck: aborted

Isso acontece porque o e2fsck tenta armazenar todas as informações do inode na memória, o que pode exceder o tamanho da memória disponível no sistema.

Para corrigir isso, atualize o sistema com mais memória ou tente definir opções adicionais que permitem ao e2fsck criar um diretório temporário em um sistema com espaço livre em disco suficiente (vários GBs). Não que isso só funcione para a versão 1.40 do e2fsck ou superior (ou seja: os usuários CentOS e RHEL estão ferrados, uma vez que só fornecem a 1.39).

$ rpm -qa | grep e2fsprogs
e2fsprogs-libs-1.39-34.el5_8.1
e2fsprogs-devel-1.39-34.el5_8.1
e2fsprogs-1.39-34.el5_8.1

Para executar o e2fsck com uma versão recente, tente isto:

$ cd /usr/local/src
$ wget "http://kernel.org/pub/linux/kernel/people/tytso/e2fsprogs/v1.42.5/e2fsprogs-1.42.5.tar.gz"
$ tar xzf e2fsprogs-1.42.5.tar.gz
$ rm -f e2fsprogs-1.42.5.tar.gz
$ cd e2fsprogs-1.42.5
$ yum install gcc make
$ ./configure
$ make

O acima exposto irá baixar e2fsck (a versão mais recente), compilá-lo e fazê-lo, mas deixá-lo no diretório da compilação (/usr/local/src/e2fsck), ele não irá copiar os binários para o seu sistema. Isso significa que você pode usar o binário recém-compilado em /usr/local/src/e2fsprogs-1.42.5/e2fsck/e2fsckw.

Agora, desde que tenha uma versão e2fsck superior à 1.40, você pode definir as opções para usar um scratch-disk e evitar os erros de memória insuficiente. Primeiro, crie o diretório.

$ mkdir -p /var/cache/e2fsck

E crie um arquivo personalizado chamado /etc/e2fsck.conf que contenha o seguinte conteúdo.

$ cat /etc/e2fsck.conf 
[scratch_files]
directory = /var/cache/e2fsck

Isso diz para e2fsck usar um diretório no disco se o total de memória disponível for insuficiente para acolher todas as informações do inode da partição.

Se você tiver que fazer um novo e2fsck porque o sistema operacional não possui uma versão recente, inicie o e2fsck novo da seguinte forma.

$ /usr/local/src/e2fsprogs-1.42.5/e2fsck/e2fsck -f /dev/vg_mnt/lv_mnt01

Se você já tiver uma versão mais recente, pode simplesmente reiniciar e2fsck com o sistema binário.

$ e2fsck -f /dev/vg_mnt/lv_mnt01

Quando o novo e2fsck estiver sendo executado, você deverá ver informações adicionais aparecerem no cache do diretório.

$ ls /var/cache/e2fsck/
total 475M
-rw-------  1 root root 106M Aug  5 13:16 2fb8a70e-8ee3-4c9c-b95b-0e42ae1ecebd-dirinfo-jthsIm
-rw-------  1 root root 368M Aug  5 13:16 2fb8a70e-8ee3-4c9c-b95b-0e42ae1ecebd-icount-ZxFa0u

Se o diretório estiver vazio, o seu e2fsck não está usando as opções do scratch_files definidas em /etc/e2fsck.conf e, provavelmente, indica que ele está executando uma versão mais antiga que ainda não suporta isso. Veja os comandos de compilação acima para compilar a versão mais recente você mesmo.

***

Texto original disponível em http://mattiasgeniar.be/2012/08/05/e2fsck-error-allocating-directory-block-array-memory-allocation-failed/