Purtroppo, a distanza di 5 anni di onorato servizio, la mia stazione Mini-ITX fanless è morta (non so ancora dove sia il guasto, ma è sempre stata – ininterrottamente – accesa e funzionante!!!). Il suo principale utilizzo è stato come stazione di download peer-2-peer: di conseguenza ha subito nel tempo un considerevole stress. E la mancanza di ventola ha certamente influito sul suo ciclo vitale. Non avendo intenzione di spendere denaro, mi sono per forza dovuto guardare intorno: in casa avevo disponibile un Raspberry Pi 3.

Cosa faremo

  1. Realizzeremo una stazione di download peer-2-peer molto leggera con un Raspberry Pi 3 e aMule (amuled-daemon)
  2. Configureremo il SO Linux Raspbian LITE (solo riga di comando) su una MicroSD da “soli” 2GB
  3. Prepareremo uno storage con una pendrive USB
  4. Useremo alcuni strumenti di monitoraggio remoto: amulecmd e amuleweb
  5. Condivideremo i files scaricati sulla rete locale tramite protocollo SAMBA

Un confronto

Mini-ITX Atom D435 (qui) Raspberry Pi 3 model B (ALTERNATIVA qui) Mini PC Intel Atom
Processore Intel® Atom™ D425 (512K Cache, 1.80 GHz) A 1.2GHz 64-bit quad-core ARMv8 CPU Intel® Atom™ x5-Z8300 (2M Cache, 1.84Ghz)
RAM 1GB DDR3 (1066 Mhz) 1GB DDR2 (900 MHz) 2GB DDR3
 Disco HDD 160GB 5400 rpm MicroSD 2GB classe 4 + PenDrive 32GB USB 3.0 32GB (system disk)
Costo con accessori circa 120 euro nel 2011 (oggi difficilmente replicabile) circa 70 euro (qui da amazon.it in kit)  cica 100 euro (qui da amazon.it)
Note (OS Win10) NON supporta LINUX

Sulla carta la cosa non mi fa ben sperare: il Raspberry Pi è inferiore alla concorrenza su tutte le principali caratteristiche. D’altra parte la mia vecchia  configurazione Atom è difficile da replicare oggi con gli stessi prezzi. In alternativa si trovano in commercio diversi Mini PC Atom preassemblati, ma sono purtroppo spesso vincolati ad usare SO Windows (problemi di BIOS). Costano decisamente poco, ma l’affidabilità è tutta da dimostrare. Passiamo quindi alla prova dei fatti e vediamo come si comporta il lampone con una installazione di aMule

Gli ingredienti

Qui qualche consiglio per gli acquisti: il raspberry Pi 3 si trova anche in kit. Dovrete aggiungere eventualmente un cavo HDMI per il collegamento ad un monitor.

Installiamo il SO: Raspbian LITE

Il SO scelto è quello ufficiale Raspbian: se avete a disposizione una MicroSD sufficiente capiente (aconsigliati 8GB), seguite queste istruzioni scaricando la ISO della versione desktop completa. Avendo però io già a disposizione una MicroSD di soli 2GB ho deciso per una installazione “leggera” passando per il NOOBS (New Out Of the Box Software). Qui trovate la semplice guida di installazione. Ovviamente, in questo caso, il SO scelto è la versione di Raspbian LITE da riga di comando, cioè senza interfaccia grafica (GUI). Questa soluzione vi permetterà anche di non sovraccaricare troppo il vostro Raspberry Pi, che non si dovrà occupare di lavorare con la scheda grafica. Se poi a voi la riga di comando non vi piace proprio, provate PIXEL. In teoria, passando per il NOOBS, una volta preparata ed inserita la MicroSD nel Raspberry Pi, vi basterà accenderlo senza tastiera, mouse e monitor. Basterà infatti alimentarlo ed inserire il cavo di rete (questa cosa non funziona con il solo WiFi): in questo modo potrete connettervi da remoto (dal vostro PC usuale) in SSH:

  • Cercate l’indirizzo IP assegnato al vostro raspberry (accedere al router o usate uno di quei tool per lo scanning della rete locale)
  • Utilizzate il terminale locale del vostro PC per aprire una sessione SSH e collegarvi al Raspberry Pi (le credenziali di default sono pi/raspberry)

