Compartiendo conocimiento... Guía para mover a raid por software una instalación de CentOS (c) 2014 Xavier Jiménez Aprovechando la instalación básica de Asterisk que documentamos en la entrada anterior, vamos a retocarla para disponer de un raid1 por software. Esto va a ofrecernos una mayor garantía contra pérdida de datos. El objetivo será, sin perder información, añadir un segundo disco y migrar el entorno para que se apoye en el raid de Linux MD. Primero necesitaremos instalar el software de administración para raids, usaremos rsync para la copia de los datos. # yum install mdadm rsync En este ejemplo el primer disco es /dev/sda y el segundo /dev/sdb El primer paso es guardar la tabla de particiones de sda # sfdisk -d /dev/sda > sda_table y después la cargamos en sdb # sfdisk --force /dev/sdb < sda_table Con esto logramos replicar las mismas particiones y tamaños de sda en sdb, lo que nos prepara el entorno y solo quedará entrar en sdb para cambiar el tipo de partición que usamos. Las particiones por defecto de CentOS son : sda1 : Sistema Linux (83) de arranque que contiene el kernel, el initramfs y las configuraciones de grub sda2 : Unidad lvm (8e) que contiene una partición para swap y la partición de root Veamos como está formado el LVM. Primero inspeccionamos los datos de los grupos de volumen [root@asterisk ~]# vgdisplay --- Volume group --VG Name vg_asterisk System ID Format lvm2 Metadata Areas 1 Metadata Sequence No 3 VG Access read/write VG Status resizable MAX LV 0 Cur LV 2 Open LV 2 Max PV 0 Cur PV 1 Act PV 1 VG Size 7,51 GiB PE Size 4,00 MiB Total PE 1922 Alloc PE / Size 1922 / 7,51 GiB Free PE / Size 0/0 VG UUID DK85W0-Ro74-XfUS-LiwB-a6A2-QBlM-RtxbLn Como podemos apreciar, hay definido un solo grupo que se llama vg_asterisk. Vemos los volúmenes lógicos que contiene. [root@asterisk ~]# lvscan ACTIVE '/dev/vg_asterisk/lv_root' [6,71 GiB] inherit ACTIVE '/dev/vg_asterisk/lv_swap' [816,00 MiB] inherit Aquí vemos los dos volúmenes que comentábamos y contiene sda2, lv_root ( contiene la ríz del sistema operativo “/”, o root) y lv_swap ( contiene el espacio que destinamos a swap ) El objetivo es replicar la estructura de particiones, pero en vez de que el disco contenga una particion del tipo linux (83) y otra del tipo lvm (8e) las dos serán del tipo raid (fd) Primero vamos a transformar las particiones de /dev/sdb [root@asterisk ~]# fdisk /dev/sdb 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'). Orden (m para obtener ayuda): p Disco /dev/sdb: 8589 MB, 8589934592 bytes 16 heads, 63 sectors/track, 16644 cylinders Units = cilindros of 1008 * 512 = 516096 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x00000000 Disposit. Inicio Comienzo Fin Bloques Id Sistema /dev/sdb1 * 3 1018 512000 83 Linux La partición 1 no termina en un límite de cilindro. /dev/sdb2 1018 16645 7875584 8e Linux LVM Orden (m para obtener ayuda): Ejecutamos la orden t que permite cambiar el tipo de partición Orden (m para obtener ayuda): t Número de partición (1-4): 1 Código hexadecimal (escriba L para ver los códigos): fd Se ha cambiado el tipo de sistema de la partición 1 por fd (Linux raid autodetect) Repetimos para la partición 2 Orden (m para obtener ayuda): t Número de partición (1-4): 12 Código hexadecimal (escriba L para ver los códigos): fd Se ha cambiado el tipo de sistema de la partición 2 por fd (Linux raid autodetect) Guardamos los cambios en el disco Orden (m para obtener ayuda): w ¡Se ha modificado la tabla de particiones! Llamando a ioctl() para volver a leer la tabla de particiones. Se están sincronizando los discos. Vamos a crear el primer disco de raid, que se compondrá por /dev/sda1 y /dev/sdb1. En este momento no nos conviene usar /dev/sda1, así que crearemos un disco de raid (/dev/md0) degradado, que dispondrá de un solo miembro, en este caso /dev/sdb1. # mdadm -C /dev/md0 -l 1 -n 2 missing /dev/sdb1 --metadata=0.90 --name=0 mdadm: array /dev/md0 started. Formatemos la parición md para su uso con extended 4 # mkfs.ext4 /dev/md0 Cremos la partición md-raid que va a contener el lvm # mdadm -C /dev/md1 -l 1 -n 2 missing /dev/sdb2 --name=1 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/md1 started. Cremos un grupo de volúmenes LVM sobre la segunda partición md-raid # vgcreate vg-raid /dev/md1 Cremos las unidades lógicas dentro del nuevo grupo de volúmenes # lvcreate -L 816 -n lv_swap vg-raid # lvcreate -L 6,70G -n lv_root vg-raid Preparamos el volumen lógico lv_swap para contener la swap # mkswap /dev/vg-raid/lv_swap mkswap: /dev/vg-raid/lv_swap: warning: don't erase bootbits sectors on whole disk. Use -f to force. Setting up swapspace version 1, size = 835580 KiB no label, UUID=bf8a5db3-ad6f-44e5-ae6e-8fe41c927eec Formateamos lv_root para que contenga un sistema de ficheros extended 4 # mkfs.ext4 /dev/vg-raid/lv_root mke2fs 1.41.12 (17-May-2010) Etiqueta del sistema de ficheros= Tipo de SO: Linux Tamaño del bloque=4096 (bitácora=2) Tamaño del fragmento=4096 (bitácora=2) Stride=0 blocks, Stripe width=0 blocks 439776 nodos-i, 1757184 bloques 87859 bloques (5.00%) reservados para el superusuario Primer bloque de datos=0 Número máximo de bloques del sistema de ficheros=1799356416 54 bloque de grupos 32768 bloques por grupo, 32768 fragmentos por grupo 8144 nodos-i por grupo Respaldo del superbloque guardado en los bloques: 32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632 Escribiendo las tablas de nodos-i: hecho Creating journal (32768 blocks): hecho Escribiendo superbloques y la información contable del sistema de ficheros: hecho Este sistema de ficheros se revisará automáticamente cada 26 montajes o 180 días, lo que suceda primero. Utilice tune2fs -c o -i para cambiarlo. Editamos /boot/grub/grub.conf para quitar las referencias a RD_NO_DM y apuntar root al LVM que hemos creado dentro del raid. En nuestro caso nos encontramos : root=/dev/mapper/vg_asterisk-lv_root y lo cambiamos por root=/dev/mapper/vg—raid-lv_root Cambiamos : rd_LVM_LV=vg-asterisk/lv_root por rd_LVM_LV=vg-raid/lv_root Cambiamos : rd_LVM_LV=vg-asterisk/lv_swap por rd_LVM_LV=vg-raid/lv_swap El contexto de arranque dentro de grub queda finalmente : title CentOS (2.6.32-431.11.2.el6.x86_64) root (hd0,0) kernel /vmlinuz-2.6.32-431.11.2.el6.x86_64 ro root=/dev/mapper/vg--raid-lv_root rd_NO_LUKS rd_LVM_LV=vg-raid/lv_root KEYBOARDTYPE=pc KEYTABLE=es rd_LVM_LV=vg-raid/lv_swap SYSFONT=latarcyrheb-sun16 crashkernel=auto LANG=es_ES.UTF-8 initrd /initramfs-2.6.32-431.11.2.el6.x86_64.img Editamos /etc/fstab para que coincida con las particiones que hemos definido dentro del raid : /dev/mapper/vg--raid-lv_root /dev/md0 /dev/mapper/vg--raid-lv_swap / ext4 defaults /boot ext4 defaults swap swap defaults 11 12 00 Generamos el fichero de configuración para los raid # mdadm --examine --scan > /etc/mdadm.conf Regeneramos el ramfilesystem para que incluya la detección de raid # mv /boot/initramfs-2.6.32-431.11.2.el6.x86_64.img /boot/initramfs-2.6.32-431.11.2.el6.x86_64.img_bkp # dracut /boot/initramfs-2.6.32-431.11.2.el6.x86_64.img 2.6.32-431.11.2.el6.x86_64 Ya podemos proceder a la copia de los datos. Primero vamos a preparar un entorno para no confundirnos durante la sincronización de los datos. # cd /mnt # mkdir src # mkdir dst Para sincronizar los datos de /dev/sda1 (boot) con el nuevo disco de raid (md0) primero montamos /dev/sda1 sobre /mnt/src y montamos sobre /dev/md0 /mnt/dst # mount /dev/sda1 /mnt/src # mount /dev/md0 /mnt/dst Sincronizamos los datos # rsync -avH --progress /mnt/src/ /mnt/dst # umount /mnt/src # umount /mnt/dst # umount /boot Montamos / (root) sobre /mnt/src # mount -o bind / /mnt/src Montamos lv_root sobre # mount /dev/vg-raid/lv_root /mnt/dst Sincronizamos los datos # rsync -avH -- progress /mnt/src/ /mnt/dst Cuando se complete la copia estaremos en situación de reiniciar el equipo y arrancar desde el raid, aún degradado. Si tenemos activo selinux es importante crear el fichero /.autorelabel # touch /.autorelabel Reiniciamos con # reboot Paramos el volgroup de origen, en nuestro caso vg_asterisk : # vgchange -a n vg_asterisk Cambiamos el tipo de partición en el disco original a fd y añadimos las particiones al raid como hicimos anteriormente. # fdisk /dev/sda Orden (m para obtener ayuda): t Número de partición (1-4): 1 Código hexadecimal (escriba L para ver los códigos): fd Se ha cambiado el tipo de sistema de la partición 1 por fd (Linux raid autodetect) Orden (m para obtener ayuda): t Número de partición (1-4): 2 Código hexadecimal (escriba L para ver los códigos): fd Se ha cambiado el tipo de sistema de la partición 1 por fd (Linux raid autodetect) Orden (m para obtener ayuda): w Añadimos la partición de boot disco al raid # mdadm - - add /dev/md0 /dev/sda1 Añadimos la partición de datos al raid # mdadm - - add /dev/md1 /dev/sda2 Instalamos grub en los discos del raid # grub grub> device (hd0) /dev/sda grub> root (hd0,0) grub> setup (hd0) grub> device (hd0) /dev/sdb grub> root (hd0,0) grub> setup (hd0) grub> quit