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 . 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 . We reproduced those steps for AArch64.
- Start fdisk to partition the SD card:
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.
- Create and mount the FAT filesystem:
1
2
3
| mkfs.vfat /dev/sdX1
mkdir boot
mount /dev/sdX1 boot
|
- Create and mount the ext4 filesystem:
1
2
3
| mkfs.ext4 /dev/sdX2
mkdir root
mount /dev/sdX2 root
|
- 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
|
- Move boot files to the first partition:
- 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
|
- Unmount the two partitions:
Insert the SD card into the Raspberry Pi, connect ethernet, and apply 5V power.
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.
- 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:
La contraseña por defecto suele ser root o similar.
1
2
| # Update and upgrade packages system
apt-get update -y && sudo apt-get upgrade -y
|
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 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) :
Ejecutamos:
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:
Creamos un nuevo usuario con:
1
| useradd -m -G sudo nombre_usuario
|
Ponemos una contraseña al nuevo usuario:
Una vez tengamos el nuevo usuario, borraremos el usuario 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:
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:
(Optional) Configuración Wi-Fi
Reproducido de la guía: los primeros pasos después de haber instalado Arch
karog, on ArchLinux ARM forums provided a simple way to connect to Wi-Fi.
As root, do the following steps:
nano /etc/systemd/network/wlan0.network to configure the wlan0 interface:- Add the following contents to the file:
1
2
3
4
5
| [Match]
Name=wlan0
[Network]
DHCP=yes
|
wpa_passphrase "<SSID>" "<PASSWORD>" > /etc/wpa_supplicant/wpa_supplicant-wlan0.conf. Replace and with your respective Wi-Fi network name and password.systemctl enable wpa_supplicant@wlan0 to enable the Wi-Fi when bootingsystemctl 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):
systemctl stop wpa_supplicant@wlan0systemctl disable wpa_supplicant@wlan0rm /etc/wpa_supplicant/wpa_supplicant-wlan0.confrm /etc/systemd/network/wlan0.network
3. Instalación de Programas
3.1. Paquetes básicos
1
| sudo apt install -y software-properties-common git wget
|
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
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
|
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
1
| sudo apt install -y ansible
|
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.
1
| ansible-galaxy install dev-sec.ssh-hardening
|
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
1
2
| sudo apt install zsh
sh -c "$(curl -fsSL https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
|
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–).
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:
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:
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:
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:
- Instalar Flatpak
1
| sudo apt install flatpak -y
|
- Se instala el repositorio de Flatpak
1
| flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo
|
- 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.
- Se instala a través de snap:
1
| sudo snap install keepassxc
|
Se descarga la extensión para el navegador.
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
- 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
|
- 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
|
- Actualización de repositorios e instalación de VSCodium:
1
| sudo apt update && sudo apt install codium
|