Raspberry

Sections:

PREAMBLE

Per caso mi sono ritrovato con un raspberry Pi 3 B e non sapendo bene cosa farci ho iniziato ad utilizzarlo a caso… prima di entrare in qualche esperienza d’utilizzo in ogni caso il setup iniziale e’ abbastanza semplice e lo scrivo qui come promemoria.

In primis dobbiamo decidere che sistema operativo utilizzare e poi scrivere l’immagine sulla Micro SD che il raspberry utilizzera’ come partizione di root per il boot.

Utilizzando un pc windows, ho optato per la soluzione piu’ semplice, ovvero installare il programma Raspberry Pi Imager, cosi’ da preparare il setup iniziale ( qui i links per il software e l’elenco delle immagini).

A questo punto quindi rimane da capire quale immagine utilizzare, esempi interessanti sono:

  • Raspberry Pi OS

  • Ubuntu 20.04.1 LTS

il primo ha gia’ tutta una serie di feature facilmente avviabili, come ad esempio il VNC Server, mentre il secondo l’ho citato perche’ sono abituato ad utilizzarlo, e quindi faro’ sicuramente esperimenti con esso.

ACCESSI

Per iniziare premetto che non avevo voglia di cercare una tastiera e un monitor da attaccare al raspberry per utilizzarlo, ma fortunatamente possiamo agire a due livelli:

  • a livello sistemistico via SSH
  • a livello UX con VNC

in pratica posso prima accedere via SSH dal terminale di un qualsiasi PC e poi in un secondo momento abilitare VNC Server sul raspberry e installare un VNC Client su qualsiasi pc dal quale voglio poter utilizzare il raspberry via interfaccia grafica (probabilmente lo stesso pc che viene utilizzato per l’accesso SSH).

I passaggi sono quindi

  • dopo aver inserito l’ SD Card e avviato il raspberry, collegarlo al cavo LAN (cosi’ che acceda direttamente al network e renderlo quindi disponibile per l’accesso SSH)
  • trovare l’ip del raspberry (ad esempio accedendo al pannello del router o installando un programma di network scanning su un device all’interno del network del raspberry)
  • accedere via ssh usando:
    • user: pi pass raspberry , nel caso l’OS sia raspbian
    • user: ubuntu pass ubuntu , nel caso l’OS sia ubuntu

A questo punto suggerisco subito un

apt update
# Opzionale
apt upgrade 

A questo punto e’ possibile customizzare il raspberry come si preferisce. Ad esempio a mio avviso installare VNC puo’ essere una buona idea se si vuole accedere a qualche interfaccia.

A seconda dell’ OS utilizzato la cosa puo’ risultare piu’ o meno comoda, quindi senza entrare nei dettagli riporto alcuni link:

  • Raspberry OS, come dicevo all’inizio con raspian basta svolgere pochissimi step per abilitare vnc, e questo link riporta al tutorial piu’ semplice che ho trovato (praticamente non bisogna fare nulla oltre all’installazione)

  • Ubuntu 20.04.1 LTS, ubuntu server NOTA: lo scopo in questo caso e’ minimizzare le risorse impiegate, quindi evitare xfce e simili, ma utilizzare lightdm

VNC ON UBUNTU

Su ubuntu l’impiego di VNC non e’ cosi’ semplice come per raspian, infatti bisogna svolgere varie azioni:

1) installo un display manager per il mio ubuntu server

Ad esempio seguendo questo

sudo apt install tasksel -> leggerissimo
sudo apt install lightdm -> e durante l'installazione lo configuro come default al posto di gdm3
# start lightdm
sudo service lightdm start

Come ogni altro servizio poi posso stopparlo con

sudo service lightdm stop

2) faccio partire VNC

E poi avvio vnc, ad esempio:

sudo x11vnc -xkb -noxrecord -noxfixes -noxdamage -display :0 -auth /var/run/lightdm/root/:0 -usepw

Dove eventualmente l’auth posso trovarlo con

ps aux | grep lightdm

e qui un altro articolo sull’installazione con lightdm

[VNCServer]
enabled=true
command=/usr/bin/x11vnc -auth guess -display :0

This content is supposed to go into a new file, e.g.
/etc/lightdm/lightdm.conf.d/vncserver.conf

Roba per systemd

[Unit]
Description=VNC
Requires=display-manager.service
After=display-manager.service

[Service]
Type=simple
ExecStart=/usr/bin/x11vnc -xkb -env FD_XDM=1 -auth guess -noxrecord -noxfixes -noxdamage -rfbauth /etc/vnc_passwd -forever -bg -rfbport 5900 -o /var/log/x11vnc.log
ExecStop=/usr/bin/killall x11vnc

[Install]
WantedBy=multi-user.target

