martes, 4 de febrero de 2014

ISCSI en Ubuntu 12.04

ISCSI

iSCSI es un protocolo usado para conectar unidades de disco a través de redes locales sobre TCP/IP. iSCSI actualmente está sustituyendo con bastante éxito a otros protocolos usados para crear redes SAN a través de redes de fibra óptica (Fibre channel).
iSCSI proporciona un excelente rendimiento con adaptadores Ethernet Gigabit, a un coste mucho menor que otras alternativas. Como inconveniente, el uso de la pila TCP/IP para transmitir la información produce una merma de rendimiento, ya que se debe transmitir bastante información con los datos, en forma de cabeceras TCP/IP, aunque esto en la práctica no suele ser para nada determinante.
iSCSI está formado por dos servicios:
  1. Target: Es el servidor iSCSI. 
  2. Initiator: Es el cliente iSCSI.
Para comprender iSCSI debemos de pensar que al compartir una unidad en una red (donde pueda haber intrusos que intenten acceder a esa unidad) es imprescindible usar algún mecanismo para proteger los datos. La protección de los datos se puede hacer de dos formas:
  1. Autenticando al equipo que conecta con el volumen iSCSI mediante un usuario y contraseña: Esto se configura en el servidor al exigir unas credenciales para el acceso al disco.
  2. Encriptando la información en el disco, para que al circular sobre la red no pueda ser capturada: Esto lo podemos configurar en el cliente, al usar algún tipo de sistema de ficheros encriptado dentro de la unidad.

iSCSI Target (el servidor de unidades)

Instalar el iSCSI Target

  • Para instalar el Target en ubuntu debemos instalar el paquete iscsitarget:
    $ sudo apt-get install iscsitarget
  • Tras esto deberemos modificar el fichero '/etc/default/iscsitarget', para hacer que el servicio iscsitarget arranque automaticamente al iniciar el sistema. Para elló deberemos modificar la línea que declara la variable ISCSITARGET_ENABLE para que contenga el valor true:
    ISCSITARGET_ENABLE=true
  • Tras esto, podemos arrancar el servicio iscsitarget con el comando:
    $ sudo service iscsitarget start
  • Si quisieramos parar el servicio debemos usar:
  • $ sudo service iscsitarget restart

Que es una unidad iscsi

Estamos familiarizados con el concepto de discos duros y de particionado típico de los ordenadores personales, pero estos conceptos se pueden ver trastocados cuando accedemos al mundo de los servidores y de Linux:
  • Disco duro: Lo que define un disco duro es ser un dispositivo que basicamente admite dos operaciones: leer y escribir bloques dentro de el, y nuestro disco duro va a tener una cantidad de espacio donde podremos guardar la información, espacio que se usa dividiéndolo en sectores. En resumen, es un bloque de datos en el que podemos leer y escribir.
  • Partición: Por motivos prácticos, los discos duros se dividen en particiones, las cuales tienen un tamaño determinado y en ellas podemos leer y escribir sectores. Existen múltiples esquemas de particionamiento, siendo los más habituales el esquema MBR y el GPT usado en los ordenadores más modernos.  Observa que un disco se puede particionar, pero que no hay ningún motivo práctico que nos impida incluso particionar la propia partición (esto lo hacen algunos sistemas operativos para saltarse el límite de cuatro particiones impuesto por el estilo de particionado MBR).
  • Un volumen creado con un gestor de volúmenes (por ejemplo LVM): Un gestor de volúmenes crea unas entidades denominadas volúmenes físicos que se corresponden con particiones o con unidades de disco. Con esos volúmenes fisicos creamos una entidad dedicada a crear dentro de el volúmenes lógicos denominada grupo de volúmenes (el grupo está formado por varios volúmenes físicos). Dentro de los grupos de volúmenes puedo crear volúmenes lógicos, los cuales, de cara al sistema operativo se comportan como si fueran unidades de disco.
  • Un fichero 'compacto': Un fichero compacto no es más que un fichero que ha sido rellenado de ceros hasta ocupar un tamaño determinado. No deja de ser un lugar donde podremos leer y escribir datos y que tiene un tamaño determinado. Para crear un fichero compacto en Linux podemos usar el comando dd, en el ejemplo creamos un fichero de 2GB de tamaño relleno de ceros:
    $ sudo dd if=/dev/cero of=fichero_compacto bs=512 count=4194304
Todos estos dispositivos pueden ser usados como unidad iscsi, aunque lo menos habitual es el uso de los ficheros compactos, debido al poco rendimiento que proporciona, ya que el fichero está situado dentro de un sistema de ficheros, y sobre el se va a construir otro sistema de ficheros: demasiadas capas de software como para que funcione rapidamente.
La alternativa más usada para crear unidades iSCSI serian los gestores de volúmenes, ya que permiten una flexibilidad que no obtenemos con las unidades de disco (podemos ampliar un volumen sin problemas), y además puede soportar tecnologías como RAID1 o RAID5, que nos van a permitir salvaguardar nuestros datos.

