Clonar la tarjeta

Buscando por Internet se pueden encontrar diversas formas de clonar la tarjeta de nuestra Raspberry. Personalmente he probado varios métodos, algunos no muy ortodoxos, pero el que mejor me ha funcionado ha sido sacando la imagen con «dd» en Linux para después comprimirla con PiShrink

La ventaja que tiene PiShrink es que puede coger una imagen de unos 15 gigas, comprimirla, y dejar una imagen grabable de unos 3.5 gigas. Dependiendo del tamaño de la tarjeta y lo que tengamos metido en ella el tamaño obviamente variará, pero en el caso del proyecto de las pantallas estas han sido más o menos las cifras.

Pero no acaban ahí las bondades, pues al grabar la imagen en la tarjeta, cuando arranquemos la Raspberry la partición se redimensionará para ocupar todo el espacio disponible. Una maravilla.

Instalación de PiShrink

PiShrink es Open Source y está disponible aquí:

https://github.com/Drewsif/PiShrink

El modo de instalarlo viene allí mismo, pero es el siguiente:

wget https://raw.githubusercontent.com/Drewsif/PiShrink/master/pishrink.sh
chmod +x pishrink.sh
sudo mv pishrink.sh /usr/local/bin

No obstante, antes de poder usar PiShrink tendremos que tener una imagen creada. Esto lo vamos a hacer con «dd»

Crear una imagen con dd

El comando «dd» (Dataset Definition) permite crear imágenes y restaurarlas de una forma verdaderamente simple. Con todo, tiene diversas opciones que se pueden consultar en su manual, pero vamos a lo simple y vamos a crear una imagen de nuestra tarjeta, que ahora mismo es lo que necesitamos, y luego quien quiera profundizar, para eso tiene el manual. Al lío:

Pinchamos la microsd y comprobamos qué unidad tiene asignada, esto lo podemos hacer con:

sudo fdisk -l

Vamos a asumir que, por ejemplo, vemos las particiones de la tarjeta en /dev/sdb1 y /dev/sdb2, así que tendremos que sacar una imagen de /dev/sdb y vamos a crearla en /home/usuario El comando sería el siguiente:

sudo dd if=/dev/sdb of=/home/usuario/imagen.img status=progress

Por supuesto, ojito con la instrucción dd que hace cosas muy chulas y de modo muy fácil pero como nos colemos… «if» es origen, «of» es destino y la opción del final «status=progress» es para que vayamos viendo el progreso, pues de otra forma se queda el cursor parado sin dar ninguna información y parece que no esté haciendo nada aunque esté currando, porque crear la imagen lleva unos minutos.

Creación de una imagen para el Proyecto Pantallas.

Al final tendremos imagen.img (o el nombre que le hayamos querido dar) del tamaño de la tarjeta, si es de 16 gigas, pues más o menos eso.

Comprimir la imagen con PiShrink

Llega el momento de comprimirla tanto para hacerla transportable como para poderla grabar en otra tarjeta, porque aunque tengamos otra tarjeta del mismo tamaño puede suceder que al ir a grabarla nos salga el aviso de que hace falta más espacio (a mi me pasa siempre por definición, y con tarjetas de la misma marca). Toca echar mano del programa que acabamos de instalar, PiShrink.

sudo pishrink.sh /home/usuario/imagen.img /home/usuario/imagencomp.img

Fácil a más no poder. Cuando acabe tendremos el fichero de nuestra imagen comprimida que aquí hemos llamado imagencomp.img

Compresión con PiShrink de la imagen creada anteriormente.

Luego esta imagen ya podemos meterla en un pincho usb y grabar nuestra tarjeta como queramos. En mi caso la he llevado a otro pc y la he grabado con ImgWriter tal como hice con la imagen de Raspbian y no ha habido ni el más mínimo problema. Luego la he pinchado en la Raspberry, ha hecho un primer arranque, ha redimensionado la partición (casi no da tiempo a verlo, se intuye por unas letras rojas que salen), se ha reiniciado y listo.

Podríamos haber grabado esta misma imagen con dd, pero aquí sí que hay que tener mucho cuidadito si lo hacéis, porque ¿os imagináis qué pasaría si en «of» ponéis una unidad que no es la que corresponde a la tarjeta que queréis grabar? 😉

Conectando la Raspberry a Eduroam

Eduroam es un servicio conexión a la red WiFi de forma segura que funciona en instituciones académicas. Tal como dicen en su página https://www.eduroam.es/ permite que estudiantes, investigadores y personal de las instituciones y centros participantes tengan conentividad WiFi en cualquier centro que participe de la red Eduroam, simplemente con su nombre de usuario y contraseña.

En esta entrada vamos a conectar la Raspberry a la Red Eduroam de la Universidad de Zaragoza, aunque muy posiblemente dicha configuración pueda valer para cualquier Universidad, al menos en España.

El proceso no tiene mucha complicación, al menos cuando se sabe qué poner y dónde, tan sólo tendremos que escribir la configuración en el fichero wpa_supplicant.conf que se encuentra en la ruta /etc/wpa_supplicant Así que nos situamos en el directorio y abrimos el fichero:

sudo nano wpa_supplicant.conf

Veremos una imagen como esta:

Podemos ver que tan sólo tiene tres líneas que ahora son necesarias para Raspbian Stretch. Tienes que estar tal como aparecen en la imagen y es de suponer que salgan así si tenemos la Raspberry bien configurada en lo referente al país.

Ahora, bajo esas líneas, tenemos que añadir la configuración de la red:

network={
identity="[email protected]"
password="YYYYYYYY"
eap=TTLS
ssid="eduroam"
phase2="auth=PAP"
key_mgmt=WPA-EAP
pairwise=CCMP TKIP
ca_cert="/etc/ssl/certs/DigiCert_Assured_ID_Root_CA.pem"
Anonymous_identity="[email protected]"
}

