Uso de ATA Over Ethernet (AoE) en Ubuntu 12.10 (Cliente y Servidor)

Hola a todos de nuevo,

Esta guía explica cómo configurar un servidor AoE (target) y un cliente AoE (initiator), ambos ejecutandoUbuntu 12.10.AoE son las siglas de ATA over Ethernet que es un protocolo de almacenamiento de red (SAN) que permite a los clientes usar dispositivos de almacenamiento de los servidores AoE (remoto) usando para ello una conexión de red de cable al uso. «Remoto» en este caso significa «dentro de la misma LAN» debido a que AoE no es enrutable fuera de la misma (esta es la mayor de las diferencias respecto a iSCSI). Para el cliente AoE , el almacenamiento remoto tiene una pinta similar a un disco duro local conectado a la máquina.

1 Nota preliminar

Voy a usar en el ejemplo 2 servidores:

  • server1.example.com (Initiator): dirección IP 192.168.0.100
  • server2.example.com (Target): dirección IP 192.168.0.101

2 Carga del módulo AoE en ambas máquinas

server1/server2:

Antes de empezar debemos asegurarnos que el kernel instalado soporta AoE, para ello lanzamos el siguiente comando:

grep ATA_OVER /boot/config-`uname -r`

Debemos poder ver unas lineas similares a:

root@server1:~# grep ATA_OVER /boot/config-`uname -r`
CONFIG_ATA_OVER_ETH=m
root@server1:~#

La «m» que podemos apreciar a la derecha del signo = significa que AoE fue construido como un módulo del kernel. Para poder verificar si el módulo ha sido ya cargado podemos ejecutar el siguiente comando:

lsmod | grep aoe

Si no obtienes ningún resultado significa que el modulo no ha sido cargado. En este caso podemos proceder a la carga del módulo mediante el siguiente comando:

modprobe aoe

Volvamos a verificar si el módulo ha sido cargado:

lsmod | grep aoe

root@server1:~# lsmod | grep aoe
aoe                    26960  0
root@server1:~#

Para conseguir que el módulo cargue a la vez que el sistema arranca, debemos agregar dicho módulo al fichero /etc/modules:

vi /etc/modules</blockquote>
# /etc/modules: kernel modules to load at boot time.
#
# This file contains the names of kernel modules that should be loaded
# at boot time, one per line. Lines beginning with "#" are ignored.

loop
lp
rtc
aoe

3 Configurando el servidor (target)

El primer paso a realizar es instalar el servidor (server2):

apt-get install vblade

Como espacio de almacenamiento podemos usar volúmenes lógicos no usados, ficheros de imagen, discos duros (por ej. /dev/sdb), particiones de disco (por ej. /dev/sdb1) o dispositivos RAID (por ej. /dev/md0). En este ejemplo vamos a crear un volumen lógico de 20GB denominado storage1 en el grupo de volúmenes vg0:

lvcreate -L20G -n storage1 vg0

(si en tu caso prefieres usar un fichero de imagen, podrias crearlo de la siguiente forma:

mkdir /storage
dd if=/dev/zero of=/storage/storage1.img bs=1024k count=20000

Estos comandos crean un fichero de imagen en /storage/storage1.img con un tamaño de 20GB.)

Ahora pasamos a exportar el dispositivo de almacenamiento con el comando:

vbladed 0 1 eth0 /dev/vg0/storage1

El primer numero (0) es el denominado «major» del dispositivo y el segundo (1) es el denominado «minor», para mas información sobre estos números podeis consultar multitud de fuentes en internet, esta entre otras http://www.makelinux.net/ldd3/chp-3-sect-2. Puedes ajustar estos numeros para tu máquina concreta. Cada dispositivo AoE se identifica por una pareja major/minor que debe ser única (caso en el que estes exportando varios dispositivos). El parámetro eth0 indica a vbladed que dispositivo ethernet debe usar.

Para realizar la exportación de forma automática cuando el target reinicia debemos abrir el fichero /etc/rc.local para editarlo…

vi /etc/rc.local

… y añadimos la siguiente linea (ANTES de exit 0):

[...]
vbladed 0 1 eth0 /dev/vg0/storage1
[...]

4 Configurando el cliente (server1)

server1:

En la máquina server1, vamos a instalar el cliente con la siguiente orden:

apt-get install aoetools

Ahora ya podemos verificar que dispositivos de almacenamiento AoE estan disponibles:

aoe-discover