In alternativa, per la prima configurazione, collegate mouse, tastiera e monitor; quindi accedete il Raspberry Pi. Lanciate sempre sudo raspi-config

  • Opzione n.1: espandiamo il filesystem (necessario solo se non siete partiti da NOOBS)
  • Opzione n.2: cambiamo la password dell’utente di default (pi)
  • Opzione n.7 (avanzate): (A2) cambiamo l’host name per riconoscere la stazione in rete; (A3) cambiamo la quantità di memoria allocata per la scheda video a soli 16MB; (A4) abilitiamo l’SSH per connetterci da remoto (se non già abilitato).

Infine assegnate l’IP statico, in modo che questi non cambi mai: per questa operazione ed le altre configurazioni di base (come l’aggiornamento del sistema) potete fare riferimento ad alcuni dei passi presenti in questa guida ed in altre guide Linux sul blog. Prima di installare qualsiasi nuovo componente vi consiglio di eseguire sempre il comandi di aggiornamento:

sudo apt-get update
sudo apt-get upgrade

Configuriamo lo storage

Collegate la chiavetta USB (qui in calce qualche chiavetta economica consigliata; in alternativa potete collegare un HDD esterno, ma ricordatevi di alimentare adeguatamente il Raspberry Pi).

Lexar JumpDrive 32GB USB 3.0 Lexar JumpDrive 64GB USB 3.0 Lexar JumpDrive 128GB USB 3.0

Digitate sul terminale:

sudo fdisk -l

avrete l’elenco dei dischi ed il tipo di filesystem. Confrontate le dimensioni e potrete facilmente riconoscere la pendrive. Nel mio caso, ad esempio, una penna da 32GB (nominali) è stata mappata su /dev/sda . In particolare c’è una partizione DOS FAT32 in /dev/sda1 , che provvederemo ad eliminare e riformattare:

Device     Boot Start      End  Sectors  Size Id Type
/dev/sda1        8192 60632063 60623872 28.9G  c W95 FAT32 (LBA)

Usate il comando:

sudo fdisk /dev/sda

Ricordatevi di sostituire sda con il vostro valore di riferimento. Digitate: p  per la lista delle partizioni. Per cancellarle, d ; Create la partizione primaria con n , quindi p . Occupate tutto lo spazio disponibile. Per applicare i cambiamenti, w . Per l’help usate m . Quindi formattate come linux ext4.

sudo mkfs.ext4 /dev/sda1

Se rieseguite il comando sudo fdisk -l  troverete:

Device     Boot Start      End  Sectors  Size Id Type
/dev/sda1        2048 60632063 60630016 28.9G 83 Linux

A questo punto è necessario montare l’unità su una cartella appositamente creata (io ho scelto di chiamarla torrents ):

sudo mkdir /mnt/torrents
sudo mount /dev/sda1 /mnt/torrents
df -hT

L’ultimo comando vi da la conferma che la partizione (del giusto file system) sia correttamente montata e sia tutto ok:

$ df -hT
Filesystem     Type      Size  Used Avail Use% Mounted on
/dev/root      ext4      1.6G  964M  531M  65% /
devtmpfs       devtmpfs  459M     0  459M   0% /dev
tmpfs          tmpfs     463M     0  463M   0% /dev/shm
tmpfs          tmpfs     463M  6.2M  457M   2% /run
tmpfs          tmpfs     5.0M  4.0K  5.0M   1% /run/lock
tmpfs          tmpfs     463M     0  463M   0% /sys/fs/cgroup
/dev/mmcblk0p6 vfat       66M   21M   46M  31% /boot
/dev/sda1      ext4       29G   44M   27G   1% /mnt/torrents