El fichero nos quedará así:

Siendo las «X» nuestro login de correo electrónico y las «Y» el password. Obviamente si es para otro centro habrá que cambiar @unizar.es por lo que corresponda.

El certificado no hay que instalarlo pues viene ya en Raspbian Strech en la ruta indicada /etc/ssl/certs junto con unos cuantos más, así que tal como se ve en la imagen, sólo hay que indicar la ruta donde se encuentra y el nombre del certificado a usar.

Y nada más, tras guardar el fichero reiniciamos la Raspberry y ya tenemos conexión a Eduroam.

Mensajería móvil en Raspberry con Signal

Si en la anterior entrada hicimos que nuestra Raspberry nos enviara correos electrónicos, ahora vamos a hacer que nos envíe mensajes al móvil y la aplicación que vamos a usar es Signal. Para quien no conozca la aplicación le sugiero que se dé una vuelta por su web: https://signal.org/

Básicamente podemos decir que Signal es una aplicación open source, gratuita y con encriptación de extremo a extremo, aparte de unas cuantas características más que podéis leer en su web y merece la pena hacerlo.

Signal y la censura

Pero Signal tampoco está exenta de problemas. El acceso a Signal está bloqueado en unos cuantos países como Egipto, Emiratos Árabes, Omán, Cuba, China, Irán… Países en los que la censura es bandera y una aplicación de mensajería con encriptación, digamos que no está bien vista por sus gobiernos.

Para burlar estas censuras Signal venía utilizando la técnica de “domain fronting”, que viene a ser más o menos camuflar el tráfico haciendo creer que corresponde a otro sitio. Primero por Google mediante su Google App Engine, pero a comienzos de 2018 Google comunicó su intención, que hizo efectiva, de evitar el funcionamiento del domain fronting. De ahí Signal pasó a AWS, y en este caso ocultaba su tráfico y lo mostraba como si se estuviera navegando por Amazon, esto le permitía estar presente en estos países donde Amazon no está censurado, igual que anteriormente hacía con Google. Pero AWS decidió seguir los pasos de Google y el 27 de abril de 2018 publicó sus “Enhanced Domain Protections for Amazon CloudFront Requests”, estableciendo una serie de cambios para evitar el domain fronting. Signal casi de forma inmediata recibió un correo de AWS avisando del cierre de su cuenta con ellos si seguía con esta práctica.

La técnica de “domain fronting” es controvertida ya que si bien aquí se está usando para dar servicio en determinadas zonas saltándose la censura impuesta por gobiernos totalitarios, también dicha técnica puede ser utilizada para distribución de malware sin levantar sospechas ya que nos hace creer que proviene de una fuente fiable.

No obstante, la realidad de todo este asunto bien pudiera ser mucho más compleja. Cuando se juntan en un mismo saco aplicaciones de mensajería cifrada, censuras gubernamentales y grandes empresas… nada va a ser lo que parece.

Y como nosotros, pobres mortales de a pie, no vamos a conocer esa verdad nunca, vamos a dejar aquí la historia, de momento, porque confieso un cierto deseo personal en ver el siguiente movimiento del equipo de Signal para hacer llegar su aplicación allá donde la tiranía impone su voz como la única audible.

Al lío

Si queremos hacer uso de Signal para recibir avisos en el móvil provenientes de nuestra Raspberry, necesitamos obviamente instalarlo en nuestro móvil y además necesitamos otro número de móvil para hacer con él la instalación en la Raspberry. Obviamente tienen que ser números distintos, así que para la Raspberry podéis usar el de una segunda sim, el móvil del gato (o perro o canario… ¡no me digáis que vuestra mascota no tiene móvil!), el de un ser próximo y querido que no use la aplicación y os lo preste… En cualquier caso es preciso tener ese segundo móvil cuando hagamos la instalación porque recibiremos en él un código de verificación que deberemos introducir.

Esto no obstante puede ser un hándicap para algunas personas, así que para quien no pueda usar este sistema, llegado el momento de mandar mensajes desde Raspberry siempre se puede hacer por correo electrónico como se explicaba en la anterior entrada.

Vamos a empezar, y como considero que es una buena costumbre tener el sistema actualizado, por si hay nuevas versiones de lo que sea comenzamos con:

sudo apt-get update
sudo apt-get upgrade

Y para ahorrarnos quebraderos de cabeza, antes de instalar la aplicación vamos a apañar un poquito el Java. Bendito Stackoverflow porque gracias al siguiente post conseguí hacer funcionar el invento la primera vez que me puse:

https://stackoverflow.com/questions/6481627/java-security-illegal-key-size-or-default-parameters

De no hacerlo es bastante probable que recibáis un error como me pasó a mi. El aviso de error que recibía comenzaba diciendo lo siguiente: Failed to send/receive message (Assertion): java.security.InvalidKeyException: Illegal key size  La solución para por instalar Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files. Lo que viene a hacer este plugin es que Java pueda usar funciones criptográficas con tamaños grandes de clave.

Hay que mirar qué versión de Java es la que tenemos instalada, en mi caso la 8 y bajar el plugin correspondiente. Para la 8 el link es el siguiente:

http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html

Descargamos el archivo, descomprimimos y vemos que en su interior contiene tres archivos:

      • README.txt
      • local_policy.jar
      • US_export_policy.jar

Estos dos últimos con extensión .jar son los que tenemos que copiar a nuestro directorio security. En la versión que hemos estado instalando la ruta es la siguiente:

/usr/lib/jvm/jdk-8-oracle-arm32-vfp-hflt/jre/lib/security