El comando aoe-stat debiera ahora mostrar los dispositivos de almacenamiento AoE disponibles:

root@server1:~# aoe-stat
e0.1        21.474GB   eth0 up
root@server1:~#

Como se puede apreciar, en este momento tenemos un nuevo dispositivo de bloque disponible en el cliente con nombre  /dev/etherd/e0.1. Si echamos un vistazo el directorio /dev podremos apreciar como ha aparecido un nuevo nodo:

ls -la /dev/etherd/

root@server1:~# ls -la /dev/etherd/
total 0
drwxr-xr-x  2 root root     160 2012-10-01 16:24 .
drwxr-xr-x 16 root root    3800 2012-10-01 16:21 ..
c-w--w----  1 root disk 152,  3 2012-10-01 16:21 discover
brw-rw----  1 root disk 152, 16 2012-10-01 16:24 e0.1
cr--r-----  1 root disk 152,  2 2012-10-01 16:21 err
c-w--w----  1 root disk 152,  6 2012-10-01 16:21 flush
c-w--w----  1 root disk 152,  4 2012-10-01 16:21 interfaces
c-w--w----  1 root disk 152,  5 2012-10-01 16:21 revalidate
root@server1:~#

La salida de

fdisk -l

debiera mostrar igualmente el nuevo dispositivo disponible:

root@server1:~# fdisk -l

Disk /dev/sda: 32.2 GB, 32212254720 bytes
255 heads, 63 sectors/track, 3916 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00016be9

Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1          32      248832   83  Linux
Partition 1 does not end on cylinder boundary.
/dev/sda2              32        3917    31205377    5  Extended
/dev/sda5              32        3917    31205376   8e  Linux LVM

Disk /dev/etherd/e0.1: 21.5 GB, 21474836480 bytes
 255 heads, 63 sectors/track, 2610 cylinders
 Units = cylinders of 16065 * 512 = 8225280 bytes
 Sector size (logical/physical): 512 bytes / 512 bytes
 I/O size (minimum/optimal): 512 bytes / 512 bytes
 Disk identifier: 0x00000000

Disk /dev/etherd/e0.1 doesn't contain a valid partition table
root@server1:~#

Para usarlo lo primero que debemos hacer es formatearlo:

fdisk /dev/etherd/e0.1

root@server1:~# fdisk /dev/etherd/e0.1
Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel
Building a new DOS disklabel with disk identifier 0x3093ae28.
Changes will remain in memory only, until you decide to write them.
After that, of course, the previous content won't be recoverable.

Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)

WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
switch off the mode (command 'c') and change display units to
sectors (command 'u').

Command (m for help): &lt;-- n
Command action
e   extended
p   primary partition (1-4)
&lt;-- p
Partition number (1-4): 1
First cylinder (1-2610, default 1): &lt;-- ENTER
Using default value 1
Last cylinder, +cylinders or +size{K,M,G} (1-2610, default 2610): &lt;-- ENTER
Using default value 2610

Command (m for help): t
Selected partition 1
Hex code (type L to list codes): &lt;-- 83

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.
root@server1:~#

A continuación, la salida del comando 

fdisk -l

debiera ser la siguiente:

root@server1:~# fdisk -l

Disk /dev/sda: 32.2 GB, 32212254720 bytes
255 heads, 63 sectors/track, 3916 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00016be9

Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1          32      248832   83  Linux
Partition 1 does not end on cylinder boundary.
/dev/sda2              32        3917    31205377    5  Extended
/dev/sda5              32        3917    31205376   8e  Linux LVM

Disk /dev/etherd/e0.1: 21.5 GB, 21474836480 bytes
 255 heads, 63 sectors/track, 2610 cylinders
 Units = cylinders of 16065 * 512 = 8225280 bytes
 Sector size (logical/physical): 512 bytes / 512 bytes
 I/O size (minimum/optimal): 512 bytes / 512 bytes
 Disk identifier: 0x3093ae28

Device Boot      Start         End      Blocks   Id  System
 /dev/etherd/e0.1p1               1        2610    20964793+  83  Linux
root@server1:~#

Podemos ahora crear el sistema de ficheros en /dev/etherd/e0.1p1…

mkfs.ext4 /dev/etherd/e0.1p1

… y lo montamos para las primeras pruebas:

mount /dev/etherd/e0.1p1 /mnt

Ahora debemos ser capaces de ver el nuevo dispositivo en la salida del comando mount:

