Como desenvolver um sistema Linux do zero para a Raspberry Pi

- por Sergio Prado

Categorias: Linux, Raspberry Pi Tags: , , , ,

A Raspberry Pi já possui diversas distribuições Linux disponíveis, para diversos gostos e preferências, dentre elas Rasp­bian, Raspbmc, Debian “wheezy” e Arch Linux (eu escrevi sobre algumas delas no meu artigo introdutório sobre a Raspberry Pi).

E o uso de uma distribuição Linux facilita bastante o trabalho, principalmente para quem esta começando seus estudos. Mas junto com a facilidade de uso, vem a falta de flexibilidade. E se você quiser um tempo de boot menor? E se você quiser apenas um conjunto específico de aplicações? E se você quiser ter controle sobre os pacotes open source usados na distribuição e suas respectivas licenças (atividade essencial em um produto comercial)?

Tudo isso fica mais difícil de atingir quando usamos uma distribuição Linux pronta. Neste caso, o ideal é construir um sistema Linux customizado para as necessidades do projeto. E é isso que faremos neste artigo.

Todos os testes foram realizados em um PC com a distribuição Ubuntu 12.04 rodando nativamente. Se necessário, adapte os comandos utilizados à sua distribuição.

Então, vamos começar?

UM SISTEMA LINUX

Você precisa basicamente de 4 componentes para construir um sistema Linux completo (para qualquer plataforma de hardware):

  1. Toolchain
  2. Bootloader
  3. Kernel
  4. Rootfs

Vamos então estudar estes componentes mais detalhadamente.

TOOLCHAIN

Já escrevi bastante sobre toolchains, incluindo os artigos “Desmistificando toolchains em Linux embarcado” e “Gerando e usando toolchains em Linux embarcado“. Se você não souber ou quiser conhecer mais sobre o que é um toolchain e o seu uso em Linux embarcado, dê uma olhada nestes artigos.

Nossa plataforma de hardware é um ARM11 com suporte à ponto flutuante. Portanto, precisamos de um toolchain com estas características para trabalhar com Linux. E não precisamos ir muito longe. O projeto da Raspberry Pi já fornece um toolchain pronto para usarmos, baseado no toolchain da Linaro. Este toolchain esta disponível no repositório tools da Raspberry Pi no github.

Antes de começar, vamos criar um diretório de trabalho:

$ mkdir ~/raspberrypi

Agora vamos baixar o toolchain:

$ cd ~/raspberrypi
$ git clone https://github.com/raspberrypi/tools.git

E instalar em um diretório na máquina de desenvolvimento:

$ sudo mkdir -p /opt/toolchain
$ sudo chown $USER:$USER /opt/toolchain/
$ cp -a tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian /opt/toolchain/

Antes de usá-lo, vamos adicionar o diretório dos binários do toolchain no PATH:

$ echo -e '\nexport PATH="/opt/toolchain/gcc-linaro-arm-linux-gnueabihf-raspbian/bin:$PATH"\n' >> ~/.bashrc
$ source ~/.bashrc

Se sua máquina for de 64 bits, você precisa instalar os bibliotecas de 32 bits:

$ sudo apt-get install ia32-libs libc6-dev-i386

Se você estiver usando uma versão mais nova do Ubuntu, o comando acima pode não funcionar. Tente então instalar as bibliotecas de 32 bits com o comando abaixo:

$ sudo apt-get install lib32stdc++6 libc6-dev-i386

Agora teste o toolchain:

$ arm-linux-gnueabihf-gcc -v
Using built-in specs.
COLLECT_GCC=arm-linux-gnueabihf-gcc
COLLECT_LTO_WRAPPER=/opt/toolchain/gcc-linaro-arm-linux-gnueabihf-raspbian/bin/../libexec/gcc/arm-linux-gnueabihf/4.7.2/lto-wrapper
Target: arm-linux-gnueabihf
Configured with: /cbuild/slaves/oort61/crosstool-ng/builds/arm-linux-gnueabihf-raspbian-linux/.build/src/gcc-linaro-4.7-2012.08/configure --build=i686-build_pc-linux-gnu --host=i686-build_pc-linux-gnu --target=arm-linux-gnueabihf --prefix=/cbuild/slaves/oort61/crosstool-ng/builds/arm-linux-gnueabihf-raspbian-linux/install --with-sysroot=/cbuild/slaves/oort61/crosstool-ng/builds/arm-linux-gnueabihf-raspbian-linux/install/arm-linux-gnueabihf/libc --enable-languages=c,c++,fortran --disable-multilib --with-arch=armv6 --with-tune=arm1176jz-s --with-fpu=vfp --with-float=hard --with-pkgversion='crosstool-NG linaro-1.13.1+bzr2458 - Linaro GCC 2012.08' --with-bugurl=https://bugs.launchpad.net/gcc-linaro --enable-__cxa_atexit --enable-libmudflap --enable-libgomp --enable-libssp --with-gmp=/cbuild/slaves/oort61/crosstool-ng/builds/arm-linux-gnueabihf-raspbian-linux/.build/arm-linux-gnueabihf/build/static --with-mpfr=/cbuild/slaves/oort61/crosstool-ng/builds/arm-linux-gnueabihf-raspbian-linux/.build/arm-linux-gnueabihf/build/static --with-mpc=/cbuild/slaves/oort61/crosstool-ng/builds/arm-linux-gnueabihf-raspbian-linux/.build/arm-linux-gnueabihf/build/static --with-ppl=/cbuild/slaves/oort61/crosstool-ng/builds/arm-linux-gnueabihf-raspbian-linux/.build/arm-linux-gnueabihf/build/static --with-cloog=/cbuild/slaves/oort61/crosstool-ng/builds/arm-linux-gnueabihf-raspbian-linux/.build/arm-linux-gnueabihf/build/static --with-libelf=/cbuild/slaves/oort61/crosstool-ng/builds/arm-linux-gnueabihf-raspbian-linux/.build/arm-linux-gnueabihf/build/static --with-host-libstdcxx='-L/cbuild/slaves/oort61/crosstool-ng/builds/arm-linux-gnueabihf-raspbian-linux/.build/arm-linux-gnueabihf/build/static/lib -lpwl' --enable-threads=posix --disable-libstdcxx-pch --enable-linker-build-id --enable-plugin --enable-gold --with-local-prefix=/cbuild/slaves/oort61/crosstool-ng/builds/arm-linux-gnueabihf-raspbian-linux/install/arm-linux-gnueabihf/libc --enable-c99 --enable-long-long
Thread model: posix
gcc version 4.7.2 20120731 (prerelease) (crosstool-NG linaro-1.13.1+bzr2458 - Linaro GCC 2012.08)

Com as ferramentas de desenvolvimento instaladas, podemos começar a desenvolver o nosso sistema Linux.

BOOTLOADER

O processo de boot da Raspberry Pi é um pouco diferente quando comparada à outras plataformas ARM disponíveis no mercado. Quando você energiza a placa, quem assume o controle é a GPU do SoC (o núcleo ARM11 esta desabilitado neste momento). A GPU procura na primeira partição do cartão SD um código de boot, e com mais alguns passo adicionais, irá carregar e executar o kernel Linux. Para uma descrição mais completa do processo de boot da Raspberry Pi , leia o artigo “Raspberry Pi e o processo de boot“.

Precisamos então preparar um cartão SD com 2 partições:

  • Partição 1 (FAT32): partição de 64M para armazenar o código de boot, arquivos de configuração da GPU e a imagem do kernel Linux.
  • Partição 2 (EXT2): partição para armazenar o sistema de arquivos (aqui você pode usar o resto do espaço disponível no cartão SD).

Para formatar o cartão SD você pode usar o gparted, conforme abaixo (altere o sdX pelo nome do arquivo de dispositivo do seu cartão SD):

$ sudo gparted /dev/sdX

O particionamento do cartão SD deve ficar assim:

Perceba que criamos a primeira partição após os primeiros 2MB do cartão SD. Aparentemente isso é essencial para que a GPU consiga carregar o código de boot da primeira partição do cartão (as distros que testei gravam o cartão assim, e sem esta configuração não funcionou nos meus testes).

Com o cartão formatado, é só baixar os binários do bootloader e gravá-los na primeira partição do cartão (altere o ponto de montagem do cartão SD se necessário):

$ cd ~/raspberrypi
$ git clone git://github.com/raspberrypi/firmware.git
$ cd firmware/boot
$ cp bootcode.bin start.elf fixup.dat /media/BOOT/
$ echo "gpu_mem=32" > /media/BOOT/config.txt

KERNEL

No momento em que escrevo este artigo, o kernel da Raspberry Pi esta disponível no repositório linux do projeto no github.

Baixe então os fontes para sua máquina de desenvolvimento:

$ cd ~/raspberrypi
$ git clone git://github.com/raspberrypi/linux.git -b rpi-3.2.27
$ cd linux

Vamos configurar o kernel para ser compilado para a Raspberry Pi:

$ make ARCH=arm bcmrpi_cutdown_defconfig

Antes de compilar, abra o menu de configuração:

$ make ARCH=arm menuconfig

E habilite o sistema de arquivos ext2:

File systems  --->
    <*> Second extended fs support

Agora compile:

$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-

E grave no cartão SD (altere o ponto de montagem do cartão SD se necessário):

$ cp -av arch/arm/boot/zImage /media/BOOT/kernel.img
$ echo "console=ttyAMA0,115200 root=/dev/mmcblk0p2 rootfstype=ext2 rootwait" > /media/BOOT/cmdline.txt

ROOTFS

Este é o nosso último passo. Vamos construir um sistema de arquivos simples baseado no Busybox. E para esta tarefa, usaremos o Buildroot.

O Buildroot é um sistema de build completo, capaz de gerar o toolchain, bootloader, kernel e rootfs. Mas para nossos testes, usaremos ele apenas para gerar o rootfs.

Baixe então o Buildroot para a sua máquina:

$ cd ~/raspberrypi
$ wget http://buildroot.net/downloads/buildroot-2012.08.tar.bz2
$ tar xjfv buildroot-2012.08.tar.bz2
$ cd buildroot-2012.08/

E inicie o processo de configuração:

$ make menuconfig

Primeiro configure a arquitetura:

Target Architecture (ARM (little endian))
Target Architecture Variant (arm1176jzf-s)

Depois configure o toolchain (apesar do Buildroot ter a capacidade de gerar seu próprio toolchain, vamos configurá-lo para usar o toolchain que instalamos no começo deste artigo):

Toolchain  --->
        Toolchain type (External toolchain)
        Toolchain (Custom toolchain)
        Toolchain origin (Pre-installed toolchain)
    (/opt/toolchain/gcc-linaro-arm-linux-gnueabihf-raspbian) Toolchain path
    ($(ARCH)-linux-gnueabihf) Toolchain prefix
        External toolchain C library (glibc)
    [*] Toolchain has C++ support?

Configure o sistema a ser gerado:

System configuration  --->
    (My Raspberry Pi is alive!) System banner
        /dev management (Dynamic using devtmpfs only)
    (ttyAMA0) Port to run a getty (login prompt) on

Sinta-se livre para acessar o menu “Package Selection for the target” e habilitar as aplicações que achar interessante. Minha sugestão é que você não habilite muitos pacotes neste primeiro teste, nem nada muito grande ou complexo como o X11. Você evitará eventuais problemas ou um tempo de compilação muito grande. E de qualquer forma, depois dos primeiros testes você poderá habilitar outras aplicações e bibliotecas e recompilar o Buildroot.

Agora é só iniciar o processo de compilação:

$ make

No fim da compilação, o Buildroot irá gerar a imagem do rootfs no diretório abaixo:

$ ls -l output/images/
-rw-rw-r-- 1 sprado sprado 4843520 Nov 3 20:20 rootfs.tar

Por último, é só extrair a imagem para a partição do rootfs no cartão SD (altere o ponto de montagem do cartão SD se necessário):

$ sudo cp -av output/images/rootfs.tar /media/ROOTFS/
$ cd /media/ROOTFS/
$ sudo tar xfv rootfs.tar && sudo rm rootfs.tar

TESTANDO

Para testar, você vai precisar de uma conexão com a console da Raspberry Pi. Na dúvida, dê uma olhada no artigo “Acessando a console serial na Raspberry Pi“.

Depois é só curtir o boot do sistema (para o login, o usuário é “root” e não tem senha):

Uncompressing Linux... done, booting the kernel.
Initializing cgroup subsys cpu
Linux version 3.2.27-cutdown+ (sprado@sergio-office-notebook) (gcc version 4.7.2 20120731 (prerelease) (crosstool-NG linaro-1.13.1+bzr2458 - Linaro GCC 2012.08) ) #1 PREEMPT Sat Nov 3 16:23:41 BRST 2012
CPU: ARMv6-compatible processor [410fb767] revision 7 (ARMv7), cr=00c5387d
CPU: PIPT / VIPT nonaliasing data cache, VIPT nonaliasing instruction cache
Machine: BCM2708
Memory policy: ECC disabled, Data cache writeback
Built 1 zonelists in Zone order, mobility grouping on.  Total pages: 56896
Kernel command line: dma.dmachans=0x7f35 bcm2708_fb.fbwidth=1280 bcm2708_fb.fbheight=1024 bcm2708.boardrev=0x2 bcm2708.serial=0xff0782fa smsc95xx.macaddr=B8:27:EB:07:82:FA sdhci-bcm2708.emmc_clock_freq=10t
PID hash table entries: 1024 (order: 0, 4096 bytes)
Dentry cache hash table entries: 32768 (order: 5, 131072 bytes)
Inode-cache hash table entries: 16384 (order: 4, 65536 bytes)
Memory: 224MB = 224MB total
Memory: 222856k/222856k available, 6520k reserved, 0K highmem
Virtual kernel memory layout:
    vector  : 0xffff0000 - 0xffff1000   (   4 kB)
    fixmap  : 0xfff00000 - 0xfffe0000   ( 896 kB)
    vmalloc : 0xce800000 - 0xe8000000   ( 408 MB)
    lowmem  : 0xc0000000 - 0xce000000   ( 224 MB)
    modules : 0xbf000000 - 0xc0000000   (  16 MB)
      .text : 0xc0008000 - 0xc03cc000   (3856 kB)
      .init : 0xc03cc000 - 0xc03eac80   ( 124 kB)
      .data : 0xc03ec000 - 0xc04121e0   ( 153 kB)
       .bss : 0xc0412204 - 0xc045f8cc   ( 310 kB)
NR_IRQS:330
sched_clock: 32 bits at 1000kHz, resolution 1000ns, wraps every 4294967ms
timer_set_mode: unhandled mode:1
timer_set_mode: unhandled mode:3
Console: colour dummy device 80x30
Calibrating delay loop... 697.95 BogoMIPS (lpj=3489792)
pid_max: default: 32768 minimum: 301
Mount-cache hash table entries: 512
CPU: Testing write buffer coherency: ok
devtmpfs: initialized
NET: Registered protocol family 16
bcm2708.uart_clock = 0
mailbox: Broadcom VideoCore Mailbox driver
bcm2708_vcio: mailbox at f200b880
bcm_power: Broadcom power driver
bcm_power_open() -> 0
bcm_power_request(0, 8)
bcm_mailbox_read -> 00000080, 0
bcm_power_request -> 0
Serial: AMBA PL011 UART driver
dev:f1: ttyAMA0 at MMIO 0x20201000 (irq = 83) is a PL011 rev3
console [ttyAMA0] enabled
bio: create slab  at 0
SCSI subsystem initialized
usbcore: registered new interface driver usbfs
usbcore: registered new interface driver hub
usbcore: registered new device driver usb
Switching to clocksource stc
FS-Cache: Loaded
CacheFiles: Loaded
NET: Registered protocol family 2
IP route cache hash table entries: 2048 (order: 1, 8192 bytes)
TCP established hash table entries: 8192 (order: 4, 65536 bytes)
TCP bind hash table entries: 8192 (order: 3, 32768 bytes)
TCP: Hash tables configured (established 8192 bind 8192)
TCP reno registered
UDP hash table entries: 256 (order: 0, 4096 bytes)
UDP-Lite hash table entries: 256 (order: 0, 4096 bytes)
NET: Registered protocol family 1
RPC: Registered named UNIX socket transport module.
RPC: Registered udp transport module.
RPC: Registered tcp transport module.
RPC: Registered tcp NFSv4.1 backchannel transport module.
bcm2708_dma: DMA manager at ce808000
bcm2708_gpio: bcm2708_gpio_probe c03f1a78
vc-mem: phys_addr:0x00000000 mem_base=0x0e000000 mem_size:0x10000000(256 MiB)
VFS: Disk quotas dquot_6.5.2
Dquot-cache hash table entries: 1024 (order 0, 4096 bytes)
FS-Cache: Netfs 'nfs' registered for caching
msgmni has been set to 435
io scheduler noop registered
io scheduler deadline registered
io scheduler cfq registered (default)
Console: switching to colour frame buffer device 160x64
brd: module loaded
loop: module loaded
vcos: [1]: vchiq_init_state: slot_zero = 0xffd80000, is_master = 0
vcos: [1]: vchiq_init_state: called
vcos: [1]: vchiq: initialised - version 2 (min 2), device 253.0
usbcore: registered new interface driver smsc95xx
cdc_ncm: 04-Aug-2011
usbcore: registered new interface driver cdc_ncm
dwc_otg: version 3.00a 10-AUG-2012 (platform bus)
Core Release: 2.80a
Setting default values for core params
Finished setting default values for core params
Using Buffer DMA mode
Periodic Transfer Interrupt Enhancement - disabled
Multiprocessor Interrupt Enhancement - disabled
OTG VER PARAM: 0, OTG VER FLAG: 0
Dedicated Tx FIFOs mode
dwc_otg bcm2708_usb: DWC OTG Controller
dwc_otg bcm2708_usb: new USB bus registered, assigned bus number 1
dwc_otg bcm2708_usb: irq 32, io mem 0x00000000
Init: Port Power? op_state=1
Init: Power Port (0)
usb usb1: New USB device found, idVendor=1d6b, idProduct=0002
usb usb1: New USB device strings: Mfr=3, Product=2, SerialNumber=1
usb usb1: Product: DWC OTG Controller
usb usb1: Manufacturer: Linux 3.2.27-cutdown+ dwc_otg_hcd
usb usb1: SerialNumber: bcm2708_usb
hub 1-0:1.0: USB hub found
hub 1-0:1.0: 1 port detected
usbcore: registered new interface driver uas
Initializing USB Mass Storage driver...
usbcore: registered new interface driver usb-storage
USB Mass Storage support registered.
usbcore: registered new interface driver libusual
mousedev: PS/2 mouse device common for all mice
cpuidle: using governor ladder
cpuidle: using governor menu
sdhci: Secure Digital Host Controller Interface driver
sdhci: Copyright(c) Pierre Ossman
sdhci: Enable low-latency mode
bcm_power_open() -> 1
mmc0: SDHCI controller on BCM2708_Arasan [platform] using platform's DMA
mmc0: BCM2708 SDHC host at 0x20300000 DMA 2 IRQ 77
sdhci-pltfm: SDHCI platform and OF driver helper
usbcore: registered new interface driver usbhid
usbhid: USB HID core driver
TCP cubic registered
Initializing XFRM netlink socket
NET: Registered protocol family 17
Registering the dns_resolver key type
VFP support v0.3: implementor 41 architecture 1 part 20 variant b rev 5
Waiting for root device /dev/mmcblk0p2...
mmc0: problem reading SD Status register.
mmc0: new high speed SD card at address 0007
mmcblk0: mmc0:0007 SD2GB 1.84 GiB 
 mmcblk0: p1 p2
EXT2-fs (mmcblk0p2): warning: mounting unchecked fs, running e2fsck is recommended
VFS: Mounted root (ext2 filesystem) on device 179:2.
devtmpfs: mounted
Freeing init memory: 120K
Starting logging: OK
Initializing random number generator... done.
Starting network...
 
My Raspberry Pi is alive!
buildroot login: root
#

Para ter acesso completo à todos os recursos da Raspberry Pi, só faltou incluir no nosso sistema as bibliotecas de acesso à GPU. Estas bibliotecas possibilitam a utilização da GPU para tarefas pesadas como decodificação de vídeo e execução de aplicações 3D. Este será o foco do nosso próximo artigo.

Happy Pi hacking!

Sergio Prado

