Contenuti

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 😊”

link

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"
}
EOF

aggiungi questa linea al file config.txt

dtoverlay=dwc2

apri cmdline.txt ed aggiungi questo testo alla fine della linea:

modules-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:

sudo 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:

#!/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 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