Crear un target (volumen compartido por iscsi)

Cuando compartimos un volumen con iSCSI, el target recibirá uno de los objetos antes descritos (en nuestro caso es un volumen LVM) que compartirá a modo de unida de disco iscsi, y el iniciador (cliente) va a recibir algo idéntico a un disco duro, que podrá formatear o dividir según su conveniencia.
Algunos usuarios confunden las redes SAN con las redes NAS, aunque no tienen nada que ver:

  1. En una red SAN el servidor lo que comparte son unidades de disco, de forma que el cliente va a recibir una unidad de disco, que podrá particionar y formatear a voluntad.
  2. En una red NAS el servidor comparte recursos, tales como carpetas o impresoras. El cliente al recibir una carpeta compartida, podrá crear ficheros y directorios en esa carpeta (lo cual no tiene nada que ver con el disco duro que recibiamos en SAN).
Vamos a crear un target en mi servidor:
  • Creamos un volumen con LVM, de 20GB de espacio que posteriormente compartiremos como una unidad iscsi:
$ sudo lvcreate --name lun0 --size 20G datos
  • Para crear un nuevo target debemos editar el fichero /etc/ietd/ietd.conf, creando el target, para lo cual añado las siguientes líneas:
Target iqn.2014-02.net.emc:repositorio8
IncomingUser emc2 secreto
OutgoingUser
Lun 0 Path=/dev/mapper/datos-lun0,Type=fileio
Alias LUN1
#MaxConnections 6
    • Como puedes ver, la primera línea crea un identificador para el target, el cual ha de ser único a nivel mundial. La nomenclatura oficial es la siguientea: "iqn.<año>-<mes>.<dominio_invertido>:<nombre_asignado_al_target>"
      • iqn: Es siempre es misma cadena
      • año y més: Es la fecha en la que el dominio es válido
      • Dominio invertido: Es el nombre de dominio de nuestra organización (o de la máquina) pero en orden inverso (para mail.telefonica.es sería es.telefonica.mail)
      • El nombre asignado al target: Queda a nuestra elección
    • Incoming user: Es un usuario y contraseña que será pedido al cliente para pode montar nuestra unidad
    • Lun 0 Path=----,Type=fileio: En esta línea estoy indicando el dispositivo que será asociado a nuestro target. En nuestro caso se trata del volumen lvm previamente creado.
    • Alias: Es un alias para el target (no es necesario)
    • MaxConnections: Es el número de conexiones máximo que podremos hacer al target (por defecto solo una ya que es algo raro que varios usuarios usen de forma simultánea una unidad de disco)
  • Ya solo nos queda modificar el fichero '/etc/ietd/initiators.allow, donde se indica para cada target los iniciadores (clientes) tienen permitido su acceso. En nuestro caso particular se va a permitir el acceso a todos los equipos de la red 192.168.1.0/24, con lo cual sitúo dentro del fichero la siguiente línea:
    iqn.2014-02.net.emc:repositorio8 192.168.1.0/24
  • Ya hemos acabado, solo nos queda reiniciar el servidor iscsitarget para que los cambios se apliquen:
    $ sudo service iscsitarget restart

Creación del initiator (cliente)

Para conectarnos al target que hemos creado en el punto anterior, debemos de usar otra máquina con ubuntu, donde deberemos instalar el iniciador iscsi. El iniciador que vamos a usar es el iniciador open-iscsi.
  • En nuestro cliente, instalamos el paquete open-iscsi:
    $ sudo apt-get install open-iscsi
  • Modificamos el fichero de configuración de open-iscsi para que el servicio se autoarranque en el inicio del sistema. Para ello edito el fichero '/etc/iscsi/iscsid.conf' y modificamos la variable node.startup al valor auto:
    node.startup = auto
Ya tenemos instalado el software, ahora debemos conectarnos al target que comparte nuestro servidor (cuya dirección ip es 192.168.1.10), para ello usamos el comando iscsiadm que se encarga de buscar los targets en un servidor, registrarlos, modificar la configuración de conexión al target, conectar y desconectar.
  • Detectamos y registramos en el sistema los targets compartidos por el servidor:
