Mini2440 — Montando rootfs no Linux via NFS

- por Sergio Prado

Categorias: Ferramentas, Linux embarcado, Mini2440, Protocolos e Padrões Tags: , ,

Em todo processo de desen­volvi­mento de soft­ware temos basi­ca­mente os seguintes passos:

Cod­i­ficar -> Com­pi­lar -> Tes­tar

Porém, quando esta­mos desen­vol­vendo uma apli­cação que será com­pi­lada em uma plataforma mas exe­cu­tada em outra, entre as eta­pas de com­pi­lação e teste existe mais uma, respon­sável pela trans­fer­ên­cia da apli­cação (ou binário) da máquina de desen­volvi­mento (host) para a plataforma alvo (target):

Cod­i­ficar -> Com­pi­lar -> Tran­ferir -> Testar

Esta etapa é comum em sis­temas embar­ca­dos. E é crítica, pois depen­dendo do mecan­ismo uti­lizado, pode con­sumir um bom tempo do processo de desenvolvimento.

Me lem­bro que uns 10 anos atrás, quando ainda estava ini­ciando na área de soft­ware embar­cado, eu tra­bal­hava com um equipa­mento de automação que uti­lizava uma EPROM como memória de programa.

A EPROM é uma memória de ape­nas leitura, mas que pode ser apa­gada através da incidên­cia de luz ultra­vi­o­leta em uma janelinha pequena situ­ada na parte supe­rior do chip:

eproms Mini2440   Montando rootfs no Linux via NFS

A vida nesta época não era fácil. Não tín­hamos uma fer­ra­menta de debug decente. Para cada sim­ples alter­ação no código, tín­hamos que apa­gar uma EPROM e gravar o novo binário para tes­tar. Este processo de com­pi­lar, gerar o binário, apa­gar a EPROM e gravar a imagem podia levar até 30 min­u­tos, depen­dendo do tamanho do pro­grama. Cada mudança no código pre­cisava então ser muito bem pen­sada para que o processo de gravação do binário na memória não tomasse muito tempo durante o desen­volvi­mento da aplicação.

Já hoje este processo ficou muito mais sim­ples, rápido e fácil. Com a evolução das memórias flash e das fer­ra­men­tas de debug, con­seguimos car­regar a apli­cação na memória facil­mente via conexões JTAG, RS232 ou Eth­er­net. Temos a opção de tra­bal­har com fer­ra­men­tas disponi­bi­lizadas pelos fab­ri­cantes (gravar na flash via ser­ial ou JTAG, por exem­plo), ou então podemos aproveitar as fun­cional­i­dades disponi­bi­lizadas pelo sis­tema opera­cional que esta­mos utilizando.

O Linux facilita este processo para nós. Através de uma conexão em rede com nossa plataforma alvo, podemos copiar o arquivo alter­ado para o rootfs do equipa­mento usando fer­ra­men­tas de rede como o ssh ou o ftp.

Um outro mecan­ismo, tam­bém muito uti­lizado no desen­volvi­mento de sis­temas embar­ca­dos com Linux, é mon­tar o sis­tema de arquivos (rootfs) remo­ta­mente através do pro­to­colo NFS (Net­work File Sys­tem).

Desta forma, o sis­tema de arquivos da plataforma alvo fica na máquina de desen­volvi­mento. No boot do equipa­mento o ker­nel irá bus­car na rede e mon­tar remo­ta­mente o sis­tema de arquivos através do pro­to­colo NFS.

Este processo facilita o desen­volvi­mento, já que qual­quer alter­ação que fiz­er­mos no sis­tema de arquivos con­fig­u­rado da máquina de desen­volvi­mento será refletido no equipamento.

Vamos ver então como con­fig­u­rar uma máquina de desen­volvi­mento com Linux e o kit Friendl­yARM mini2440 para tra­bal­har com um sis­tema de arquivos em rede.

Estas serão as con­fig­u­rações bási­cas que utilizaremos:

  • IP do host (máquina de desen­volvi­mento): 10.0.0.1
  • IP do tar­get (mini2440): 10.0.0.2
  • Local do sis­tema de arquivos: /home/mini2440/rootfs