A questo punto è necessario che l’unità venga montata in automatico ad ogni avvio del sistema. Modifichiamo un file di configurazione con:

sudo nano /etc/fstab

aggiungiamo la seguente riga:

/dev/sda1 /mnt/torrents ext4 defaults 0 0

Ad esempio, nel mio caso, il file fstab si presenta alla fine così:

$ cat /etc/fstab 
proc            /proc           proc    defaults          0       0
/dev/mmcblk0p6  /boot           vfat    defaults          0       2
/dev/mmcblk0p7  /               ext4    defaults,noatime  0       1
/dev/sda1       /mnt/torrents   ext4    defaults          0       0
# a swapfile is not a swap partition, no line here
#   use  dphys-swapfile swap[on|off]  for that

Riavviate il Raspberry Pi con:

sudo reboot

Installiamo aMule Daemon

Emule da moltissimi anni continua ad essere un riferimento per il P2P. Quando si parla di eMule si fa riferimento all’eseguibile per SO Windows. Per le altre piattaforme il pacchetto di riferimento di chiama aMule, che deriva direttamente da eMule. La cosa interessante è che aMule dispone di un demone chiamato amuled perfetto per le installazioni prive di GUI (come questa) e sistemi di bassa potenza. Installiamolo:

sudo apt-get install amule-daemon

Il pacchetto di amule-daemon si porta dietro anche amulecmd e amuleweb di cui parleremo dopo. In genere, subito dopo l’installazione, il demone non può partire perché manca una corretta configurazione. Prima di tutto è necessario configurare un utente non amministratore con cui farlo girare: chiamo questo utente amuleusr.

sudo adduser amuleusr

Dovreste proseguire con qualcosa del genere:

$ sudo adduser amuleusr
Adding user `amuleusr' ...
Adding new group `amuleusr' (1002) ...
Adding new user `amuleusr' (1002) with group `amuleusr' ...
Creating home directory `/home/amuleusr' ...
Copying files from `/etc/skel' ...
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
Changing the user information for usertmp
Enter the new value, or press ENTER for the default
   Full Name []: aMule User
   Room Number []:
   Work Phone []:
   Home Phone []:
   Other []:
Is the information correct? [Y/n] Y

Per una ragione di comodità aggiungiamo temporaneamente l’utente amulusr al gruppo sudo, in modo che possa eseguire qualche comando con maggiori privilegi: sudo adduser amuleusr sudo Basta ricordarsi alla fine dell’installazione di eliminarlo dal gruppo sudo e di cambiargli la shell associata per evitare di loggarsi. Una volta configurato l’utente editiamo il primo fondamentale file di configurazione di aMule:

sudo nano /etc/default/amule-daemon

E’ necessario indicare l’utente appena creato (amuleusr) come utente con cui far girare il demone (chiave AMULED_USER nel file di configurazione). Alla fine della modifica il file dovrebbe essere una cosa del genere:

# Configuration for /etc/init.d/amule-daemon

# The init.d script will only run if this variable non-empty.
AMULED_USER="amuleusr"

# You can set this variable to make the daemon use an alternative HOME.
# The daemon will use $AMULED_HOME/.aMule as the directory, so if you
# want to have $AMULED_HOME the real root (with an Incoming and Temp
# directories), you can do `ln -s . $AMULED_HOME/.aMule`.
AMULED_HOME=""

Volendo (ma in questo caso specifico non l’ho fatto) potremmo spostare sullo storage (la pen drive) tutta la cartella HOME di amuled che contiene sia i files di configurazione che le cartelle Temp (con gli spezzoni dei files in download) ed Incoming (con i files completi): basta popolare la chiave AMULED_HOME con il path dello storage. Io personalmente preferisco tenere separati i files di configurazione dai files scaricati. Quindi creiamo le due cartelle sulla pen drive: Temp e Incoming

sudo mkdir /mnt/torrents/Temp
sudo mkdir /mnt/torrents/

Diamo i privilegi di scrittura al nostro utente amuleusr.

sudo chown -R amuleusr /mnt/torrents