root@server1:~# mount
/dev/mapper/server1-root on / type ext4 (rw,errors=remount-ro)
proc on /proc type proc (rw,noexec,nosuid,nodev)
none on /sys type sysfs (rw,noexec,nosuid,nodev)
none on /sys/fs/fuse/connections type fusectl (rw)
none on /sys/kernel/debug type debugfs (rw)
none on /sys/kernel/security type securityfs (rw)
none on /dev type devtmpfs (rw,mode=0755)
none on /dev/pts type devpts (rw,noexec,nosuid,gid=5,mode=0620)
none on /dev/shm type tmpfs (rw,nosuid,nodev)
none on /var/run type tmpfs (rw,nosuid,mode=0755)
none on /var/lock type tmpfs (rw,noexec,nosuid,nodev)
none on /lib/init/rw type tmpfs (rw,nosuid,mode=0755)
none on /var/lib/ureadahead/debugfs type debugfs (rw,relatime)
/dev/sda1 on /boot type ext2 (rw)
/dev/etherd/e0.1p1 on /mnt type ext4 (rw)
root@server1:~#

… y

df -h

muestra:

root@server1:~# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/server1-root
18G  838M   16G   5% /
none                  243M  180K  242M   1% /dev
none                  247M     0  247M   0% /dev/shm
none                  247M   32K  247M   1% /var/run
none                  247M     0  247M   0% /var/lock
none                  247M     0  247M   0% /lib/init/rw
none                   18G  838M   16G   5% /var/lib/ureadahead/debugfs
/dev/sda1             228M   17M  199M   8% /boot
/dev/etherd/e0.1p1     20G  172M   19G   1% /mnt
root@server1:~#

Podemos desmontarlo con el comando umount /mnt

Para montar el dispositivo de forma automática en el momento del arranque del sistema, por ej. en el directorio /storage, debemos crear dicho directorio…

mkdir /storage

… y añadir la siguiente línea al fichero /etc/fstab:

vi /etc/fstab

[…]
/dev/etherd/e0.1p1 /storage ext4 defaults,auto,_netdev 0 0
La linea que acabamos de escribir por sí sola no es suficiente para que el dispositivo sea montado en el arranque. Esto es debido a que los componentes de AoE se cargan después de leer el fichero /etc/fstab. Para solucionarlo abramos el fichero /etc/rc.local…

vi /etc/rc.local

… y añadamos las siguientes líneas en él (ANTES del exit 0):

[...]
aoe-discover
sleep 5
mount -a
[...]

Para validar que todo funciona correctamente podemos reiniciar la máquina con:

reboot

Después del arranque, el dispositivo debiera estar montado:

root@server1:~# mount

/dev/mapper/server1-root on / type ext4 (rw,errors=remount-ro)
proc on /proc type proc (rw,noexec,nosuid,nodev)
none on /sys type sysfs (rw,noexec,nosuid,nodev)
none on /sys/fs/fuse/connections type fusectl (rw)
none on /sys/kernel/debug type debugfs (rw)
none on /sys/kernel/security type securityfs (rw)
none on /dev type devtmpfs (rw,mode=0755)
none on /dev/pts type devpts (rw,noexec,nosuid,gid=5,mode=0620)
none on /dev/shm type tmpfs (rw,nosuid,nodev)
none on /var/run type tmpfs (rw,nosuid,mode=0755)
none on /var/lock type tmpfs (rw,noexec,nosuid,nodev)
none on /lib/init/rw type tmpfs (rw,nosuid,mode=0755)
none on /var/lib/ureadahead/debugfs type debugfs (rw,relatime)
/dev/sda1 on /boot type ext2 (rw)
/dev/etherd/e0.1p1 on /storage type ext4 (rw,_netdev)
root@server1:~#

df -h

root@server1:~# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/server1-root
18G  838M   16G   5% /
none                  243M  180K  242M   1% /dev
none                  247M     0  247M   0% /dev/shm
none                  247M   32K  247M   1% /var/run
none                  247M     0  247M   0% /var/lock
none                  247M     0  247M   0% /lib/init/rw
none                   18G  838M   16G   5% /var/lib/ureadahead/debugfs
/dev/sda1             228M   17M  199M   8% /boot
/dev/etherd/e0.1p1     20G  172M   19G   1% /storage
root@server1:~#

5 Enlaces de interés

Un saludo a todos y hasta la próxima.

You must be logged in to post a comment.