Ha surgido la necesidad de redimensionar las particiones de un servidor de oficina, cambiando bastante el esquema de particiones. Disponemos de un segundo disco duro, así que lo utilizaremos como plantilla, copiaremos los datos del disco viejo al nuevo y de paso montaremos un RAID en espejo (RAID 1). Al acabar deberíamos tener ambos discos duros con la nueva distribución de particiones, con RAID activado y sin haber perdido ningún dato.
De los dos discos del sistema, /dev/sda es el disco duro actual que está funcionando ya en el equipo, y /dev/sdb es el disco duro nuevo al que queremos mover el sistema. Lo ideal es que ambos discos duros tengan el mismo tamaño para un montaje en espejo, o por lo menos, que las particiones que queramos espejar quepan en ambos discos (se pueden dejar particiones fuera del RAID, lo veremos ahora). El procedimiento es casi idéntico utilicemos RAID o no, pero ya puestos, vamos con todo.
Antes de empezar, haced un backup de todo lo importante que haya en ese equipo. No debería ser necesario, pero es mejor no correr riesgos innecesarios.
Este es el sistema actual antes de empezar, tiene un LVM configurado que no se necesita:
Shell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
root@oficina:~# df -h
S.ficherosTamañoUsados Disp Uso%Montado en
rootfs322M120M186M40%/
udev10M010M0%/dev
tmpfs89M556K88M1%/run
/dev/mapper/espejo-root322M120M186M40%/
tmpfs5,0M05,0M0%/run/lock
tmpfs177M0177M0%/run/shm
/dev/sda1228M12M204M6%/boot
/dev/mapper/espejo-home446G218G206G52%/home
/dev/mapper/espejo-tmp368M11M339M3%/tmp
/dev/mapper/espejo-usr8,3G7,4G464M95%/usr
/dev/mapper/espejo-var2,8G1,6G1,2G58%/var
root@oficina:~#root@oficina:~# fdisk -l /dev/sda
Disk/dev/sda:500.1GB,500107862016bytes
255heads,63sectors/track,60801cylinders,976773168sectores en total
Units=sectores of1*512=512bytes
Sector size(logical/physical):512bytes/512bytes
I/Osize(minimum/optimal):512bytes/512bytes
Identificador del disco:0x000317f3
Disposit.Inicio Comienzo Fin Bloques IdSistema
/dev/sda1*204849971124883283Linux
/dev/sda25017589767710714881346575Extendida
/dev/sda55017609767710714881346568eLinux LVM
root@oficina:~# fdisk -l /dev/sdb
Disk/dev/sdb:500.1GB,500107862016bytes
255heads,63sectors/track,60801cylinders,976773168sectores en total
Units=sectores of1*512=512bytes
Sector size(logical/physical):512bytes/512bytes
I/Osize(minimum/optimal):512bytes/512bytes
Identificador del disco:0x00000000
El disco/dev/sdb no contiene una tabla de particionesválida
root@oficina:~#
El siguiente paso es crear en el disco nuevo /dev/sdb las particiones a nuestro gusto:
Shell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
root@oficina:~# fdisk -l /dev/sdb
Disk/dev/sdb:500.1GB,500107862016bytes
255heads,63sectors/track,60801cylinders,976773168sectores en total
Units=sectores of1*512=512bytes
Sector size(logical/physical):512bytes/512bytes
I/Osize(minimum/optimal):512bytes/512bytes
Identificador del disco:0x00000000
Disposit.Inicio Comienzo Fin Bloques IdSistema
/dev/sdb1*63996029497983+fd Linux raid autodetect
/dev/sdb29960302988089996030fd Linux raid autodetect
/dev/sdb329880904305419920033055fd Linux raid autodetect
/dev/sdb443054200976773167466859484fd Linux raid autodetect
root@oficina:~#
No es obligatorio marcar el tipo de las particiones como Linux raid autodetect (código FD en el tipo de partición) pero lo veo recomendable para ser conscientes, y tomar las medidas pertinentes, si alguno de estos discos duros son utilizados en otro equipo con posterioridad.
/dev/sdb1 será la partición /boot configurada como RAID 1 (espejo)
/dev/sdb2 será una partición usada como SWAP, no configuraremos ningún RAID en ella por ahora, posteriormente añadiremos un RAID 0 para mejorar el rendimiento (será /dev/md/swap).
/dev/sdb3 será la partición / configurada como RAID 1
/dev/sdb4 será la partición /home configurada como RAID 1
Ahora montamos el RAID, esto hará que aparezcan unos dispositivos por cada partición controlada mediante RAID, y son los que utilizaremos en lugar de /dev/sda1 o /dev/sda2 a la hora de trabajar con los discos duros (en el fstab por ejemplo):
your boot-loader understands md/v1.xmetadata,oruse
--metadata=0.90
Continuecreating array?yes
mdadm:Defaulting toversion1.2metadata
mdadm:array/dev/md/root started.
root@oficina:~# mdadm --create home --name=home --homehost="<none>" --level=1 --raid-devices=2 missing /dev/sdb4
mdadm:Note:thisarrayhas metadata atthe start and
may notbe suitable asaboot device.Ifyou plan to
store'/boot'on thisdevice please ensure that
your boot-loader understands md/v1.xmetadata,oruse
--metadata=0.90
Continuecreating array?yes
mdadm:Defaulting toversion1.2metadata
mdadm:array/dev/md/home started.
root@oficina:~# ls -la /dev/md
total0
drwxr-xr-x2root root100oct2220:36.
drwxr-xr-x15root root3360oct2220:36..
lrwxrwxrwx1root root8oct2220:31boot->../md127
lrwxrwxrwx1root root8oct2220:36home->../md125
lrwxrwxrwx1root root8oct2220:35root->../md126
root@oficina:~#
Lo que hacemos es crear los volúmenes únicamente con las particiones del disco sdb, el disco sda lo añadiremos una vez que el sistema consiga arrancar desde el RAID (por eso indicamos ahora que está missing). Cuando incluyamos el disco sda en el RAID, se borrará por completo y se clonará a partir del disco duro que estamos configurando.
El parámetro name indica la etiqueta que tendrá, muy útil porque sino será algo como md0. El otro parámetro homehost indica el nombre del servidor, en nuestro caso no queremos que lo coloque, por eso le indicamos <none>, es útil cuando se mueven discos duros físicamente entre servidores.
Escribiendo superbloquesyla informacióncontable del sistema de ficheros:0/hecho
root@oficina:~#
La opción -m 0 hace que se reserven un 0% de los bloques del sistema de archivos (generalmente se reserva un cierto porcentaje para evitar colapsos si se llena mucho, pero por experiencia propia tengo llegado a 0 bytes libres y todo sigue funcionando :D), y el parámetro -L XXXX establece una etiqueta.
Tuve un problema extraño con el disco duro al formatear la partición home, por alguna razón, tras dos horas generando el sistema de archivos, mostró este mensaje y el disco duro mostraba errores en dmesg:
ext2fs_mkdir: Attempt to read block from filesystem resulted in short read
smartctl -i /dev/sdb
Tras reiniciar, procedí a volver a generar el sistema de archivos y parece que funcionó:
Shell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
root@oficina:~# mkfs.ext4 -m 0 -L HOME /dev/md/home
Parece que todo fue bien, pero tenemos que comprobarlo. Revisamos el fichero grub.cfg, tiene que cargar los módulos raid y mdraid1x. Además de eso, los identificadores de las particiones deberían ser los de las particiones RAID:
Shell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
root@oficina:/# vi /boot/grub/grub.cfg
...
### BEGIN /etc/grub.d/10_linux ###
menuentry'Debian GNU/Linux, with Linux 4.1.3-devel'--classdebian--classgnu-linux--classgnu--classos{
load_video
insmod gzio
insmod raid
insmod mdraid1x
insmod part_msdos
insmod ext2
set root='(mduuid/a88ec28f7b0f29d73baa2ebb96f1f2aa)'
Todo correcto. Si no funcionase, podéis colocar ese texto (menuentry { … }) en el archivo /etc/grub/40_custom y volver a ejecutar update-grub.
Ahora mismo tenemos un disco duro configurado para arrancar sin RAID, y el otro configurado para arrancar con RAID. Reiniciamos el equipo y o bien entramos en la BIOS para cambiar el orden de arranque de los discos duros, o bien intercambiamos físicamente los cables SATA. Yo he optado por intercambiar los cables (¡Ojo! ahora /dev/sda será el RAID bueno y /dev/sdb será el disco antiguo que sobreescribiremos). Si todo va bien deberíais ver esto:
Se puede lanzar el comando automáticamente cada 10 segundos usando:
Shell
1
watch-n10cat/proc/mdstat
En mi caso, tardará 4 horas en sincronizar los dos discos duros de más de 400 GB. Mientras tanto, vamos con un bonus, vamos a crear un RAID 0 sobre la segunda partición de ambos discos, que era la que reservamos para SWAP (1024 MB + 1024 MB). RAID 0 no ofrece redundancia pero sí mejora el rendimiento, algo que tiene mucho sentido para la SWAP. Vamos a ello, es igual que lo que hicimos antes, pero con nivel 0: