Trabajar con iSCSI
Configura un escenario donde tengas un servidor que exporte algunos targets por iSCSI y los conecte a diversos clientes, explicando con detalle la forma de trabajar.
-
Crea un target con una LUN y conéctala a un cliente GNU/Linux. Explica cómo escaneas desde el cliente buscando los targets disponibles y utiliza la unidad lógica proporcionada, formateándola si es necesario y montándola.
-
Utiliza systemd mount para que el target se monte automáticamente al arrancar el cliente.
-
Crea un target con 2 LUN y autenticación por CHAP y conéctala a un cliente windows. Explica cómo se escanea la red en windows y cómo se utilizan las unidades nuevas (formateándolas con NTFS)
-
El sistema debe funcionar después de un reinicio de las máquinas.
Para empezar vamos a describir el escenario:
-
Una máquina Debian 11 que funcionará como servidor. Dispone de tres discos asociados de 1GiB cada uno y tiene como ip 192.168.121.188/24.
-
Una máquina Debian 11 que funcionará como cliente. Tiene como ip 192.168.121.107/24.
-
Una máquina Windows 7 que funcionará como cliente. Tiene como ip 192.168.121.12/24.
Para empezar vamos a crear un target en el servidor con un LUN que posteriormente compartiremos con el cliente Debian. Podemos comprobar que mi máquina servidora tiene los discos anexados que hemos mencionado anteriormente:
lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
vda 254:0 0 20G 0 disk
└─vda1 254:1 0 20G 0 part /
vdb 254:16 0 1G 0 disk
vdc 254:32 0 1G 0 disk
vdd 254:48 0 1G 0 disk
Así pues, instalamos el paquete que nos proporcionará las funcionalidades de servidor iSCSI:
apt install tgt
Una vez instalado, creamos el primer target usando el siguiente comando:
tgtadm --lld iscsi --op new --mode target --tid 1 -T iqn.2021-12.servidor:clientedebian
Una vez creado el target, procedemos a crear la unidad lógica (LUM) que añadimos al target que acabamos de crear:
tgtadm --lld iscsi --op new --mode logicalunit --tid 1 --lun 1 -b /dev/vdb
También debemos indicar la interfaz por la vamos a permitir que el target se comparta (en mi caso elijo todas):
tgtadm --lld iscsi --op bind --mode target --tid 1 -I ALL
Podemos ver los targets que tenemos definidos:
tgtadm --lld iscsi --op show --mode target
Target 1: iqn.2021-12.servidor:clientedebian
System information:
Driver: iscsi
State: ready
I_T nexus information:
LUN information:
LUN: 0
Type: controller
SCSI ID: IET 00010000
SCSI SN: beaf10
Size: 0 MB, Block size: 1
Online: Yes
Removable media: No
Prevent removal: No
Readonly: No
SWP: No
Thin-provisioning: No
Backing store type: null
Backing store path: None
Backing store flags:
LUN: 1
Type: disk
SCSI ID: IET 00010001
SCSI SN: beaf11
Size: 1074 MB, Block size: 512
Online: Yes
Removable media: No
Prevent removal: No
Readonly: No
SWP: No
Thin-provisioning: No
Backing store type: rdwr
Backing store path: /dev/vdb
Backing store flags:
Account information:
ACL information:
ALL
Ahora podemos hacer permanente la configuración si la exportamos con el siguiente comando:
tgt-admin --dump > /etc/tgt/conf.d/servidor_clientedebian.conf
Podemos ver el fichero que se ha creado con el anterior comando:
cat /etc/tgt/conf.d/servidor_clientedebian.conf
default-driver iscsi
<target iqn.2021-12.servidor:clientedebian>
backing-store /dev/vdb
</target>
Con esto, hemos acabado en la parte del servidor por ahora.
Cliente Debian
En el cliente debian, primero debemos instalar el paquete que usaremos para conectarnos con el servidor iSCSI y utilizar sus targets:
apt install open-iscsi
Al instalarlo, se genera automáticamente un nombre para el cliente (inicializador) en /etc/iscsi/initiatorname.iscsi
:
cat /etc/iscsi/initiatorname.iscsi
## DO NOT EDIT OR REMOVE THIS FILE!
## If you remove this file, the iSCSI daemon will not start.
## If you change the InitiatorName, existing access control lists
## may reject this initiator. The InitiatorName must be unique
## for each iSCSI initiator. Do NOT duplicate iSCSI InitiatorNames.
InitiatorName=iqn.1993-08.org.debian:01:5f8160f0539c
Ahora tenemos que descubrir que targets están siendo compartidos por el servidor:
iscsiadm --mode discovery --type sendtargets --portal 192.168.121.188
192.168.121.188:3260,1 iqn.2021-12.servidor:clientedebian
Una vez que conocemos el nombre del target que se está compartiendo, podemos hacer la conexión:
iscsiadm --mode node -T iqn.2021-12.servidor:clientedebian --portal 192.168.121.188 --login
Logging in to [iface: default, target: iqn.2021-12.servidor:clientedebian, portal: 192.168.121.188,3260]
Login to [iface: default, target: iqn.2021-12.servidor:clientedebian, portal: 192.168.121.188,3260] successful.
Podemos visualizar las sesiones que tenemos abiertas:
iscsiadm -m session
tcp: [1] 192.168.121.188:3260,1 iqn.2021-12.servidor:clientedebian (non-flash)
También podemos ver que tenemos disponible el disco que se estaba compartiendo, y podemos hacer lo que queramos con él:
lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 1G 0 disk
vda 254:0 0 20G 0 disk
└─vda1 254:1 0 20G 0 part /
Vamos a montarlo, formatearlo y crear algún fichero en él:
mkfs.ext4 /dev/sda
mke2fs 1.46.2 (28-Feb-2021)
Creating filesystem with 262144 4k blocks and 65536 inodes
Filesystem UUID: f14b6627-f901-4960-b406-19c6ad7be27b
Superblock backups stored on blocks:
32768, 98304, 163840, 229376
Allocating group tables: done
Writing inode tables: done
Creating journal (8192 blocks): done
Writing superblocks and filesystem accounting information: done
mount /dev/sda /mnt/iscsi/
lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 1G 0 disk /mnt/iscsi
vda 254:0 0 20G 0 disk
└─vda1 254:1 0 20G 0 part /
dd if=/dev/zero of=/mnt/iscsi/prueba bs=2048 count=50k
51200+0 records in
51200+0 records out
104857600 bytes (105 MB, 100 MiB) copied, 0.348157 s, 301 MB/s
lsblk -f
NAME FSTYPE FSVER LABEL UUID FSAVAIL FSUSE% MOUNTPOINT
sda ext4 1.0 f14b6627-f901-4960-b406-19c6ad7be27b 806.2M 10% /mnt/iscsi
vda
└─vda1 ext4 1.0 5767898c-d464-4a3c-8911-6a964518f002 17.5G 5% /
Como vemos, podemos trabajar con ese nuevo volumen de forma normal, pudiendo hacer cualquier cosa con él al igual que haríamos con un disco que anexáramos nosotros físicamente. Ahora tenemos que hacer que se monte automáticamente al reiniciar la máquina. Para ello en primer lugar ejecutamos el siguiente comando para hacer que haga el login en el servidor de forma automática:
iscsiadm --mode node -T iqn.2021-12.servidor:clientedebian --portal 192.168.121.188 -o update -n node.startup -v automatic
Ahora crearemos una unidad systemd para hacer que el montaje se haga de forma automática (también podríamos usar fstab, pero no es lo recomendable actualmente).
nano /etc/systemd/system/mnt-iscsi.mount
[Unit]
Description=Primera prueba con iSCSI
[Mount]
What=/dev/disk/by-uuid/f14b6627-f901-4960-b406-19c6ad7be27b
Where=/mnt/iscsi
Type=ext4
Options=_netdev
[Install]
WantedBy=multi-user.target
Donde:
- “Description”: La descripción que queramos darle a la unidad
- “What”: Lo que queremos montar, en este caso identificado por el uuid del disco. También podríamos haber indicado el disco como “/dev/sda”.
- “Where”: El lugar donde los vamos a montar. Debe coincidir con el nombre que demos al fichero. En este caso he decidido montarlo en “/mnt/iscsi”, así que el nombre del fichero debe ser “mnt-iscsi.mount”.
- “Type”: el tipo de sistema de ficheros (es opcional añadir esta línea).
- “Options”: opciones del montaje (también es opcional).
Habilitamos la unidad que acabamos de crear:
systemctl enable mnt-iscsi.mount
Ahora podemos reiniciar la máquina, y debería montarse automáticamente el volumen:
reboot
lsblk -f
NAME FSTYPE FSVER LABEL UUID FSAVAIL FSUSE% MOUNTPOINT
sda ext4 1.0 f14b6627-f901-4960-b406-19c6ad7be27b 806.2M 10% /mnt/iscsi
vda
└─vda1 ext4 1.0 5767898c-d464-4a3c-8911-6a964518f002 17.5G 5% /
Cliente Windows
Ahora hagamos lo mismo para el cliente Windows. En primer lugar, debemos crear un nuevo target en el servidor:
tgtadm --lld iscsi --op new --mode target --tid 2 -T iqn.2021-12.servidor:clientewindows
Le añadimos los dos LUMs que nos han indicado:
tgtadm --lld iscsi --op new --mode logicalunit --tid 2 --lun 1 -b /dev/vdc
tgtadm --lld iscsi --op new --mode logicalunit --tid 2 --lun 2 -b /dev/vdd
Volvemos a indicar la interfaz por la que se compartirá el target:
tgtadm --lld iscsi --op bind --mode target --tid 2 -I ALL
Ahora crearemos la autentificación CHAP que se nos ha indicado de la siguiente forma:
-Primero creamos la cuenta:
tgtadm --lld iscsi --op new --mode account --user dparrales --password dparrales_isc
-Después añadimos la cuenta al target indicado:
tgtadm --lld iscsi --op bind --mode account --tid 2 --user dparrales
Tras haber hecho esto, podemos ver el target que hemos creado:
tgt-admin -s
Target 1: iqn.2021-12.servidor:clientedebian
System information:
Driver: iscsi
State: ready
I_T nexus information:
I_T nexus: 3
Initiator: iqn.1993-08.org.debian:01:5f8160f0539c alias: Cliente
Connection: 0
IP Address: 192.168.121.107
LUN information:
LUN: 0
Type: controller
SCSI ID: IET 00010000
SCSI SN: beaf10
Size: 0 MB, Block size: 1
Online: Yes
Removable media: No
Prevent removal: No
Readonly: No
SWP: No
Thin-provisioning: No
Backing store type: null
Backing store path: None
Backing store flags:
LUN: 1
Type: disk
SCSI ID: IET 00010001
SCSI SN: beaf11
Size: 1074 MB, Block size: 512
Online: Yes
Removable media: No
Prevent removal: No
Readonly: No
SWP: No
Thin-provisioning: No
Backing store type: rdwr
Backing store path: /dev/vdb
Backing store flags:
Account information:
ACL information:
ALL
Target 2: iqn.2021-12.servidor:clientewindows
System information:
Driver: iscsi
State: ready
I_T nexus information:
LUN information:
LUN: 0
Type: controller
SCSI ID: IET 00020000
SCSI SN: beaf20
Size: 0 MB, Block size: 1
Online: Yes
Removable media: No
Prevent removal: No
Readonly: No
SWP: No
Thin-provisioning: No
Backing store type: null
Backing store path: None
Backing store flags:
LUN: 1
Type: disk
SCSI ID: IET 00020001
SCSI SN: beaf21
Size: 1074 MB, Block size: 512
Online: Yes
Removable media: No
Prevent removal: No
Readonly: No
SWP: No
Thin-provisioning: No
Backing store type: rdwr
Backing store path: /dev/vdc
Backing store flags:
LUN: 2
Type: disk
SCSI ID: IET 00020002
SCSI SN: beaf22
Size: 1074 MB, Block size: 512
Online: Yes
Removable media: No
Prevent removal: No
Readonly: No
SWP: No
Thin-provisioning: No
Backing store type: rdwr
Backing store path: /dev/vdd
Backing store flags:
Account information:
dparrales
ACL information:
ALL
Ahora lo haremos permanente al igual que hicimos antes:
tgt-admin --dump > /etc/tgt/conf.d/servidor_clientedebian.conf
Aquí el fichero de configuración que hemos creado:
cat /etc/tgt/conf.d/servidor_clientedebian.conf
default-driver iscsi
<target iqn.2021-12.servidor:clientewindows>
backing-store /dev/vdc
backing-store /dev/vdd
incominguser dparrales dparrales_isc
</target>
<target iqn.2021-12.servidor:clientedebian>
backing-store /dev/vdb
</target>
Con esto hemos finalizado en el lado del servidor. Ahora vayamos al cliente Windows. Busquemos primero el programa del inicializador de iSCSI:
Al abrir el programa, le damos al botón “Discover Portal” en el menú de “Discovery”:
En el menú que se nos abre indicamos la ip del servidor:
Si volvemos al menú de targets, podremos apreciar que ya están los dos que creamos:
Si intentamos conectarnos se nos abrirá el siguiente menú, en el que tenemos que darle a “Advanced” para introducir las credenciales que creamos antes:
Ahora podemos comprobar que se han añadido dos nuevos discos en el gestor de discos duros:
Ahora le damos el formato adecuado:
A la hora de conectarnos por primera vez, ya le indicamos que intentara montar el target cada vez que reiniciara la máquina, por lo que podemos decir que la configuración del cliente Windows ha finalizado.