Ad esempio posso attivare con

x11vnc -xkb -env FD_XDM=1 -auth /run/user/122/gdm/Xauthority -noxrecord -noxfixes -noxdamage -forever -bg -rfbport 5900 -o /var/log/x11vnc.log

dove ho customizzato il -auth …. recuperandolo da:

ps wwwaux | grep auth
ps aux | grep Xorg

Articolo che parla dell’attivazione VNC con LIGHTDM:

https://www.it-swarm.dev/it/xorg/ubuntu-18.04-lts-x11vnc-non-funziona-piu/998311006/

Infine per switchare tra i vari manager grafici

sudo dpkg-reconfigure gdm3
sudo service gdm3 start
ma poi...
sudo dpkg-reconfigure lightdm

RASPBERRY AS NAS

NAS Storage con Raspberry e Samba

Questo e’ un tuttorial a mio avviso fatto piuttosto bene, anche se magari la parte sull’impiego dei permessi lascia un po a desiderare (ma parlo per professione, ed in ogni caso bisogna considerare che tutto dipende dal livello di protezione che si vuole raggiungere nel proprio network), in ogni caso risulta un buon riferimento: https://www.youtube.com/watch?v=A0Tz5S7TZMM.

Forse la cosa interessante e’ che viene utilizzato un hard disk recuperato da un pc.

Open Media Vault

Qui il raspberry viene utilizzato come media center. La cosa bella e’ che questo e’ gia’ pronto per l’uso, senza alcun effort.

Vedi questo video: in sostanza basta installarlo sul raspberry e poi avviarlo.

Al limite qui un link a un tutorial ben fatto che spiega come installare il software.

Non testato… pero’ sembra interessante. In ogni caso questo server solo come SMB, e non funge da Media Center

FASE OPERATIVA: COMANDI ESEGUITI

MOUNT MEMORIE USB

Anzitutto backup di fstab:

cp /etc/fstab /etc/fstab_`date +"%Y-%m-%d"`_original

Ecco qui alcuni comandi utilizzati e altri lanciati per realizzare quanto necessario:

apt install net-tools -> per avere ifconfig
fdisk -l -> trovo il media (anche con lsblk)
lsblk -f
lsblk -o +UUID
blkid -o value -s TYPE /dev/sdb2
mkdir /media/nas4
chown -R ubuntu:ubuntu /media/nas4/
mount /dev/sda2 /media/nas4/

poi per fare in modo che anche al reboot tutto funzioni, utilizzare:

Esempio di /etc/fstab

# My Nas
/dev/sda2	/media/nas4	vfat	defaults,uid=ubuntu,gid=ubuntu	0	0
/dev/sdb1	/media/nas3	vfat	defaults,uid=ubuntu,gid=ubuntu	0	0

dove vfat o hfsplus li ho trovati col comando tipo blkid -o value -s TYPE /dev/sdb2

Altro esempio di /etc/fstab piu’ avanzato, in quanto

  • prevede l’uso di un file di swap
  • per il mount utilizza lo UUID che nel caso di memorie USB risulta piu’ sicuro (mi e’ capitato che dopo aver spento il raspberry poi i volumni montati non combaciassero con la porta usb che mi aspettavo)
# Custom
/swapfile	none	swap	sw	0	0
# My Nas
UUID=0CD4-5C65	/media/nas4	vfat	defaults,uid=ubuntu,gid=ubuntu	0	0
UUID=832C-83A6	/media/nas3	vfat	defaults,uid=ubuntu,gid=ubuntu	0	0
UUID=61E9-D996	/media/nas2	vfat	defaults,uid=ubuntu,gid=ubuntu	0	0

MEMORIA USB

In caso vada formattata la memoria, ho usato questa guida.

Contestualmente e’ utile anche predisporre dei cron:

### Server Test
* * * * *  root echo "$(date)" > /tmp/testcron-root

*/10 * * * *  root mount -a > /dev/null 2>&1

SAMBA

A questo punto si puo’ pensare di procedere anche con SAMBA, che server per rendere alcuni volumi locali accessibili via network (ovvero renderli volumi di rete).

apt install -y samba
cp /etc/samba/smb.conf /etc/samba/smb_`date +"%Y-%m-%d"`.conf

Esempio di configurazione da inserire in /etc/samba/smb.conf

[raspy-nas-4]
    comment = Enomis Rapsy SMB
    path = /media/nas4
    read only = no
    browsable = yes
    writeable = yes #-> forse non serve...

Dove raspy-nas-4 diventera’ il nome che vedo nel file manager (browsing).

A questo punto posso avviare samba, e configurare la password d’accesso (sostanzialmente quando provo a montare il volume di network in locale, mi richiede “utente” e “password” per garantire che non tutti possano accedere alla risorsa di rete)