Fino a questo momento abbiamo operato con l’utente di default pi. Passiamo adesso all’utente amulusr, in modo da avviare finalmente il demone:

su amuleusr

Ci chiederà ovviamente la password. Avviamo il demone con:

amuled -f

A questo punto all’interno della home dell’utente amuleusr verrà create una cartella nascosta .aMule . Diamo un occhiata:

cd ~/.aMule
$ ls -la
...
-rw-r--r-- 1 amuleusr amuleusr 5587 Jan 15 15:25 amule.conf
drwxr-xr-x 2 amuleusr amuleusr 4096 Jan 31 13:38 Incoming
drwxr-xr-x 2 amuleusr amuleusr 4096 Jan 31 13:38 Temp
...

Come anticipato vi troviamo le cartelle di servizio Incoming (files scaricati completi) e Temp (spezzoni dei files in download): queste verranno configurate sullo storage nelle analoghe cartelle create al passo precedente. E’ invece fondamentale il file di configurazione amule.conf  che deve essere editato. Fermiamo temporaneamente il servizio:

sudo /etc/init.d/amule-daemon stop

Se volete avere la conferma che il servizio non giri più usate sempre il comando ps aux | grep amuled . Apriamo il file con l’editor:

sudo nano /home/amuleusr/.aMule/amule.conf

Riporto qui le principali voci da modificare:

[eMule]
...
# E' il nickname con cui sarete conosciuti dagli altri utenti
# Cambiarlo potrebbe essere utile
Nick=ilmionickpreferitoanonimo
...
# E' la porta TCP utilizzata dal amule: dovrete aprirla sul router
Port=39521
# E' la porta UDP utilizzata da amule: dovrete aprile sul router
UDPPort=39525
UDPEnable=1
...
# Questa opzione vi evita di rimuovere i server amule
# nel caso non dovessero rispondere per alcune ore
RemoveDeadServer=0
DeadServerRetry=3
ServerKeepAliveTimeout=0
...
# Queste sono le cartelle si servizio da far puntare
# al vostro storage
TempDir=/mnt/torrents/temp
IncomingDir=/mnt/torrents/incoming
...
# Fatevi allertare se lo spazio su disco dovesse finire
MinFreeDiskSpace=100
...
# Questa è la cartella nascosta di sistema che
# non è stata spostata e rimane della home
# dell'utente amuleusr
OSDirectory=/home/amuleusr/.aMule/
...
# Impostate qui i limiti di banda in funzione
# della capacità della vostra connessione
DownloadCapacity=1000
UploadCapacity=100
...
# Per ragioni di sicurezza lasciate a 0 queste voci:
# eviterete di ricevere l'elenco dei server dalla rete
# riducendo il rischio di connessioni a servers fake
AddServerListFromServer=0
AddServerListFromClient=0
...
[Browser]
...
[Proxy]
...
[ExternalConnect]
...
# Questi sono i dati per la connessione remota attraverso amulecmd
# La password è in formato MD5 (vedi dopo). Consiglio di non cambiare la porta.
AcceptExternalConnections=1
ECPort=4712
ECPassword=90027b489987c6b6f0c4af63c673c56a
...
[WebServer]
# Abilito il server web per l'accesso remoto tramite HTTP
# La password è in formato Md5 (vedi dopo)
Enabled=1
Password=90027b489987c6b6f0c4af63c673c56a
PasswordLow=
Port=4711
UseGzip=1
...
Path=amuleweb
[GUI]
...

Per produrre la password da inserire in cofigurazione dovete calcolarne l’MD5. Ad esempio, per calcolare l’Md5 di ccworld usate:

$ echo -n "ccworld" | md5sum
90027b489987c6b6f0c4af63c673c56a  -

Ricordatevi di configurare adeguatamente il NAT sul vostro router: tutte le porte devono essere aperte e ruotate. Nel file di configurazione in alto abbiamo ipotizzato di usare le seguenti porte: TCP 39521, UDP 39525. Sul vostro router dovrete però aprire le seguenti porte

  • TCP 39521
  • UDP 39524 (cioè la porta TCP + 3)
  • UDP 39525

