julio 27, 2019

Como reinstalar una nueva imagen de Raspberry Pi desde dentro y por ssh

Sin sacar siquiera la tarjeta de la RasperryPi :D (entre otras cosas por que ya no dispongo de lector de tarjetas). El sistema se que tenía era bastante viejo y tenía una debian Wheezy (7) para la que ya no se hacen paquetes. Total, imposible de hacer un update/upgrade. Aquí los pasos para reinstalar el sistema de nuevo con la última versión, todo por ssh, sin despeinarse ;)

Descargamos la ultima raspbian desde https://www.raspberrypi.org/downloads/raspbian/ en mi caso he cogido la lite.

Vamos a editar la imagen y transmitirla ya modificada para que el sistema arranque directamente con SSH e IP fija:

$ mkdir rpi
$ cd rpi
$ 7z x ../2019-07-10-raspbian-buster-lite.zip
$ fdisk -l 2019-07-10-raspbian-buster-lite.img
Disk 2019-07-10-raspbian-buster-lite.img: 2 GiB, 2197815296 bytes, 4292608 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x17869b7d
Device                               Boot  Start     End Sectors  Size Id Type
2019-07-10-raspbian-buster-lite.img1        8192  532480  524289  256M  c W95 FAT32 (LBA)
2019-07-10-raspbian-buster-lite.img2      540672 4292607 3751936  1,8G 83 Linux

Montamos sobre loop devices las dos particiones (el valor del offset sale de multiplicar el comienzo de la partición por el tamaño de sector: 8192 * 512 = 4194304):
$ sudo losetup /dev/loop1 -o 4194304 2019-07-10-raspbian-buster-lite.img
$ sudo losetup /dev/loop2 -o 276824064 2019-07-10-raspbian-buster-lite.img
$ mkdir p1 p2

$ sudo mount /dev/loop1 p1
$ sudo mount /dev/loop2 p2

Ahora tenemos las particiones montadas en sendos directorios.

Para activar el ssh necesitamos crear en la primera partición un archivo llamado "ssh":
$ echo ssh > p1/ssh

Para fijar nuestra ip debemos editar el archivo "p2/etc/dhcpcd.conf", al final del archivo habilitamos el interfaz (por ej, el eth0)

# Example static IP configuration:
interface eth0
static ip_address=192.168.1.2/24
#static ip6_address=fd51:42f8:caae:d92e::ff/64
static routers=192.168.1.1
static domain_name_servers=8.8.8.8

Desmontamos las particiones y los loops:
$ sudo umount /dev/loop1
$ sudo umount /dev/loop2
$ sudo losetup -D

Ya tenemos la imagen preparada, para guardarla sobre la SD vamos a transmitirla por SSH directamente. Debemos activar el acceso root por ssh: "sudo passwd root" en la raspberry. Editar el /etc/sshd si fuera necesario.

Detener todos los demonios y procesos posibles, para asegurarnos que nadie se dedica a escribir en disco.

Ahora es recomendable tener una segunda consola abierta con root contra la Raspberry y lanzar el comando "sync" que nos asegurará que todos los datos están escritos en la SD y podemos apagarla.

En otra consola lanzamos:
$ gzip -c 2019-07-10-raspbian-buster-lite.img | ssh root@192.168.1.9 "gunzip -c > /dev/mmcblk0"

Una vez acabe volvemos a la consola previa, "sync" y esperamos a que finalice.

Ya podemos apagar y volver a encenderla, si todo hay ido bien:
$ ssh pi@[IP]
password: raspberry
Linux raspberrypi 4.19.57+ #1244 Thu Jul 4 18:42:50 BST 2019 armv6l

Y aunque pueda parecer poco heterodoxo, ya lo tenemos listo.

comentarios: