Instalación y configuración de Debian, Ubuntu, RaspberryPiOS, LibreElec o Arch en una Raspbery Pi

En esta entrada se definen los pasos a seguir para instalar y configurar una Raspberry Pi para desplegar una serie de servicios.

1. Instalación del SO


1.1. Ubuntu, RaspberryPiOS o LibreElec

Usando el programa Raspberry Pi Imager se puede quemar la imagen de Ubuntu, RaspberryPiOS, LibreElec o que prefieras, en cualquier tarjeta micro SD o USB 1. Por ejemplo elegiremos la imagen de Raspbian OS con escritorio y la quemaremos en un USB de 64GB.

Otra forma de quemar una imagen en una tarjeta SD o un USB sería usando los siguientes comandos:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# See the partitions
lsblk

# Umount the USB partition
umount /dev/sdc1 

# Format in vFAT
mkfs.vfat -F 32 /dev/sdc -I

# Flash the ISO into USB
dd status=progress if=NAME.iso of=/dev/sdc

1.2. Arch

En caso de instalar Arch, se ha seguido los pasos de la instalación de Arch con la versión de AArch64 2. We reproduced those steps for AArch64.

  1. Start fdisk to partition the SD card:
1
    fdisk /dev/sdX

At the fdisk prompt, delete old partitions and create a new one:

  • Type o. This will clear out any partitions on the drive.
  • Type p to list partitions. There should be no partitions left.
  • Type n, then p for primary, 1 for the first partition on the drive, press ENTER to accept the default first sector, then type +200M for the last sector.
  • Type t, then c to set the first partition to type W95 FAT32 (LBA).
  • Type n, then p for primary, 2 for the second partition on the drive, and then press ENTER twice to accept the default first and last sector.
  • Write the partition table and exit by typing w.
  1. Create and mount the FAT filesystem:
1
2
3
mkfs.vfat /dev/sdX1
mkdir boot
mount /dev/sdX1 boot
  1. Create and mount the ext4 filesystem:
1
2
3
mkfs.ext4 /dev/sdX2
mkdir root
mount /dev/sdX2 root
  1. Download and extract the root filesystem (as root, not via sudo):
1
2
3
wget http://os.archlinuxarm.org/os/ArchLinuxARM-rpi-aarch64-latest.tar.gz
bsdtar -xpf ArchLinuxARM-rpi-aarch64-latest.tar.gz -C root
sync
  1. Move boot files to the first partition:
