Diferencias

Muestra las diferencias entre dos versiones de la página.

Enlace a la vista de comparación

Próxima revisión
Revisión previa
bbx [2022/01/15 01:10]
127.0.0.1 editor externo
bbx [2023/10/19 21:57] (actual)
cnigri Aclaracion para caso SD
Línea 5: Línea 5:
  
 La idea es que el alumno pueda empaparse con el procedimiento básico para la generación de imágenes //custom// de Linux para sistemas embebidos. Cada caso, será particular al embebido en cuestión, pero típicamente consta de lo mismos **macro-pasos** enumerados.  La idea es que el alumno pueda empaparse con el procedimiento básico para la generación de imágenes //custom// de Linux para sistemas embebidos. Cada caso, será particular al embebido en cuestión, pero típicamente consta de lo mismos **macro-pasos** enumerados. 
- 
-====== Mapa de memoria ====== 
-==== Componentes del sistema ==== 
-* **MLO :** 
-Minimal LOader es un bootloader básico utilizado por TI (Texas Instruments) para las familias OMAP y derivados. Su principal misión es inicializar el hardware, unidades del SOC y  
-periféricos de la placa, mínimo para la operación. Por lo general en este software se configura el controlador de RAM externa, terminal de depuración, relojes del sistema y unidades de control de alimentación 
- 
-* **[[http://www.denx.de/wiki/U-Boot|U-Boot]] :** 
-Es un bootloader de propósito general destinado principalmente a embebidos. Entre las funciones implementadas se destacan la inicialización de los pines no críticos para la primera etapa de arranque, hardware secundario (USB, display), la copia de la imagen del kernel, rootfs y DTB de la memoria persistente a RAM y su posterior expansión (deflat) 
-  
-* **[[http://wiki.electron.frba.utn.edu.ar/doku.php?id=td3:device_tree_presentation|DTB]] :** 
-Es el binario (Device Tree Blob) asociado al DTS (Device Tree Source) que describe el hardware del sistema 
- 
-* **zImage :** 
-Imagen comprimida del kernel de Linux 
- 
-* **rootfs :** 
-Imagen del sistema de archivos del sistema. En el mismo se localizan todos los binarios necesarios para operación a nivel usuario (root/user) del sistema, así 
-como tambien aquellos utilizados por el propio OS para su correcta ejecución. 
- 
- 
-==== SD ==== 
- 
-<code asm> 
-+--------------------------------------+ 
-|                                      | 
-|                  MLO                 | 
-|                                      | 
-+--------------------------------------+ 
-|                                      | 
-|                 U-Boot               | 
-|                                      | 
-+--------------------------------------+ 
-|                                      | 
-|                  DTB                 | 
-|                                      | 
-+--------------------------------------+ 
-|                                      | 
-|                zImage                | 
-|                                      | 
-+--------------------------------------+ 
-|                                      | 
-|              Linux rootfs            | 
-|                                      | 
-+--------------------------------------+  
-</code> 
- 
-==== RAM ==== 
-{{:td3:under_construction.jpg|105x200}} 
  
 ====== Procedimiento ====== ====== Procedimiento ======
Línea 80: Línea 31:
 <code bash> <code bash>
 christian@desarrollo:/home/usuario/Imagen_BBB$ sudo apt-get install git-core christian@desarrollo:/home/usuario/Imagen_BBB$ sudo apt-get install git-core
-</code> +</code> 
 +* [[https://sge.frba.utn.edu.ar/wiki/td3/doku.php?id=uso_del_git_para_la_entrega_de_tp|GitLab configurado]]
  
 ===== Instalacion del cross compiler ===== ===== Instalacion del cross compiler =====
  
-Como //cross-compiler// se utiliza [[https://www.linaro.org/|GCC Linaro]]. De esa página, acceder al link: [[https://releases.linaro.org/components/toolchain/binaries/latest-7/arm-linux-gnueabihf/|Binaries]] en **Support/Downloads** (utilizamos arquitectura ARM-v7), descargar la última versión disponible y descomprimir:+Como //cross-compiler// se utiliza [[https://www.linaro.org/|GCC Linaro]]. De esa página, acceder al link: [[https://releases.linaro.org/components/toolchain/binaries/latest-7/arm-linux-gnueabihf/|Binaries]] en **Support/Downloads** (utilizamos arquitectura ARM-v7), descargar la versión homologada por la Cátedra y descomprimir:
  
 <code bash> <code bash>
Línea 118: Línea 70:
 </code> </code>
  
-===== Instalación y construcción de U-Boot =====+===== Instalación de dependencias =====
 Dependencias antes de empezar: Dependencias antes de empezar:
 <code bash> <code bash>
 +user@machine:~/ubicacion_carpeta/Imagen_BBB$ sudo apt-get update
 user@machine:~/ubicacion_carpeta/Imagen_BBB$ sudo apt install bison user@machine:~/ubicacion_carpeta/Imagen_BBB$ sudo apt install bison
 user@machine:~/ubicacion_carpeta/Imagen_BBB$ sudo apt install flex user@machine:~/ubicacion_carpeta/Imagen_BBB$ sudo apt install flex
 +user@machine:~/ubicacion_carpeta/Imagen_BBB$ sudo apt install build-essential
 +user@machine:~/ubicacion_carpeta/Imagen_BBB$ sudo apt install libncurses5
 +user@machine:~/ubicacion_carpeta/Imagen_BBB$ sudo apt install libpython2.7
 +</code>
 +Si se desea trabajar con el entorno visual [[https://www.gnu.org/software/ddd/ | DDD ]] y disponer del [[https://www.gnu.org/software/gdb/ | GDB]] para depurar múltiples arquitecturas (el conjunto de herramientas //crosstoolchain// ya dispone del //gdb// para la arquitectura ARM)
 +<code bash>
 +user@machine:~/ubicacion_carpeta/Imagen_BBB$ sudo apt install ddd
 +user@machine:~/ubicacion_carpeta/Imagen_BBB$ sudo apt install gdb-multiarch
 +</code>
 +===== Instalación de emulador =====
 +Instalar el emulador (responder Y a todo lo requerido)
 +<code bash>
 +user@machine:~/ubicacion_carpeta/Imagen_BBB$ sudo apt install qemu-system-arm
 </code> </code>
  
 +Verificar instalación. La versión puede diferir según la distribución que se esté empleando
 +<code bash>
 +user@machine:~/ubicacion_carpeta/Imagen_BBB$ qemu-system-arm -version
 +QEMU emulator version 2.5.0 (Debian 1:2.5+dfsg-5ubuntu10.51), Copyright (c) 2003-2008 Fabrice Bellard
 +</code>
  
 +Verificar ejecución. Las sintaxis de los argumentos puede diferir segun la versión, por lo cual se recomienda verificar la misma mediante la opción ''qemu-system-arm -help''
 +<code bash>
 +user@machine:~/ubicacion_carpeta/Imagen_BBB$ qemu-system-arm -machine realview-pb-a8 -m 32 -nographic -no-reboot -monitor telnet:127.0.0.1:1234,server,nowait;
 +pulseaudio: set_sink_input_volume() failed
 +pulseaudio: Reason: Invalid argument
 +pulseaudio: set_sink_input_mute() failed
 +pulseaudio: Reason: Invalid argument
 +qemu: fatal: Trying to execute code outside RAM or ROM at 0x02000000
 +
 +R00=00000000 R01=00000000 R02=00000000 R03=00000000
 +R04=00000000 R05=00000000 R06=00000000 R07=00000000
 +R08=00000000 R09=00000000 R10=00000000 R11=00000000
 +R12=00000000 R13=00000000 R14=00000000 R15=02000000
 +PSR=400001d3 -Z-- A svc32
 +s00=00000000 s01=00000000 d00=0000000000000000
 +s02=00000000 s03=00000000 d01=0000000000000000
 +s04=00000000 s05=00000000 d02=0000000000000000
 +s06=00000000 s07=00000000 d03=0000000000000000
 +s08=00000000 s09=00000000 d04=0000000000000000
 +s10=00000000 s11=00000000 d05=0000000000000000
 +s12=00000000 s13=00000000 d06=0000000000000000
 +s14=00000000 s15=00000000 d07=0000000000000000
 +s16=00000000 s17=00000000 d08=0000000000000000
 +s18=00000000 s19=00000000 d09=0000000000000000
 +s20=00000000 s21=00000000 d10=0000000000000000
 +s22=00000000 s23=00000000 d11=0000000000000000
 +s24=00000000 s25=00000000 d12=0000000000000000
 +s26=00000000 s27=00000000 d13=0000000000000000
 +s28=00000000 s29=00000000 d14=0000000000000000
 +s30=00000000 s31=00000000 d15=0000000000000000
 +s32=00000000 s33=00000000 d16=0000000000000000
 +s34=00000000 s35=00000000 d17=0000000000000000
 +s36=00000000 s37=00000000 d18=0000000000000000
 +s38=00000000 s39=00000000 d19=0000000000000000
 +s40=00000000 s41=00000000 d20=0000000000000000
 +s42=00000000 s43=00000000 d21=0000000000000000
 +s44=00000000 s45=00000000 d22=0000000000000000
 +s46=00000000 s47=00000000 d23=0000000000000000
 +s48=00000000 s49=00000000 d24=0000000000000000
 +s50=00000000 s51=00000000 d25=0000000000000000
 +s52=00000000 s53=00000000 d26=0000000000000000
 +s54=00000000 s55=00000000 d27=0000000000000000
 +s56=00000000 s57=00000000 d28=0000000000000000
 +s58=00000000 s59=00000000 d29=0000000000000000
 +s60=00000000 s61=00000000 d30=0000000000000000
 +s62=00000000 s63=00000000 d31=0000000000000000
 +FPSCR: 00000000
 +Aborted (core dumped)
 +</code>
 +
 +
 +===== Instalación y construcción de U-Boot =====
 Descargar el //bootloader//, U-Boot((http://www.denx.de/wiki/U-Boot))((http://git.denx.de/?p=u-boot.git;a=summary))((https://github.com/eewiki/u-boot-patches)), para la imagen a construir. Para ello, clonamos el siguiente repositorio y buscamos uno de los branch más reciente (pero **nunca** el último, ya que usualmente requiere de correcciones por parte de los desarrolladores. Idealmente: 1 o 2 branch detrás): Descargar el //bootloader//, U-Boot((http://www.denx.de/wiki/U-Boot))((http://git.denx.de/?p=u-boot.git;a=summary))((https://github.com/eewiki/u-boot-patches)), para la imagen a construir. Para ello, clonamos el siguiente repositorio y buscamos uno de los branch más reciente (pero **nunca** el último, ya que usualmente requiere de correcciones por parte de los desarrolladores. Idealmente: 1 o 2 branch detrás):
  
Línea 168: Línea 191:
 user@machine:~/ubicacion_carpeta/Imagen_BBB$ user@machine:~/ubicacion_carpeta/Imagen_BBB$
 </code> </code>
- 
- 
  
 ===== Instalación y construcción del Linux Kernel ===== ===== Instalación y construcción del Linux Kernel =====
Línea 191: Línea 212:
 </code> </code>
  
-Puede que al ejecutar el script **build_kernel.sh** arroje un error pidiendo satisfacer ciertas dependencias, en cuyo caso procedemos a cumplirlas. Por ejemplo, un mensaje que al menos a mi me apareció fue:+Puede que al ejecutar el script **build_kernel.sh** arroje un error pidiendo satisfacer ciertas dependencias, en cuyo caso procedemos a cumplirlas. Por ejemplo:
  
 <code bash> <code bash>
Línea 205: Línea 226:
 </code> </code>
  
-En cuyo caso, ejecuté la línea: +En cuyo caso, ejecute la línea: 
 <code bash> <code bash>
 user@machine:~/ubicacion_carpeta/Imagen_BBB/bb-kernel$ sudo apt-get install lzma lzop libmpc-dev u-boot-tools libssl-dev:amd64  user@machine:~/ubicacion_carpeta/Imagen_BBB/bb-kernel$ sudo apt-get install lzma lzop libmpc-dev u-boot-tools libssl-dev:amd64 
 </code> </code>
  
-Volvemos ejecutar el script, y luego de que realiza un par de descargas y prepara todo, nos aparece la siguiente pantalla de configuración:+Volver a ejecutar el script, al finalizar la preparación el mismo presentará siguiente pantalla de configuración:
  
 {{td3:kernelcfgscreen.png?1000x500}} {{td3:kernelcfgscreen.png?1000x500}}
Línea 271: Línea 292:
  
 ==== Preparación de la microSD ==== ==== Preparación de la microSD ====
-Verificar que la tarjeta microSD **no** se encuentre dentro de la lista de [[http://http://wiki.electron.frba.utn.edu.ar/doku.php?id=td3:bbx&do=edit&rev=#faq|incompatibles]])+Verificar que la tarjeta microSD **no** se encuentre dentro de la lista de incompatibles en la sección FAQ (al final de esta página)
  
 **NOTA:** tener cuidado con los comandos a continuación, sobre todo con el comando **dd**, ya que si ponemos mal el //device// (el "disco" en este caso"), podemos llegar a perder la PC Host. Para más información, ingresar a la pagina [[http://man7.org/linux/man-pages/man1/dd.1.html|man linux dd]]. **NOTA:** tener cuidado con los comandos a continuación, sobre todo con el comando **dd**, ya que si ponemos mal el //device// (el "disco" en este caso"), podemos llegar a perder la PC Host. Para más información, ingresar a la pagina [[http://man7.org/linux/man-pages/man1/dd.1.html|man linux dd]].
Línea 290: Línea 311:
  
 <code bash>user@machine:~/ubicacion_carpeta/Imagen_BBB$ export DISK=/dev/mmcblk0</code> <code bash>user@machine:~/ubicacion_carpeta/Imagen_BBB$ export DISK=/dev/mmcblk0</code>
 +
 +Para el caso que nuestro dispositivo sea **/dev/sd<letra><numero>**
 +
 +<code bash>user@machine:~/ubicacion_carpeta/Imagen_BBB$ export DISK=/dev/sd<letra></code>
  
 Con el comando **lsblk** podrán obtener un listado de las unidades de almacenamiento y sus particiones. Con el comando **lsblk** podrán obtener un listado de las unidades de almacenamiento y sus particiones.
Línea 364: Línea 389:
 === Root File System === === Root File System ===
  
-<code bash>user@machine:~/ubicacion_carpeta/Imagen_BBB$ sudo tar xfvp ./*-*-*-armhf-*/armhf-rootfs-*.tar -C /media/rootfs/  +<code bash>user@machine:~/ubicacion_carpeta/Imagen_BBB/ubuntu-XXXX-XXXX-XXX-XXX$ sudo tar xfvp ./*-*-*-armhf-*/armhf-rootfs-*.tar -C /media/rootfs/  
-user@machine:~/ubicacion_carpeta/Imagen_BBB$ sync +user@machine:~/ubicacion_carpeta/Imagen_BBB/ubuntu-XXXX-XXXX-XXX-XXX$ sync 
-user@machine:~/ubicacion_carpeta/Imagen_BBB$ sudo chown root:root /media/rootfs/ +user@machine:~/ubicacion_carpeta/Imagen_BBB/ubuntu-XXXX-XXXX-XXX-XXX$ sudo chown root:root /media/rootfs/ 
-user@machine:~/ubicacion_carpeta/Imagen_BBB$ sudo chmod 755 /media/rootfs/</code>+user@machine:~/ubicacion_carpeta/Imagen_BBB/ubuntu-XXXX-XXXX-XXX-XXX$ sudo chmod 755 /media/rootfs/</code>
  
 Crear el archivo uEnv.txt en el directorio local de trabajo, con las siguientes lineas: Crear el archivo uEnv.txt en el directorio local de trabajo, con las siguientes lineas:
Línea 521: Línea 546:
  
   - Correr ifconfig y anotar el nombre de la interfaz que tiene la dirección 192.168.7.1 (que es el que se conecta a la Beaglebone) y luego anotar el nombre de la interfaz que provee Internet.   - Correr ifconfig y anotar el nombre de la interfaz que tiene la dirección 192.168.7.1 (que es el que se conecta a la Beaglebone) y luego anotar el nombre de la interfaz que provee Internet.
-  - sudo ifconfig **nombre_interfaz_usb_de_BBB** 192.168.7.1 +  - sudo su 
-  - sudo iptables %%--%%table nat %%--%%append POSTROUTING %%--%%out-interface **interfaz_WLAN_que_brindara_internet** -j MASQUERADE +  - ifconfig **nombre_interfaz_usb_de_BBB** 192.168.7.1 
-  - sudo iptables %%--%%append FORWARD %%--%%in-interface **nombre_interfaz_usb_de_BBB** -j ACCEPT +  - iptables %%--%%table nat %%--%%append POSTROUTING %%--%%out-interface **interfaz_WLAN_que_brindara_internet** -j MASQUERADE 
-  - sudo echo 1 > /proc/sys/net/ipv4/ip_forward+  - iptables %%--%%append FORWARD %%--%%in-interface **nombre_interfaz_usb_de_BBB** -j ACCEPT 
 +  - echo 1 > /proc/sys/net/ipv4/ip_forward
  
 Es importante no poner comillas en los nombres de las interfaces que se colocan en los comandos que se muestran arriba. Estos archivos se pueden poner un archivo batch ejecutable (de texto) para no tipearlos cada vez que arranque la PC o la Beaglebone. Es importante no poner comillas en los nombres de las interfaces que se colocan en los comandos que se muestran arriba. Estos archivos se pueden poner un archivo batch ejecutable (de texto) para no tipearlos cada vez que arranque la PC o la Beaglebone.
  
 +=== Verificar que haya internet ===
 +    ping www.example.com
 +En caso que no consigamos es probable que no este configurado ningún servidor DNS.
 +Para ello abrir el archivo "/etc/resolv.conf"
 +    sudo nano /etc/resolv.conf
 +
 +Si el archivo no tiene ningún nameserver, agregar:
 +    nameserver 8.8.8.8
 +
 +Luego reiniciar el servicio con:
 +    sudo systemctl restart systemd-resolved.service
 +
 +Verificar nuevamente si se puede resolver el dominio
 +    ping www.example.com
 ==== Segundo método (NO seguro para producto) ==== ==== Segundo método (NO seguro para producto) ====
  
Línea 569: Línea 609:
 //ssh localhost// //ssh localhost//
  
- --- //[[luciano.ferreyro@iteda.cnea.gov.ar|LFerreyro]]//\\  
  --- //[[cnigri@frba.utn.edu.ar|ChristiaN]]//\\  --- //[[cnigri@frba.utn.edu.ar|ChristiaN]]//\\
-//2020/08/23 00:00//+ --- //[[luciano.ferreyro@iteda.cnea.gov.ar|LFerreyro]]//\\  
 +//2023/03/25 18:00//