Veréis que en dicho directorio ya hay dos archivos con el mismo nombre, que tenemos que machacar. Yo por si acaso prefiero hacer antes una copia, por si las moscas. Acto seguido muevo los nuevos archivos machacando los existentes. Necesitaréis privilegios de root para ello, así que según si la descarga se ha hecho en local o en remoto pues el proceso se hará de una forma u otra, pero vamos, un sudo mv desde donde estén los ficheros a la dirección indicada, o la que corresponda en vuestro caso según sistema o versión, y listo.

Una vez copiados esos ficheros comenzamos con la instalación, cuyas instrucciones detalladas, que vamos a seguir, se pueden encontrar aquí:

https://github.com/AsamK/signal-cli

El primer paso es consultar la versión actual con el link que ofrece la página para ello, que es el siguiente:

https://github.com/AsamK/signal-cli/releases

En el momento de escribir estas líneas es la 0.6.0

Así que asignamos ese valor a la variable y así ya sólo será copiar y pegar:

export VERSION=”0.6.0”
wget https://github.com/AsamK/signal-cli/releases/download/v"${VERSION}"/signal-cli-"${VERSION}".tar.gz
sudo tar xf signal-cli-"${VERSION}".tar.gz -C /opt
sudo ln -sf /opt/signal-cli-"${VERSION}"/bin/signal-cli /usr/local/bin/

Fijaos que el valor de la variable VERSION ha de ser exclusivamente los números de versión separados por un punto y encerrados entre comillas, no tiene que haber ningún carácter más o el proceso fallará. Y lógicamente ha de ser el número de la versión actual que hayamos obtenido con el anterior link.

Bueno, esto ya está instalado, así de fácil, ahora hay que registrarse y hay que prestar atención en hacerlo con el usuario con el que lo vayamos a usar, si no no funcionará y habrá que volver a realizar el registro (afortunadamente si algo sale mal se puede repetir el registro y el anterior se anula).

signal-cli –u +34AAAAAAAAA register

Siendo AAAAAAAAA el número de teléfono que vamos a usar para la Raspberry precedido del código de país, en este caso +34 que el de España

En la consola no recibiremos respuesta alguna, simplemente se lo piensa unos segundos y ya está, pero al momento recibiremos un aviso en el móvil que contendrá el número del registro con un código de verificación:

Así que con ese código nos vamos de nuevo a la consola y lo ponemos:

signal-cli –u +34AAAAAAAAA verify YYY-ZZZ

En esta ocasión tampoco recibiremos ninguna respuesta, ni por consola ni por móvil, pero una vez que la instrucción se haya ejecutado podemos probar a mandar un mensaje desde la línea de comandos a nuestro móvil, en el que obviamente ya tendremos que tener instalada la aplicación.

signal-cli –u +34AAAAAAAAA send –m “Mensaje de prueba desde Raspberry” +34BBBBBBBBB

En este caso AAAAAAAAA sigue siendo el número de la Raspberry y BBBBBBBBB el número del destinatario, es decir, para la faena que nos ocupa será nuestro propio móvil.

Y podemos comprobar que el mensaje llega al instante.

 

Pero además de escribirle el texto también podemos mandar el resultado de otro proceso. Por ejemplo, si tuviéramos un programa llamado temperatura.py que lo que hace es leer un sensor y luego hacer un print de la temperatura, podemos hacer que ese resultado nos lo envíe al móvil, con una instrucción similar a la siguiente:

Python temperatura.py –a | signal-cli –u +34AAAAAAAAA send +34BBBBBBBBB

Eso lo veremos más adelante, pero fijaos las posibilidades que esto tiene: Se pueden tener corriendo aplicaciones que bajo determinadas circunstancias manden mensajes a distintas personas. Ahí lo dejo.

Y con este apartado ya casi no queda nada para tener la Raspberry lista y poder cacharrear con los juguetes. Así que en la siguiente entrada haremos una copia de seguridad de la tarjeta por aquello de no tener que empezar de cero si nos cargamos algo y ¡A jugar!

Mandando correos desde Raspberry con Mutt

Vamos a instalar Mutt, con él podremos enviar correos electrónicos desde la Raspberry y lo vamos a configurar para enviarlos con Gmail ¿alguien no tiene una cuenta en Gmail?… Lo imaginaba, así que al lío. No obstante no es preciso configurarlo con Gmail, se puede hacer con otro servidor. Toda la documentación se encuentra en la web del programa: http://www.mutt.org/

Para instalarlo:

sudo apt-get install mutt

En principio vamos a usarlo sólo desde nuestro usuario “pi”, así que para comenzar creamos un par de directorios que necesita y un archivo:

mkdir –p ~/.mutt/cache/{headers,bodies}

touch ~/.mutt/certificates

Se crea todo dentro del directorio oculto .mutt. Con la primera instrucción hemos creado dos subdirectorios, headers y bodies dentro de .mutt/cache. La segunda instrucción lo que hace es crear el fichero vacío certificates dentro del directorio .mutt (si el fichero existiera, el comando touch no lo machacaría, tan sólo cambiaría fecha y hora de creación).

El siguiente paso es crear el fichero de configuración. También irá oculto, así que el nombre irá precedido por un punto: .muttrc Dicho fichero lo colocaremos en la home de pi. Lo podemos crear con cualquier editor de texto, bien desde la propia Raspberry, o bien en el pc y luego mandarlo por FTP. El contenido es el siguiente, puedes copiar y pegar y sustituir USUARIO_GMAIL y PASSWORD_GMAIL por tu usuario y pass de la cuenta que vayas a usar.

