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:

 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