Todos os coman­dos que ver­e­mos a seguir serão basea­dos nes­tas con­fig­u­rações. Mude se achar necessário.

CONFIGURANDO O PC COM LINUX

Con­fig­ure a inter­face de rede conec­tada à mini2440 (no meu caso estou usando a inter­face eth1, mude se necessário):

sudo ifconfig eth1 10.0.0.1

Instale e con­fig­ure o servi­dor NFS com os coman­dos abaixo (estou usando o geren­ci­ador de pacotes do Ubuntu, por­tanto adapte os coman­dos ao seu sistema):

sudo apt-get install nfs-kernel-server portmap
sudo chmod a+w /etc/exports
sudo echo -e "\n/home/mini2440/rootfs 10.0.0.2(rw,no_root_squash,sync)\n" >> /etc/exports
sudo /etc/init.d/portmap restart
sudo /etc/init.d/nfs-kernel-server restart

Pre­cis­are­mos disponi­bi­lizar o sis­tema de arquivos no diretório “/home/mini2440/rootfs”. Para isso, você pode gerar um rootfs com o Buil­d­root (expliquei isso aqui). A imagem será ger­ada den­tro do diretório do Buil­d­root em “output/images/rootfs.ext2″. Você pode mon­tar este arquivo “rootfs.ext2″ com comando abaixo:

sudo mount -o loop rootfs.ext2 /home/mini2440/rootfs

Se você não quiser gerar um rootfs do zero, pode tam­bém uti­lizar um já disponível como o do Emde­bian que usei neste artigo aqui. Lembre-se de descompactá-lo no diretório que defin­i­mos “/home/mini2440/rootfs”.

CONFIGURANDO O KIT MINI2440

Ini­cie a placa pelo U-boot (se seu kit não tiver o U-boot insta­l­ado veja como fazer isso neste artigo aqui), e exe­cute os coman­dos abaixo:

setenv serverip 10.0.0.1
setenv ipaddr 10.0.0.2
setenv bootargs mini2440=0tb console=ttySAC0,115200 ip=10.0.0.2 root=/dev/nfs rw nfsroot=10.0.0.1:/home/mini2440/rootfs
saveenv

TESTANDO

Para tes­tar a conexão de rede, dig­ite na linha de comando do U-boot “ping 10.0.0.1″ e veja se recebe a resposta “host 10.0.0.1 is alive”. Se não rece­ber, reveja suas conexões de rede.

Reini­cie o equipa­mento e veja na con­sole o ker­nel mon­tando o rootfs remo­ta­mente. Acesse a con­sole com usuário “root” e senha vazia. Agora, para qual­quer alter­ação que você quiser fazer no equipa­mento, basta atu­alizar os arquivos no diretório “/home/mini2440/rootfs” na sua máquina de desenvolvimento.

Fácil, não?

Um abraço e até a próxima!