set from = "[email protected]"
set realname = "Raspberry"
set imap_user = "[email protected]"
set imap_pass = "PASSWORD_GMAIL"
set folder = "imaps://imap.gmail.com:993"
set spoolfile = "+INBOX"
set postponed ="+[Gmail]/Drafts"
set header_cache =~/.mutt/cache/headers
set message_cachedir =~/.mutt/cache/bodies
set certificate_file =~/.mutt/certificates
set smtp_url = "smtp://USUA[email protected]:587/"
set smtp_pass = "PASSWORD_GMAIL"

Y con esto ya casi lo tenemos, falta afinarlo. Podemos hacer la primera prueba enviando una línea de prueba a ver qué pasa. Para enviar el texto directamente desde la línea de comandos la sintaxis es la siguiente:

echo “Si lees esto es que todo ha ido bien” | mutt –s “Mensaje de prueba” [email protected]

Y vemos que no, que no ha ido bien.

Nos habla de un protocolo no disponible y de que no ha sido posible la autenticación. Bueno, nada de lo que preocuparse: Lo importante es esto último, la autenticación, y no es culpa nuestra sino de Gmail, bueno, culpa culpa tampoco, es más bien la configuración de seguridad.

Si vamos a la cuenta desde la que hemos intentado enviar el mensaje veremos que hemos recibido uno de alerta:

La solución la tenemos en el propio mensaje, si echamos un vistazo veremos que la solución pasa por “permitir el acceso a aplicaciones menos seguras”, así que vamos a la configuración de la cuenta, le atizamos al deslizante y listo, no hace falta más.

Automáticamente recibimos otro correo que nos indica que esta configuración, que desaconsejan y por la que nos vaticinan ser pasto de las siete plagas, está activada. Así que a probar.

Ok! Vemos que ahora el correo sí que se ha enviado aunque persiste en el mensaje de protocolo ausente. Para evitar esto y que los correos se envíen sin generar errores hay que modificar el fichero gpg.rc que se encuentra en etc/Muttrc.d En él buscamos la línea:

set crypt_use_gpgme=yes

y la ponemos a no:

set crypt_use_gpgme=no

Con esto, si volvemos a probar, vemos que ahora el correo se envía sin problemas.

Apuntamos también cómo se mandaría el mismo correo de prueba con un adjunto, por ejemplo una imagen que se llamara imagendeprueba.jpg:

echo “Si lees esto es que todo ha ido bien” | mutt –s “Mensaje de prueba” [email protected] –a imagendeprueba.jpg

Fácil ¿no?

Y por último para estas breves instrucciones, vamos a ver cómo se mandaría el texto del mensaje si este estuviera dentro de un fichero, llamado por ejemplo textomensaje.txt:

mutt –s “Mensaje desde fichero” [email protected] < textomensaje.txt

Por supuesto podemos usar esta opción y añadir después un fichero, quedando así:

mutt –s “Mensaje desde fichero” desti[email protected] < textomensaje.txt –a imagendeprueba.jpg

Para nuestros fines, con esto nos basta, aunque hay mucha más información en la web de Mutt. Os podéis imaginar que la idea es que la Raspberry nos envíe información por correo electrónico de lo que le pidamos: Estado de los sensores, alarmas, etc. No obstante a mi más que enviar estas alertas por correo prefiero hacerlas por mensajería al móvil, pero eso lo dejamos para la siguiente entrada.

Haciendo hablar a la Raspberry: eSpeak

Esta entrada va a ser corta, pero curiosa. Vamos a hacer hablar al cacharrejo este. Para ello vamos a instalar el sintetizador de voz eSpeak.

eSpeak es un sintetizador de voz open source que podéis encontrar aquí:

http://espeak.sourceforge.net/

La instalación es de lo más sencilla:

sudo apt install espeak

Aunque se pueden configurar diversos parámetros, jugar con la frecuencia, el tono, etc. estando todo ello documentado en la web antes mencionada, a mí el tono por defecto me gusta. Y para hacer que diga en voz alta una frase, en español, tan sólo hay que poner lo siguiente:

espeak –ves “Saludos Profesor Falken ¿Le apetece una partidita de ajedrez?”

¿A alguien le suena la frase? Pues si te suena,  o es que te gustan las pelis de los 80 o vas amontonando una pila de años como yo, o ambas cosas, como yo también 🙂

El resultado lo podéis escuchar aquí:

No es la entonación de Joshua, pero tiene su aquel.

No obstante, aunque el funcionamiento es correcto, podemos ver que muestra numerosas líneas de error.

En la captura de pantalla estoy usando un monitor con altavoces integrados y conectado por HDMI, así que si conectamos unos altavoces directamente los mensajes pueden ser distintos. En cualquier caso el funcionamiento es correcto y si molestan los errores puede simplemente decirse que no se muestre añadiendo 2>/dev/null a la instrucción:

espeak –ves “Saludos Profesor Falken ¿Le apetece una partidita de ajedrez?” 2>/dev/null

Como vemos, los errores han desaparecido y el resultado sonoro es idéntico (de verdad, lo es).

De momento podemos enredar con el nuevo juguete desde la línea de comandos, pero más adelante ya os podéis imaginar que vamos a usarlo para dar avisos sonoros cuando se activen algunos sensores.

Raspberry: Instalando Apache, PHP, MariaDB y phpMyAdmin

Junio de 2020. Vamos a revisar parte de esta entrada que si no luego van diciendo por algún foro poco menos que soy un brozas 😀 Y bueno, algo de razón llevan.

De todos modos, la configuración que hay aquí es “de andar por casa”, pero de forma literal. En mi caso tengo la raspi en casa para hacer pruebas que si funcionan luego subo a un sito o a otro. Si tu intención, amable lector, es la de poner una raspi en producción, tendrás que echar un ojo a alguna otra web o manual para implementar y configurar correctamente todo lo referente a la seguridad.

