The Unlimited Thumbdrive
Qualche giorno fa, Synology ha postato un tweet su un vecchio dispositivo, chiedendo agli utenti cosa facesse.
Qualcuno ha rispostp:
“E’ un target iSCSI che si presenta al computer come un disco virtuale tramite USB 😁😂😂 scherzo 😊”
Ho immediatamente tweettato il mio primo pensiero: “Questa è proprio una grande idea! Dovrebbe essere fattibile con un raspberry pi zero w.”
E adesso ho questa fissa. So che è possibile, quindi è ora di un POC.
Cosa serve
- Un Raspberry Pi Zero W
- Una scheda microSD (almeno 2GiB)
- Un server iSCSI (un NAS decente andrà bene)
iSCSI
Se hai un nas, accedi all’interfaccia di amministrazione e crea un nuovo target per il pendrive ed un LUN da associargli. Questo può essere grande quanto vuoi.
Prendi nota di questi parametri:
- indirizzo IP (del NAS)
- porta (di solito 3260)
- IQN (l’identificatore del target iSCSI)
preparazione della scheda microSD
Copia l’immagine del sistema operativo sulla microSD. Ho usato l’immagine Raspberry Pi OS Lite (Legacy) che è ridotta ed ha poche richieste per funzionare.
Puoi usare “Raspberry Pi Imager” o “Balena Etcher”, o il buon vecchio dd.
Quando la scrittura è terminata, vai nella partizione di boot e:
1touch ssh
2
3cat <<EOF >wpa_supplicant.conf
4ctrl_interface=/var/run/wpa_supplicant
5update_config=1
6country=IT
7
8network={
9 ssid="my-wifi-ssid"
10 scan_ssid=1
11 psk="my-wifi-password"
12}
13EOF
aggiungi questa linea al file config.txt
1dtoverlay=dwc2
apri cmdline.txt
ed aggiungi questo testo alla fine della linea:
1modules-load=dwc2,g_acm_ms
Ora, sposta la microSD sul rPiZero e accendi.
Poi apri una sessione ssh e scrivi questo comando per installare i pacchetti iscsi richiesti:
1sudo apt install open-iscsi
Poi usa raspi-config
per forzare il Pi ad aspettare che la rete sia connessa all’avvio.
ora modifica il file /etc/rc.local
:
1#!/bin/sh -e
2#
3# rc.local
4#
5# This script is executed at the end of each multiuser runlevel.
6# Make sure that the script will "exit 0" on success or any other
7# value on error.
8#
9# In order to enable or disable this script just change the execution
10# bits.
11#
12# By default this script does nothing.
13
14# Print the IP address
15_IP=$(hostname -I) || true
16if [ "$_IP" ]; then
17 printf "My IP address is %s\n" "$_IP"
18fi
19
20IQN=iqn.2000-01.com.synology:MYNAS.Target-1.c12345678f9
21HOST=192.168.1.10
22PORT=3260
23
24iscsiadm --mode node --targetname "${IQN}" -p "${HOST}:${PORT}" --login
25sleep 5
26/sbin/modprobe g_acm_ms file=/dev/disk/by-path/ip-192.168.1.10:3260-iscsi-iqn.2000-01.com.synology:MYNAS.Target-1.c12345678f9-lun-1 removable=y ro=0 stall=0
27
28exit 0
Puoi fare copia-incolla di questi comandi in una shell (di root) per verificare che funzionino.
Ora, spegni il RaspberryPiZero e connetti il cavo USB dalla porta OTG al PC: avrai alimentazione dal PC e il Raspberry si avvierà, si connetterà al wifi, tiretà su iSCSI e presenterà il block device via USB.
Sarà visto come un disco vuoto, della dimensione scelta durante la creazione del LUN.
Possibili miglioramenti
- avvio più rapido
- case stampato in 3d
- disconnessione sicura (filesystem in r/o oppure overlay su RAM)
- generazione automatica dell’immagine partendo ad quella stock di raspberry
- console tramite emulazione seriale usb
- interfaccia di amministrazione web su scheda di rete emulata usb
- connessione vpn prima di iscsi