para

  • Cleber

    Poxa, desde que comprei o RPi queria fazer algo deste tipo. No momento estou tentando a comunicação via I2C para leitura e gravação em 2 EEPROMs.. Na sequência vou tentar isso..
    Parabéns pelo post e por compartilhar suas experiências!.

    • Legal Cleber! Depois me conta sobre suas experiencias com o I2C!

  • David Lewin

    Nice 1st Article Sergio.   this remind me some other commands from another article with mini2440 ;o) but after all this is due to the homogeneous side of Linux: “learn once and apply anywhere”
    I hope you’ll be able to write something equivalent for the i.MX53.

    • Hi David,
       
      Yes, you are right! Despite the boot process, the rest is pretty much the same! I’ll put in my list of next articles to write one for the i.MX53.

      Best regards.

  • John

    Olá Sergio,
    Tambem estou usando Ubuntu 12.04, mas estou tendo o seguinte erro após instalar o toolchain:
    $ arm-linux-gnueabihf-gcc -v
    bash: /opt/toolchain/gcc-linaro-arm-linux-gnueabihf-raspbian/bin/arm-linux-gnueabihf-gcc: Arquivo ou diretório não encontrado

    Será que a linha adicionada ao path está incorreta?

    abs
     

    • Olá John!

      Se o caminho estiver correto, pode ser uma questão da arquitetura da sua máquina host. Este toolchain foi compilado para rodar em uma máquina de 32 bits. Se sua máquina for de 64 bits, você precisa instalar as libs de 32 bits:

      $ sudo apt-get install ia32-libs libc6-dev-i386

      Teste e me avisa se funcionou. Se funcionar vou atualizar o post.

      Um abraço!

      • John Martius

        Realmente o toolchain está compilado para 32 bits.
        Após instalar as libs funcionou no 64 bits.

        Está bem bacana seu blog ;)

        • Legal John. Vou atualizar o post. Obrigado pelo feedback!

  • jaisonDala

    Parabéns pelo post, fiz e funcionou perfeitamente. Minha pergunta é tenho um kernel com suporte a AUFS+Squashfs eu precisaria apontar o meu rootfs para o meu rootfs.squash, mas não sei como fazer. O que preciso é ter um rootfs idêntico ao um livecd que seja somente leitura, o rootfs execute na ram e a escrita seja feita na ram, consequentemente no próximo reboot as alterações de gravação feitas anteriormente não serão salvas, pois foram feitas na ram.
    Desde já agradeço e parabéns pelo blog.
    att.
    Jaison

    • Olá Jaison,

      Você tem duas opções:

      1. Criar um initramfs. Tem bastante documentação na Internet sobre isso. Esta é a documentação oficial do kernel:
      http://www.kernel.org/doc/Documentation/filesystems/ramfs-rootfs-initramfs.txt

      2. Montar um rootfs read-only com o squashfs e depois criar um overlay em RAM usando por exemplo o unionfs ou o aufs. Para montar o rootfs com squashfs, é só gravar a imagem no cartão e mudar a linha de comandos do kernel no cmdline.txt. Ex:

      $ echo “console=ttyAMA0,115200 root=/dev/mmcblk0p2 rootfstype=squashfs rootwait” > /media/BOOT/cmdline.txt

      Depois é só fazer o overlay em RAM no boot.

      • jaisonDala

        Olá. Obrigado pela atenção.

        Fiz a troca do kernel conforme abaixo, com suporte ao squash+aufs. 

        My Raspberry Pi is alive!
        buildroot login: root
        # uname -r
        3.2.27-cutdown+
        # cat /proc/filesystems | grep squash
                squashfs
        # cat /proc/filesystems | grep aufs
        nodev   aufs

        Agora fiz a alteração trocando o cmdline.txt conforme descrito. Veja o que acontece!
        Obs: testei com o kernel “original” igual ao do artigo e o meu cuja configuração descrevi acima.

        Waiting for root device /dev/mmcblk0p2…
        mmc0: new high speed SD card at address 0001
        mmcblk0: mmc0:0001 00000 968 MiB 
         mmcblk0: p1 p2
        mmcblk0: p2 size 1724417 extends beyond EOD, truncated
        Indeed it is in host mode hprt0 = 00021501
        List of all partitions:
        b300          991232 mmcblk0  driver: mmcblk
        b301          128000 mmcblk0p1 00000000-0000-0000-0000-000000000000
        b302          862208 mmcblk0p2 00000000-0000-0000-0000-000000000000
        No filesystem could mount root, tried:  squashfs
        Kernel panic – not syncing: VFS: Unable to mount root fs on unknown-block(179,2)

        OBS: para ter certeza que minha imagem rootfs.squash não seja o problema peguei de uma iso da distribuição openelec versão pra rasp inclusive booto por ela. Extraí do .iso e joguei na minha segunda partição o arquivo que se chama SYSTEM e é um rootfs em squashfs.

        • Olá Jaison,

          Você gravou a imagem squashfs no cartão?

          • jaisonDala

            Sim, no lugar do rootfs que fiz com o buildroot coloquei a minha imagem retirada do OpenElec que se chama SYSTEM onde é um arquivo squash. A imagem está na partição EXT2 conforme seu artigo.

          • Olá Jaison,

            Neste caso, este não é o procedimento correto. Você deve copiar a sua imagem diretamente para a partição 2 do cartão, e não copiar o arquivo da imagem para a partição EXT2.

            O comando dd pode resolver seu problema:

            $ sudo dd if=/dev/sdX2 of=squashfs.img

            Substitua o nome do arquivo de dispositivo da segunda partição do cartão e o nome da sua imagem de acordo com seu ambiente.

          • Eu alterei o cmdline.txt para squashfs e peguei meu rootfs.squashfs e dei o dd if=rootfs.squashfs of=/dev/sdb2, sendo assim passaria a meu rootfs gerado como squashfs para o /dev/mmcblk0p2.

            Porém no boot recebo:

            Kernel panic – not syncing: VFS: Unable to mount root fs on unknown-block(179,2)

            Já como ext2 o mesmo rootfs funciona, o procedimento para utilizar squashfs que estou fazendo esta correto?

            Abraço.

          • Olá Cleiton!

            Verifique se o seu kernel esta com o squashfs habilitado. Você pode verificar isso no arquivo de configuração do kernel ou iniciar o sistema pelo ext2 e exibir o conteúdo do arquivo /proc/filesystems.

          • Opa, Sergio belezinha?

            Então realizei toda configuração novamente, compilei e copiei o rootfs e kernel para o SD.

            Nas configurações do .config do meu buildroot esta:

            cleiton@note-scbr /opt/buildroot $ cat .config | grep SQUASHFS
            BR2_PACKAGE_SQUASHFS=y
            BR2_PACKAGE_SQUASHFS_GZIP=y
            # BR2_PACKAGE_SQUASHFS_LZMA is not set
            BR2_PACKAGE_SQUASHFS_LZO=y
            BR2_PACKAGE_SQUASHFS_XZ=y
            BR2_TARGET_ROOTFS_SQUASHFS=y
            BR2_TARGET_ROOTFS_SQUASHFS4=y
            BR2_TARGET_ROOTFS_SQUASHFS4_GZIP=y
            # BR2_TARGET_ROOTFS_SQUASHFS4_LZMA is not set
            BR2_TARGET_ROOTFS_SQUASHFS4_LZO=y
            # BR2_TARGET_ROOTFS_SQUASHFS4_XZ is not set

            O sistema sobe e quando dou cat /proc/filesystems
            # cat /proc/filesystems | grep squashfs
            #

            Porém:

            # modprobe -l | grep squashfs
            kernel/fs/squashfs/squashfs.ko

            # modprobe squashfs
            [ 921.558883] squashfs: version 4.0 (2009/01/31) Phillip Lougher

            # cat /proc/filesystems | grep squashfs
            squashfs

            Procurei o /etc/modules.conf mas não achei no meu rootfs para habilitar squashfs

            Meu setup atual:
            BusyBox v1.21.0 multi-call binary.
            Kernel 3.6.11

          • Entendi Cleiton. O problema então é que o squashfs esta habilitado como módulo.

            Para subir o rootfs como squashfs, você precisa abrir a configuração do kernel, habilitar o squashfs como built-in, recompilar o kernel e atualizar o cartão.

          • Então Sergio, quando eu dei o clean e reconfigurei, no filesystem o squashfs deixa apenas como [*] não possibilita [M] então pensei que já compilaria como built-in no kernel, estou pensando em testar com kernel anterior 3.4.X e caso persista o busybox anterior 1.20.X, pois nessa configuração atual não sei onde mais habilitar squashfs ou alterar.

          • Olá Cleiton,

            Você esta se referindo à configuração do Buildroot, mas você precisa alterar a configuração do kernel. Veja no post acima o processo usado para habilitar o ext2. É o mesmo processo para habilitar o squashfs.

          • Verdade você esta certissimo. Nossa houve um equivoco. Eu estava dando make menuconfig e configurando o buildroot, sendo que na verdade deveria ser make linux-menuconfig para alterar o kernel, fiz as alterações e já compilei.

            Em casa irei realizar o teste.

          • Opa Sergio.

            Problema resolvido, era só passar de módulo para built-in e o procedimento dd if=rootfs.squashfs of=/dev/sdbX e alterando o cmdline.txt e funcionou perfeitamente, os demais ajustes como no fstab já estavam prontos.

            Obrigado e grande abraço.

          • Boa!

  • Legal Jaison, parabens!

  • Leonardo Pinheiro

     Olá Sergio, como é mesmo o nome da empresa que tu falou no curso de Linux embarcado que fabrica núcleos de hardware para rodar linux? Abraço, Leonardo Pinheiro

  • Celso Varella

    Sérgio
    Gostaria de saber se após a configuração da ToolChain para trabalhar com o kernel, é possível compilar programas em “C” para rodar no Raspberry-PI, se for possível quais são as diretivas que devo inserir no comando para compilar?

  • Murilo

    Minha PI chega na semana que vem. Não vejo a hora de colocar em prática todo o conhecimento adquirido aqui em algumas horas de leitura. Parabéns pelo blog, espetacular! Em breve espero estar dando trabalho a todos! Rs! Um abraço e até breve!

  • Consegui criar a partir do zero para o Raspberry PI ! Valeu mesmo!!!

  • Marcelo

    Olá Sérgio…Excelente artigo!!!

    Gostaria de te fazer uma pergunta em relação a hardware de desenvolvimento.

    Posso utilizar um tablet convencional para embarcar Linux? Possuo um tablet com Android e gostaria de embarcar linux nele. Será que há possibilidade?

    O processador é um ARM 11 Telechips tcc9201.

    Se houver possibilidade, pode me dar alguma informação de como proceder?

    Um abraço e parabéns pela site.

    Marcelo

    • Olá Marcelo,

      Se roda Android. As possibilidades são grandes de você conseguir rodar Linux nele. Mas você vai precisar de:

      1. Acesso aos fontes do kernel.
      2. Acesso ao bootloader para poder gravar seu sistema Linux.

      Um abraço.

  • Sidney Bastos

    Que beleza de artigo. Vc acha que eu consigo colocar o tomcat e o java no raspberry e ele funcionaria?

    • Sim, a única questão seria a performance destas aplicações em um dispositivo com poucos recursos. Neste caso, para testar, eu usaria uma distribuição como a Raspbian.

      Um abraço.

  • Humberto

    Muito bom seu artigo. Fiz tudo, mas estou com um problema, quado conecto o RPI pela porta serial da a seguinte mensagem.

    Kernel panic – not syncing: VFS: Unable to mount root fs on unknown-block(179,2)

    Como posso resolver? Muito orbigado!!

    • Olá Humberto,

      Pode ser a linha de comandos do kernel, a partição do rootfs que não esta formatada, ou o rootfs que não foi copiado corretamente para o cartão.

  • Eduardo C. Scherrer

    Boa noite Sergio.

    Já tinha lido este artigo, e seguindo os passos descritos consegui fazer a minha RPI rodar direitinho.

    Mas a minha dúvida está relacionada à outra placa.

    Eu tenho uma beaglebone, e queria embarcar linux do zero, assim como para a RPI.

    Já procurei bastante como fazer, mas não tive sucesso.

    Alguns sites que acessei para as tentativas.

    Arago-project

    Buildroot (projeto indicando no proprio site beaglebone.org) lá tem linux embarcado para beaglebone, mas não tive sucesso.

    http://eewiki.net/display/linuxonarm/BeagleBone#BeagleBone-Bootloader (tem passo a passo), mas dá um erro que indica que o SDCard não está sendo alimentado.

    Tem alguma dica.

    Tem algum material para isso?

    obrigado.

    • Olá Eduardo,

      O procedimento deve ser bem parecido, com exceção do processo de boot, mas infelizmente não tenho nenhum material sobre isso.

  • Legal Jaison, parabéns!

    Sobre o AUFS, ele ainda não esta disponivel na versão mainline do kernel, apenas via patches mesmo.

    Abs!

  • Victor

    Sérgio, ocorreram alguns erros na comialção do Buildroot. Precisei instalar os pacotes bison, flex e texinfo para prosseguir com o make. Em seguida, ocorreu este erro:
    arm-linux-gnueabihf-gcc: fatal error: -fuse-linker-plugin, but liblto_plugin.so not found

    Como faço para resolver isto?

    Abraço

  • Sergio, eu gostaria de compilar este kernel do zero porém adicionando o DTB para a raspberry. Tenho um driver I2C de um LCD e gostaria que ele fosse carregado junto com o kernel.
    Como eu faria isso?

  • Wagner Galdino

    Olá Sergio, você tem alguma imagem do windows ce para o raspberry pi?

    • Olá Wagner,

      Não acredito que exista uma versão do WindowsCE para a RPi.

      • Wagner Galdino

        OK! Você mostrou como desenvolver uma versão linus do zero para o RPi, você tem alguma imagem pronta de uma versão que você tenha desenvolvido? Quanto ao Windows CE, tem um site que ja está disponivel uma BSP, e outro com o win compact embedded pronta, porem os drivers de rede e USB não são reconhecido…. Trabalho com automação industrial, e estou desenvolvendo um produto com raspberry….

  • Rafael

    ia32-libs não existe mais,e agora?
    Vi que é uma pratica errada instalar esse pacote de fonte raring

    • Use o ldd no binário do toolchain para verificar quais bibliotecas ele depende, então instale a versão de 32 bits das bibliotecas manualmente, conforme abaixo:

      $ sudo apt-get install package-name:i386

  • Diego

    Olá,
    Antes de mais, parabéns pelo post!
    Tenho uma dúvida. Após a criação desta imagem “do zero”, a raspberry pi está com um SO enxuto. E os drivers de rede? interface gráfica (desktop)? …. fica tudo em modo texto e tem que instalar tudo manualmente?

    • Olá Diego,

      A idéia deste artigo era mesmo criar uma distribuição mínima, sem interface gráfica.

      Se você quiser criar um sistema mais completo com suporte à interface gráfica, sugiro dar uma olhada no Yocto Project.

      Um abraço.

  • Pedro Rossi

    Exelente post, isso que eu digo quando se faz alguma coisa tem que ser sério, eu estava procurando como instalar o OS e só achava algo sobre, NOOBS, não tem como ir adiante se quiser ficar na moleza e procurar coisas fáceis, parabéns.

  • Guest

    Poderia me dizer onde estou errando?

    • Qual é o erro? O que acontece durante a compilação?

      • Guest

        Consegui concertar (tinha errado nisso: ”

        /opt/toolchain/gcc-linaro-arm-linux-gnueabihf-raspbian”)
        Mas uma outra dúvida, depois de tudo isso, eu coloco o cartão do raspibian,
        mas não inicia nada… eu já instalei os S.Os do rasperberry com o “noobs”, e gostaria de saber como eu faço pra ter um kernel, só com o compilador básico, um editor nano, e os processos básicos de rede.

        Desde já grato.

        Carlos Mapa – IFMG São João Del Rei. 1º ano.

        • Você está usando uma conexão com a console para testar?

          • Guest

            Não; achei que seguindo os passos, depois que eu colocasse todos os dados no cartão, ele daria boot automaticamente, e só abriria um terminal.

          • Então é por isso que você nào conseguiu acessar o sistema gerado. O tutorial prepara uma distribuição mínima, sem interface gráfica, para conexão via console.

  • Pedro Rossi

    Eu estava instalando novamente os componentes utilitários para compilar o sistema e deparei com o seguinte erro: A canonical, distribuirdora do Ubuntu, retirou o ia32-libs do repositório para sistemas AMD64.

    Então vim informar a solução para esse problema, que deve ser corrigido no tutorial. Basta executar o seguinte comando no lugar da instalação da biblioteca ia32-libs, sudo apt-get install lib32stdc++6 libc6-dev-i386.

    • Obrigado Pedro! Qual a versão do Ubuntu que você está usando?

  • Pedro Rossi

    Ainda depois do ultimo erro vieram outros 3 antes da configuração e na hora de compilar o KERNEL que consegui resolver, lembrando que compilei o linux no Ubuntu 14.04 LTS, provavelmente alguém possa encontrar os mesmos erros que eu, então ja vou deixar a solução ai caso tais complicações ocorram.

    1° – É preciso instalar o NCURSES:

    Obs.: Tentei baixar e compilar os fontes, não obtive sucesso, quase quebrei a cabeça, ainda bem que tem os binários.

    AMD64 – http://ftp.br.debian.org/debian/pool/main/n/ncurses/libncurses5-dev_5.7+20100313-5_amd64.deb

    i368 – http://ftp.br.debian.org/debian/pool/main/n/ncurses/libncurses5-dev_5.7+20100313-5_i386.deb

    2° – É preciso ter as bibliotecas zlib instaladas, um erro como esse pode aparecer: libz.so.1 error

    A seguinte linha de comando irá resolver: sudo apt-get install lib32z1

    3º – Na hora de compilar o KERNEL recebi uma mensagem de erro relacionado ao bluetooth em um arquivo “sco.o” então voltei na configuração em (make ARCH=arm menuconfig) e dasibilitei o bluetooth.

  • Diego

    Sérgio..

    Parabéns e obrigado pelo artigo!

    Fiz todo processo tempo atrás, tudo funcionou direitinho.
    No entanto, não consigo acessar a raspberry por ethernet (ssh ou telnet).
    Qual opção devo habilitar ao compilar o kernel para habilitar ssh e telnet, por exemplo?

    Diego

    • Olá Diego!

      Na configuração do Buildroot, procure pelo openssh e habilite. Recompile e atualize o rootfs no cartão SD.

      Um abraço!

  • Gelson Gomes Rodrigues

    Muito bom o post, porém tenho umas dúvidas básicas.
    Fiz todos os procedimentos do tutorial e deu tudo certo nas configurações e compilações,apenas não testei pois vou comprar o cabo serial.
    Dúvidas básicas:
    Eu preciso do cabo para ver a saida pois não foi habilitado o hdmi?
    Crei as duas partições porém a partição ext2 ficou com apenas 30 megas, é isso mesmo?

    • Olá Gelson,

      > Eu preciso do cabo para ver a saida pois não foi habilitado o hdmi?
      Exato. A distribuição criada ficou apenas com suporte à console.

      > Crei as duas partições porém a partição ext2 ficou com apenas 30
      > megas, é isso mesmo?
      Isso mesmo. É porque o rootfs criado é bem pequeno. Mas pode aumentar se quiser.

      Um abraço.

  • Gelson Gomes Rodrigues

    Bem eu consegui dar o boot e visualiza-lo usando um cabo serial, porém ele não sai desse ponto:

    smsc95xx 1-1.1:1.0 eth0: register ‘smsc95xx’ at usb-bcm2708_usb-1.1, smsc95xx USB 2.0 Ethernet, b8:27:eb:59:3c:11
    random: nonblocking pool is initialized

    Essa são as últimas 3 linhas

    Estou usando o raspberry B+
    Pode me ajudar?

    • Consegue me enviar o arquivo /etc/inittab?

      • Gelson Gomes Rodrigues

        # /etc/inittab
        #
        # Copyright (C) 2001 Erik Andersen
        #
        # Note: BusyBox init doesn’t support runlevels. The runlevels field is
        # completely ignored by BusyBox init. If you want runlevels, use
        # sysvinit.
        #
        # Format for each entry: :::
        #
        # id == tty to run on, or empty for /dev/console
        # runlevels == ignored
        # action == one of sysinit, respawn, askfirst, wait, and once
        # process == program to run

        # Startup the system
        null::sysinit:/bin/mount -t proc proc /proc
        null::sysinit:/bin/mount -o remount,rw / # REMOUNT_ROOTFS_RW
        null::sysinit:/bin/mkdir -p /dev/pts
        null::sysinit:/bin/mkdir -p /dev/shm
        null::sysinit:/bin/mount -a
        null::sysinit:/bin/hostname -F /etc/hostname
        # now run any rc scripts
        ::sysinit:/etc/init.d/rcS

        # Put a getty on the serial port
        ttyAMA0::respawn:/sbin/getty -L ttyAMA0 115200 vt100 # GENERIC_SERIAL

        # Stuff to do for the 3-finger salute
        ::ctrlaltdel:/sbin/reboot

        # Stuff to do before rebooting
        null::shutdown:/etc/init.d/rcK
        null::shutdown:/bin/umount -a -r
        null::shutdown:/sbin/swapoff -a

        • Imaginei que o nome da tty estaria incorreto, mas está certo. Me envie o log completo do boot por e-mail para que eu possa dar uma olhada.

          • Gelson Gomes Rodrigues

            O email chegou para vc?

  • Manoel Godoi Faria

    Como desenvolver um sistema Linux do zero para a Raspberry Pi.
    Segui seu artigo ate este ponto
    $ make ARCH=arm bcmrpi_cutdown_defconfig,
    entao ele me da esta resposta: Can’t find default configuration “arch/arm/configs/bcmrpi_cutdown_defconfig”!, ou seja, nao foi possivel encontrar a configuração padrão “arch/arm/configs/bcmrpi_cutdown_defconfig”!.

    Como posso resolver este problema, voce pode me ajudar.

    • Olá Manoel,

      Este problema está acontecendo porque a comunidade da Raspberry Pi alterou o nome do arquivo de configuração nas versões mais atuais do kernel.

      Antes de carregar o arquivo de configuração, dentro do diretório raiz do kernel, faça o checkout da versão 3.2.27. Deve resolver.

      $ git checkout rpi-3.2.27

      Um abraço.

  • Manoel Godoi Faria

    Caro amigo; obrigado pela dica que resolveu meu primeiro problema, agora estou tendo problemas com dependência, o pacote makeinfo nao esta sendo encontrado pelo instalador, como posso adquirir este pacote ?.
    E de que forma posso estar baixando ?

    make ***[core-dependencies] Error 1

    Mais uma vez Obrigado pela Ateção!!!

    • Em qual passo do tutorial você está? Qual comando executou? Pode postar o log completo?

  • Manoel Godoi Faria

    Sinta-se livre para aces­sar o menu “Pack­age Selec­tion for the tar­get”
    e habil­i­tar as apli­cações que achar inter­es­sante. Minha sug­estão é
    que você não habilite muitos pacotes neste primeiro teste, nem nada
    muito grande ou com­plexo como o X11. Você
    evi­tará even­tu­ais prob­le­mas ou um tempo de com­pi­lação muito
    grande. E de qual­quer forma, depois dos primeiros testes você poderá
    habil­i­tar out­ras apli­cações e bib­liote­cas e recom­pi­lar o
    Buildroot.

    Agora é só ini­ciar o processo de compilação:

    $ make

  • Manoel Godoi Faria

    ROOTFS

    Este é o nosso último passo. Vamos con­struir um sis­tema de arquivos sim­ples baseado no Busy­box. E para esta tarefa, usare­mos o Buil­d­root.

    O
    Buil­d­root é um sis­tema de build com­pleto, capaz de gerar o
    tool­chain, boot­loader, ker­nel e rootfs. Mas para nos­sos testes,
    usare­mos ele ape­nas para gerar o rootfs.

    Baixe então o Buil­d­root para a sua máquina:

    $ cd ~/raspberrypi
    $ wget http://buildroot.net/downloads/buildroot-2012.08.tar.bz2
    $ tar xjfv buildroot-2012.08.tar.bz2
    $ cd buildroot-2012.08/

    E ini­cie o processo de configuração:

    $ make menuconfig

    Primeiro con­fig­ure a arquitetura:

    Target Architecture (ARM (little endian))
    Target Architecture Variant (arm1176jzf-s)

    Depois
    con­fig­ure o tool­chain (ape­sar do Buil­d­root ter a capaci­dade de
    gerar seu próprio tool­chain, vamos configurá-lo para usar o tool­chain
    que insta­lamos no começo deste artigo):

    Toolchain —>
    Toolchain type (External toolchain)
    Toolchain (Custom toolchain)
    Toolchain origin (Pre-installed toolchain)
    (/opt/toolchain/gcc-linaro-arm-linux-gnueabihf-raspbian) Toolchain path
    ($(ARCH)-linux-gnueabihf) Toolchain prefix
    External toolchain C library (glibc)
    [*] Toolchain has C++ support?

    Con­fig­ure o sis­tema a ser gerado:

    System configuration —>
    (My Raspberry Pi is alive!) System banner
    /dev management (Dynamic using devtmpfs only)
    (ttyAMA0) Port to run a getty (login prompt) on

    Sinta-se livre para aces­sar o menu “Pack­age Selec­tion for the tar­get”
    e habil­i­tar as apli­cações que achar inter­es­sante. Minha sug­estão é
    que você não habilite muitos pacotes neste primeiro teste, nem nada
    muito grande ou com­plexo como o X11. Você
    evi­tará even­tu­ais prob­le­mas ou um tempo de com­pi­lação muito
    grande. E de qual­quer forma, depois dos primeiros testes você poderá
    habil­i­tar out­ras apli­cações e bib­liote­cas e recom­pi­lar o
    Buildroot.
    Agora é só ini­ciar o processo de compilação:

    $ make —>// E aqui no make que da um erro de dependencia por nao ter o pacote makeinfo que deve pertencer a outro, o resto dos comandos acima tudo funciona, e os erros de dependencia aparece justamente que eu tendo compilar.

    No fim da com­pi­lação, o Buil­d­root irá gerar a imagem do rootfs no diretório abaixo:

    $ ls -l output/images/
    -rw-rw-r– 1 sprado sprado 4843520 Nov 3 20:20 rootfs.tar

    Por último, é só extrair a imagem para a par­tição do rootfs no cartão SD (altere o ponto de mon­tagem do cartão SD se necessário):

    $ sudo cp -av output/images/rootfs.tar /media/ROOTFS/
    $ cd /media/ROOTFS/
    $ sudo tar xfv rootfs.tar && sudo rm rootfs.tar

  • Manoel Godoi Faria

    Bom, eu consegui fazer o boot, e ele funcionou mais não sai deste ponto:

    smsc95xx 1-1.1:1.0 eth0: register ‘smsc95xx’ at usb-bcm2708_usb-1.1, smsc95xx USB 2.0 Ethernet, b8:27:eb:59:3c:11

    O que eu posso fazer nessa situação?

    • Você pode ter esquecido de configurar a opção abaixo no Buildroot:

      System configuration —>
      (ttyAMA0) Port to run a getty (login prompt) on

  • Manoel Godoi Faria

    Configurei como voce disse mais nao resolveu, eu observando o processador
    do raspberry nao e um broadcom BCM2835 ele um da samsung K4P4324EQ GPG0599M, o boot trava, eu faço todos os passos e nao da certo.

    Nao sei o qeue mais fazer.

  • Manoel Godoi Faria

    Tudo bem com voce; entao, fiz tudo que falou pra fazer mais o boot trava aqui:
    VFS: Cannot open root device “mmcblk0p2” or unknown-block(179,2)
    Please append a correct “root=” boot option; here are the available partitions:
    b300 7639040 mmcblk0 driver: mmcblk
    b301 65536 mmcblk0p1 00000000-0000-0000-0000-000000000000
    b302 7565179 mmcblk0p2 00000000-0000-0000-0000-000000000000
    Kernel panic – not syncing: VFS: Unable to mount root fs on unknown-block(179,2)

  • O cartão SD foi formatado corretamente? A segunda partição existe? O rootfs foi gravado corretamente na segunda partição?

    • Manoel Godoi Faria

      Sim, conforme o formato que você descreve no artigo, 2MiB, 64MiB FAT32 e 1.79GiB em EXT2, e foi gravados de acordo com as instruções que o artigo descreve.

    • Manoel Godoi Faria

      Outra coisa que notei e que estou com duvida, o que é gravado na partição ext2 de nome ROOTFS no cartão SD é gravado lá só é um arquivo compactado de nome rootfs.rar, é isso mesmo?… esta correto?

      • Não. É necessário descompactar este arquivo na segunda partição do rootfs.

  • Deivid Roza

    Amigo eu gostaria de remover completamente o sistema Android de um tablet e instalar somente o Linux kali , você acha possível?

    • Sim, é possível. Mas será um trabalho grande de engenharia reversa.

  • Tiago

    Slitaz seria uma boa ferramenta.

    • Olá Tiago.

      Não conheço esta distribuição.

      • Tiago

        Ela é basicamente os componentes que vc citou!
        é só digitar slitaz linux

        • Olá Tiago,

          Sim, eu acessei o site da distro e dei uma olhada. O que eu quis dizer é que eu nunca trabalhei com esta distro, e não tenho uma opinião formada sobre ela. Que tipo de experiencia você teve com ela?

          • Tiago

            Eu sei que vc não devia conhecer, por isso que eu falei da distro pra vc, ela é muito minimalista, mas plenamente funcional.

  • Damerlan

    da para ver o processo de boot pelo monitor para nao precizar conectarse a porta serial?

    • Depende da distribuição que você está usando. No caso deste artigo, onde foi criada uma distro do zero, os logs são enviados por padrão para a porta serial. Se quiser mandar também para o monitor, adicione console=tty1 na linha de comandos do kernel (arquivo cmdline.txt).

      • Damerlan

        Olá sergio, eu estou tentando fazer este processo para haspberrypi 2, eu acrecentei o comando no fim do arquivo ficando assim ” console=ttyAMA0,115200 root=/dev/mmcblk0p2 rootfstype=ext2 rootwait console=tty1 ”

        mas na hora que ligo ele nao sai da tela colorida, pode me dizer a onde eu posso estar errando, todo oprocesso funcionou corretamente apenas na hora de liga que nao aprezenta no monitor

  • Damerlan

    Sergio na hora de compila a ROOTFS ta dando erro!

    usuario:~/raspberrypi/buildroot-2012.08$ make
    Checking external toolchain settings
    Cannot execute cross-compiler ‘/opt/toolchqain/gcc-linaro-arm-linux-gnueabihf-raspbian/bin/arm-linux-gnueabihf-gcc’
    make: ** [/home/damerlan/raspberrypi/buildroot-2012.08/output/stamps/ext-toolchain-checked] Erro 1

    • Olá Damerlan,

      Me parece que você errou ao setar o PATH do toolchain, digitando “toolchqain” ao invés de “toolchain”.

      • Damerlan

        ixi é mesmo não notei esta falha, obrigado :D

  • Damerlan

    Olá Sergio, eu gostaria de saber se tem um tutorial pra compilar um linux do zero pra computadores normais, utilizando a arquitetura i386 ou amd64, dei uma boa lida deste site http://www.linuxfromscratch.org/ que ensina a montar uma distribuição mas eu gostaria de encontrar algo mais passo a passo para facilitar o processo :)

    • Olá Damerlan,

      O Linux From Scratch é realmente o tutorial mais completo e passo-a-passo que conheço para criar uma distro Linux do zero.

      Um abraço.

  • Bianca Morinatt

    Olá Sergio isto serve para o Orange Pi PC? estou ficando louca já .. eu quero rodar meu jogo em html5 ou NW.js diretamente. Tipo por o pen drive e ja ir direto, sem abrir o sistema operacional todo. “como se fosse um vídeo game..”espetou jogou” rsrs, pensei em mudar o modo que o sistema operacional e iniciado, para ler o pen drive e ja ir para o jogo. mas não tem nada na internet falando muito sobre o Orange Pi.. beijos e espero que posso me ajudar pois não sei oque fazer

    • Olá Bianca!

      O procedimento descrito neste artigo serve apenas para a Raspberry Pi, e precisaria ser adaptado para a Orange Pi.

      Qual a distro que você está usando na Orange Pi?

  • Anderson Luis

    Esta imagem funciona em modo texto na saida HDMI? ou somente via SERIAL ?

    • Olá Anderson,

      Este sistema funciona apenas pela console serial.

      Um abraço.

  • Lucas Santos Dias

    Olá Sérgio! Vc teria algum tutorial parecido para a beagle bone black?
    Obrigado!

  • King

    Quando vou compilar(make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-), da o seguinte erro, o que pode ser? E como arrumar?
    Can’t use ‘defined(@array)’ (Maybe you should just omit the defined()?) at kernel/timeconst.pl line 373.
    /home/king/raspberrypi/linux/kernel/Makefile:141: recipe for target ‘kernel/timeconst.h’ failed
    make[1]: *** [kernel/timeconst.h] Error 255
    Makefile:945: recipe for target ‘kernel’ failed
    make: *** [kernel] Error 2

    • Pode ser incompatibilidade de versão do kernel com o toolchain. A versão do toolchain que utilizei no artigo foi 4.7.2. Qual a versão do seu?

  • Alexandre Conceição

    Olá Sergio!!!
    Ótimo turorial. Gostei muito do que li. Quero colocar em prática, mas vi que esse tutorial é de 2012. Acredito que teria problemas para colocá-lo em prática.

    Poderia atualizar as linhas de comando, links de repositório e etc de esse tutorial para os dias atuais. Ou pode me passar por email.
    Desde já agradeço
    E parabéns pelos artigos.

    • Olá Alexandre,

      Sugestão anotada! Um abraço!

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