Discuta este tópico no fórum

Se este conteúdo te ajudou, deixe um presente!

sábado, 11 de maio de 2013

OpenWRT: Configurando memória swap

Mais um artigo da série sobre o OpenWRT.

Como sempre, o limitador do que pode ser feito em um roteador com OpenWRT é o seu hardware. Quanto ao processador, não temos o que fazer mas, em geral, ele é suficiente, exceto se você quiser fazer transcoding de vídeo em tempo real (não, não dá para fazer no seu roteador). O disco é um dos problemas mais incômodos e já foi tratado em um outro post. Neste foi apresentar a alternativa para contornar a falta de memória RAM.

Se você leu o artigo sobre fazer download de torrents no roteador, pode estar enfrentando problemas com a falta de memória. O sintoma é de processos que desaparecem e avisos de "out of memory" nas mensagens do kernel (dmesg). Pessoalmente, não tive problemas com memória e torrent pois meu roteador tem 64 MB de RAM, o dobro do normalmente disponível em modelos anteriores. Porém, enfrentei a falta de memória ao utilizar um servidor DLNA, enquanto ele varria os arquivos de vídeo.

A solução para a pouca disponibilidade de memória é a mesma faz muito tempo: jogar informações menos usadas em uma memória mais lenta, como o disco. No Linux, chamados esta área em disco de memória swap, ou área de troca. Alguns também chamam de "memória virtual", mas não gosto do termo por confundir a técnica de utilizar endereçamento virtual para regiões de memória.

Para configurar a swap, em primeiro lugar, você precisa de um local para armazená-la. Ele pode ser um disco montado remotamente (NFS), uma unidade remota (NBD) ou simplesmente uma unidade de armazenamento conectada na USB. Nem pense em usar a swap na flash interna do roteador. Além de ser mais escaço que a própria memória RAM, ela não é feita para ser reescrita um grande número de vezes e, se der problema, não é facilmente substituível. Por isto, o primeiro passo é ter acesso a esta unidade externa.

A swap no Linux pode ser implementada em qualquer coisa que se assemelha, na filosofia UNIX, a um arquivo: um arquivo no sistema de arquivos, uma partição, um disco inteiro. A forma mais simples é utilizar uma partição dedicada para esta função.

Reparticione seu disco e deixe uma pequena partição para a swap. Faça com sua ferramenta de particionamento favorita (partition magic, gparted). Pode, inclusive, ser pequena, como 128 MB. Se quiser exagerar, 1 GB é muito mais do que o seu roteador um dia pensou em usar. O problema de ter muita memória swap é quando um processo se perde e começa a usar indefinidamente memória. Quanto maior a memória, mais tempo até o processo conseguir encher a memória e ser morto pelo kernel.

A partição tem que ter o identificador de uma partição swap. Em hexadecimal, é o valor 0x82. Isto é feito com as ferramentas de particionamento, mas pode também ser feito mais adiante com o fdisk, inclusive se instalado no roteador. A saída de um comando "fdisk -l" deve ter uma linha similar a em destaque abaixo:
   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1              63   123758591    61879264+   7  HPFS/NTFS/exFAT
/dev/sdb2       125853210  2928904191  1401525491    f  W95 Ext'd (LBA)
/dev/sdb3       123758592   125851647     1046528   82  Linux swap
Com a partição pronta e com a identificação correta, é o momento de "formatar" a partição. O formatar para uma partição swap é basicamente escrever uma assinatura no começo do disco. É bem rápido. Também é interessante definir o nome da partição, que pode ser usado para referenciá-la mais adiante (no exemplo, "minhaswap").
mkswap -L minhaswap /dev/sdb3
O /dev/sdb3 é o dispositivo da sua partição, como listado na saída do comando "fdisk -l". Para utilizar a swap no seu roteador, você precisará dos utilitários básicos para swap, como o mkswap. Instale o pacote swap-utils.
opkg updateopkg install swap-utils

Agora é a hora de testar a swap. Ative-a com o comando swapon:
swapon /dev/sdb3
Você poderá ver o espaço disponível pelo comando free:
# free             total         used         free       shared      buffersMem:         61700        60480         1220            0         1160-/+ buffers:              59320         2380Swap:      1046524        18884      1027640

