Tabla de Contenidos
Introducción a iSCSI
iSCSI es un protocolo que permite ejecutar comandos SCSI a través de la red. Es decir, controlar un dispositivo SCSI a través de un cable Ethernet en vez de a través de su conexión de toda la vida. Esto permite controlar dispositivos SCSI remotos, en otras máquinas
A esto se le llama “Storage Area Network” o SAN. No estás compartiendo un sistema de ficheros (como NFS o Samba, a eso se le llama “NAS”), estás compartiendo el dispositivo directamente. Sin ningún tipo de filesystem. Ya que se supone que eso lo creas el cliente
Para que sirve iSCSI?
Para darle almacenamiento a otros ordenadores. Por ejemplo, podrías tener un “disco duro” privado en tu servidor solo para tu ordenador. Ya que iSCSI soporta autenticación que puedes “enchufar” usando iSCSI. También puedes usar volumenes iSCSI para instalar sistemas operativos y arrancarlos en máquinas físicas o virtuales y tener ordenadores funcionales sin necesidad de que tengan un disco duro.
Crear un volumen iSCSI (target)
Usando zfs, se puede crear un zvol para crear un dispositivo de
bloques (algo parecido a lo que harías usando qemu-img
) para esto
se usa la flag -V
del comando zfs-create
con el tamaño deseado
zfs create -V 50G stranger/iscsi/debian2
Y esto nos crearia un dispositivo de bloques en
/dev/zvol/stranger/iscsi/debian2 que podremos exportar usando la
utilidad ctld
de FreeBSD. He aquí un ejemplo de configuración
bastante sencillo que no tiene soporte para autenticación ni nada (así
que asegurate de no sacarlo de tu LAN…)
- /etc/ctl.conf
# No poner ningún tipo de autenticación portal-group example2 { discovery-auth-group no-authentication listen 0.0.0.0 } # El volumenm iSCSI de Debian target iqn.2025-03.net.suragu:target0 { alias "Testing target" auth-group no-authentication portal-group example2 lun 0 { path /dev/zvol/stranger/iscsi/debian2 blocksize 4096 size 50G } }
service ctld enable && service ctld start
y ya podremos acceder a
nuestras volumenes iSCSI desde dentro de la RAM. Y ya podremos
conectarnos a ellos a través de clientes.
El cliente (initiator)
En FreeBSD usaríamos el comando iscsictl con la dirección IP del host, en mi caso 192.168.1.230
doas iscsictl -A -p 192.168.1.230 -t iqn.2025-03.net.suragu:target0
Y podemos ver que ha funcionado pues tengo un nuevo dispositivo SCSI en da0 con particiones y todo (ya tenía Debian instalado aquí)
~ [qmdx] % lsblk DEVICE MAJ:MIN SIZE TYPE LABEL MOUNT ada0 0:96 466G GPT - - ada0p1 0:97 260M efi gpt/efiboot0 /boot/efi ada0p2 0:98 512K freebsd-boot gpt/gptboot0 - <FREE> -:- 492K - - - ada0p3 0:99 2.0G freebsd-swap gpt/freebsd-swap SWAP ada0p4 0:100 464G freebsd-zfs gpt/freebsd-zfs <ZFS> <FREE> -:- 4.0K - - - da0 1:203 50G GPT - - <FREE> -:- 1.0M - - - da0p2 1:205 2.8G efi gpt/efi - da0p1 1:204 47G linux-data gpt/linux-data - <FREE> -:- 1.0M - - -
Podemos crear una tabla de particiones, formatear particiones, montar un RAID, lo que queramos. Pero cuando acabemos de usarlo, acabar la sesión con el mismo comando pero con la flag -R en vez de la flag -A. Para acabar la sesión en lugar de iniciarla.
En Linux
Para hacerlo en Linux, se necesita el programa open-iscsi
que está
en la mayoría de repos. Se debe iniciar el servicio (systemctl
enable –now open-iscsi
si tienes systemd) y a partir de ahi puedes
usar iscsiadm -m node -T TARGET_NAME -p PORTAL_IP_ADDRESS –login
para
loggearte en la target iSCSI. Para deslogearte usas –logout
en
vez de –login
¡Felicidades por crear tu target iSCSI!
Detalles
Recordemos que realmente lo que estás haciendo es enviar comandos SCSI a través de red. Como si el dispositivo estuviese conectado a tu ordenador a través de un cable ethernet mas que por un cable raro. Sigues teniendo las limitaciones de SCSI. Por lo cual no puedes enchufar la misma target a distintos dispositivos y esperar que funcione correctamente. Ya que conectar una target a dos dispositivos distintos sería como conectar el mismo disco duro a dos ordenadores distintos a la vez. No tiene sentido.