Ativando zram no Slackware


Aproveitando os posts anteriores sobre zram, aqui veremos como ativá-lo no Slackware.

Por: Leandro Nkz

Sobre o zram: http://en.wikipedia.org/wiki/Zram

Instalação no Debian Wheezy: https://edpsblog.wordpress.com/2013/10/19/systemd-zram-no-debian-wheezy/

No Arch Linux: https://edpsblog.wordpress.com/2013/10/20/zram-no-arch-linux/

E no Sabayon:

https://edpsblog.wordpress.com/2014/05/09/usando-zram-em-sabayon/
https://edpsblog.wordpress.com/2014/06/05/testes-iniciais-com-zram-em-sabayon-linux/

No Slackware, o módulo zram não está habilitado por padrão, pelo menos no Slackware current 64 bits. Portanto, tive de habilitá-lo diretamente na configuração do kernel.

Antes de começar, cheque se o suporte ao zram não está habilitado, com o comando:

# modprobe zram

Ou:

# modinfo zram

Se retornar uma mensagem dizendo “Module zram not found”. Significa que o suporte não está ativo.
Mas se o módulo já estiver habilitado, sorte sua, pule para o passo “Configurando o zram”.

 

Habilitando o módulo.

Pois bem, se o seu kernel não oferece suporte ao zram, você deve recompilá-lo habilitando o módulo.
Para isso, execute os passos:

Instale o pacote kernel-source:

# slackpkg install kernel-source

Obs.: este pacote oferece o source original do kernel Linux, sem alterações. Optei por utilizá-lo para manter a mesma configuração do kernel “oficial” do Slackware. Desse modo, evita-se imprevistos com alterações entre as versões.

OK. Ao instalar este pacote, ele irá instalar os sources do kernel Linux na pasta /usr/src/linux. Vamos até lá:

# cd /usr/src/linux

Comece “limpando” os sources:

# make mrproper

Agora, copie a configuração do kernel atualmente em uso:

Para quem usa o kernel huge:

# cp /boot/config-huge-3.14.5 .config

Para quem usa o kernel generic:

# cp /boot/config-generic-3.14.5 .config

Obs.: modifique o número “3.14.5” para a versão do seu kernel.

Atualize a configuração:

# make oldconfig

Se aparecerem perguntas, você pode optar por aceitar a opção padrão teclando enter em todas elas.

Agora, execute o assistente de configuração para habilitarmos o módulo:

# make menuconfig

A primeira tela será:

1-zram_slackwareNela, selecione a opção “Processor type and features” e tecle Enter.

Na próxima tela, habilite o campo “Memory allocator for compressed pages”, teclando Y:

2-zram_slackwareVolte à tela principal teclando Esc duas vezes. Agora, escolha a opção “Device Drivers”:

3-zram_slackwareDepois entre na seção “Block devices”:

4-zram_slackwareE habilite a opção “Compressed RAM block device support”, teclando M:

5-zram_slackwareEstas configurações irão habilitar o zram como um módulo no kernel.

Agora uma configuração extra que recomendo: alterar o nome da release do seu kernel. Como estamos compilando um kernel da mesma versão que o kernel em uso e não queremos substituí-lo, devemos alterar o nome para que não ocorram conflitos entre os diretórios dos módulos.

Por exemplo, o kernel que utilizo (3.14.5) possui os módulos em /lib/modules/3.14.5. Se eu compilar um novo kernel desta mesma versão, ele irá sobrescrever o diretório /lib/modules/3.14.5 com os novos módulos. Ou seja, o kernel antigo pode não funcionar se você precisar dele mais tarde.

Para minimizar isso, vamos acrescentar algum nome à release do kernel que estamos compilando. Na tela inicial do assistente de configuração, selecione a opção “General setup”:

6-zram_slackwareE depois “Local version – append to kernel release”:

7-zram_slackwareEscolha algum nome para acrescentar ao seu kernel e tecle Enter:

8-zram_slackwareComo escolhi acrescentar o “-zram”, a release deste kernel ficará nomeada assim: “3.14.5-zram”.

Para finalizar a configuração, selecione a opção “Save” e saia do assistente selecionando “Exit”.

Por fim, compile o novo kernel:

# make -j5 bzImage modules

Obs.: a opção “-j” determina o número de processos em paralelo que a compilação do kernel será dividida. É útil para tornar a compilação mais rápida em processadores com mais de um núcleo. Eu recomendo defini-la com o valor de: quantidade de núcleos + 1. Para saber a quantidade de núcleos do seu processador, execute o comando:

$ lscpu

Na linha “CPU(s)” está especificada a quantidade de núcleos do seu processador. Um exemplo em um processador Core i5 M450 (que possui dois núcleos físicos mais dois “simulados”):

$ lscpu

Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                4
On-line CPU(s) list:   0-3
Thread(s) per core:    2
Core(s) per socket:    2
Socket(s):             1
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 37
Stepping:              5
CPU MHz:               2400.000
BogoMIPS:              4787.53
Virtualization:        VT-x
L1d cache:             32K
L1i cache:             32K
L2 cache:              256K
L3 cache:              3072K

Após o término da compilação (que pode demorar dependendo do seu processador e da configuração do kernel – huge x generic), instale os módulos com o comando:

# make modules_install

E copie a imagem gerada para o diretório /boot:

