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:
touch ssh
cat <<EOF >wpa_supplicant.conf
ctrl_interface=/var/run/wpa_supplicant
update_config=1
country=IT
network={
ssid="my-wifi-ssid"
scan_ssid=1
psk="my-wifi-password"
}
EOFaggiungi questa linea al file config.txt
dtoverlay=dwc2apri cmdline.txt ed aggiungi questo testo alla fine della linea:
modules-load=dwc2,g_acm_msOra, sposta la microSD sul rPiZero e accendi.
Poi apri una sessione ssh e scrivi questo comando per installare i pacchetti iscsi richiesti:
sudo apt install open-iscsiPoi usa raspi-config per forzare il Pi ad aspettare che la rete sia connessa all’avvio.
ora modifica il file /etc/rc.local:
#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.
# Print the IP address
_IP=$(hostname -I) || true
if [ "$_IP" ]; then
printf "My IP address is %s\n" "$_IP"
fi
IQN=iqn.2000-01.com.synology:MYNAS.Target-1.c12345678f9
HOST=192.168.1.10
PORT=3260
iscsiadm --mode node --targetname "${IQN}" -p "${HOST}:${PORT}" --login
sleep 5
/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
exit 0Puoi 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