No obstante, sí que es posible acortar un poco la instalación, haciéndola más cómoda y de paso más segura, así que vamos a ello:

En esta entrada vamos a instalar en nuestra Raspberry los siguientes elementos y por este orden:

      • Apache
      • PHP
      • MariaDB
      • phpMyAdmin

Apache

Si continuamos desde la anterior entrada deberíamos tener el aparatejo actualizado, pero por si acaso podemos volver a introducir los comandos para ver si hay alguna actualización nueva y que esta se cargue. Para ello, bien abrimos una ventana de consola de comandos o bien nos conectamos con PuTTY a nuestra Rasberry. Sea cual sea la opción elegida tecleamos:

sudo apt-get update
sudo apt-get upgrade

Ahora toca instalar Apache, para ello tecleamos la siguiente instrucción:

sudo apt-get install apache2

Si todo ha ido bien, poniendo la ip de la Raspberry en el navegador nos tendría que salir una pantalla como esta:

Ahora aplicamos usuario y permisos:

sudo chown -R pi:www-data /var/www/html/
sudo chmod -R 770 /var/www/html/

Y ya está, con esto ya tenemos Apache instalado y funcionando. Nuestra Raspberry ya tiene instalado un servidor de páginas web.

PHP

Toca el turno a PHP. En este caso tecleamos:

sudo apt-get install php php-mbstring

Esto instalará PHP 7 Podemos comprobar que se ha instalado bien y está funcionando creando una sencilla página web que albergue la instrucción phpinfo() y nombrándola como queramos, por ejemplo info.php  Para ello el código de la página ha de ser el siguiente:

<?php
phpinfo ();
¿>

Hay dos formas de hacer esto, bien desde Windows con nuestro editor de código favorito subiendo después el archivo al directorio /var/www/html/ de nuestra Raspberry, o bien desde la consola, con PuTTY o desde la propia Raspberry, con la siguiente instrucción:

echo "<?php phpinfo ();?>" > /var/www/html/info.php

Para mi gusto mucho más cómodo así, aunque es un buen momento si queremos probar el editor de código y el funcionamiento de WinSCP, Filezilla o similar para subir el archivo.

Ahora podremos ver si el PHP se ha instalado correctamente accediendo por el navegador a la ip de la Raspberry seguido de / y nuestro fichero. Si todo va bien veremos algo así:

Para acabar con PHP vamos a instalar SSH2 que lo necesitaremos más adelante:

sudo apt-get install php-ssh2

Esto lo vamos a necesitar cuando conectemos con la Raspberry a través del móvil con la aplicación en App Inventor que realizaremos. De momento solo lo instalamos y a otra cosa.

MariaDB

Nos dejamos de literatura e instalamos MariaDB con las siguientes instrucciones:

sudo apt install mariadb-server
sudo apt install php-mysql

Ahora apañamos el usuario root para MariaDB.

Esta es la parte actualizada que se puede hacer más sencilla y de paso hacer más segura la instalación. Dejaré después el método publicado anteriormente porque también funciona, para tenerlo como alternativa si alguien tiene problemas. Tecleamos la siguiente instrucción:

sudo mysql_secure_installation

Ahora nos tocará responder a una serie de preguntas muy fáciles: En la primera nos pedirá el pass de root, que como no tiene dejaremos en blanco. Acto seguido nos preguntará si queremos asignar uno, le contestamos que sí y le ponemos el pass que queramos, confirmándolo a continuación:

El siguiente interrogatorio versará sobre si queremos borrar los usuarios anónimos e impedir a root el acceso remoto, se recomienda contestar afirmativamente a ambas preguntas:

Por último nos pregunta si deseamos eliminar la base de datos «test» y como no la queremos para nada, pues fuera. A la última pregunta de recargar permisos le contestamos también que sí:

Y con esto ya «casi» está todo. Casi, porque es muy posible que al intentar entrar ahora en MariaDB con:

mysql -u root -pnuestropassword

(Atención: «nuestropassword» es el password que hayamos puesto a root, y no hay que dejar espacio entre -p y el pass)

Obtengamos un bonito:

ERROR 1698 (28000): Access denied for user ‘root’@’localhost’

Bueno pues la solución perfectamente explicada está aquí:

Corregir ERROR 1698 (28000): Access denied for user ‘root’@’localhost’ en MariaDB (MySQL)

Conviene leer la entrada porque es corta y está muy bien explicada, así sabremos qué estamos haciendo, pero básicamente la solución es la siguiente:

Ingresamos con sudo:

sudo mysql -u root -pnuestropassword

Y una vez dentro vamos ejecutando por orden:

USE mysql;

UPDATE user SET plugin="mysql_native_password" WHERE user="root";

FLUSH PRIVILEGES;

exit;

Listo. Ahora deberíamos poder entrar normalmente. Probamos y para comprobar que root está correctamente configurado podemos probar la instrucción:

mysql> SELECT host,user,password,Grant_priv,Super_priv FROM mysql.user;

Deberíamos tener una respuesta como esta:

Y ya está. Verdaderamente es un método mucho más fácil y seguro.

Este es el método que había colgado antes. Funcionar… funciona, aunque es un poco más enrevesado pero lo dejo por si acaso alguien tiene problemas, no obstante el método anterior está probado y es más seguro. Todo lo que hay a continuación en rojo no hay que hacerlo si se ha realizado el paso anterior.

Este root no tiene nada que ver con el del sistema, es un usuario que tendrá todos los privilegios en la base de datos. Debemos ponerle un password, el que queramos y recordemos. A la base de datos nos conectaremos con ese usuario y su password, luego más adelante y por cuestiones de seguridad, ya crearemos otro usuario con menos privilegios, pero de momento configuramos root.