# cp arch/x86/boot/bzImage /boot/vmlinuz-3.14.5-zram
# cp System.map /boot/System.map-3.14.5-zram
# cp .config /boot/config-3.14.5-zram

Obs.: certifique-se de que a release está correta. Você pode conferir com o comando:

# make kernelrelease

Se você utilizou a configuração do kernel generic, não se esqueça de gerar o initrd.gz deste kernel. Utilize o script “mkinitrd_command_generator.sh“:

# /usr/share/mkinitrd/mkinitrd_command_generator.sh -k 3.14.5-zram  # Não se esqueça de especificar a release correta

Ele irá retornar o comando adequado para a geração do initrd. Exemplo:

# /usr/share/mkinitrd/mkinitrd_command_generator.sh -k 3.14.5-zram

#
# mkinitrd_command_generator.sh revision 1.45
#
# This script will now make a recommendation about the command to use
# in case you require an initrd image to boot a kernel that does not
# have support for your storage or root filesystem built in
# (such as the Slackware ‘generic’ kernels’).
# A suitable ‘mkinitrd’ command will be:

mkinitrd -c -k 3.14.5-zram -f ext4 -r /dev/sda2 -m mbcache:jbd2:ext4 -u -o /boot/initrd.gz

Agora basta copiá-lo e executá-lo:

# mkinitrd -c -k 3.14.5-zram -f ext4 -r /dev/sda2 -m mbcache:jbd2:ext4 -u -o /boot/initrd.gz-3.14.5-zram

Obs.: altere o nome do initrd.gz para que ele não sobrescreva o initrd do kernel generic.

Para finalizar, insira as entradas no arquivo /etc/lilo.conf:

Para o kernel huge:

image = /boot/vmlinuz-3.14.5-zram
root = /dev/sda2  # Altere de acordo com a partição de instalação
label = Slackware-zram
read-only

Para o kernel generic:

image = /boot/vmlinuz-3.14.5-zram
initrd = /boot/initrd.gz-3.14.5-zram # Acrescenta-se o initrd
root = /dev/sda2  # Altere de acordo com a partição de instalação
label = Slackware-zram
read-only

Atualize o LILO e reinicie:

# lilo
# reboot

Após dar boot pelo novo kernel, verifique se o módulo foi habilitado corretamente:

# modprobe zram

Ou:

# modinfo zram

Se não aparecerem mensagens de erro, sucesso!

Configurando o zram.

Esta parte é mais rápida, há um script desenvolvido por Andrei Gliga disponível aqui que faz todo o trabalho.

Basta criar o arquivo /etc/rc.d/rc.zram com o seguinte conteúdo:

#!/bin/bash
# Script to start zRam (Virtual Swap Compressed in RAM)
# https://github.com/otzy007/enable-zRam-in-Slackware
#
# Size of swap space in MB
# default 1GB
SIZE=1024

start() {
modprobe zram
echo $SIZE*1024*1024 | bc > /sys/block/zram0/disksize
mkswap /dev/zram0
swapon -p 50 /dev/zram0
}

stop() {
swapoff /dev/zram0
}

case "$1" in
start)
start
;;

stop)
stop
;;

restart)
echo 1 > /sys/block/zram0/reset
;;

*)
echo "Usage: $0 (start|stop|restart)"
esac

Dê permissão de execução:

# chmod +x /etc/rc.d/rc.zram

E adicione as linhas no arquivo /etc/rc.d/rc.local para que o script inicie no boot:

#Iniciando zram
if [ -x /etc/rc.d/rc.zram ] ; then
/etc/rc.d/rc.zram start
fi

Observações:

  • Por padrão ele irá disponibilizar 1 GB, se quiser mudar, altere a linha “SIZE” como preferir.
  • Eu alterei o script, acrescentando o parâmetro “-p 50” na linha que ativa a nova área swap (swapon). Este parâmetro atribui a prioridade 50 à nova área criada, fazendo com que o sistema dê prioridade a ela em detrimento à alguma outra swap que esteja habilitada. Assim, o sistema usará primeiro a área swap do zram, e quando esta estiver esgotada, ele irá buscar a área swap no disco (se houver).

Por fim, execute o comando:

# /etc/rc.d/rc.zram start

E pronto, zram ativado.

 

Um screenshot do sistema em uso:

9-zram_slackware

  • 4 GB de RAM (3.74 GB “usável”);
  • zram utilizando 1 GB;
  • Swap no disco (/dev/sda3) de 3 GB;
  • Nível de swapiness em 70;
  • Programas abertos:
  • VirtualBox executando: Windows 7 (argh!), Ubuntu 12.04 e o saudoso Conectiva 6.0.
  • Firefox com um vídeo do YouTube executando;
  • GIMP;
  • LibreOffice Writer;
  • E outros menores: lxterminal, Genymotion e Thunar.

 

Notas finais:

  • Reparem no consumo de memória RAM (3344 de 3744 MB) e nas partições swap (zram com 671 MB e /dev/sda3 vazia).
  • O sistema só passará a utilizar a partição swap do disco (/dev/sda3) quando o dispositivo criado pelo zram estiver cheio devido à maior prioridade atribuída ao zram.
  • Manter uma partição swap no disco é útil para quem usa o recurso de hibernação (como o zram utiliza a memória RAM para criar a partição swap, a hibernação não funcionará).

 

Referências:

 

Até a próxima!

 

 

Ativando zram no Slackware

2 comentários sobre “Ativando zram no Slackware

Deixe um comentário