Ya que nosotros los mortales no tenemos una SAN o una caja de storage para manejar/aprender a usar el LVM y el software de RAID en GNU/Linux, aprenderemos usando discos "virtuales" emulando discos por medio del driver loop.
Asi lo primero que haremos sera lo siguiente: Crearemos la cantidad de discos que creamos adecuados, para mi seran 7, mis discos seran de 10 megas cada uno.
seq 1 7 | xargs -I{} dd if=/dev/zero bs=1M count=10 of=disk{}.img
#seq 1 7 | xargs -I{} dd if=/dev/zero bs=1M count=10 of=disk{}.img
10+0 records in
10+0 records out
10485760 bytes (10 MB) copied, 0.105609 seconds, 99.3 MB/s
10+0 records in
10+0 records out
10485760 bytes (10 MB) copied, 0.130759 seconds, 80.2 MB/s
10+0 records in
v10+0 records out
10485760 bytes (10 MB) copied, 0.299541 seconds, 35.0 MB/s
10+0 records in
10+0 records out
10485760 bytes (10 MB) copied, 0.237755 seconds, 44.1 MB/s
10+0 records in
10+0 records out
10485760 bytes (10 MB) copied, 0.0576922 seconds, 182 MB/s
10+0 records in
10+0 records out
10485760 bytes (10 MB) copied, 0.270273 seconds, 38.8 MB/s
10+0 records in
10+0 records out
10485760 bytes (10 MB) copied, 0.345489 seconds, 30.4 MB/s
/tmp/pruebas# ls
disk1.img disk2.img disk3.img disk4.img disk5.img disk6.img disk7.img
Con esto crearemos 7 archivos llamados disk1.img hasta disk7.img Crearemos los discos virtuales, los cuales unicamente seran dispositivos de bloques /dev/loop1,/dev/loop2 ... /dev/loop7
#/tmp/pruebas# seq 1 7 | xargs -I{} losetup /dev/loop{} disk{}.img
Ahora que ya tenemos los "discos virtuales" de 10 megas cada uno, podemos empezar, lo primero que haremos sera ver las distintas configuracion RAID que se utilizan principalmente: raid0 , raid1, raid5 y rad0+1 y raid1+0
RAID es un acronimo que significa Array redundante de discos independientes, bueno mas o menos, lo importante es que tenemos varios discos independientes que utilizaremos para realizar algo como lo siguiente:
RAID0 ( raid cero ) : Tambien llamado Stripe, esta configuracion lo que hace es concatenar los discos de manera que se suman los espacios..
#mdadm --create /dev/md0 –-level=0 –-raid-devices=2 /dev/loop1 /dev/loop2
podemos checar cuantos dispositivos raid tenemos en total viendo el archivo /proc/mdstat de la siguiente forma:
# cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md0 : active raid0 loop2[1] loop1[0]
20352 blocks 64k chunks
unused devices:
root@cobalto:/tmp/pruebas#
root@cobalto:/tmp/pruebas# mdadm --detail /dev/md0
/dev/md0:
Version : 00.90.03
Creation Time : Tue Apr 22 22:17:54 2008
Raid Level : raid0
Array Size : 20352 (19.88 MiB 20.84 MB)
Raid Devices : 2
Total Devices : 2
Preferred Minor : 0
Persistence : Superblock is persistent
Update Time : Tue Apr 22 22:17:54 2008
State : clean
Active Devices : 2
Working Devices : 2
Failed Devices : 0
Spare Devices : 0
Chunk Size : 64K
UUID : 41b0c926:b0ba8060:19f3422c:9f71b02e (local to host cobalto)
Events : 0.1
Number Major Minor RaidDevice State
0 7 1 0 active sync /dev/loop1
1 7 2 1 active sync /dev/loop2
El comando anterior crea un dispositivo de bloques /dev/md0 y /dev/md/0 los cuales son el mismo device logico ( meta device ), para comprobarlo solo hay que ver su numero mayor y numero menor, se vera que son los mismos.
Tambien llamado mirror, esta configuracion copia cada byte que llega al metadispositivo ( /dev/md[x] o /dev/md/[x] ) a cada uno de sus componentes.
Aqui los espacios no se suman, ya que cada uno de los dispositivos que forman el mirror tiene una copia de los datos, por tanto todos se "utilizan".
#mdadm --create /dev/md0 –level=1 --devices=2 /dev/loop1 /dev/loop2
Esta configuracion puede tomar un discos completos o particiones, claro como aqui lo vemos tambien puede tomar dispositivos loop.
Una vez creado /dev/md0 veamos si funciona, vamos a copiar la mbr de mi disco duro al mirro: copiaremos los primero 512 bytes de /dev/sda ( es un disco sata interno, para ide sera /dev/hda)
/tmp/pruebas# dd if=/dev/sda bs=1 count=512 of=/dev/md0
512+0 records in
512+0 records out
512 bytes (512 B) copied, 0.0244872 seconds, 20.9 kB/s
512 bytes (512 B) copied, 0.00563707 seconds, 90.8 kB/s
root@cobalto:/tmp/pruebas# dd if=/dev/loop1 bs=1 count=512 of=mbr.loop1
512+0 records in
512+0 records out
512 bytes (512 B) copied, 0.00539904 seconds, 94.8 kB/s
root@cobalto:/tmp/pruebas# dd if=/dev/loop2 bs=1 count=512 of=mbr.loop2
512+0 records in
512+0 records out
512 bytes (512 B) copied, 0.0122788 seconds, 41.7 kB/s
Comparamos los archivos usando cmp, si son iguales no da ningun error:
root@cobalto:/tmp/pruebas# cmp mbr.md0 mbr.loop1
root@cobalto:/tmp/pruebas# cmp mbr.md0 mbr.loop2
root@cobalto:/tmp/pruebas# cmp mbr.loop1 mbr.loop1
Veamos la salida hexadecimal usando hexdump y paste:
root@cobalto:/tmp/pruebas# hexdump mbr.md0 > s1
root@cobalto:/tmp/pruebas# hexdump mbr.loop1 > s2
root@cobalto:/tmp/pruebas# paste s1 s2 |more
----------------------mbr.md0------------------|--------------------mbr.loop1-----------------
0000000 48eb 0090 8e02 bcd7 7a00 a0bb 8b07 8ece 0000000 48eb 0090 8e02 bcd7 7a00 a0bb 8b07 8ece
0000010 8edb f3c3 eaa4 007a 07a0 0010 0001 7a00 0000010 8edb f3c3 eaa4 007a 07a0 0010 0001 7a00
0000020 0000 0000 0000 0000 0000 8b66 0855 42b4 0000020 0000 0000 0000 0000 0000 8b66 0855 42b4
0000030 06c6 001f 327c 66c0 1689 0022 1abe 0203 0000030 06c6 001f 327c 66c0 1689 0022 1abe 0203
0000040 00ff 2000 0001 0000 0200 90fa f690 80c2 0000040 00ff 2000 0001 0000 0200 90fa f690 80c2
0000050 0275 80b2 59ea 007c 3100 8ec0 8ed8 bcd0 0000050 0275 80b2 59ea 007c 3100 8ec0 8ed8 bcd0
0000060 2000 a0fb 7c40 ff3c 0274 c288 be52 7d7f 0000060 2000 a0fb 7c40 ff3c 0274 c288 be52 7d7f
0000070 34e8 f601 80c2 5474 41b4 aabb cd55 5a13 0000070 34e8 f601 80c2 5474 41b4 aabb cd55 5a13
0000080 7252 8149 55fb 75aa a043 7c41 c084 0575 0000080 7252 8149 55fb 75aa a043 7c41 c084 0575
0000090 e183 7401 6637 4c8b be10 7c05 44c6 01ff 0000090 e183 7401 6637 4c8b be10 7c05 44c6 01ff
00000a0 8b66 441e c77c 1004 c700 0244 0001 8966 00000a0 8b66 441e c77c 1004 c700 0244 0001 8966
00000b0 085c 44c7 0006 6670 c031 4489 6604 4489 00000b0 085c 44c7 0006 6670 c031 4489 6604 4489
00000c0 b40c cd42 7213 bb05 7000 7deb 08b4 13cd 00000c0 b40c cd42 7213 bb05 7000 7deb 08b4 13cd
00000d0 0a73 c2f6 0f80 ea84 e900 008d 05be c67c 00000d0 0a73 c2f6 0f80 ea84 e900 008d 05be c67c
00000e0 ff44 6600 c031 f088 6640 4489 3104 88d2 00000e0 ff44 6600 c031 f088 6640 4489 3104 88d2
00000f0 c1ca 02e2 e888 f488 8940 0844 c031 d088 00000f0 c1ca 02e2 e888 f488 8940 0844 c031 d088
0000100 e8c0 6602 0489 a166 7c44 3166 66d2 34f7 0000100 e8c0 6602 0489 a166 7c44 3166 66d2 34f7
0000110 5488 660a d231 f766 0474 5488 890b 0c44 0000110 5488 660a d231 f766 0474 5488 890b 0c44
0000120 443b 7d08 8a3c 0d54 e2c0 8a06 0a4c c1fe 0000120 443b 7d08 8a3c 0d54 e2c0 8a06 0a4c c1fe
0000130 d108 6c8a 5a0c 748a bb0b 7000 c38e db31 0000130 d108 6c8a 5a0c 748a bb0b 7000 c38e db31
0000140 01b8 cd02 7213 8c2a 8ec3 4806 607c b91e 0000140 01b8 cd02 7213 8c2a 8ec3 4806 607c b91e
0000150 0100 db8e f631 ff31 f3fc 1fa5 ff61 4226 0000150 0100 db8e f631 ff31 f3fc 1fa5 ff61 4226
0000160 be7c 7d85 40e8 eb00 be0e 7d8a 38e8 eb00 0000160 be7c 7d85 40e8 eb00 be0e 7d8a 38e8 eb00
0000170 be06 7d94 30e8 be00 7d99 2ae8 eb00 47fe 0000170 be06 7d94 30e8 be00 7d99 2ae8 eb00 47fe
0000180 5552 2042 4700 6f65 006d 6148 6472 4420 0000180 5552 2042 4700 6f65 006d 6148 6472 4420
0000190 7369 006b 6552 6461 2000 7245 6f72 0072 0000190 7369 006b 6552 6461 2000 7245 6f72 0072
00001a0 01bb b400 cd0e ac10 003c f475 00c3 0000 00001a0 01bb b400 cd0e ac10 003c f475 00c3 0000
00001b0 0000 0000 0000 0000 3770 3771 0000 0080 00001b0 0000 0000 0000 0000 3770 3771 0000 0080
00001c0 ff01 fe07 ffff 823f 003e 2dbf 0310 fe00 00001c0 ff01 fe07 ffff 823f 003e 2dbf 0310 fe00
00001d0 ffff fe83 ffff affe 034e 59f4 02af fe00 00001d0 ffff fe83 ffff affe 034e 59f4 02af fe00
00001e0 ffff fe82 ffff 09f2 05fe 6080 001f 0000 00001e0 ffff fe82 ffff 09f2 05fe 6080 001f 0000
00001f0 ffc1 fe83 ffff 6a72 061d 50cf 00df aa55 00001f0 ffc1 fe83 ffff 6a72 061d 50cf 00df aa55
Vuala, el mirror esta funcionando!, de hecho podriamos sacar la informacion directamente de los
``discos'' , es decir de los archivos disk1.img, etc.
Agregaremos un disco mas al mirror dejando el nuevo dispositivo en spare ( es decir esta en la
banca, listo para entrar a jugar cuando alguien se lesione).
/tmp/pruebas# mdadm /dev/md0 --add /dev/loop3
mdadm: added /dev/loop3
Veamos como va:
root@cobalto:/tmp/pruebas# mdadm --detail /dev/md0
/dev/md0:
Version : 00.90.03
Creation Time : Tue Apr 22 22:22:29 2008
Raid Level : raid1
Array Size : 10176 (9.94 MiB 10.42 MB)
Used Dev Size : 10176 (9.94 MiB 10.42 MB)
Raid Devices : 2
Total Devices : 3
Preferred Minor : 0
Persistence : Superblock is persistent
Update Time : Tue Apr 22 22:39:33 2008
State : clean
Active Devices : 2
Working Devices : 3
Failed Devices : 0
Spare Devices : 1
UUID : 00d7cf84:3fd2e782:19f3422c:9f71b02e (local to host cobalto)
Events : 0.6
Number Major Minor RaidDevice State
0 7 1 0 active sync /dev/loop1
1 7 2 1 active sync /dev/loop2
2 7 3 - spare /dev/loop3
Ahora tenemos a /dev/loop1 y /dev/loop2 sincronizados, /dev/loop3 esta en spare. Si desearamos sacar uno de los discos para tener una imagen del sistema en un punto temporal.
Primero marcamos uno de los discos con la bandera -f (faulty) esto lo saca de sincronizacion intercambiando lugar con el disco spare.
xSacamos al /dev/loop1 de sicronizacion:
x
root@cobalto:/tmp/pruebas# mdadm /dev/md0 -f /dev/loop1
mdadm: set /dev/loop1 faulty in /dev/md0
root@cobalto:/tmp/pruebas# mdadm --detail /dev/md0
/dev/md0:
Version : 00.90.03
Creation Time : Tue Apr 22 22:22:29 2008
Raid Level : raid1
Array Size : 10176 (9.94 MiB 10.42 MB)
Used Dev Size : 10176 (9.94 MiB 10.42 MB)
Raid Devices : 2
Total Devices : 3
Preferred Minor : 0
Persistence : Superblock is persistent
Update Time : Tue Apr 22 22:49:01 2008
State : clean
Active Devices : 2
Working Devices : 2
Failed Devices : 1
Spare Devices : 0
UUID : 00d7cf84:3fd2e782:19f3422c:9f71b02e (local to host cobalto)
Events : 0.12
Number Major Minor RaidDevice State
0 7 3 0 active sync /dev/loop3
1 7 2 1 active sync /dev/loop2
2 7 1 - faulty spare /dev/loop1
root@cobalto:/tmp/pruebas#
Vemos que ahora /dev/loop3 que antes estava en spare ha tomado el lugar de /dev/loop1.
Si esto en realidad fuera un disco y hubiera fallado de manera ``natural'' entonces el procedimiento normal seria el de reemplazo, por tanto tendriamos sacar el disco para llevarlo al provedor o cambiarlo por otro, esperemos, nuevo.
Por tanto para poder sacarlo tendremos que eliminar el disco que esta fallando:
:/tmp/pruebas# mdadm /dev/md0 --remove /dev/loop1
mdadm: hot removed /dev/loop1
:/tmp/pruebas# mdadm --detail /dev/md0
/dev/md0:
Version : 00.90.03
Creation Time : Tue Apr 22 22:22:29 2008
Raid Level : raid1
Array Size : 10176 (9.94 MiB 10.42 MB)
Used Dev Size : 10176 (9.94 MiB 10.42 MB)
Raid Devices : 2
Total Devices : 2
Preferred Minor : 0
Persistence : Superblock is persistent
Update Time : Tue Apr 22 22:54:31 2008
State : clean
Active Devices : 2
Working Devices : 2
Failed Devices : 0
Spare Devices : 0
UUID : 00d7cf84:3fd2e782:19f3422c:9f71b02e (local to host cobalto)
Events : 0.14
Number Major Minor RaidDevice State
0 7 3 0 active sync /dev/loop3
1 7 2 1 active sync /dev/loop2
:/tmp/pruebas#
Vemos que /dev/loop1 ya no esta asociado a /dev/md0 por tanto yapodemos sacar el disco
marcado como faulty.
RAID 0+1:
RAID 1+0:
En esta configuracion de discos, tenemos el espacio se suma como en RAID0 sin embargo se ocupa espacio en cada disco para tener redundancia de datos, de modo que si un disco falla, podemos tener la informacion a salvo, hasta que podamos reingresar un disco sin problemas.
El comando para crear un RAID5 es:
# mdadm --create /dev/md0 --level=5 --raid-devices=7 /dev/loop1 /dev/loop2 /dev/loop3 \
/dev/loop4 /dev/loop5 /dev/loop6 /dev/loop7
Veamos el espacio disponible del dispositivo:
# mdadm --detail /dev/md0
/dev/md0:
Version : 00.90.03
Creation Time : Tue Apr 22 23:04:30 2008
Raid Level : raid5
Array Size : 61056 (59.64 MiB 62.52 MB) <---- casi 60 mb de espacio para usar.
Used Dev Size : 10176 (9.94 MiB 10.42 MB)
Raid Devices : 7
Total Devices : 7
Preferred Minor : 0
Persistence : Superblock is persistent
Update Time : Tue Apr 22 23:04:34 2008
State : clean
Active Devices : 7
Working Devices : 7
Failed Devices : 0
Spare Devices : 0
Layout : left-symmetric
Chunk Size : 64K
UUID : f223a88f:bd401c43:19f3422c:9f71b02e (local to host cobalto)
Events : 0.4
Number Major Minor RaidDevice State
0 7 1 0 active sync /dev/loop1
1 7 2 1 active sync /dev/loop2
2 7 3 2 active sync /dev/loop3
3 7 4 3 active sync /dev/loop4
4 7 5 4 active sync /dev/loop5
5 7 6 5 active sync /dev/loop6
6 7 7 6 active sync /dev/loop7
Hay que notar que podemos usar ``casi'' todo el espacio de los 7 dispositivos.
Vamos a probar esta nueva configuracion creando un fs sobre el :
# mkfs -t ext3 /dev/md0
# mount -t ext3 /dev/md0 /tmp/pruebas/fs
/tmp/pruebas# df -h /tmp/pruebas/fs
Filesystem Size Used Avail Use% Mounted on
/dev/md0 58M 5.2M 50M 10% /tmp/pruebas/fs
Copiaremos un archivo y le sacaremos su md5 para comprobar esta completo y sin cambio.
#cd /tmp/pruebas/fs #cp /home/kb/mmix-20060918.tar.gz . # md5sum mmix-20060918.tar.gz df3962e94427145532ef783b32a1a752 mmix-20060918.tar.gz # md5sum /home/kb/mmix-20060918.tar.gz df3962e94427145532ef783b32a1a752 /home/kb/mmix-20060918.tar.gz
Comprobaremos que al filesystem y la informacion dentro del filesystem sigue intacta aun y cuando uno de los discos que forman el RAID5 falla, o en este caso esta marcado para fallar artificialmente:
Artificialmente hacemos que ``falle'' un disco:
# mdadm /dev/md0 -f /dev/loop4
mdadm: set /dev/loop4 faulty in /dev/md0
:/tmp/pruebas/fs# mdadm --detail /dev/md0
/dev/md0:
Version : 00.90.03
Creation Time : Tue Apr 22 23:04:30 2008
Raid Level : raid5
Array Size : 61056 (59.64 MiB 62.52 MB)
Used Dev Size : 10176 (9.94 MiB 10.42 MB)
Raid Devices : 7
Total Devices : 7
Preferred Minor : 0
Persistence : Superblock is persistent
Update Time : Tue Apr 22 23:32:03 2008
State : clean, degraded <--marcado como limpio pero con problemas
Active Devices : 6
Working Devices : 6
Failed Devices : 1
Spare Devices : 0
Layout : left-symmetric
Chunk Size : 64K
UUID : f223a88f:bd401c43:19f3422c:9f71b02e (local to host cobalto)
Events : 0.6
Number Major Minor RaidDevice State
0 7 1 0 active sync /dev/loop1
1 7 2 1 active sync /dev/loop2
2 7 3 2 active sync /dev/loop3
3 0 0 3 removed <-------------aqui estava antes
4 7 5 4 active sync /dev/loop5
5 7 6 5 active sync /dev/loop6
6 7 7 6 active sync /dev/loop7
7 7 4 - faulty spare /dev/loop4 <-quedo en spare listo para cambiarse.
# df -h /tmp/pruebas/fs
Filesystem Size Used Avail Use% Mounted on
/dev/md0 58M 5.5M 50M 11% /tmp/pruebas/fs
root@cobalto:/tmp/pruebas/fs# ls
lost+found mmix-20060918.tar.gz
:/tmp/pruebas/fs# md5sum /home/kb/mmix-20060918.tar.gz
df3962e94427145532ef783b32a1a752 /home/kb/mmix-20060918.tar.gz
:/tmp/pruebas/fs# md5sum mmix-20060918.tar.gz
df3962e94427145532ef783b32a1a752 mmix-20060918.tar.gz
El fs sigue arriba y la informacion dentro del filesystem esta intacta, el md5 sigue siendo igual para ambas copias.
El manejador de volumenes es una herramienta utilizada para tener principalmente : disponibilidad,flexibilidad y mayor desempe;o de los datos, ya sea en forma de un filesystem o de volumenes.
Las personas que no tienen acceso a equipos que tengas decenas o incluso cientos de discos probablemente nunca habran escuchado este termino ( como yo antes de trabajar profesioanalmente), el LVM forma parte de la mayoria de los sistemas operativos UNIX modernos concretamente estamos hablando del LVM2 utilizado en GNU/Linux el cual se asemeja al LVM de HP-UX, cuando menos en sus comandos los cuales por ciertos son muy intuitivos.
En pocas palabras la ventaja o servicios que proporciona un LVM es poder "juntar" el espacio de los discos bajo su control de modo que se pueden crear "discos virtuales" que pueden tener la capacidad de almacenamiento de, incluso, la suma de todos los discos previamente descritos.
Tambien tiene la ventaja que estos "volumenes logicos" pueden ser incrementados o reducidos dinamicamente cosa que es muy tardado y peligroso cuando se hace en particiones duras de disco.Estas ventajas son las principales pero no las unicas ya lo veremos.
Cuando utilizas el LVM para tener tus filesystems y demas datos veras algo asi:
El comando df muestra en que dispositivos recide tu filesystem y cuanto se ha ocupado asi como en que directorio esta "montado"
#df -h /oratmp01
/dev/mapper/oraclevg-lvoratmp01
4.0G 1.8G 2.1G 46% /oratmp01
# ls -al /dev/oraclevg/lvoratmp01
lrwxrwxrwx 1 root root 31 May 15 16:16 /dev/oraclevg/lvoratmp01 -> /dev/mapper/oraclevg-lvoratmp01
# ls -al /dev/mapper/oraclevg-lvoratmp01
brw-rw---- 1 root disk 253, 14 Apr 23 17:26 /dev/mapper/oraclevg-lvoratmp01
Con esto intento explicar de que partes se compone la administracion de disco cuando estas usando el LVM, como ves el filesystem que tiene como "punto de montura" el directorio /oratmp01 esta en /dev/mapper/oraclevg-lvoratmp01 y que existe un directorio /dev/oraclevg en el cual existe un archivo ( en realidad un enlace ) al dispositivo /dev/mapper/oraclevg-lvoratmp01
El volumen logico : lvoratmp01 es lo que tu utilizas para tener tu filesystem, lo tienes que formatear con mkfs y lo debes montar como si fuera un disco o particion normal, para poder hacerlo debes primero tener un volume group definido el cual consta de 1 o mas discos ( pueden ser disco,particiones duras o como lo veremos dispositivos loop)
Asi el primer paso sera definir tu VOLUME GROUP