¡Esta es una revisión vieja del documento!
Tabla de Contenidos
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 Linux on ARM, pero con las modificiones necesarias para satisfacer el propósito de la cátedra, por tal motivo no se utilizará la ROM.
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
* 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)
* 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
+--------------------------------------+ | | | MLO | | | +--------------------------------------+ | | | U-Boot | | | +--------------------------------------+ | | | 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, por ejemplo
cd /home/<su usuario> mkdir Imagen_BBB
- Trabajar dentro la carpeta creada
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)
christian@desarrollo:/home/usuario/Imagen_BBB$ uname -a christian@desarrollo:/home/usuario/Imagen_BBB$ Linux nsw02 4.15.0-34-generic #37~16.04.1-Ubuntu SMP Tue Aug 28 10:44:06 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
- GIT instalado
christian@desarrollo:/home/usuario/Imagen_BBB$ sudo apt-get install git-core
Instalacion del cross compiler
Como cross-compiler se utiliza GCC Linaro. De esa página, acceder al link: Binaries en Support/Downloads (utilizamos arquitectura ARM-v7), descargar la versión homologada por la Cátedra y descomprimir:
user@machine:/home/<su usuario>/Imagen_BBB$ tar xf gcc-linaro-X.X.X-YYYY.MM-x86_64_arm-linux-gnueabihf.tar.xz
Dónde, por ejemplo:
- X.X.X = 7.5.0,
- YYYY.MM = 2019.12
Para utilizar el nuevo toolchain, se disponen de dos opciones a elección del desarrollador
- 1-Persistente
Permite disponer de forma permanente la herramienta, para lo cual es necesario incorporar al fichero .bashrc ubicado en el directorio de trabajo del usuario la siguiente directiva
export PATH=$PATH:/home/<su usuario>/Imagen_BBB/gcc-linaro-X.X.X-YYYY.MM-x86_64_arm-linux-gnueabihf/bin/
Relanzar la terminal para que los cambios surtan efecto
user@machine://home/<su usuario>/Imagen_BBB/$ arm-linux-gnueabihf-gcc --version 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
user@machine:/home/<su usuario>/Imagen_BBB/$ export CC=`pwd`/gcc-linaro-X.X.X-YYYY.MM-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf- user@machine:/home/<su usuario>/Imagen_BBB/$ ${CC}gcc --version 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 de dependencias
Dependencias antes de empezar:
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 flex user@machine:~/ubicacion_carpeta/Imagen_BBB$ sudo apt install build-essential user@machine:~/ubicacion_carpeta/Imagen_BBB$ sudo apt-get install libncurses5 user@machine:~/ubicacion_carpeta/Imagen_BBB$ sudo apt install install libpython2.7 user@machine:~/ubicacion_carpeta/Imagen_BBB$ sudo apt install ddd user@machine:~/ubicacion_carpeta/Imagen_BBB$ sudo apt install gdb-multiarch
Si se desea trabajar con el entorno visual DDD y disponer del GDB para depurar múltiples arquitecturas (el conjunto de herramientas crosstoolchain ya dispone del gdb para la arquitectura ARM)
user@machine:~/ubicacion_carpeta/Imagen_BBB$ sudo apt install ddd user@machine:~/ubicacion_carpeta/Imagen_BBB$ sudo apt install gdb-multiarch
Instalación de emulador
Instalar el emulador (responder Y a todo lo requerido)
user@machine:~/ubicacion_carpeta/Imagen_BBB$ sudo apt install qemu-system-arm
Verificar instalación. La versión puede diferir según la distribución que se esté empleando
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
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
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)
Instalación y construcción de U-Boot
Descargar el bootloader, U-Boot1)2)3), 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):
user@machine:~/ubicacion_carpeta/Imagen_BBB$ git clone https://github.com/u-boot/u-boot user@machine:~/ubicacion_carpeta/Imagen_BBB$ cd u-boot/ user@machine:~/ubicacion_carpeta/Imagen_BBB/u-boot$ git checkout vYYYY.MM -b tmp
Por ejemplo, YYYY.MM = 2019.04.
Descargar y aplicar los parches correspondientes:
user@machine:~/ubicacion_carpeta/Imagen_BBB/u-boot$ wget -c https://rcn-ee.com/repos/git/u-boot-patches/vYYYY.MM/0001-am335x_evm-uEnv.txt-bootz-n-fixes.patch user@machine:~/ubicacion_carpeta/Imagen_BBB/u-boot$ wget -c https://rcn-ee.com/repos/git/u-boot-patches/vYYYY.MM/0002-U-Boot-BeagleBone-Cape-Manager.patch user@machine:~/ubicacion_carpeta/Imagen_BBB/u-boot$ patch -p1 < 0001-am335x_evm-uEnv.txt-bootz-n-fixes.patch user@machine:~/ubicacion_carpeta/Imagen_BBB/u-boot$ patch -p1 < 0002-U-Boot-BeagleBone-Cape-Manager.patch
Nota: YYYY.MM es el mismo que en el paso anterior.
Configurar y construir (“buildear”) segun la configuración de las herramientas en la sección anterior (export o .bashrc):
Opción 1: si hiciste export antes:
user@machine:~/ubicacion_carpeta/Imagen_BBB/u-boot$ make ARCH=arm CROSS_COMPILE=${CC} distclean user@machine:~/ubicacion_carpeta/Imagen_BBB/u-boot$ make ARCH=arm CROSS_COMPILE=${CC} am335x_evm_defconfig user@machine:~/ubicacion_carpeta/Imagen_BBB/u-boot$ make ARCH=arm CROSS_COMPILE=${CC}
Opción 2: si NO hiciste export antes:
user@machine:~/ubicacion_carpeta/Imagen_BBB/u-boot$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean user@machine:~/ubicacion_carpeta/Imagen_BBB/u-boot$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- am335x_evm_defconfig user@machine:~/ubicacion_carpeta/Imagen_BBB/u-boot$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
Pueden aparecer algunos warnings al finalizar.
Antes de pasar a la siguiente sección:
user@machine:~/ubicacion_carpeta/Imagen_BBB/u-boot$ cd .. user@machine:~/ubicacion_carpeta/Imagen_BBB$
Instalación y construcción del Linux Kernel
Verificar que se encuentra en la carpeta raiz del proyecto
user@machine:~/ubicacion_carpeta/Imagen_BBB/u-boot$ cd user@machine:/home/<su usuario>/Imagen_BBB/ user@machine:~/ubicacion_carpeta/Imagen_BBB$ pwd user@machine:~/ubicacion_carpeta/Imagen_BBB$ /home/<su usuario>/Imagen_BBB/
Descargar el mainline:
user@machine:~/ubicacion_carpeta/Imagen_BBB$ git clone https://github.com/RobertCNelson/bb-kernel user@machine:~/ubicacion_carpeta/Imagen_BBB$ cd bb-kernel/ user@machine:~/ubicacion_carpeta/Imagen_BBB/bb-kernel$
Descargar y construir la última versión estable (por ej.: am33x-v4.19 al momento de actualización de la Wiki):
user@machine:~/ubicacion_carpeta/Imagen_BBB/bb-kernel$ git checkout origin/am33x-v4.19 -b tmp user@machine:~/ubicacion_carpeta/Imagen_BBB/bb-kernel$ ./build_kernel.sh
Puede que al ejecutar el script build_kernel.sh arroje un error pidiendo satisfacer ciertas dependencias, en cuyo caso procedemos a cumplirlas. Por ejemplo:
Detected build host [KDE neon User Edition 5.19] + host: [x86_64] + git HEAD commit: [703093899bef60a157a0586b256e598d85b8227a] Debian/Ubuntu/Mint: missing dependencies, please install: ----------------------------- sudo apt-get update sudo apt-get install lzma lzop libmpc-dev u-boot-tools libssl-dev:amd64 ----------------------------- * Failed dependency check
En cuyo caso, ejecute la línea:
user@machine:~/ubicacion_carpeta/Imagen_BBB/bb-kernel$ sudo apt-get install lzma lzop libmpc-dev u-boot-tools libssl-dev:amd64
Volver a ejecutar el script, al finalizar la preparación el mismo presentará siguiente pantalla de configuración:
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/deploy/).
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: observar las últimas líneas devueltas por el script:
----------------------------- Script Complete eewiki.net: [user@localhost:~$ export kernel_version=4.X.Y-Z] -----------------------------
Ejecutamos esa línea:
user@machine:~/ubicacion_carpeta/Imagen_BBB/bb-kernel$ export kernel_version=4.X.Y-Z
Y antes de pasar a la siguiente sección:
user@machine:~/ubicacion_carpeta/Imagen_BBB/bb-kernel$ cd .. user@machine:~/ubicacion_carpeta/Imagen_BBB$
RFS: Root File System
Aquí nos encargamos de descargar la imagen de Ubuntu:
user@machine:~/ubicacion_carpeta/Imagen_BBB$ wget -c https://rcn-ee.com/rootfs/eewiki/minfs/ubuntu-XX.YY.Z-minimal-armhf-YYYY-MM-DD.tar.xz
Ejemplo:
- XX.YY.Z: puede ser 18.04.1 o 20.04. Se puede acceder a dicha web y elegir la imagen a gusto,
- YYYY-MM-DD: puede ser 2020-05-10, como siempre, se recomienda no elegir la última.
Verificamos que se haya descargado correctamente:
user@machine:~/ubicacion_carpeta/Imagen_BBB$ sha256sum ubuntu-XX.YY.Z-minimal-armhf-YYYY-MM-DD.tar.xz 6b212ee7dd0d5c9c0af49c22cf78b63e6ad20cec641c303232fca9f21a18804c ubuntu-XX.YY.Z-minimal-armhf-YYYY-MM-DD.tar.xz
Extraemos:
user@machine:~/ubicacion_carpeta/Imagen_BBB$ tar xf ubuntu-XX.YY.Z-minimal-armhf-YYYY-MM-DD.tar.xz
Al momento de la creación de este tutorial, el usuario y contraseña para esta distribución son:
Usuario | Contraseña |
---|---|
ubuntu | temppwd |
Instalación
LLegados a este punto, debemos contar con el siguiente árbol de directorios en la carpeta Imagen_BBB/:
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
Verificar que la tarjeta microSD no se encuentre dentro de la lista de incompatibles)
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 man linux dd.
Antes de continuar, tenemos que saber que nombre le asignó el sistema operativo al device. Para ello, ejecutamos el comando dmesg (man linux dmesg):
user@machine:~/ubicacion_carpeta/Imagen_BBB$ sudo dmesg
Luego, COLOCAR LA SD EN EL LECTOR DE LA NOTEBOOK/PC, no montarla, ni abrir el gestor de archivos si el SO nos ofrece hacerlo (eso monta la SD), y volver a ejecutar el mismo comando. De todo el listado de mensajes que nos devuelve, ubicar los mensajes nuevos debido a la inserción de la SD:
[ 345.857375] mmc0: new SDHC card at address 0001 [ 345.931132] mmcblk0: mmc0:0001 SD8GB 7.28 GiB [ 345.933006] mmcblk0: p1
En el caso ejemplo, resulta ser: mmcblk0. Por lo tanto, hacemos:
user@machine:~/ubicacion_carpeta/Imagen_BBB$ export DISK=/dev/mmcblk0
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:
user@machine:~/ubicacion_carpeta/Imagen_BBB$ sudo dd if=/dev/zero of=${DISK} bs=1M count=10
- Instalamos el bootloader:
user@machine:~/ubicacion_carpeta/Imagen_BBB$ dd if=./u-boot/MLO of=${DISK} count=1 seek=1 bs=128k user@machine:~/ubicacion_carpeta/Imagen_BBB$ dd if=./u-boot/u-boot.img of=${DISK} count=2 seek=1 bs=384k
- Creamos el esquema de particiones. Para ello, requerimos del comando sfdisk ( man linux sfdisk). Y en función de la versión que dispongamos:
user@machine:~/ubicacion_carpeta/Imagen_BBB$ sudo sfdisk --version sfdisk from util-linux X.XX.X
Para version >= 2.26.x:
user@machine:~/ubicacion_carpeta/Imagen_BBB$ sudo sfdisk ${DISK} <<-__EOF__ 4M,,L,* __EOF__
Para version =< 2.25.x:
user@machine:~/ubicacion_carpeta/Imagen_BBB$ sudo sfdisk --unit M ${DISK} <<-__EOF__ 4,,L,* __EOF__
- Formateamos las particiones. Para ello, utilizamos el comando mkfs.ext4 ( man linux mkfs.ext4). Y en función de la versión que dispongamos:
user@machine:~/ubicacion_carpeta/Imagen_BBB$ sudo mkfs.ext4 -V
Para versión >= 1.43:
Para el caso en que: DISK=/dev/mmcblk0:
user@machine:~/ubicacion_carpeta/Imagen_BBB$ sudo mkfs.ext4 -L rootfs -O ^metadata_csum,^64bit ${DISK}p1
Para el caso en que: DISK=/dev/sdX:
user@machine:~/ubicacion_carpeta/Imagen_BBB$ sudo mkfs.ext4 -L rootfs -O ^metadata_csum,^64bit ${DISK}1
Para versión =< 1.42:
Para el caso en que: DISK=/dev/mmcblk0:
user@machine:~/ubicacion_carpeta/Imagen_BBB$ sudo mkfs.ext4 -L rootfs ${DISK}p1
Para el caso en que: DISK=/dev/sdX:
user@machine:~/ubicacion_carpeta/Imagen_BBB$ sudo mkfs.ext4 -L rootfs ${DISK}1
- Finalmente, montamos la microSD:
user@machine:~/ubicacion_carpeta/Imagen_BBB$ sudo mkdir -p /media/rootfs/
Para el caso en que: DISK=/dev/mmcblk0:
user@machine:~/ubicacion_carpeta/Imagen_BBB$ sudo mount ${DISK}p1 /media/rootfs/
Para el caso en que: DISK=/dev/sdX:
user@machine:~/ubicacion_carpeta/Imagen_BBB$ sudo mount ${DISK}1 /media/rootfs/
Instalación del Kernel y el Root File System
Root File System
user@machine:~/ubicacion_carpeta/Imagen_BBB$ sudo tar xfvp ./*-*-*-armhf-*/armhf-rootfs-*.tar -C /media/rootfs/ user@machine:~/ubicacion_carpeta/Imagen_BBB$ sync user@machine:~/ubicacion_carpeta/Imagen_BBB$ sudo chown root:root /media/rootfs/ user@machine:~/ubicacion_carpeta/Imagen_BBB$ sudo chmod 755 /media/rootfs/
Crear el archivo uEnv.txt en el directorio local de trabajo, con las siguientes lineas:
#for single partitions: mmcroot=/dev/mmcblk0p1
Luego, copiarlo al microSD:
user@machine:~/ubicacion_carpeta/Imagen_BBB$ sudo cp -v ./uEnv.txt /media/rootfs/boot/
Y finalmente:
user@machine:~/ubicacion_carpeta/Imagen_BBB$ sudo sh -c "echo 'uname_r=${kernel_version}' >> /media/rootfs/boot/uEnv.txt"
Linux Kernel
user@machine:~/ubicacion_carpeta/Imagen_BBB$ sudo cp -v ./bb-kernel/deploy/${kernel_version}.zImage /media/rootfs/boot/vmlinuz-${kernel_version} user@machine:~/ubicacion_carpeta/Imagen_BBB$ sudo mkdir -p /media/rootfs/boot/dtbs/${kernel_version}/ user@machine:~/ubicacion_carpeta/Imagen_BBB$ sudo tar xfv ./bb-kernel/deploy/${kernel_version}-dtbs.tar.gz -C /media/rootfs/boot/dtbs/${kernel_version}/ user@machine:~/ubicacion_carpeta/Imagen_BBB$ sudo tar xfv ./bb-kernel/deploy/${kernel_version}-modules.tar.gz -C /media/rootfs/
Editamos el archivo que contiene la tabla de particiones, y lo configuramos para que ante el booteo, monte la partición p1 de la SD en el directorio raiz:
user@machine:~/ubicacion_carpeta/Imagen_BBB$ sudo sh -c "echo '/dev/mmcblk0p1 / auto errors=remount-ro 0 1' >> /media/rootfs/etc/fstab"
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.
Conexión de Beaglebone mediante router
La conexión es mediante cable de red (no USB).
Configuración en la BBB
Editamos/creamos el archivo de configuración: interfaces:
user@machine:~/ubicacion_carpeta/Imagen_BBB$ sudo vim /media/rootfs/etc/network/interfaces
- Si pretendemos conectar la BBB a un router, creamos el archivo con las siguientes lineas:
auto lo iface lo inet loopback auto eth0 iface eth0 inet dhcp
- Si pretendemos conectarla a la PC, creamos el archivo con las siguientes lineas:
auto lo iface lo inet loopback
Luego, para cualquiera de los 2 casos, agregamos la siguiente regla persistente:
user@machine:~/ubicacion_carpeta/Imagen_BBB$ sudo vim /media/rootfs/etc/udev/rules.d/70-persistent-net.rules
Y le escribimos:
# BeagleBone: net device () SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"
Por otro lado, nuevamente, dependiendo del caso elegido varía la configuración de Netplan4). Para ello creamos un archivo que llamaremos default.yaml:
user@machine:~/ubicacion_carpeta/Imagen_BBB$ sudo vim /media/rootfs/etc/netplan/default.yaml
- 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/24 nameservers: addresses: [8.8.8.8, 8.8.4.4]
Finalizados estos pasos, podemos extraer la microSD:
user@machine:~/ubicacion_carpeta/Imagen_BBB$ sync user@machine:~/ubicacion_carpeta/Imagen_BBB$ sudo umount /media/rootfs
Configuración en la PC
Instalar el cliente/servidor ssh
sudo apt-get install openssh-server
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 | Cableada | IPv4 | Manual | 172.31.255.1 | 255.255.255.0 | 0.0.0.0 |
Configuración para acceso SSH
Editar/crear, empleando sudo, el fichero /etc/ssh/sshd_config. En el mismo deben estar presentes y sin comentarios (remover #) las siguientes lineas
Port 22 Protocol 2 PermitRootLogin yes
Luego de guardar el fichero y conectar la BBB a la PC o al router, se deberia debería poder acceder a la BBB mediante ssh:
user@machine:~$ ssh ubuntu@172.31.255.2 o user@machine:~$ ssh ubuntu@<ip_asignada_por_el_router>
Internet en Beaglebone a través de la PC
Hay dos formas para lograrlo.
Primer método
Pasos a realizar en la BBB
Ejecutar los siguientes comandos en la consola:
- sudo ifconfig usb0 192.168.7.2
- sudo route add default gw 192.168.7.1
Pasos a realizar en la PC
- 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 su
- ifconfig nombre_interfaz_usb_de_BBB 192.168.7.1
- iptables --table nat --append POSTROUTING --out-interface interfaz_WLAN_que_brindara_internet -j MASQUERADE
- 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.
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)
Pasos a realizar en la BBB
En el primer booteo de la BBB:
ubuntu@arm:~$ cd /etc ubuntu@arm:~$ sudo ln -sf ../run/systemd/resolve/stub-resolv.conf resolv.conf ubuntu@arm:~$ sudo systemctl disable connman.service ubuntu@arm:~$ sudo systemctl enable systemd-networkd.service systemd-resolved.service ubuntu@arm:~$ sudo systemctl reboot
Esto no se repite más. Lo siguiente, debe hacerse cada vez que se bootee la BBB:
ubuntu@arm:~$ sudo ip route add 0.0.0.0/0 via IP_ASIGNADA_AL_HOST
Que en el caso ejemplo, IP_ASIGNADA_AL_HOST = 172.31.255.1
Pasos a realizar en la PC
En la consola de la PC deben ejecutarse los siguientes comandos:
user@machine:~/ubicacion_carpeta/Imagen_BBB$ sudo iptables -A POSTROUTING -t nat -j MASQUERADE user@machine:~/ubicacion_carpeta/Imagen_BBB$ sudo sysctl -w net.ipv4.ip_forward=1
Aclaración: el método mostrado para brindarle acceso a internet a la BBB a través de la PC, no es el método más seguro, con lo cual NO debe ser tomado como el procedimiento estándar para implementaciones
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 ejemplo si se observa que la tarjeta se monta en /dev/sdX, se debe utilizar dicho dispositivo.
- Tarjetas SecureDigital incompatibles
- Verbatim 8GB Class4
- ¿Cual es la clave de acceso para ssh
temppwd
- Al intentar conectar mediante ssh <host>@<ip> se obtiene ssh: connect to host xxx.yyy.zzz.vvv port 22: Connection refused
Verificar que la conexion a la BBB se encuentre activa mediante
ping <ip>
Verificar que el servicio ssh se encuentre operativo mediante
ssh localhost