Diferencias
Muestra las diferencias entre dos versiones de la página.
| Ambos lados, revisión anteriorRevisión previaPróxima revisión | Revisión previa | ||
| td3:bbx [2020/08/08 18:42] – hzbucki | td3:bbx [2026/09/11 07:57] (actual) – borrado - editor externo (Fecha desconocida) 127.0.0.1 | ||
|---|---|---|---|
| Línea 1: | Línea 1: | ||
| - | ====== Introducción ====== | ||
| - | La presente guía tiene por objeto brindar el procedimiento necesario para la instalación de un SO Linux distribución Ubuntu en una SD para un sistema del tipo Beagle. | ||
| - | El procedimiento detallado en los subsiguientes apartados se encuentra basado en [[https:// | ||
| - | |||
| - | 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 | ||
| - | perifericos de la placa, mínimo para la operacion. Por lo general en este software se configura el controlador de RAM externa, terminal de depuración, | ||
| - | |||
| - | * **[[http:// | ||
| - | Es un bootloader de proposito 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:// | ||
| - | Es el binario asociado al DTS 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 | | ||
| - | | | | ||
| - | +--------------------------------------+ | ||
| - | | | | ||
| - | | | ||
| - | | | | ||
| - | +--------------------------------------+ | ||
| - | | | | ||
| - | | DTB | | ||
| - | | | | ||
| - | +--------------------------------------+ | ||
| - | | | | ||
| - | | zImage | ||
| - | | | | ||
| - | +--------------------------------------+ | ||
| - | | | | ||
| - | | Linux rootfs | ||
| - | | | | ||
| - | +--------------------------------------+ | ||
| - | </ | ||
| - | |||
| - | ==== RAM ==== | ||
| - | {{: | ||
| - | |||
| - | ====== Procedimiento ====== | ||
| - | |||
| - | A fin de ejecutar exitosamente el procedimiento propuesto es altamente recomendable satisfacer los siguientes requerimientos | ||
| - | * Crear una carpeta base en un directorio que no requiera privilegios, | ||
| - | <code bash> | ||
| - | cd / | ||
| - | mkdir Imagen_BBB | ||
| - | </ | ||
| - | * Trabajar dentro la carpeta creada | ||
| - | <code bash> | ||
| - | cd Imagen_BBB | ||
| - | </ | ||
| - | * Verificar que la microSD a utilizar sea compatible con la versión de Beagle. | ||
| - | * Disponer de unas horas libres para la compilación del Kernel. | ||
| - | * Requerimiento del ordenador | ||
| - | * Lector de memoria SD | ||
| - | * Al menos 7 GB de espacio en disco | ||
| - | * SO Linux de 64b (**x86_64**) | ||
| - | <code bash> | ||
| - | christian@desarrollo:/ | ||
| - | christian@desarrollo:/ | ||
| - | </ | ||
| - | * GIT instalado | ||
| - | <code bash> | ||
| - | christian@desarrollo:/ | ||
| - | </ | ||
| - | |||
| - | ===== Instalacion del cross compiler ===== | ||
| - | |||
| - | Como // | ||
| - | |||
| - | <code bash> | ||
| - | user@machine:/ | ||
| - | </ | ||
| - | |||
| - | Dónde, por ejemplo: | ||
| - | * X.X.X = 7.5.0, | ||
| - | * YYYY.MM = 2019.12 | ||
| - | |||
| - | Para utilizar el nuevo // | ||
| - | * **1-Persistente** | ||
| - | Permite disponer de forma permanente la herramienta, | ||
| - | <code bash> | ||
| - | export PATH=$PATH:/ | ||
| - | </ | ||
| - | Relanzar la terminal para que los cambios surtan efecto | ||
| - | <code bash> | ||
| - | user@machine:// | ||
| - | arm-linux-gnueabihf-gcc (Linaro GCC X.X-YYYY.MM) X.X.X YYYYMMDD [linaro-X.X.X-YYYY.MM revision 7b15d0869c096fe39603ad63dc19ab7cf035eb70] | ||
| - | Copyright (C) 2017 Free Software Foundation, Inc. | ||
| - | This is free software; see the source for copying conditions. There is NO | ||
| - | warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. </ | ||
| - | * **2-Temporal** | ||
| - | Para evitar conflictos con otras herramientas utilizadas, es posible establecer una herramienta específica antes de cada contrucción | ||
| - | <code bash> | ||
| - | user@machine:/ | ||
| - | user@machine:/ | ||
| - | arm-linux-gnueabihf-gcc (Linaro GCC X.X-YYYY.MM) X.X.X YYYYMMDD [linaro-X.X.X-YYYY.MM revision 7b15d0869c096fe39603ad63dc19ab7cf035eb70] | ||
| - | Copyright (C) 2017 Free Software Foundation, Inc. | ||
| - | This is free software; see the source for copying conditions. There is NO | ||
| - | warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. | ||
| - | </ | ||
| - | |||
| - | ===== Instalación y contrucción de U-Boot ===== | ||
| - | Descargar el // | ||
| - | |||
| - | <code bash> | ||
| - | user@machine: | ||
| - | user@machine: | ||
| - | user@machine: | ||
| - | </ | ||
| - | |||
| - | Por ejemplo, YYYY.MM = 2019.04. | ||
| - | |||
| - | Descargar y aplicar los parches correspondientes: | ||
| - | |||
| - | <code bash> | ||
| - | user@machine: | ||
| - | user@machine: | ||
| - | user@machine: | ||
| - | user@machine: | ||
| - | </ | ||
| - | |||
| - | **Nota:** YYYY.MM es el mismo que en el paso anterior. | ||
| - | |||
| - | Configurar y construir ("// | ||
| - | |||
| - | **Opción 1:** si hiciste //export// antes: | ||
| - | <code bash> | ||
| - | user@machine: | ||
| - | user@machine: | ||
| - | </ | ||
| - | |||
| - | **Opción 2:** si **NO** hiciste //export// antes: | ||
| - | <code bash> | ||
| - | user@machine: | ||
| - | user@machine: | ||
| - | </ | ||
| - | |||
| - | Pueden aparecer algunos warnings al finalizar. | ||
| - | |||
| - | **Antes de pasar a la siguiente sección:** | ||
| - | |||
| - | <code bash> | ||
| - | user@machine: | ||
| - | </ | ||
| - | |||
| - | |||
| - | |||
| - | ===== Instalación y contrucción del Linux Kernel ===== | ||
| - | Verificar que se encuentra en la carpeta raiz del proyecto | ||
| - | <code bash> | ||
| - | user@machine: | ||
| - | user@machine: | ||
| - | user@machine: | ||
| - | </ | ||
| - | |||
| - | Descargar el // | ||
| - | <code bash> | ||
| - | user@machine: | ||
| - | user@machine: | ||
| - | user@machine: | ||
| - | </ | ||
| - | |||
| - | Descargar y contruir | ||
| - | <code bash> | ||
| - | user@machine: | ||
| - | </ | ||
| - | |||
| - | Puede que al ejecutar el script **build_kernel.sh** arroje un error pidiendo satisfacer ciertas dependencias, | ||
| - | |||
| - | <code bash> | ||
| - | | ||
| - | + host: [x86_64] | ||
| - | + git HEAD commit: [703093899bef60a157a0586b256e598d85b8227a] | ||
| - | Debian/ | ||
| - | ----------------------------- | ||
| - | sudo apt-get update | ||
| - | sudo apt-get install lzma lzop libmpc-dev u-boot-tools libssl-dev: | ||
| - | ----------------------------- | ||
| - | * Failed dependency check | ||
| - | </ | ||
| - | |||
| - | En cuyo caso, ejecuté la línea: | ||
| - | <code bash> | ||
| - | user@machine: | ||
| - | </ | ||
| - | |||
| - | Volvemos ejecutar el script, y luego de que realiza un par de descargas y prepara todo, nos aparece la siguiente pantalla de configuración: | ||
| - | |||
| - | {{td3: | ||
| - | |||
| - | la cual, a menos que sea por interés propio del alumno, no modificamos nada. Seleccionamos **exit** y continuamos...y a sentarse a esperar un buen rato (depende de la PC):!::!:. Esta sección (y el script ejecutado) se encarga de construir el Kernel, sus módulos, el //device tree// y los copia al directorio //deploy// (dentro de ésta misma carpeta bb-kernel/ | ||
| - | |||
| - | Vale aclarar, que a partir de las versiones: **U-Boot: v2018.07 y Kernel: v4.18.x**, se dispone de los parches para Spectre y Meltdown. | ||
| - | |||
| - | **Una vez finalizado: | ||
| - | |||
| - | <code bash> | ||
| - | Script Complete | ||
| - | eewiki.net: [user@localhost: | ||
| - | -----------------------------</ | ||
| - | |||
| - | Ejecutamos esa línea: | ||
| - | |||
| - | <code bash> | ||
| - | |||
| - | |||
| - | **Y antes de pasar a la siguiente sección:** | ||
| - | <code bash> | ||
| - | user@machine: | ||
| - | </ | ||
| - | |||
| - | |||
| - | |||
| - | ====== RFS: Root File System ====== | ||
| - | |||
| - | Aqui nos encargamos de descargar la imagen de Ubuntu: | ||
| - | |||
| - | <code bash> | ||
| - | |||
| - | Ejemplo: | ||
| - | * XX.YY.Z: puede ser **18.04.1** o **20.04**. Se puede acceder a dicha [[https:// | ||
| - | * YYYY-MM-DD: puede ser **2020-05-10**, | ||
| - | |||
| - | Verificamos que se haya descargado correctamente: | ||
| - | |||
| - | <code bash> | ||
| - | 6b212ee7dd0d5c9c0af49c22cf78b63e6ad20cec641c303232fca9f21a18804c | ||
| - | </ | ||
| - | |||
| - | Extraemos: | ||
| - | |||
| - | <code bash> | ||
| - | |||
| - | Al momento de la creación de este tutorial, el usuario y contraseña para esta distribución son: | ||
| - | |||
| - | ^ Usuario | ||
| - | | ubuntu | ||
| - | |||
| - | ====== Instalación ====== | ||
| - | |||
| - | LLegados a este punto, debemos contar con el siguiente árbol de directorios en la carpeta Imagen_BBB/: | ||
| - | |||
| - | {{td3: | ||
| - | |||
| - | Dónde además, ya compilamos el bootloader y el kernel. Los pasos restantes son para grabar la imagen en la micro SD y en la sección siguiente, configurar la conectividad a internet. | ||
| - | |||
| - | ==== Preparación de la microSD ==== | ||
| - | |||
| - | **NOTA:** tener cuidado con los comandos a continuación, | ||
| - | |||
| - | Antes de continuar, tenemos que saber que nombre le asignó el sistema operativo al //device//. Para ello, ejecutamos el comando **dmesg** ([[http:// | ||
| - | |||
| - | <code bash> | ||
| - | |||
| - | Luego, **COLOCAR LA SD EN EL LECTOR DE LA NOTEBOOK/ | ||
| - | |||
| - | <code bash> | ||
| - | [ 345.931132] mmcblk0: mmc0:0001 SD8GB 7.28 GiB | ||
| - | [ 345.933006] | ||
| - | |||
| - | |||
| - | |||
| - | En el caso ejemplo, resulta ser: **mmcblk0**. Por lo tanto, hacemos: | ||
| - | |||
| - | <code bash> | ||
| - | |||
| - | Con el comando **lsblk** podrán obtener un listado de las unidades de almacenamiento y sus particiones. | ||
| - | |||
| - | Comenzamos con el procedimiento: | ||
| - | |||
| - | * Borramos la tabla de particiones de la microSD: | ||
| - | |||
| - | <code bash> | ||
| - | |||
| - | * Instalamos el bootloader: | ||
| - | |||
| - | <code bash> | ||
| - | user@machine: | ||
| - | |||
| - | * Creamos el esquema de particiones. Para ello, requerimos del comando **sfdisk** ([[http:// | ||
| - | |||
| - | <code bash> | ||
| - | sfdisk from util-linux X.XX.X</ | ||
| - | |||
| - | **Para version >= 2.26.x:** | ||
| - | |||
| - | <code bash> | ||
| - | 4M,,L,* | ||
| - | __EOF__</ | ||
| - | |||
| - | **Para version =< 2.25.x:** | ||
| - | |||
| - | <code bash> | ||
| - | 4,,L,* | ||
| - | __EOF__</ | ||
| - | |||
| - | * Formateamos las particiones. Para ello, utilizamos el comando **mkfs.ext4** ([[https:// | ||
| - | |||
| - | <code bash> | ||
| - | |||
| - | **Para versión >= 1.43:** | ||
| - | |||
| - | Para el caso en que: // | ||
| - | |||
| - | <code bash> | ||
| - | |||
| - | Para el caso en que: // | ||
| - | |||
| - | <code bash> | ||
| - | |||
| - | |||
| - | **Para versión =< 1.42:** | ||
| - | |||
| - | Para el caso en que: // | ||
| - | |||
| - | <code bash> | ||
| - | |||
| - | Para el caso en que: // | ||
| - | |||
| - | <code bash> | ||
| - | |||
| - | * **Finalmente, | ||
| - | |||
| - | <code bash> | ||
| - | |||
| - | Para el caso en que: // | ||
| - | |||
| - | <code bash> | ||
| - | |||
| - | Para el caso en que: // | ||
| - | |||
| - | <code bash> | ||
| - | |||
| - | |||
| - | |||
| - | ==== Instalación del Kernel y el Root File System ==== | ||
| - | |||
| - | === Root File System === | ||
| - | |||
| - | <code bash> | ||
| - | user@machine: | ||
| - | user@machine: | ||
| - | user@machine: | ||
| - | |||
| - | Crear el archivo uEnv.txt en el directorio local de trabajo, con las siguientes lineas: | ||
| - | |||
| - | <code bash># | ||
| - | mmcroot=/ | ||
| - | |||
| - | Luego, copiarlo al microSD: | ||
| - | |||
| - | <code bash> | ||
| - | |||
| - | Y finalmente: | ||
| - | |||
| - | <code bash> | ||
| - | |||
| - | === Linux Kernel === | ||
| - | |||
| - | <code bash> | ||
| - | user@machine: | ||
| - | user@machine: | ||
| - | user@machine: | ||
| - | </ | ||
| - | |||
| - | Editamos el archivo que contiene la tabla de particiones, | ||
| - | |||
| - | <code bash> | ||
| - | |||
| - | |||
| - | |||
| - | |||
| - | |||
| - | |||
| - | |||
| - | |||
| - | |||
| - | |||
| - | |||
| - | |||
| - | ====== Networking ====== | ||
| - | |||
| - | En este paso caben 2 escenarios distintos. Uno es que se desee utilizar la BBB conectada a un router, y el otro conectada a la PC. Estos casos, a fines prácticos de la materia, son mutuamente excluyentes. Es decir, se opta por uno de los métodos. | ||
| - | |||
| - | === Configuración en la BBB === | ||
| - | |||
| - | Editamos/ | ||
| - | |||
| - | <code bash> | ||
| - | |||
| - | * Si pretendemos conectar la BBB a un router, creamos el archivo con las siguientes lineas: | ||
| - | |||
| - | < | ||
| - | iface lo inet loopback | ||
| - | | ||
| - | auto eth0 | ||
| - | iface eth0 inet dhcp </ | ||
| - | |||
| - | * Si pretendemos conectarla a la PC, creamos el archivo con las siguientes lineas: | ||
| - | |||
| - | < | ||
| - | iface lo inet loopback</ | ||
| - | |||
| - | Luego, para cualquiera de los 2 casos, agregamos la siguiente regla persistente: | ||
| - | |||
| - | <code bash> | ||
| - | |||
| - | Y le escribimos: | ||
| - | |||
| - | < | ||
| - | SUBSYSTEM==" | ||
| - | |||
| - | Por otro lado, nuevamente, dependiendo del caso elegido varía la configuración de [[https:// | ||
| - | |||
| - | <code bash> | ||
| - | |||
| - | * Si pretendemos conectar la BBB a un router, creamos el archivo con las siguientes lineas: | ||
| - | |||
| - | < | ||
| - | network: | ||
| - | version: 2 | ||
| - | renderer: networkd | ||
| - | ethernets: | ||
| - | eth0: | ||
| - | dhcp4: true | ||
| - | </ | ||
| - | |||
| - | |||
| - | * Si pretendemos conectar la BBB a la PC, creamos el archivo con las siguientes lineas: | ||
| - | |||
| - | < | ||
| - | network: | ||
| - | version: 2 | ||
| - | renderer: networkd | ||
| - | ethernets: | ||
| - | eth0: | ||
| - | addresses: | ||
| - | - 172.31.255.2/ | ||
| - | nameservers: | ||
| - | addresses: [8.8.8.8, 8.8.4.4] | ||
| - | </ | ||
| - | |||
| - | Finalizados estos pasos, podemos extraer la microSD: | ||
| - | |||
| - | <code bash> | ||
| - | user@machine: | ||
| - | |||
| - | |||
| - | === Configuración en la PC === | ||
| - | |||
| - | Este paso debe seguirse si se optó por conectar la BBB a la PC. En este paso, lo que haremos será crear una nueva conexión cableada con el gestor de conexiones de la distribución que estemos utilizando. La cual debe quedar configurada de la siguiente manera: | ||
| - | |||
| - | |||
| - | ^ Nombre Conexión ^ Hardware ^ Tipo ^ Método ^ Dirección IP ^ Máscara de Red ^ Puerta de enlace ^ | ||
| - | | BBB_Cable | ||
| - | |||
| - | |||
| - | === Configuración para acceso SSH === | ||
| - | |||
| - | Finalmente, para poder acceder mediante **ssh** debemos editar un archivo de configuración ubicado en **/ | ||
| - | |||
| - | < | ||
| - | Port 22 | ||
| - | Protocol 2 | ||
| - | </ | ||
| - | |||
| - | Y agregar al final de todo: | ||
| - | |||
| - | < | ||
| - | PermitRootLogin yes | ||
| - | </ | ||
| - | |||
| - | Guardar el archivo y listo. Con esto, ya deberíamos poder conectarnos a la BBB con un cable de red conectado a la PC, mediante **ssh**: | ||
| - | |||
| - | <code bash> | ||
| - | |||
| - | === Internet en la BBB y la PC (método NO seguro para producto)=== | ||
| - | |||
| - | Este paso NO es obligatorio, | ||
| - | |||
| - | == BBB === | ||
| - | |||
| - | En el primer booteo de la BBB: | ||
| - | |||
| - | <code bash> | ||
| - | ubuntu@arm: | ||
| - | ubuntu@arm: | ||
| - | ubuntu@arm: | ||
| - | ubuntu@arm: | ||
| - | |||
| - | Esto no se repite más. Lo siguiente, debe hacerse cada vez que se bootee la BBB: | ||
| - | |||
| - | <code bash> | ||
| - | |||
| - | Que en el caso ejemplo, IP_ASIGNADA_AL_HOST = 172.31.255.1 | ||
| - | |||
| - | == PC == | ||
| - | |||
| - | En la consola de la PC deben ejecutarse los siguientes comandos: | ||
| - | |||
| - | <code bash> | ||
| - | user@machine: | ||
| - | |||
| - | **Aclaración**: | ||
| - | profesionales. La forma correcta es algo más compleja, y escapa a los objetivos de la materia (y los tiempos disponibles para que todos los alumnos puedan implementarlo).\\ | ||
| - | |||
| - | ====== FAQ ====== | ||
| - | * **¿Al crear uEnv.txt siempre debo utilizar el dispositivo indicado en el "paso a paso"? | ||
| - | No. El dispositivo corresponde al visualizado en el punto de montaje, ya sea por dmesg o mount. Por ejmplo si se observa que la tarjeta se monta en /dev/sdX, se debe utilizar dicho dispositivo. | ||
| - | |||
| - | |||
| - | --- // | ||
| - | --- // | ||
| - | // | ||