Ser­gio Prado

  • Mar­cos

    Muito legal Ser­gio os seus arti­gos sobre esse kit. Estou pen­sando em com­prar um pelo ebay e uti­lizar aqui. Vc con­hece alguém que venda ele direto aqui no brasil?
    abraço marcos.

    • http://sergioprado.org ser­gio­prado

      Olá Mar­cos,

      Infe­liz­mente não con­heço nen­hum fornece­dor no Brasil. Eu tam­bém com­prei pelo ebay. Demora um pouco para chegar, mas é con­fiável. E fica mais barato.

      Abraços!

  • Marcelo Jo

      Olá Sér­gio!
      Pois é.. lem­bro tam­bém que usei um micro­con­tro­lador da Motorola com uma eprom… putz… era um saco esperar tanto tempo pra apa­gar! Hoje a gente com­pila e grava um micro­con­tro­lador 1000x mais do que antes! =D
      Aliás, ótimo artigo e con­tinue postando!
      Abraços
      Marcelo

  • Diogo Luvi­zon

    Muito bom post, facilita a vida!
    Só uma dúvida: se no futuro for de inter­esse, como faço para copiar este sis­tema de arquivos defin­i­ti­va­mente para a placa?
    Abraço!

    • http://sergioprado.org ser­gio­prado

      Olá Diogo,

      Lembre-se de que mon­ta­mos o rootfs através de um arquivo (rootfs.ext2). Qual­quer alter­ação que você fizer neste rootfs, será refletido na imagem do arquivo. Depois que você desmon­tar este arquivo, o mesmo estará pronto para ser gravado na flash.

      Agora, se você tiver um rootfs em um local qual­quer, e quiser convertê-lo para gravar na flash, pode exe­cu­tar os coman­dos abaixo, que irão criar uma imagem do rootfs baseada no diretório “origem” que você pas­sar como parâmentro:

      dd if=/dev/zero of=foo.img bs=1k count=2000
      mke2fs –f rootfs.img
      mount –o loop rootfs.img /mnt
      cp –ar /source /mnt
      umount /mnt

      Ajuste os coman­dos de acordo com seus diretórios.

      Um abraço!

  • http://www.polaticus.com.br Jefer­son da Luz

    Ser­gio

    No artigo que vc ensina a enviar a imagem do emde­bian via tftp, é envi­ado para uma memo­ria RAM, certo
    Agora, criei uma imagem de 800 mb, pois minha NAND é de 1GB, neste caso, como posso fazer para enviar, pois excede o tamanho da RAM
     
    Abraço

  • http://sergioprado.org ser­gio­prado

    Olá Jef­fer­son,

    Nunca testei, mas acho que dá para fazer usando um pen­drive pela USB ou um cartão SD. Este os coman­dos do U-boot e veja se funciona.

    Abraços!

  • Gutem­berg

    Olá Ser­gio,
    Exce­lente blog!
    Gostaria de deixar reg­istrado um prob­lema que eu encon­trei ao ten­tar mon­tar o rootfs através do nfs no Arch Linux.
    ERRO do ker­nel ao mon­tar o rootfs:
    Root-NFS: Server returned error –93 while mount­ing /files
    VFS: Unable to mount root fs via NFS, try­ing floppy.
    VFS: Can­not open root device “nfs” or unknown-block(2,0)
    Please append a cor­rect “root=” boot option; here are the avail­able par­ti­tions:
    1f00        256 mtdblock0 (dri­ver?)
    1f01        128 mtdblock1 (dri­ver?)
    1f02       5120 mtdblock2 (dri­ver?)
    1f03     125568 mtdblock3 (dri­ver?)
    Ker­nel panic — not sync­ing: VFS: Unable to mount root fs on unknown-block(2,0)
    o erro –93 é: EPROTONOSUPPORT.
    Prob­lema de ver­são do nfs.
    A solução foi pas­sar a opção “v3” no vari­avel bootargs do uboot.
    setenv bootargs mini2440=0tb console=ttySAC0,115200 ip=10.0.0.2 root=/dev/nfs rw nfsroot=10.0.0.1:/files,v3
    Abraço.
     

    • http://sergioprado.org ser­gio­prado

      Valeu pela dica Gutemberg!

      Um abraço.

  • Diego Perez

     
    Boa tarde,
    Estou ten­tando mon­tar o sis­tema de arquivo no PC para facil­i­tar o desen­volvi­mento porem quando tenta conec­tar com o PC para car­regar o sis­tema de arquivo ele para no seguinte comando abaixo e depois aparece Ker­nel panic.
    Look­ing up port of RPC 100003/2 on 10.0.0.1
    rpcbind: server 10.0.0.1 not respond­ing, timed out
    Root-NFS: Unable to get nfsd port num­ber from server, using default
    Look­ing up port of RPC 100005/1 on 10.0.0.1
    Como resolver este prob­lema?
     
    Abraço

    • http://sergioprado.org ser­gio­prado

      Olá Diego,

      Me parece que a placa não esta con­seguindo se comu­nicar com o servi­dor NFS. No menu do U-Boot você con­segue pin­gar o 10.0.0.1? Se não con­seguir, tem alguma coisa de errado com sua rede. Se con­seguir, é porque seu servi­dor NFS não esta rodando corretamente.

      Um abraço.

  • Cleoner Pietra­longa

    Boa tarde Serjo
    Estou ten­tando mon­tar a imagem emdebian-jffs2.img disponi­bi­lizado no arquivo
    uboot-emdebian.tar.gz, usei o comando:
     
    sudo mount –o loop emdebian-jffs2.img /mnt/rootfs e o resul­tado foi:
    mount: você pre­cisa especi­ficar o tipo do sis­tema de arquivos
     
    depois: sudo mount –o loop –t jffs2 emdebian-jffs2.img /mnt/rootfs e o resul­tado foi
    mount: wrong fs type, bad option, bad superblock on /dev/loop0,
    miss­ing code­page or helper pro­gram, or other error
     
    Tem alguma ideia de que pode esta acon­te­cendo?
    Desde já agradeço, muito bom seu tutorial!

    • http://sergioprado.org ser­gio­prado

      Olá Cleoner!

      Você não con­segue mon­tar uma imagem jffs2 porque ela foi feita para ser mon­tada em dis­pos­i­tivos MTD. Você pre­cisa de uma camada extra, basi­ca­mente para emu­lar um dis­pos­i­tivo mtd. Você pode fazer isso usando um dos dois mod­u­los do ker­nel: block2mtd e mtdram. Dá uma lida neste artigo:

      https://wiki.maemo.org/Modifying_the_root_image

      Um abraço!

  • Fred­erico

    Boa tarde Ser­gio
    Eu estou com uma dúvida que é a seguinte:
    Como você gerou essa imagem rootfs.ext2? Eu estou na dúvida de como gerar um image file sys­tem a par­tir de um diretório que con­tém os dados do meu rootfs
     
     
    Abraço

    • http://sergioprado.org Ser­gio Prado

      Olá Fred­erico,

      Estes são os pas­sos para criar uma imagem ext2:

      1) Gerar um arquivo de 1M (mude se quiser):
      dd if=/dev/zero of=rootfs.ext2 bs=1024 count=1000

      2) For­matar ext2:
      mkfs.ext2 rootfs.ext2

      3) Mon­tar a imagem
      sudo mount –o loop rootfs.ext2 mnt/

      4) Copiar o dire­to­rio para o ponto de mon­tagem
      cp –Rf mnt/

      5) Desmon­tar o diretório
      sudo umount mnt/

      Abraços!

  • Rodolfo

    Boa tarde Sérgio,

    Parabéns pelo blog… tem me aju­dado bastante!

    Eu mon­tei um ambi­ente de desen­volvi­mento como você comen­tou e está fun­cio­nando per­feita­mente. =)
    Tenho uma dúvida, como faço para sin­cronizar o roofts remoto com o local, para que, após o desen­volvi­mento, a mini2440 possa rodar sem pre­cisar estar conec­tada ao PC?

    Obrigado.

    Abraços

    • http://sergioprado.org/ Ser­gio Prado

      Olá Rodolfo,

      Depois você vai pre­cisar gravar o rootfs em um dis­pos­i­tivo de armazenamento.

      Se for um cartão SD, fica fácil. É só for­matar o cartão e copiar os arquivos do rootfs para a par­tição formatada.

      Por último, você vai pre­cisar alterar o parâmetro root do bootargs. Por exem­plo, se o rootfs estiver na segunda par­tição do cartão SD, a con­fig­u­ração do root será “root=mmcblk0p2”.

      Um abraço.

      • Rodolfo

        Sér­gio,

        obri­gado pela resposta! =)

        Mas eu me refe­ria a gravar o rootfs na própria Flash da mini2440. Procu­rando na net (depois de algu­mas ten­ta­ti­vas sem sucesso… rs) con­segui realizar o processo.

        Instalei no host (ubuntu) um MTD Tools (na ver­dade ape­nas para usar o “mkfs.jffs2”) e, com o comando:

        sudo mkfs.jffs2 –r /home/rodolfo/rootfs –n –e 128 –o /home/rodolfo/mini2440/images/ver_0/image.jffs2”

        gerei a imagem do rootfs com sucesso. Aí segui o método do teu tuto­r­ial para fazer o boot da placa.

        Obri­gado.

        Abraços

        • http://sergioprado.org/ Ser­gio Prado

          Boa!

Navegue
Licença Creative Commons Este trabalho de Sergio Prado é licenciado pelo
Creative Commons BY-NC-SA 3.0.