Se a linha swap estiver zerada, não está funcionado. Caso contrário, você já estará usando sua nova swap. Contudo, esta configuração feita pelo swapon é volátil. Ao reiniciar o roteador, ela será perdida. Para ativar automaticamente, vamos usar o mesmo recurso que usamos para montagem de disco externo: o arquivo /etc/config/fstab. No arquivo, é possível configurar a montagem de uma swap. A configuração é um pouco mais simples do que partições de arquivos pois não precisa especificar onde será montada. Basta adicionar:
/etc/config/fstab:
config swap
option label "minhaswap"
option enabled 1

Note que o "label" é o mesmo que foi definido ao formatar a partição. Assim como o caso de uma partição de arquivos, também poderia referenciar o disco pela opção "device" ou "uuid". Alternativamente, existe também a opção autoswap, que ativará qualquer partição com identificação 0x82 e formatada como swap.

/etc/config/fstab: 
config global autoswap
option from_fstab 0
option anon_swap 1
Reinicie o roteador para garantir que tudo funciona após reiniciar. Observe se o espaço da swap estará disponível pelo comando free.

Pronto! Pode abusar de seu roteador que agora ele terá memoria extra, mas mais lenta, para suas tarefas.

Peraí, mas não quero mexer com partições! Tem como fazer com um arquivo simples? Tem sim. Em primeiro lugar, crie um arquivo com o tamanho da swap desejada. Use o dd para isto. O tamanho é passado pela opção "count" e é em blocos de 512. Sendo assim, por exemplo, escolha 2 par 1K, 2000 para 1M, 200000 para 100M, e assim por diante. Para uma swap de 50 MB, use:
dd if=/dev/zero of=/mnt/meudisco/swap count=100000
O arquivo /mnt/meudisco/swap deve ficar no disco externo e será, incialmente, completamente zerado. Vai demorar um pouco se for feito no roteador. Depois, você poderá usar os comandos "mkswap" e "swapon" diretamente sobre o arquivo:
mkswap /mnt/meudisco/swapswapon /mnt/meudisco/swap
O problema desta abordagem é que, por não poder usar o /etc/config/fstab, vai se perder ao reiniciar o roteador. Você precisará executar o swapon toda vez que o roteador foi ligado, ou colocar em alguns script como o "/etc/rc.local".

Até a próxima.