smbpasswd -a <username>
service smbd start/restart

In caso di problemi di network provare ad esempio

ufw allow samba #-> not used...

DLNA SERVER

Per essere tutto visibile da SMART TV, devo installare un server DLNA, ad esempio mini-dlna:
qui un tutorial in base al quale ho poi dedotto quanto segue:

cp /etc/minidlna.conf /etc/minidlna_`date +"%Y-%m-%d"`.conf
ln -s /media/nas3/Anime /var/lib/minidlna/Anime
sudo service minidlna stop

Nel file di condivisione mi sono limitato a settare:

# Set custom media server name
friendly_name=MediaServer EnomisRaspy
# Enable simlinks usage
wide_links=yes

FINE TUNNING

Seguendo questo buon tutorial in cui tratta:

  • impiego swapfile
  • Adjusting the Swappiness Property
  • Adjusting the Cache Pressure Setting

DOCKER

Compilazione multi architetuttura: tutorial semplice e chiaro qui.

Versioning

first install

obtain ifconfig

apt install net-tools cp /etc/fstab /etc/fstab_date +"%Y-%m-%d"_original

each usb is a “NAS”

mkdir /media/nas-250G/ mkdir /media/nas-16G/ chown -R ubuntu:ubuntu /media/nas-*

/etc/fstab

My Nas

UUID=832C-83A6 /media/nas-250G vfat defaults,uid=ubuntu,gid=ubuntu 0 0 UUID=0CD4-5C65 /media/nas-16G vfat defaults,uid=ubuntu,gid=ubuntu 0 0

# 5120 is 5GB (~4/5 minutes)
dd if=/dev/zero of="/swapfile" bs=1M count="5120" || \
{ >&2 echo "[ERROR] dd command fails. Ensure provided path exists." ; return 1 ; }
mkswap /swapfile
swapon /swapfile

/etc/fstab

Custom

/swapfile none swap sw 0 0

apt install -y samba cp /etc/samba/smb.conf /etc/samba/smb_date +"%Y-%m-%d".conf

[raspy-nas-250GB] comment = Enomis Rapsy 250 GB SMB path = /media/nas-250GB read only = no browsable = yes #writeable = yes #-> forse non serve…

[raspy-nas-16GB] comment = Enomis Rapsy 16 GB SMB path = /media/nas-16GB read only = no browsable = yes #writeable = yes #-> forse non serve…

apt install -y minidlna cp /etc/minidlna.conf /etc/minidlna_date +"%Y-%m-%d".conf

ln -s /media/nas-250G/Anime /var/lib/minidlna/Anime ln -s /media/nas-250G/Music /var/lib/minidlna/Music

In /etc/minidlna.conf

Set custom media server name

friendly_name=MediaServer EnomisRaspy

Enable simlinks usage

wide_links=yes

service minidlna restart echo ‘/swapfile none swap sw 0 0’ | sudo tee -a /etc/fstab

testare nuovi valori: sysctl vm.swappiness=10 sysctl vm.vfs_cache_pressure=50

rendere permanente vim /etc/sysctl.conf -> vm.swappiness=10 vm.vfs_cache_pressure=50 oppure creo file in /etc/sysctl.d/

### Device:
### Ubuntu 18.04 LTS - Ubuntu 20.04 LTS

apt-get install -y docker.io docker-compose
systemctl enable --now docker

# Docker completion https://docs.docker.com/compose/completion/
#curl -L https://raw.githubusercontent.com/docker/compose/1.25.4/contrib/completion/bash/docker-compose -o /etc/bash_completion.d/docker-compose
curl -L "https://raw.githubusercontent.com/docker/compose/$(curl -s https://api.github.com/repos/docker/compose/releases/latest | grep -oP '"tag_name": "\K(.*)(?=")')/contrib/completion/bash/docker-compose" -o /etc/bash_completion.d/docker-compose


# Abilitato auto-completion per tutti gli utenti:
`/etc/bash.bashrc` aggiunto: `if [ -f "/etc/profile.d/bash_completion.sh" ] ; then source /etc/profile.d/bash_completion.sh ; fi`

usermod -a -G docker ubuntu

systemctl status docker

Test server:

#mkdir -p /enomis/docker/infrastructure
mkdir -p /enomis/docker/projects/http-hello/

Provato nginx di test in htto-hello con porta 8080 e aperto sul firewall

Ora provo acme-dns:

https://github.com/joohoi/acme-dns/

needs two volumes:

  • config file, for example config/config.cfg
  • sqlite database folder, for example ` dbdata-sqlite3/`

https://github.com/joohoi/acme-dns/

Code Samples:

/topics/raspberry/