Potrebbe essere necessario intervenire anche sul firewall del Raspberry Pi. Potete usare questi comandi per modificarne la configurazione:

sudo iptables -A INPUT -p tcp --dport 39521 -j ACCEPT
sudo iptables -A INPUT -p udp --dport 39525 -j ACCEPT
sudo iptables -A INPUT -p udp --dport 39524 -j ACCEPT

Ovviamente sostituite in modo opportuno le vostre porte IP a quelle dell’esempio. Avviamo finalmente il demone (ricordiamoci di lavorare sempre con l’utente amuleusr):

amuled -f

Usiamo amulecmd

Il programma amulecmd è uno strumento da riga di comando che permette di controllare (sia in locale che in remoto) amuled. Per funzionare è importante che la sezione [ExternalConnect]  del file di configurazione amule.conf sia opportunamente compilata (vedi sopra). Per lanciare amulecmd è sufficiente digitarne il comando amulecmd :

$ amulecmd
This is amulecmd 2.3.1
Enter password for mule connection: 
Creating client...
Succeeded! Connection established to aMule 2.3.1
---------------------------------------
|          aMule text client          |
---------------------------------------
Use 'Help' for command list
aMulecmd$

La password che vi verrà chiesta è esattamente quella impostata in amule.conf. Le operazioni da fare non sono tantissime, ma sono presenti quelle fondamentali: basta digitare help .

Available commands:
Add           Add an eD2k or magnet link to core.
Cancel        Cancel download.
Connect       Connect to the network.
Disconnect    Disconnect from the network.
Download      Start downloading a file
Exit          Exits from the application.
Get           Get and display a preference value.
Help          Show help.
Pause         Pause download.
Priority      Set download priority.
Progress      Show the progress of a search.
Quit          Exits from the application.
Reload        Reload the given object.
Reset         Reset log.
Results       Show the results of the last search.
Resume        Resume download.
Search        Execute a search.
Set           Set a preference value.
Show          Show queues/lists.
Shutdown      Shut down aMule.
Statistics    Show full statistics tree.
Status        Show short status information.

Ad esempio possiamo aggiungere qualche server, pescandolo dalla seguente lista (valida a gennaio 2017, ricordate di aggiornarla):

Una nota: ormai tutti i server di amule non sono affidabili (o non funzionano) per la ricerca. Se dovete cercare un file nella rete collegatevi alla rete Kad. Per aggiungere i server al vostro mulo basta digitare all’interno di amulecmd il comando add seguito da uno dei link riportati in alto.

aMulecmd$ add ed2k://%7Cserver%7C91.200.42.46%7C1176%7C/
 > Operation was successful.

ripetete l’operazione per i restanti server (qui li riporto tutti per comodità).

add ed2k://%7Cserver%7C91.200.42.46%7C1176%7C/
add ed2k://%7Cserver%7C91.200.42.47%7C3883%7C/
add ed2k://%7Cserver%7C91.200.42.119%7C9939%7C/
add ed2k://%7Cserver%7C77.120.115.66:5041%7C/
add ed2k://%7Cserver%7C176.103.48.36%7C4184%7C/
ed2k://%7Cserver%7C195.154.109.229%7C4232%7C/
add ed2k://%7Cserver%7C88.191.228.66%7C7111%7C/
add ed2k://%7Cserver%7C88.191.221.121%7C7111%7C/

Potete verificare con il comando show  che i server siano stati memorizzati:

aMulecmd$ show servers
 > [91.200.42.46:1176]     eMule Security No1
 > [88.191.221.121:7111]   88.191.221.121
 > [91.200.42.119:9939]    eMule Security No3
 > [91.200.42.47:3883]     eMule Security No2
 > [176.103.48.36:4184]    TV Underground
 > [195.154.109.229:4232]  195.154.109.229
 > [88.191.228.66:7111]    88.191.228.66