Y para ello lo primero que hacemos es conectar y esto se hace igual que con MySQL:

sudo mysql

Veréis un mensaje de bienvenida y que el prompt cambia. Hay que teclear tres comandos:

DROP USER ‘root’@’localhost’;

Con ese borraremos el usuario root

CREATE USER ‘root’@’localhost’ IDENTIFIED BY ‘aquí_pon_el_password’;

Con esto creamos el usuario y le asignamos un pass (creo que se ve claramente dónde ponerlo…)

GRANT ALL PRIVILEGES ON *.* TO ‘root’@’localhost’;

Y con esto le damos todos los privilegios para todo, parafraseando a José Mota: “todo, en to, pa siempre” (aunque luego veremos que no es del todo así).

No obstante fijaos en la captura de pantalla de la terminal:

Veréis primero cómo se ingresa en MySQL, el mensaje que se muestra y el prompt que queda. A continuación de este veréis cada una de las instrucciones y la respuesta.

“Query Ok” viene a decirnos que la “consulta” o “query”, que así se llaman las instrucciones que introducimos en MySQL, se ha ejecutado correctamente. “0 rows affected” dice que son cero los registros afectados, y así debe ser pues estas consultas no van contra ninguna tabla ni tiene que modificar registro alguno, tan sólo estamos borrando usuarios, creándolos y dando permisos.

Falta una cosilla, y es comprobar los privilegios de root para no tener problemas luego. Para ello realizamos la siguiente consulta (por cierto, que si habéis salido ahora ya no se puede entrar con «sudo mysql» ahora hay que identificarse, usaremos: mysql -u root -pnuestropassword Y fijaos que no hay ninguna comilla y entre -p y el password que hayamos puesto no hay espacio):

mysql> SELECT host,user,password,Grant_priv,Super_priv FROM mysql.user;

Si en la tabla que nos salga vemos que en Grant_priv aparece una «N»

Hay que cambiarlo, actualizando la tabla así:

UPDATE mysql.user SET Grant_priv='Y', Super_priv='Y' WHERE User='root';

Si realizamos ahora esa misma consulta veremos que Grant_priv está a «Y».

Y a continuación:

FLUSH PRIVILEGES;

Para salir, simplemente “exit”

Comparando ambos métodos, es ciertamente mejor, más simple y seguro el primero.

phpMyAdmin

La instalación también es un proceso sencillo, lo único a lo que tenemos que prestar especial atención es a las dos preguntas que se nos formularán:

    • Marcaremos el servidor “apache2” cuando nos dé a elegir el servidor a configurar (Podemos hacer uso de la barra espaciadora para ello. Cuando lo tengamos correctamente seleccionado aparecerá un asterisco)
    • Seleccionaremos “NO” cuando nos dé la opción de usar dbconfig-common, pues ya tenemos una base de datos instalada

Damos la instrucción y fijaos en las capturas de pantalla para cuando os salgan:

sudo apt install phpmyadmin

Para comprobar el funcionamiento procedemos de forma parecida a las anteriores, en el navegador ponemos la ip de la raspberry seguida de /phpmyadmin. Nos debería salir una pantalla como esta:

Para ingresar, ponemos como usuario root y el password que hayamos establecido en MariaDB, y de momento si vemos una pantalla como la siguiente es que phpMyAdmin está instalado y funciona.

Aunque como en este caso, lo más probable es que no esté todavía funcionando correctamente, pues vemos un mensaje de error en la parte baja de la pantalla.

Si buscamos información sobre este error veremos que afecta a las relaciones de tablas del tipo InnoDB, así que vamos a apañarlo para evitarnos posibles futuros quebraderos de cabeza. Esto en paquetes como WAMPP ya viene configurado y no hay que hacerlo, pero aquí, al instalar los componentes uno a uno pues toca.

Básicamente se trata de crear unas tablas, un usuario y modificar un fichero de configuración. Para la creación de las tablas phpMyAdmin incluye el script create_tables.sql Habremos de ejecutar este script y él sólo hará todo el trabajo. Si queréis, podéis descargarlo antes y abrirlo con vuestro editor favorito para echarle un ojo. La ruta en la que se encuentra en la versión que acabamos de instalar es la siguiente:  usr/share/phpmyadmin/sql

Así que nos colocamos en ese directorio y ejecutamos la consulta correspondiente tal que así:

mysql –u root –ppassword < create_tables.sql

La palabra “password” la tenéis que sustituir por el pass que tengáis para root, o no ponerla y os la pedirá tras ejecutar el comando; prestad atención a que entre –p y password no hay espacio.

Y como veréis, no nos va a decir ni esta boca es mía ¿Habrá hecho algo?

Por supuesto que sí. Si queremos comprobarlo podemos pinchar en la casita y desde el home ir a “Bases de datos”, veremos que ahora aparece “phpmyadmin”, que corresponde con la que crea el script, podéis pinchar sobre el nombre y veréis todas las tablas que se han creado, pero si aún con todo queremos asegurarnos de que todo lo que aparece ahí lo ha creado ese script y no estaba ya, podéis ir a la pestaña SQL e introducir la siguiente consulta: SHOW TABLE STATUS; Esto os mostrará información sobre las distintas tablas que incluye la fecha y hora de creación.

Como segundo paso toca modificar el fichero config.inc.php Este se encuentra en la ruta:  etc/phpmyadmin

La modificación de este fichero se puede hacer con cualquier editor. En este caso lo vamos a hacer con nano realizándole antes unos pequeños ajustes gracias a la información sacada de aquí:

https://www.atareao.es/software/programacion/nano-un-editor-de-texto-para-la-terminal/