20 comentários:

  1. Olá, será que você poderia fazer um tutorial pra instalar o squid transparente? Muito bom os seus tutoriais.

    ResponderExcluir
    Respostas
    1. Olá Jônatas,

      Qual seria o uso do proxy transparente? Filtragem? Monitoramento? Cache?

      Excluir
  2. O objetivo principal seria utilizar cache e depois utilizar o SARG pra monitoramento.
    Eu até instalei o Squid, e percebi que as regras de redirecionamento da porta 80 para a 3128 é feito de uma forma diferente por causa da versão do iptables do OpenWrt. Deu uma olhada na documentação do OpenWrt e fiz, mas por alguma razão quando o squid ta rodando, a internet fica MUITO, MUITO lenta mesmo.

    Não sei por que razão.

    Bem .. a configuração do squid é a seguinte:

    http_port 3128 transparent
    visible_hostname bekaserver
    acl all src 0.0.0.0/0.0.0.0

    cache_mem 12 MB
    maximum_object_size_in_memory 64 KB
    maximum_object_size 100 MB
    minimum_object_size 0 KB
    cache_swap_low 90
    cache_swap_high 95
    cache_dir ufs /squid/spool/squid 400 16 256
    cache_access_log /squid/log/squid/access.log
    refresh_pattern ^ftp: 15 20% 2280
    refresh_pattern ^gopher: 15 0% 2280
    refresh_pattern . 15 20% 2280
    error_directory /usr/share/squid/errors/English
    cache_store_log /squid/log/store.log

    acl manager proto cache_object
    acl localhost src 127.0.0.1/32

    acl SSL_ports port 443 563
    acl Safe_ports port 80 # http
    acl Safe_ports port 21 # ftp
    acl Safe_ports port 1863 # MSN
    acl Safe_ports port 5223 # MSN
    acl Safe_ports port 443 563 # https, snews
    acl Safe_ports port 70 # gopher
    acl Safe_ports port 210 # wais
    acl Safe_ports port 1025-65535 # unregistered ports
    acl Safe_ports port 280 # http-mgmt
    acl Safe_ports port 488 # gss-http
    acl Safe_ports port 591 # filemaker
    acl Safe_ports port 777 # multiling http
    acl Safe_ports port 901 # SWAT
    acl purge method PURGE
    acl CONNECT method CONNECT


    http_access allow manager localhost
    http_access deny manager
    http_access allow purge localhost
    http_access deny purge
    http_access deny !Safe_ports
    http_access deny CONNECT !SSL_ports


    acl redelocal src 192.168.1.0/24

    http_access allow localhost
    http_access allow redelocal

    http_access deny all


    Informações adicionais:
    Roteador: TP-LINK WR1043ND.
    USB: Leitor de cartão microSD com um cartão de 2GB
    Partições: sda1 => /home (800MB) EXT4
    sda2 => 256MB Swap
    sda3 => /overlay (800MB) EXT4

    ResponderExcluir
  3. Na verdade a lentidão é na quando o redirecionamento está ativado e não quando o squid ta rodando, necessariamente.
    As regras de redirecionamento que foram inseridas foram essas (no /etc/config/firewall)

    config redirect
    option src lan
    option proto tcp
    option src_dport 80
    option dest_port 3128
    option dest_ip 192.168.1.1

    ResponderExcluir
    Respostas
    1. Estranho a lentidão somente quando em proxy transparente. Pode ser algo que não está funcionando bem e está esperando um timeout. Em geral, para roteadores, o squid pode ser um pouco maior que o necessário. As alternativas, tinyproxy e polipo devem ser mais econômicas.

      Sinceramente, proxy transparente não é lá muito útil. Todo o tráfego HTTPS passa direto. Mesmo o proxy como cache está cada vez menos interessante pois com conexões mais rápidas e com conteúdo cada vez mais dinâmico, você perde mais guardando a informação do que se acessasse diretamente. Hoje em dia, o proxy é mais usado somente para filtragem e monitoramento.

      Excluir
  4. To pensando em voltar para o DD-WRT, rodou bem no meu WR1043N mas reiniciava muito, talvez pela questão do swap. Mas pelo que andei vendo no wiki do DD-WRT parece que a nova versão já tem suporte à swap, você sabe alguma coisa em relação a isso?

    ResponderExcluir
    Respostas
    1. Pessoalmente nunca usei o DD-WRT. Ele possui uma arquitetura fechada que não se encaixava com o que eu queria fazer com o meu roteador. Por exemplo, até onde eu olhei, você não conseguia baixar o fonte e gerar uma imagem dd-wrt. O foco deles é outro. Essa história de "ativação", mesmo não necessária para o meu roteador, não é para mim. Também eles estão meio devagar em lançamentos. A última estável faz mais de 5 anos.

      Excluir
  5. Blz Luiz,
    Sou um curioso desse assunto, eu fiz as alterações no meu TP-LINK WR1043ND apenas lendo alguns tutos pela net; instalei um HD de 500gb, com 128mb swap, 512mb overlay e o resto para dados; instalei o torrent, samba, ddns, e gostaria de aprofundar ainda mais: instalei o pack minidlna mas não to conseguindo fazê-lo funcionar. Um amigo quer que eu faça a mesma coisa na casa dele, achou muito legal, e ele tem uma TV que queria acessar os baixados diretamente via dlna na TV.
    Um dia será que teremos aqui um tuto sobre isso? outra coisa também que tentei é o FTP, mas não sei por que só conseguia o acesso pela minha rede interna apenas, mas pela net necas... A propósito, muito legais os seus tutos.

    ResponderExcluir
    Respostas
    1. Anderson,

      DLNA está na fila. Eu já uso faz um tempo. E realmente é muito legal.

      Quanto ao FTP, o protocolo é um pouco chato para funcionar, principalmente a parte de firewall. Em modo normal o servidor tentará conectar no cliente para enviar os dados, coisa quase impossível com os NATs que existem por ai. No ativo, você terá uma porta dinâmica no servidor para liberar. Nunca usei mas tem um módulo do iptables (firewall do linux e, consequentemente, do openwrt) que pode ler a sessão do FTP e abrir dinamicamente esta porta. Contudo, o melhor mesmo é não usar o FTP.
      Para servidores, em geral, recomendo o SFTP, o WEBDAV ou o próprio SAMBA.

      O webdav é o mais "comum" e pois qualquer sistema operacional já tem cliente nativo (o windows que nunca tem nada já tem desde o win9x). É fácil de usar mas um pouco complicado de configurar, principalmente para o openwrt. Como o webdav é sobre um servidor HTTP, teria que trocar o nativo do openwrt ou colocá-lo em outra porta. Não sei se você teria espaço e memória para tanto.

      SAMBA também tem suporte de todos os SOs nativamente. Este terá o melhor desempenho de qualquer outro. A preocupação maior é com a segurança.

      O último, SFTP, é tão seguro quanto o SSH e já tem espera no dropbear (servidor SSH do OpenWRT). Só precisa instalar o servidor sftp do openssh. O problema é o espaço em disco. Ele, em si, é pequeno (22k) mas depende do libopenssl que tem 632k. Se no seu caso já tiver estendido a raiz usando o disco externo, não será problema. O pacote é "openssh-sftp-server". Ai você pode usar o filezilla, porta 22, que conecta numa boa. Vou escrever sobre isto no futuro...

      Excluir
    2. Beleza Luiz, vou aguardar. Vou também tentar o servidor ftp que mencionou.

      Excluir
  6. Boa tarde,

    Quando digito o comando fdisk -l aparece isso:

    http://oi41.tinypic.com/4vlm2x.jpg

    O que devo fazer???

    Obrigado.

    ResponderExcluir
    Respostas
    1. http://imageshack.us/a/img546/4431/eqsr.jpg

      Excluir
    2. Olá Anônimo,

      Os /dev/mtdblock* referem-se as "partições" da sua flash interna. Pode ignorá-las.
      O que você está interessado são em entradas do tipo /dev/sd* como esta:

      Disk /dev/sda: 128 MB, 128974848 bytes
      16 heads, 32 sectors/track, 492 cylinders, total 251904 sectors
      Units = sectors of 1 * 512 = 512 bytes
      Sector size (logical/physical): 512 bytes / 512 bytes
      I/O size (minimum/optimal): 512 bytes / 512 bytes
      Disk identifier: 0x445a2183

      Device Boot Start End Blocks Id System
      /dev/sda1 * 32 251903 125936 83 Linux


      Se não apareceu, seu disco externo não foi reconhecido.

      Excluir
  7. Opa.. apesar de não ter conseguido expandir o espaço interno pelo seu método, a parte da swap foi um sucesso.. agora vou para o seu próximo tutorial! (cronologicamente) Valeu!

    ResponderExcluir
    Respostas
    1. Willian,

      Sempre é bom ler feedback de sucesso. Obrigado.
      Contudo, sem mais espaço interno você não vai longe. Reveja os para expandir o disco com uma unidade externa.
      Abs,

      Excluir
  8. Você precisará executar o swapon toda vez que o roteador foi ligado, ou colocar em alguns script como o "/etc/rc.local".
    Sou muito crú no openWRT, Como seria este script Luiz? Obrigado

    ResponderExcluir
    Respostas
    1. Ivan, swapon é para habilitar manualmente em uma execução. O /etc/config/fstab faz este serviço para você.

      Excluir
    2. Ah, e existe o serviço fstab que lê o /etc/config/fstab.

      Este deve estar habilitado para disparar ao ligar o roteador.

      Excluir
    3. Amigo, poderia fazer um tutorial para open-wrt sendo utilizado em bridge repeater? Não consegui fazer funcionar sem utilizar ip fixo no PC. Meu router principal tem ip 192.168.1.1, fiz tudo certo, desativei o dhcp no open-wrt, coloquei ele em outra faixa 192.168.1.2 e mesmo assim não rolou. Já segui todos os tutoriais que encontrei e nada de funcionar. Att Alexandre

      Excluir
    4. Caro anônimo, já tem:

      http://luizluca.blogspot.com.br/2013/05/openwrt-utilizando-conexoes-wireless.html
      http://luizluca.blogspot.com.br/2013/05/openwrt-utilizando-conexoes-wireless_18.html

      Excluir