A questo digitate il comando connect  ed aspettate qualche secondo. Se volete fare una ricerca (proviamo “spiderman“) potete usare il comando search kad :

aMulecmd$ search kad spiderman
 > Search in progress. Refetch results in a moment!

Per ottenere il risultato digitiamo results :

aMulecmd$ results
Nr.    Filename:                                                                        Size(MB):  Sources: 
-----------------------------------------------------------------------------------------------------------
...
2.    The.Amazing.SpiderMan.2.Il.Potere.Di.Electro.3D.2014.DTS.ITA.ENG.Half.SBS.10     1748.332     1
3.    cartoni animati - Spiderman l'uomo ragno.mp3                                        2.538     0
4.    Michael Buble - Spiderman theme (Swing).mp3                                         2.790     1
5.    OK - [Divx ita] Spiderman 3.avi                                                   695.220     406
6.    x-men wolverine, thor, hulk, and spiderman 01.jpg                                   0.329     1
...

Mi raccomando, non scaricate contenuti illegali! Esiste un modo per sfruttare amulecmd direttamente dalla riga di comando principale, e di conseguenza negli script. Usiamo il comando  status  per vedere come vanno le cose. La sintassi è la seguente:

amulecmd -P PASSWORD -c COMANDO

Ad esempio, dal prompt dell’utente:

/home/pi $ amulecmd -P 123456 -c status
This is amulecmd 2.3.1

Creating client...
Succeeded! Connection established to aMule 2.3.1
 > eD2k: Connected to eMule Security No1 [91.200.42.46:1176] with HighID
 > Kad: Connected (ok)
 > Download:	143.87 kB/s
 > Upload:	27.22 kB/s
 > Clients in queue:	1
 > Total sources:	382

Qui trovate un semplice script. Ma non è tutto: amulecmd può comandare una installazione di amuled anche da remoto. E’ sufficiente installarlo sulla macchina remota e usare una sintassi del genere:

amulecmd -h [IP_amuled] -p [porta_amuled] -P [password] -c "comando"

Usiamo amuleweb

Nella configurazione editata in fase di installazione abbiamo abilitato anche l’interfaccia web di aMule. Per funzionare è importante che la sezione [WebServer]  del file di configurazione amule.conf sia opportunamente compilata (vedi sopra). La porta di default (che non abbiamo cambiato) è la 4711 e la password è quella inserita nel file di configurazione in formato Md5. Digitando nel browser http://:4711/  possiamo autenticarci e visualizzare l’interfaccia grafica (seppur minimale). Attraverso emuleweb è possibile variare alcuni parametri di configurazione, accedere al log, alle statistiche ed eseguire più facilmente le ricerche.

Condividiamo i files nella rete locale

L’idea è di condividere la cartella dei files scaricati

/mnt/torrents/Incoming

sulla nostra rete locale. Per fare questo installiamo il servizio SAMBA:

sudo apt-get install samba samba-common-bin

prima backuppiamo e poi editiamo il file di configurazione:

sudo cp /etc/samba/smb.conf /etc/samba/smb.conf.old
sudo nano /etc/samba/smb.conf

se vogliamo abilitare il supporto a Windows decommentiamo e modifichiamo la linea:

wins support = yes

Aggiungete (o decommentate nel caso sia già presente) alla fine della sezione Authentication la seguente riga:

security = user

Aggiungete alla fine del file la seguente sezione (la prima riga tra parentesi identifica la vostra condivisione: assegnategli una etichetta chiara):

[torrents]
comment = cartella dei files scaricati
path= /mnt/torrents
valid users=amuleusr
browseable=yes
read only = no
writeable=yes
only guest=no
guest ok=no
create mask=0777
directory mask=0777
public=no

Assegnate la password all’utente che può collegarsi alla cartella condivisa:

sudo smbpasswd -a amuleusr

(io per comodità uso lo stesso utente e la stessa password dell’utente amuleusr di amuled). Riavviate il servizio:

sudo /etc/init.d/samba restart

 

La vostra stazione p2p è pronta…