$ sudo iscsiadm --mode discovery --type st --portal 192.168.1.10
192.168.1.10:3260,1 iqn.2014-02.net.emc:repositorio8
El parámetro type indica el tipo de protocolo usado para descubrir los targets, y lo más habitual es que contenga el valor st (abreviatura de send targets).
  • En este momento, nuestro target ya está agregado dentro de la jerarquía de targets detectados, que se almancena dentro del directorio /etc/iscsi/nodes. La información contenida en este directorio solamente debe ser manipulada con el comando iscsadmn, ya que si modificamos los ficheros manualmente, podemos provocar problemas graves al acceder al disco.
  • Para comprobar que tenemos en nuestra base de datos el target descubierto, podemos usar el comando iscsiadm --mode node, que lista los targets que tiene guardados nuestro equipo:
$ sudo iscsiadm --mode node
192.168.1.10:3260,1 iqn.2014-02.net.emc:repositorio8
  • Vamos a indicar que nuestro target utiliza autenticación. Para ello debo indicar tres opciones: El método de autenticación, el usuario y la contraseña:
$ sudo iscsiadm --mode node  --target "iqn.2014-02.net.emc:repositorio8" --portal "192.168.1.10:3260" --op update --name node.session.auth.authmethod --value=CHAP
$ sudo iscsiadm --mode node  --target "iqn.2014-02.net.emc:repositorio8" --portal "192.168.1.10:3260" --op update --name node.session.auth.username --value=emc2
$ sudo iscsiadm --mode node  --target "iqn.2014-02.net.emc:repositorio8" --portal "192.168.1.10:3260" --op update --name node.session.auth.password --value=secreto
  • Ya solo nos queda iniciar sesión en el servidor con la opción --login:
$ sudo  iscsiadm --mode node  --target "iqn.2014-02.net.emc:repositorio8" --portal "192.168.1.10:3260" --login
Logging in to [iface: default, target: iqn.2014-02.net.emc:repositorio8, portal: 192.168.1.10,3260] (multiple)
Login to [iface: default, target: iqn.2014-02.net.emc:repositorio8, portal: 192.168.1.10,3260] successful.
Como puedes ver, estamos conectados al target, el cual va a ser visto por el cliente como un dispositivo scsi (/dev/sdb, /dev/sdc, etc.). Ya solo nos queda usar las herramientas habituales de manipulación de discos duros para poder hacer uso de nuestro disco iscsi.

Particionar y montar nuestro disco duro

Lo primero que debemos hacer es descubrir que letras de unidad usa nuestro disco, para ello, podemos usar el comando fdisk:
$ sudo fdisk -l
...
Disco /dev/sdc: 224.6 GB, 224579813376 bytes
256 cabezas, 63 sectores/pista, 27196 cilindros, 438632448 sectores en total
Unidades = sectores de 1 * 512 = 512 bytes
Tamaño de sector (lógico / físico): 512 bytes / 512 bytes
Tamaño E/S (mínimo/óptimo): 512 bytes / 512 bytes
Identificador del disco: 0x00000000

Disposit. Inicio    Comienzo      Fin      Bloques  Id  Sistema
/dev/sdc1               1  4294967295  2147483647+  ee  GPT
...
Como puedes ver, en el ejemplo ya hemos creado una tabla de particiones en el disco /dev/sdc, con una sola partición sdc1. Esto ocurre porque no capturamos la salida de fdisk al hacer el ejemplo, y creamos la tabla de particiones y la partición. Lo que realmente nos encontrariamos en una unidad iscsi la primera vez que accedemos es un disco sin tabla de particiones.
A partir de aquí, puedo particionar el target a voluntad, con fdisk, gparted o cualquier otra aplicación que me permita crear particiones.
Incluso, tengo la opción de usar la unidad sin particionar, para ello, puedo usar el comando mkfs sobre la propia unidad:
$ sudo mkfs.xfs /dev/sdc

Desconectar el target

Cuando queremos desconectar un target debo seguir estos dos pasos:
  1. Desmontar cualquier volumen que este guardado dentro del target, para ello uso el comando umount
  2. Desconectar el target con iscsiadm --logout
$ sudo iscsiadm --mode node --target iqn.2014-02.net.emc:repositorio8 --portal 192.168.1.10:3260 --logout
Logging out of session [sid: 2, target: iqn.2014-02.net.emc:repositorio8, portal: 192.168.1.10,3260]Logout of [sid: 2, target: iqn.2014-02.net.emc:repositorio8, portal: 192.168.1.10,3260] successfulTras esto, ya tenemos desconectado nuestro target

Eliminar un target de la lista de targets

Para eliminar un target, debo usar el comando --op delete:
$ sudo iscsiadm --mode node --target "iqn.2014-02.net.emc:repositorio8" --portal 192.168.1.10:3260 --op delete
Tras el comando anterior, nuestro target ha sido eliminada de la lista de targets de confianza

Referencias


No hay comentarios:

Publicar un comentario