Lo prometido es deuda... como veo que hay más gente estos días "peleando" con los Hybrid para pasar el máximo posible de sistema a los discos SATA, y aprovechar de esta forma los SSD, y gracias a la ayuda y el permiso del amigo WuShell, he pensado compartir el documento de instalación aqui, en el foro, por si a alguien le viene bien una ayuda con este tema.
Lo pego aquí a modo de archivo, pero quizá os sea más "Legible" en la versión "documento web", fuera del foro.
Un saludo a todos, gracias a todos los que hicieron sugerencias en mi post al respecto (
sdzzds, Power, manoleet, diazjc, luis_sanz ! ), y cualquier nueva sugerencia sobre el método empleado será, por supuesto, muy bien recibida.
http://marcosbl.com/lab/sistemas/hybrid/
Abstract
OVH [1] propone entre sus gamas de servidores máquinas Hybrid, con discos duros SSD y SATA, combinando la velocidad de los primeros con la gran capacidad de los segundos, lo que los hace un producto muy atractivo para muchos de nosotros. En este caso concreto, hablamos de la siguiente máquina, un EG Hybrid 2011 (SSD + SATA2) [2] :
- Intel Xeon i7 W3520 4x2(HT)x2.66+ GHz
- 24 GB DDR3
- SSD Intel SSD 320 - 2x 40 GB
- SATA 2 - 2x 2TB
Sin embargo, el Manager de instalación de OVH, aunque nos permite seleccionar RAID o sólo un disco, sólo nos mostrará el primer disco SSD, sin darnos acceso a los SATA, por lo que todo el sistema acabará en los discos SSD, dejándonos, por ejemplo, en esta configuración de Ubuntu 11.04, con sólo 27 GB de discos SSD libres, de los 80 GB originales.
En el caso que nos ocupa, se solicitó a OVH un cambios de arranque a los SATA, para poder instalar el sistema en ellos, y aprovechar al máximo el espacio y velocidad de los discos SSD, pero nos fue denegada ya que es un servicio que sólo se ofrece con RAID Hardware, y no Software, el incluído con este tipo de máquina.
Esta es la historia de cómo se logró una aproximación a este fin, con varias ventajas adicionales:
- Una configuración con casi todo el sistema montado en los discos SATA
- Una disponibilidad final de 66 GB en los discos SSD en lugar de los 27 GB iniciales con RAID 1
- Una partición concreta dentro de /home/ssd con todo el espacio disponible SSD
- Una mejora de un 100% en la velocidad de los SSD, uniendo el sobrante del primero con la totalidad del segundo, en RAID 0
- La habilidad de poder cambiar los tamaños de las particiones SATA en caliente (fácilmente extensible al espacio SSD también)
Autores
Versión 0.1 Work in progress - Faltan algunos detalles de redacción/limpieza
Consideraciones previasç
Todos los comandos reflejados en este documento se han ejecutado como root, a menos que se especifique lo contrario.
En este documento se asume que estamos usando Debian [3] o una distribución derivada (como Ubuntu [4] por ejemplo). Prácticamente todo es aplicable a cualquier otra distribución de Linux, simplemente habrá que cambiar las lineas en las que se usa apt [5] por los comandos correspondientes en otra distribución (pacman [6] en archlinux [7], emerge [8] en gentoo [9] o yum [10] en fedora [11], por ejemplo)
Paso 1 - Particionado e Instalación iniciales
Reinstalamos el server desde el manager de OVH, seleccionando particionado manual e indicando que simplemente utilice el primer disco (esto hará que la instalación se realice en el primer disco SSD).
Creamos dos particiones:
Partición (primaria) de 2GB formateada con ext4, punto de montaje /
Partición (secundaria) de 1GB, swap
Y procedemos con la instalación del sistema Linux que hayamos elegido previamente.
Paso 2 - Particionar discos SATA y crear RAID1
Una vez que tenemos el sistema instalado y podemos acceder al mismo, instalamos gdisk [12] para poder particionar los discos SATA (no nos sirve cfdisk [13], por ejemplo, por que estos discos tienen una tabla de particiones GPT [14] (GUID partition table):
Usamos gdisk para crear una particion en cada disco SATA. gdisk es una herramienta que dispone de una interfaz similar a la de una consola o terminal, podemos invocarlo y luego pasarle comandos para que los ejecute:
root@nsXXXXX:~# gdisk /dev/sdc
GPT fdisk (gdisk) version 0.6.14
Partition table scan:
MBR: protective
BSD: not present
APM: not present
GPT: present
Found valid GPT with protective MBR; using GPT.
Command (? for help)
Disk /dev/sdc: 3907029168 sectors, 1.8 TiB
Logical sector size: 512 bytes
Disk identifier (GUID): FDD1B989-ACFB-49CB-BAC3-290D42C4E716
Partition table holds up to 128 entries
First usable sector is 34, last usable sector is 3907029134
Partitions will be aligned on 8-sector boundaries
Total free space is 181001791 sectors (86.3 GiB)
Number Start (sector) End (sector) Size Code Name
1 34 3726027343 1.7 TiB FD00 primary
Command (? for help): d 1
Using 1
Command (? for help): p
Disk /dev/sdc: 3907029168 sectors, 1.8 TiB
Logical sector size: 512 bytes
Disk identifier (GUID): FDD1B989-ACFB-49CB-BAC3-290D42C4E716
Partition table holds up to 128 entries
First usable sector is 34, last usable sector is 3907029134
Partitions will be aligned on 8-sector boundaries
Total free space is 3907029101 sectors (1.8 TiB)
Number Start (sector) End (sector) Size Code Name
Command (? for help): n
Partition number (1-128, default 1):
First sector (34-3907029134, default = 34) or {+-}size{KMGTP}:
Information: Moved requested sector from 34 to 40 in
order to align on 8-sector boundaries.
Use 'l' on the experts' menu to adjust alignment
Last sector (40-3907029134, default = 3907029134) or {+-}size{KMGTP}:
Current type is 'Linux/Windows data'
Hex code or GUID (L to show codes, Enter = 0700): L
0700 Linux/Windows data 0c01 Microsoft reserved 2700 Windows RE
4200 Windows LDM data 4201 Windows LDM metadata 7501 IBM GPFS
7f00 ChromeOS kernel 7f01 ChromeOS root 7f02 ChromeOS reserved
8200 Linux swap 8301 Linux reserved 8e00 Linux LVM
a500 FreeBSD disklabel a501 FreeBSD boot a502 FreeBSD swap
a503 FreeBSD UFS a504 FreeBSD ZFS a505 FreeBSD Vinum/RAID
a800 Apple UFS a901 NetBSD swap a902 NetBSD FFS
a903 NetBSD LFS a904 NetBSD concatenated a905 NetBSD encrypted
a906 NetBSD RAID ab00 Apple boot af00 Apple HFS/HFS+
af01 Apple RAID af02 Apple RAID offline af03 Apple label
af04 AppleTV recovery be00 Solaris boot bf00 Solaris root
bf01 Solaris /usr & Mac Z bf02 Solaris swap bf03 Solaris backup
bf04 Solaris /var bf05 Solaris /home bf06 Solaris alternate se
bf07 Solaris Reserved 1 bf08 Solaris Reserved 2 bf09 Solaris Reserved 3
bf0a Solaris Reserved 4 bf0b Solaris Reserved 5 c001 HP-UX data
c002 HP-UX service ef00 EFI System ef01 MBR partition scheme
ef02 BIOS boot partition fd00 Linux RAID
Hex code or GUID (L to show codes, Enter = 0700):
Changed type of partition to 'Linux/Windows data'
Command (? for help): w
Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
PARTITIONS!!
Do you want to proceed, possibly destroying your data? (Y/N): Y
OK; writing new GUID partition table (GPT).
The operation has completed successfully.
En este caso hemos listado la tabla de particiones, hemos borrado una primera partición existente y hemos creado una nueva, marcando que el tipo de partición es de datos (Linux/Windows), aunque ésto último no sería necesario ya que las herramientas que usaremos luego para crear el RAID 1 [15] y el sistema de ficheros [16]
El mismo proceso que hemos hecho para el primer disco SATA (/dev/sdc en este caso) lo repetimos con el segundo disco SATA (/dev/sdd en este caso)
Con las particiones creadas, creamos el raid 1 por software utilizando mdadm [17]:
root@nsXXXXX:~# mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/sd[cd]1 --assume-clean
mdadm: Note: this array has metadata at the start and
may not be suitable as a boot device. If you plan to
store '/boot' on this device please ensure that
your boot-loader understands md/v1.x metadata, or use
--metadata=0.90
Continue creating array? y
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.
root@nsXXXXX:~#
En este caso estamos creando un nuevo dispositivo (/dev/md0) que será el dispositivo que vamos a utilizar en todo momento en lugar de las particiones tradicionales (/dev/sdc y /dev/sdd) que serán los componentes del RAID.
Al llamar a mdadm le pasamos el parámetro --assume-clean para que no realice un sync inicial de los componentes del RAID (no es necesario, ya que están vacíos).
Una vez creado el RAID, podemos obtener más información sobre el mismo usando el propio mdadm o comprobando el fichero /proc/mdstat:
root@nsXXXXX:~# mdadm --misc --detail /dev/md0
/dev/md0:
Version : 1.2
Creation Time : Thu Oct 13 18:52:12 2011
Raid Level : raid1
Array Size : 1953513387 (1863.02 GiB 2000.40 GB)
Used Dev Size : 1953513387 (1863.02 GiB 2000.40 GB)
Raid Devices : 2
Total Devices : 2
Persistence : Superblock is persistent
Update Time : Thu Oct 13 18:52:12 2011
State : clean
Active Devices : 2
Working Devices : 2
Failed Devices : 0
Spare Devices : 0
Name : nsXXXXX.ovh.net:0 (local to host nsXXXXX.ovh.net)
UUID : 05fe0aa6:ef5bb851:10d4ac6d:4ca936b6
Events : 0
Number Major Minor RaidDevice State
0 8 33 0 active sync /dev/sdc1
1 8 49 1 active sync /dev/sdd1
root@nsXXXXX:~#
root@nsXXXXX:~# cat /proc/mdstat
Personalities : [linear] [raid0] [raid1] [raid10] [raid6] [raid5] [raid4] [multipath] [faulty]
md0 : active raid1 sdd1[1] sdc1[0]
1953513387 blocks super 1.2 [2/2] [UU]
unused devices:
root@nsXXXXX:~#
Paso 3 - Crear LVM en los discos SATA
En cuanto hemos terminado de crear el RAID, creamos un volumen físico [18] LVM [19] que englobe todo el RAID:
root@nsXXXXX:~# pvcreate /dev/md0
Physical volume "/dev/md0" successfully created
root@nsXXXXX:~#
podemos obtener más información del volumen físico utilizando pvdisplay [20]
root@nsXXXXX:~# pvdisplay
"/dev/md0" is a new physical volume of "1,82 TiB"
--- NEW Physical volume ---
PV Name /dev/md0
VG Name
PV Size 1,82 TiB
Allocatable NO
PE Size 0
Total PE 0
Free PE 0
Allocated PE 0
PV UUID 4srLEs-fkh9-nYW9-hUDV-2pfd-fdEj-Dge1P1
Luego creamos un grupo de volumen, llamado "DiscosSATA":
root@nsXXXXX:~# vgcreate DiscosSATA /dev/md0
Volume group "DiscosSATA" successfully created
Podemos consultar la info del grupo de volumenes con vgdisplay [21]:
root@nsXXXXX:~# vgdisplay
--- Volume group ---
VG Name DiscosSATA
System ID
Format lvm2
Metadata Areas 1
Metadata Sequence No 1
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 0
Open LV 0
Max PV 0
Cur PV 1
Act PV 1
VG Size 1,82 TiB
PE Size 4,00 MiB
Total PE 476931
Alloc PE / Size 0 / 0
Free PE / Size 476931 / 1,82 TiB
VG UUID 2D7Ge5-eTZA-W4tC-Czh1-9TUZ-VGaV-eebNQ9
Y, por último creamos los volúmenes lógicos [22] (el equivalente a las particiones tradicionales, que será lo que montemos en los puntos de montaje correspondientes):
Creamos un volumen lógico de 10GB para el montaje de /usr:
root@nsXXXXX:~# lvcreate -L 10G DiscosSATA -n lv_usr
The link /dev/DiscosSATA/lv_usr should had been created by udev but it was not found. Falling back to direct link creation.
Logical volume "lv_usr" created
Creamos un volumen lógico de 20GB para el montaje de /var:
root@nsXXXXX:~# lvcreate -L 20G DiscosSATA -n lv_var
The link /dev/DiscosSATA/lv_var should had been created by udev but it was not found. Falling back to direct link creation.
Logical volume "lv_var" created
Creamos un volumen lógico para el montaje de /home, utilizando el resto del espacio en disco disponible:
root@nsXXXXX:/# lvcreate -l +100%FREE DiscosSATA -n lv_home
The link /dev/DiscosSATA/lv_home should had been created by udev but it was not found. Falling back to direct link creation.
Logical volume "lv_home" created
Una vez creados, podemos ver los volúmenes lógicos utilizando lvdisplay [23]:
root@nsXXXXX:/# lvdisplay
--- Logical volume ---
LV Name /dev/DiscosSATA/lv_usr
VG Name DiscosSATA
LV UUID YDxvNN-To3E-SFoj-cAHj-nnKI-jYfR-dtY5dW
LV Write Access read/write
LV Status available
# open 0
LV Size 10,00 GiB
Current LE 2560
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 253:0
--- Logical volume ---
LV Name /dev/DiscosSATA/lv_var
VG Name DiscosSATA
LV UUID Fzuxmd-oIsP-iR1a-gAsq-gqRe-Ommc-mbGGdX
LV Write Access read/write
LV Status available
# open 0
LV Size 20,00 GiB
Current LE 5120
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 253:1
--- Logical volume ---
LV Name /dev/DiscosSATA/lv_home
VG Name DiscosSATA
LV UUID lhrOUL-BX2x-BcpS-Q3J5-dViY-ERKc-wa4L1A
LV Write Access read/write
LV Status available
# open 0
LV Size 1,79 TiB
Current LE 469251
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 253:2
Después de crear los volúmenes lógicos, tenemos que formatear esos volúmenes con el sistema de ficheros que creamos mas conveniente (mi recomendación, siempre XFS [24]).
Antes de poder formatear bajo XFS, necesitamos instalar una serie de utilidades que, en Ubuntu por ejemplo, no vienen instaladas:
apt-get install xfsprogs xfsdump
Formateo las particiones con XFS:
root@nsXXXXX:/# mkfs.xfs /dev/DiscosSATA/lv_usr
meta-data=/dev/DiscosSATA/lv_usr isize=256 agcount=4, agsize=655360 blks
= sectsz=512 attr=2, projid32bit=0
data = bsize=4096 blocks=2621440, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0
log =internal log bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
root@nsXXXXX:/# mkfs.xfs /dev/DiscosSATA/lv_var
meta-data=/dev/DiscosSATA/lv_var isize=256 agcount=4, agsize=1310720 blks
= sectsz=512 attr=2, projid32bit=0
data = bsize=4096 blocks=5242880, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0
log =internal log bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
root@nsXXXXX:/# mkfs.xfs /dev/DiscosSATA/lv_home
meta-data=/dev/DiscosSATA/lv_home isize=256 agcount=4, agsize=120128256 blks
= sectsz=512 attr=2, projid32bit=0
data = bsize=4096 blocks=480513024, imaxpct=5
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0
log =internal log bsize=4096 blocks=234625, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
Paso 4 - Mover particiones (/var, /usr, etc) a LVM
El siguiente paso consiste en clonar los actuales directorios /usr, /var y /home, copiando sus contenidos a los volúmenes lógicos que hemos creado para utilizarlos para esos contenidos.
Para poder hacer la copia necesitamos montar esos volúmenes lógicos en algún lugar, por lo que creamos unos puntos de montaje temporales:
mkdir /mnt/{home,usr,var}
Para luego montar los volúmenes lógicos en esos puntos de montaje:
mount /dev/DiscosSATA/lv_home /mnt/home
mount /dev/DiscosSATA/lv_usr /mnt/usr
mount /dev/DiscosSATA/lv_var /mnt/var
Podemos verificar que se han montado correctamente utilizando los comandos df [25] o mount [26].
Una vez que hemos montado todos los volúmenes, utilizamos rsync [27] para sincronizar/clonar los contenidos (para /home realmente no es necesario en este caso, ya que está vacío):
rsync -vza /usr/ /mnt/usr/
rsync -vza /var/ /mnt/var/
Cuando rsync acabe, agregamos las entradas correspondientes al fichero /etc/fstab, de forma que en el siguiente arranque, el sistema monte los volúmenes lógicos de forma automática en los puntos de montaje correctos:
echo "/dev/DiscosSATA/lv_usr /usr xfs defaults 0 1" >> /etc/fstab
echo "/dev/DiscosSATA/lv_var /var xfs defaults 0 1" >> /etc/fstab
echo "/dev/DiscosSATA/lv_home /home xfs defaults 0 1" >> /etc/fstab
Reiniciamos la maquina y verificamos que tras el reboot todo esté correcto.
Usando df o mount podemos verificar si los volúmenes se han montado correctamente.
Eliminamos además las carpetas temporales creadas
rm -fr /mnt/{home,usr,var}
Paso 5 - Crear RAID 0 (linear mode) en discos SSD
Ahora vamos a configurar los discos SSD (lo que queda del primer disco y todo el espacio libre del segundo disco) en RAID 0 [28] o linear mode.
Además, vamos a dejar una partición adicional en el primer disco SSD para montarla en /tmp, de forma que podamos sacar el directorio temporal de la misma partición en la que se monta / (y evitar así problemas de llenado de la partición raíz).
Primero creamos dos particiones en el primer disco SSD (/dev/sda) y una en el segundo disco SSD (/dev/sdb). Para ello utilizamos cfdisk o fdisk.
Luego creamos el RAID 0 con mdadm (en este caso no necesitamos pasarle el parámetro --assume-clean ya que RAID 0 no necesita hacer ninguna sincronización inicial):
root@nsXXXXX:~# mdadm --create /dev/md1 --level=0 --raid-devices=2 /dev/sda7 /dev/sdb1
mdadm: /dev/sda7 appears to contain an ext2fs file system
size=29170420K mtime=Thu Jan 1 01:00:00 1970
mdadm: /dev/sdb1 appears to contain an ext2fs file system
size=39078080K mtime=Thu Jan 1 01:00:00 1970
Continue creating array? y
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md1 started.
Una vez creadas las particiones y el dispositivo RAID por software, les damos formato bajo el sistema de ficheros que queramos.
mkfs.ext4 /dev/sda6
mkfs.xfs /dev/md1
Creamos el punto de montaje para el raid 0:
(
NOTA: /home/ssd es solo un lugar, podemos crearlo donde queramos, como /mnt/ssd, /opt/ssd o /ssd)
Agregamos las siguientes líneas al fichero /etc/fstab:
echo "/dev/sda6 /tmp ext4 defaults 0 1" >> /etc/fstab
echo "/dev/md1 /home/ssd xfs defaults 0 1" >> /etc/fstab
Podemos montar el RAID 0 y verificar que todo está correcto:
También podemos comprobar ahora la velocidad de nuestro nuevo md1, frente a los 250 MB/s originales del SSD:
/var/www # hdparm -tT /dev/md1
/dev/md1:
Timing cached reads: 17606 MB in 2.00 seconds = 8811.17 MB/sec
Timing buffered disk reads: 1588 MB in 3.00 seconds = 528.78 MB/sec
No está mal,
~ 525 MB/sec
Finalmente asigamos permisos de escritura a /tmp
Y tenemos que reiniciar de nuevo el servidor para verificar que la partición /dev/sda6 se monta en la susodicha /tmp.
Enlaces de referencia:
[1]
http://www.ovh.es
[2]
http://www.ovh.es/servidores_dedicados/eg_hybrid.xml
[3]
http://debian.org
[4]
http://ubuntu.com
[5]
http://en.wikipedia.org/wiki/Advanced_Packaging_Tool
[6]
https://wiki.archlinux.org/index.php/Pacman
[7]
http://archlinux.org
[8]
http://www.gentoo.org/doc/en/handboo...?part=2&chap=1
[9]
http://gentoo.org
[10]
http://fedoraproject.org/wiki/Yum
[11]
http://fedoraproject.org
[12]
http://www.rodsbooks.com/gdisk
[13]
http://en.wikipedia.org/wiki/Cfdisk
[14]
http://en.wikipedia.org/wiki/GUID_Partition_Table
[15]
http://en.wikipedia.org/wiki/Standar..._levels#RAID_1
[16]
http://en.wikipedia.org/wiki/File_system
[17]
http://en.wikipedia.org/wiki/Mdadm
[18]
http://en.wikipedia.org/wiki/Physical_volume
[19]
http://en.wikipedia.org/wiki/Logical...er_%28Linux%29
[20]
http://linux.die.net/man/8/pvdisplay
[21]
http://linux.die.net/man/8/vgdisplay
[22]
http://en.wikipedia.org/wiki/Logical_volume
[23]
http://linux.die.net/man/8/lvdisplay
[24]
http://en.wikipedia.org/wiki/XFS
[25]
http://linux.die.net/man/1/df
[26]
http://linux.die.net/man/8/mount
[27]
http://en.wikipedia.org/wiki/Rsync
[28]
http://en.wikipedia.org/wiki/Standar..._levels#RAID_0