1
mv root/boot/* boot
  1. Before unmounting the partitions, update /etc/fstab for the different SD block device compared to the Raspberry Pi 3:
1
sed -i 's/mmcblk0/mmcblk1/g' root/etc/fstab
  1. Unmount the two partitions:
1
umount boot root
  1. Insert the SD card into the Raspberry Pi, connect ethernet, and apply 5V power.

  2. Use the serial console or SSH to the IP address given to the board by your router.

  • Login as the default user alarm with the password alarm.
  • The default root password is root.
  1. Initialize the pacman keyring and populate the Arch Linux ARM package signing keys:
1
2
pacman-key --init
pacman-key --populate archlinuxarm

2. Configuración Básica


Una vez esté instalado el sistema operativo, existen varias opciones para configurar la raspi. La más sencilla es realizar un analisis de red con sudo nmap -f 192.168.1.0/24 para identificar la IP ue tiene la Raspberry y ha sido proporcionada por el router. Haremos ssh pi@192.168.10.250 (si es raspbian) o ssh alarm@192.168.10.250 (si es arch)). También se puede configurar sin necesidad de una pantalla, teclado y ratón extra como se explicó en un post anterior o usando estos tres periféricos externos. En este caso, usaremos una pantalla, un teclado y un ratón externo para simplificar la publicación. Por lo tanto, una vez encendida la raspi con el USB o la tarjeta SD conectada, aparecerá un dialogo para configurar el idioma, el wifi y una contraseña (por ejemplo: usar KeepassXC para generar una contraseña aleatoria).

2.1 Actualización del sistema

Una vez tengamos una consola con un usuario sin privilegios de root, abriremos una nueva consola como el usuario root:

1
su -

La contraseña por defecto suele ser root o similar.

  • Basados en Debian:
1
2
# Update and upgrade packages system
apt-get update -y && sudo apt-get upgrade -y
  • Basados en Arch:
1
2
# Update and upgrade packages system
pacman -Syu

2.2 Actualización horaria

Seguimos esta guía con los primeros pasos después de haber instalado Arch 3 o alguna distribución minimalista como HypriotOS. Cambiamos la hora al ue nos corresponde con:

1
timedatectl set-timezone Europe/London

Actualizamos el reloj con internet:

1
timedatectl set-ntp true

2.3 Actualización del idioma

Descomentamos el idioma deseado en el archivo locale.gen (por ejemplo: en_US.UTF-8) :

1
nano /etc/locale.gen

Ejecutamos:

1
locale-gen

Y ejecutamos:

1
localectl set-locale LANG=en_US.UTF-8

2.4 Cambio de hostname

Cambiamos el hostname con:

1
hostnamectl set-hostname <nombre>

Añadimos un alias par el hostname en el archivo /etc/hosts del oredenador que estemos utilizando para la configuración. Usamos nano /etc/hosts:

1
2
127.0.0.1		localhost.localdomain	<nombre>	localhost
::1				localhost.localdomain	<nombre>	localhost

(Opcional) Cambiar el color a la salida de pacman

Si utilizamos Arch, ejecutamos:

1
sed -i 's/#Color/Color/' /etc/pacman.conf

(Opcional) Añadimos 8GB de memoria SWAP

Si utilizamos Arch, ejecutamos:

1
fallocate -l 8192M /swapfile

(Opcional) Nuevo usuario con permisos sudo

Si utilizamos Arch, ahora usaremos la utilidad visudo para editar los permisos de grupo para ejecutar comandos administrativos con sudo.

1
2
pacman -S sudo
EDITOR=nano visudo

Descomentamos la siguiente línea:

1
2
## Uncomment to allow members of group sudo to execute any command
%sudo   ALL=(ALL:ALL) ALL

Creamos un nuevo grupo sudo con:

1
sudo groupadd sudo

Creamos un nuevo usuario con:

1
useradd -m -G sudo nombre_usuario

Ponemos una contraseña al nuevo usuario:

1
passwd nombre_usuario

Una vez tengamos el nuevo usuario, borraremos el usuario alarm.

1
userdel alarm

En Debian o derivados modificamos los permisos del usuario que habíamos creado durante la instalació y lo añadidos al grupo sudo con el siguiente comando:

1
2
su -
usermod -aG sudo username

Reiniciamos el sistema:

1
reboot

2.5 SSH

En el siguiente paso es necesario copiar la clave pública al archivo ~/.ssh/authorized_keys de la RaspberryPi. Para ello se utilizará el siguiente comando:

1
ssh-copy-id -i <identity.pub> pi@<ip de la raspberry o node-1>

Ahora nos pedirá la contraseña de nuestra clave SSH y nos conectaremos a la RaspberryPi mediante:

1
ssh pi@node-1

(Optional) Configuración Wi-Fi

Reproducido de la guía: los primeros pasos después de haber instalado Arch 3

karog, on ArchLinux ARM forums provided a simple way to connect to Wi-Fi. As root, do the following steps:

  1. nano /etc/systemd/network/wlan0.network to configure the wlan0 interface:
  2. Add the following contents to the file:
1
2
3
4
5
[Match]
Name=wlan0

[Network]
DHCP=yes
  1. wpa_passphrase "<SSID>" "<PASSWORD>" > /etc/wpa_supplicant/wpa_supplicant-wlan0.conf. Replace and with your respective Wi-Fi network name and password.
  2. systemctl enable wpa_supplicant@wlan0 to enable the Wi-Fi when booting
  3. systemctl start wpa_supplicant@wlan0 to connect to Wi-Fi.

You’re good to go!

If you ever want to remove Wi-Fi connection (e.g. when you want to make it connect only through ethernet):

  1. systemctl stop wpa_supplicant@wlan0
  2. systemctl disable wpa_supplicant@wlan0
  3. rm /etc/wpa_supplicant/wpa_supplicant-wlan0.conf
  4. rm /etc/systemd/network/wlan0.network

3. Instalación de Programas


3.1. Paquetes básicos

  • Debian:
1
sudo apt install -y software-properties-common git wget
  • Arch:
1
sudo pacman -S -y git wget

3.2. Docker y docker compose

Se recomienda instalar docker rootless.

3.2.1. Instalación en Debian

Instalamos docker con el script de instalación:

1
2
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh

Mientras que la instación de docker-compose lo realizamos a través de pithon3:

1
2
3
4
sudo apt-get install libffi-dev libssl-dev
sudo apt install python3-dev
sudo apt-get install -y python3 python3-pip
sudo pip3 install docker-compose

Añadir usuario al grupo docker:

1
sudo usermod -aG docker ${USER}

3.2.2. Instalación en Arch

Instalamos docker y docker-compose desde los repositorios oficiales:

1
2
sudo pacman -Sy  docker
sudo pacman -Sy  docker-compose

Se activa el servicio con:

1
sudo systemctl start docker.service

Se activa siempre que se reinicie:

1
sudo systemctl start docker.service

Añadir usuario al grupo docker

1
sudo usermod -aG docker ${USER}

3.2.3 Docker rootless

  • Arch:
1
2
sudo pacman -S shadow
sudo pacman -S fuse-overlayfs

Añade kernel.unprivileged_userns_clone=1 in /etc/sysctl.conf:

1
2
sudo nano /etc/sysctl.conf
sudo sysctl --system
  • Común:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
sudo touch /etc/subuid && sudo touch /etc/subgid
su -
echo "pi:100000:65536" >> /etc/subgid
echo "pi:100000:65536" >> /etc/subuid
exit

sudo systemctl disable --now docker.service docker.socket
curl -fsSL https://get.docker.com/rootless | sh

systemctl --user start docker
systemctl --user enable docker
sudo loginctl enable-linger $(whoami)

export DOCKER_HOST=unix://$XDG_RUNTIME_DIR/docker.sock

Se prueba con docker run -d -p 8080:80 nginx.

Si queremos que se arranque en el arranque, escribimos los siguientes comandos:

1
2
 sudo systemctl enable docker.service
 sudo systemctl enable containerd.service

3.3. Ansible

  • Debian
1
sudo apt install -y ansible
  • Arch:
1
sudo pacman -Sy ansible

3.3.1 Hardening de SSH usando Ansible

Mediante las colecciones de Ansible devsec.hardening, proporcionamos mecanismos de seguridad y la comprobamos con los siguientes comandos.

  • Instalación:
1
ansible-galaxy install dev-sec.ssh-hardening
  • Crea un playbook para cada rol de ansible llamado ansible-ssh-hardening.yaml.

  • Ejecuta estos playbooks con los siguientes comandos:

1
ansible-playbook ansible-ssh-hardening.yaml --ask-become-pass

También se puede crear un playbook de ansible con los módulos que queramos incluir.

  • Añade tu clave ssh en un ssh-agent usando zsh (o bash):
1
2
ssh-agent zsh
ssh-add ~/.ssh/id_ed25519
  • Ejecutar el playbook de ansible con la contraseña sudo requerida para los comandos:
1
ansible-playbook playbook.yaml --ask-become-pass

3.4. Instalar zsh y Oh my zsh

  • Debian4:
1
2
sudo apt install zsh
sh -c "$(curl -fsSL https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
  • Arch:
1
2
sudo pacman -Sy zsh zsh-completions
sh -c "$(curl -fsSL https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"

3.4.1. Instalar Powerlevel10k

Descargar y pegar las 4 fuentes .ttf Meslo Nerd en /usr/local/share/fonts. Deben tener los permisos 644 (-rw-r–r–).5

1
2
sudo mkdir /usr/local/share/fonts
cd  /usr/local/share/fonts

Descargamos las fuentes:

1
sudo wget https://github.com/romkatv/powerlevel10k-media/raw/master/MesloLGS%20NF%20Regular.ttf https://github.com/romkatv/powerlevel10k-media/raw/master/MesloLGS%20NF%20Bold.ttf  https://github.com/romkatv/powerlevel10k-media/raw/master/MesloLGS%20NF%20Italic.ttf https://github.com/romkatv/powerlevel10k-media/raw/master/MesloLGS%20NF%20Bold%20Italic.ttf

Clonar el proyecto de powerlevel10k:

1
2
3
git clone --depth=1 https://github.com/romkatv/powerlevel10k.git ~/powerlevel10k
echo 'source ~/powerlevel10k/powerlevel10k.zsh-theme' >>~/.zshrc
exec zsh

Sustituir el siguiente valor en ~/.zshrc:

1
ZSH_THEME="powerlevel10k/powerlevel10k"

3.4.2. Instalar plugins para zsh

Para añadir una serie de plugins interesantes, editamos el archivo ~/.zshrc con nano ~/.zshrc y modificamos lo siguiente:

1
2
#plugins=(git)
plugins=(git git-extras history ansible zsh-autosuggestions zsh-syntax-highlighting docker-helpers docker docker-compose kubectl kubectx colorize nmap pip ssh-agent sudo pipenv fzf fzf-docker)

Necesitamos instalar los plugins de zsh-autosuggestions, zsh-syntax-highlightingm docker-helpers, fzf y fzf-docker.

Para instalar zsh-autosuggestions:

1
git clone https://github.com/zsh-users/zsh-autosuggestions ~/.oh-my-zsh/plugins/zsh-autosuggestions

Para instalar zsh-syntax-highlighting:

1
git clone https://github.com/zsh-users/zsh-syntax-highlighting.git ~/.oh-my-zsh/plugins/zsh-syntax-highlighting

Para instalar fzf usamos los repositorios oficiales:

1
sudo pacman -Sy fzf

Para instalar fzf-docker:

1
git clone https://github.com/pierpo/fzf-docker ~/.oh-my-zsh/plugins/fzf-docker

Para instalar docker-helpers:

1
git clone https://github.com/unixorn/docker-helpers.zshplugin ~/.oh-my-zsh/plugins/docker-helpers

Configurar al gusto y actualizar los cambios del fichero ~/.zshrc:

1
source ~/.zshrc

Snapd

Instalación

Se instala los paquetes snapd y core:

1
sudo apt install -y snapd core

Añadir ruta de ejecutables al PATH de bash y Zhs

Se añade la ruta de ejecutables snap al PATH:

1
2
3
4
echo "export PATH=$PATH:/snap/bin" >> ~/.bashrc
source ~/.bashrc
echo "export PATH=$PATH:/snap/bin" >> ~/.zshrc
source ~/.zshrc

Se comprueba que se ha añadido correctamente la ruta:

1
echo $PATH

Añadir lanzadores al menú de aplicaciones

Se crea un enlace simbólico desde el directorio que almacena los lanzadores de snaps (/var/lib/snapd/desktop/applications) al directorio de aplicaciones del sistema (usr/share/applications/)

1
sudo ln -s /var/lib/snapd/desktop/applications /usr/share/applications/snapd

Flatpak

Instalación

De la documentación oficial de Flatpak, se siguen los siguientes pasos:

  1. Instalar Flatpak
1
sudo apt install flatpak -y
  1. Se instala el repositorio de Flatpak
1
flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo
  1. Se reinicia el sistema para aplicar los cambios.

Añadir lanzadores al menú

Se crea un enlace simbólico desde el directorio que almacena los lanzadores de flatpak (/var/lib/flatpak/exports/share/applications/) al directorio de aplicaciones del sistema (usr/share/applications/)

1
sudo ln -s /var/lib/flatpak/exports/share/applications/ /usr/share/applications/flatpak

KeePassXC

Nota: se instala a través de Snap porque los repositorios oficiales tienen una versión desactualizada.

  1. Se instala a través de snap:
1
sudo snap install keepassxc
  1. Se descarga la extensión para el navegador.

  2. Se configura la extensión del navegador a través de un script oficial de KeePassXC. Guardar script y ejecutar:

1
2
wget https://raw.githubusercontent.com/keepassxreboot/keepassxc/master/utils/keepassxc-snap-helper.sh
zsh keepassxc-snap-helper.sh 

En caso de obtener el error Could not find keepassxc.proxy! Ensure the keepassxc snap is installed properly., esto se debe a que falta añadir la ruta de ejecutables snap al PATH mediante:

1
2
3
4
echo "export PATH=$PATH:/snap/bin" >> ~/.zshrc
source ~/.zshrc
echo "export PATH=$PATH:/snap/bin" >> ~/.bashrc
source ~/.bashrc

Volver a ejecutar el script:

1
bash keepassxc-snap-helper.sh

VSCodium 4

  1. Añade la clave GPG del repositorio:
1
wget -qO - https://gitlab.com/paulcarroty/vscodium-deb-rpm-repo/raw/master/pub.gpg | gpg --dearmor | sudo dd of=/etc/apt/trusted.gpg.d/vscodium.gpg
  1. Añade el repositorio:
1
2
3
4
echo 'deb
 [ signed-by=/usr/share/keyrings/vscodium-archive-keyring.gpg ] 
https://paulcarroty.gitlab.io/vscodium-deb-rpm-repo/debs vscodium main'
    | sudo tee /etc/apt/sources.list.d/vscodium.list
  1. Actualización de repositorios e instalación de VSCodium:
1
sudo apt update && sudo apt install codium