Se trata de hacer un par de pequeños ajustes en el fichero de configuración de nano, que se encuentra en /etc y se llama nanorc  Hay que descomentar las líneas:

set linenumbers

set rebindkeypad

Con la primera conseguiremos que se nos muestren los números de línea en la izquierda, y nos será mucho más fácil localizar el texto «a borrar». Con la segunda opción lo que hacemos es que el teclado numérico funcione correctamente. Esto se puede hacer también arrancando nano con la opción «-K», pero es que a mi se me olvida siempre… En cualquier caso, si por aquellos azares del destino vuestro teclado numérico funciona correctamente con nano o no lo usáis, pasad de comentar esa línea.

Bien, con el nano ya bien configurado, o con vuestro editor favorito dispuesto, nos vamos a etc/phpmyadmin y por seguridad sacamos una copia de config.inc.php antes de ponernos a editar el fichero.

Como es cierto que la edición del fichero tal como aparecía antes resultaba un tanto liosa, vamos a ver si la puedo aclarar un poquito. Comenzamos buscando  primero el trozo que vamos a configurar y descomentar. Supongo que en posteriores versiones puede cambiar de línea, pero ahora mismo comienza en la 109. Entramos al fichero:

sudo nano config.inc.php

Vamos a la línea 109, o a la que contenga lo siguiente:

/* Authentication type */

A partir de ahí tenemos el bloque en el que debemos ir descomentando y configurando ciertas líneas, desde la 110 a la 150 (insisto, en esta versión, comprobad el contenido de las líneas puesto que podrían cambiar de sitio en futuras versiones), para dejarlo así:

Fijaos en los valores que hay que poner al principio, en las líneas «auth_type», «host» y «port», y luego en el siguiente bloque: «controlhost», «controlport», «controluser» y «controlpass», en estas dos últimas hay que poner pma y el pass con el que queramos conectar, que será el mismo que usaremos luego.

El resto de líneas sólo es descomentarlas.

Ahora, justo encima del bloque que acabamos de configurar, tenemos otro que vamos a borrar. Es el que «actualmente» comienza en la línea 61 hasta la 107. No obstante, y a riesgo de hacerme «pesao», no os fiéis de la numeración, el bloque que buscamos comienza con:

Línea 61:    /* Configure according to dbconfig-common if enabled */

En la siguiente línea a la mencionada veremos que se abre un «if» y una llave, hemos de bajar hasta localizar el cierre de la llave y borrar todo eso.

Línea 62     if (!empty($dbname)) {

Línea 107     }

Con nano vamos marcando las líneas con alt+a, las cortamos con ctrl+k y líneas eliminadas.

Todo el bloque que se muestra en la imagen, fuera. Es fácil entenderlo, vemos que el comentario de inicio nos dice «si dbconfig-common está activado», y le hemos dicho que no.

Con estos cambios ya realizados, guardamos el fichero y salimos (ctrl-o para guardar y ctrl-x para salir, si estamos usando nano, claro)

Por último se trata de crear al usuario para la base de datos phpmyadmin y darle todos los privilegios para ella, sólo para ella.

Vamos a lo fácil y lo hacemos con phpMyAdmin:

Creamos el usuario con su clave (la misma que hemos puesto en el fichero de configuración). Fijaos en la imagen, desde la pantalla principal, pestaña Cuentas de Usuario: Nombre -> pma, host -> localhost, contraseña -> la que hayamos puesto antes en el fichero que acabamos de editar.

Los privilegios globales los dejamos en blanco

Seleccionamos la base de datos phpmyadmin

Y aquí le damos todos los privilegios.

Ya está, ahora cuando volvamos a entrar a phpMyAdmin veremos que el mensaje de error ha desaparecido.

Con esto ya tenemos instalado en nuestra Raspberry un servidor web con soporte para PHP y MySQL, instalado el phpMyAdmin y configurado para el uso de tablas InnoDB que son las que usa por defecto. Si más adelante nos hace falta algún módulo más para PHP o lo que sea, ya lo instalaremos y configuraremos, pero de momento, si no he metido la pata, con esto ya debería de bastar y sobrar para los primeros proyectos.

Anexo: Acceso remoto a MariaDB

Esto no es en absoluto necesario. Únicamente si quieres usar una interfaz gráfica como MySQL Workbench, HeidiSQL o similar, si no es tu caso, te lo puedes saltar.

Como medida de seguridad MariaDB tiene deshabilitado por defecto el acceso remoto y sólo admite conexiones locales, por eso no tenemos ningún problema en conectarnos a MariaDB desde consola o desde phpMyAdmin, pero si lo intentamos a pelo desde MySQL Workbench, por ejemplo, no podremos conectarnos.

La explicación detallada, aquí:

https://mariadb.com/kb/en/configuring-mariadb-for-remote-client-access/

Conviene leerla porque afecta a la seguridad. Si la Raspberry la vamos a tener, como en mi caso, en la calidez del hogar y destinada a las más variopintas pruebas, no habrá mucho problema, pero para desarrollos “serios” conviene valorar la necesidad de modificar esto y ser prudentes.

Para permitir conexiones externas modificamos el fichero /etc/mysql/my.cnf añadiendo al final del mismo las tres líneas que nos indicaban en el link anterior:

[mysqld]
skip-networking=0
skip-bind-address

Tras salvar los cambios reiniciamos el servicio con

sudo service mysql restart

Ahora, para la base de datos a la que queramos acceder bastará crear un usuario con phpMyAdmin dejando la configuración de Nombre de Host así:

“Nombre de Host” -> “Cualquier servidor” -> “%”

para que dicho usuario pueda conectarse desde cualquier sitio con esa base de datos (también podríamos especificar una IP o un rango).

Los campos que aparecen en blanco los rellenaríamos con el nombre de usuario y el pass que queramos, continuaríamos con la configuración igual que hemos hecho antes, seleccionando la DB y otorgando los permisos que debamos y con esto ya tendríamos a un usuario capaz de acceder a una determinada base de datos desde cualquier sitio.

Preparando la Raspberry: Instalación de Raspbian

Bueno, vamos a comenzar por preparar el cacharrete para el primer proyecto y los que vengan después. En este primer apartado vamos a centrarnos en instalar el sistema Raspbian en la Raspberry, adecuar la tarjeta, configurar una ip estática e instalar los programas en el ordenador (Windows) que usaremos para comunicarnos con la Raspberry.

Lo referente a la instalación del sistema está muy bien documentado en otras webs, así que si ponéis en vuestro buscador favorito cómo hacer cada una de las cosas os saldrán un buen número de entradas que sin duda os lo podrán explicar mejor que yo. Por ello este apartado va a ser escueto pero conciso y la literatura la dejaremos para cuando nos metamos en harina.

Comenzamos descargando Raspbian, la versión Desktop desde aquí:

https://www.raspberrypi.org/downloads/raspbian/

A fecha de hoy es la versión de junio de 2018

Podemos comprobar la integridad del archivo comparando el SHA-256 que tenemos en la página de descarga. Hay diversos programas para ello, gratuitos y de pago. No obstante, si tienes que instalar un compresor/descompresor de archivos, 7zip integra esta funcionalidad en el menú contextual. No es la forma más cómoda de hacer una comparación, pero sirve perfectamente y estamos usando un programa open source.

https://www.7-zip.org/

El siguiente paso es formatear la tarjeta, con un programa como Sdcard, por ejemplo:

https://www.sdcard.org/

Y por último descomprimir y grabar la imagen en la tarjeta, lo que se puede hacer con Disk Imager:

https://sourceforge.net/projects/win32diskimager/

Son aplicaciones muy intuitivas, lo único que hay que tener cuidado es de formatear lo que corresponda y grabar la imagen donde se deba, prestad atención no la vayáis a liar parda por correr.

Con esto ya tenemos la tarjeta lista y la podemos pinchar en la Raspberry. Conectamos un monitor, teclado y ratón, encendemos el chisme y procedemos a una primera configuración: idioma, clave, wifi y actualizaciones. Sale todo automáticamente en pantalla así que no hay mucho problema. Prestad atención en todo caso a la clave, porque es fundamental. Por defecto el usuario que trae el sistema es «pi» y la clave «raspberry», podéis cambiarle la clave por la que más os guste, pero recordad recordarla 😉 Tras eso pedirá reiniciar.

Una vez que reiniciemos habrá que configurar un par de cosillas más: En “Configuración de Raspberry Pi”, que se encuentra en el menú de «Raspberry >> Preferencias»:

En la primera pestaña, “Sistema”, pondremos “overscan = desactivado” si queremos que la imagen ocupe toda la pantalla del monitor y no muestre un dedo de margen alrededor.

En la siguiente pestaña, “Interfaces”, activaremos “SSH” y “VNC” Con esto podremos conectarnos a ella de forma remota. Para ello sería conveniente asignar una ip estática a la Raspberry. La configuración depende de cómo tenga cada uno su red local: si es cableada con ips estáticas pues es fácil, se configura como cualquier otro equipo con una ip libre del rango que estemos usando y listo, si estamos con servidores DHCP, pues lo suyo es entrar en la configuración del router y reservar una ip para la mac address de la Raspberry, así cada vez que nos conectemos con la Raspberry lo haremos siempre con la misma ip. Cómo hacer esto depende del modelo del router que estemos usando, cuestión de echar un ojo al manual.

Ya casi está. Ahora vamos a configurar la tarjeta para poder usar todo el espacio: Abrimos una ventana de terminal y tecleamos “sudo raspi-config” y la opción la tenemos en “Advanced Options >> Expand Filesystem”.

Nos dirá que tenemos que reiniciar para que los cambios surtan efecto. Con el comando df –h podremos comprobar el espacio disponible, el usado y tamaños de unidades.

Y finalizamos actualizando. Para ello en la consola tecleamos los siguientes comandos:

sudo apt-get update
sudo apt-get upgrade

Con esto ya tendremos la Raspberry lista y configurada.

Ahora que ya tenemos el chisme en marcha vamos a instalar un par de programas en el ordenador para comunicarnos con la Raspberry de forma remota. Vamos a usar los programas PuTTY y WinSCP

https://www.putty.org/

https://winscp.net/eng/download.php

Con el primero nos comunicamos con la Raspberry por terminal, el segundo lo usaremos para subir archivos. No obstante para todo esto hay alternativas, cada cual puede optar por la más cómoda para él.

Vamos a hacer la primera conexión con PuTTY, para ello basta con indicarle la ip de la Raspberry. El puerto por defecto es el 22

Podéis salvar la configuración y así la próxima vez que abráis el programa tan sólo tendréis que seleccionarla y abrir.

Al abrir se abrirá una consola y nos pedirá el usuario, «pi» y el pass, que será el que le hayamos puesto en la configuración si es que se lo hemos cambiado.

Para conectar con WinSCP el procedimiento es muy parecido, pero en este caso además de indicar la ip deberemos ya establecer nuestro nombre de usuario y pass. También se puede salvar y que almacene estos datos para futuras conexiones. La pantalla debe quedar así:

Y con esto ya tenemos la Raspberry configurada y también los programas en Windows para comunicarnos con ella. En la próximas entradas seguiremos instalando programas y realizando algunos otros ajustes.

Ya queda menos para empezar a jugar…