Soy completamente nuevo en Linux. Heredé un servidor dedicado alojado en algún lugar de Alemania. El sistema operativo es CentOS versión 6.7 (final) de 64 bits. El servidor tiene dos discos de 3 TB en configuración de software RAID-1. La situación con la que estoy lidiando es que, según SMART, el segundo disco está a punto de fallar, sin embargo, el administrador anterior tuvo algunos problemas con el RAID y eliminó por completo los componentes /dev/sda, por lo que ahora el sistema arranca desde un único disco. matriz RAID-1 de disco (degradada) con todos los archivos en /dev/sdb (el disco que está a punto de fallar). Además, borró por completo /dev/sda. Para resolver el problema necesito realizar las siguientes tareas:
- Vuelva a particionar /dev/sda para que sea igual que /dev/sdb.
- Copie (clone) todos los datos de /dev/sdb a /dev/sda.
- Elimine completamente la configuración RAID-1.
- Configure el sistema para que arranque desde /dev/sda como un disco nativo (no desde /dev/md*).
- Asegúrate de que todo esté funcionando bien.
- Borrado seguro /dev/sdb.
- Solicite al soporte que reemplace el disco defectuoso (/dev/sdb) por uno nuevo.
- Vuelva a crear y sincronizar la matriz RAID-1.
El problema es que no sé cómo realizar estas tareas en Linux. Tenga en cuenta que estoy accediendo al sistema de forma remota, por lo que no puedo permitirme ningún error que impida que el sistema pueda iniciarse. Sin embargo, tengo acceso a un sistema de rescate (un pequeño Linux que se puede iniciar desde DHCP con acceso al sistema subyacente).
Aquí hay algunos resultados de comandos (quizás útiles) y archivos de configuración:
fdisk-l
Disk /dev/sdb: 3000.6 GB, 3000592982016 bytes
255 heads, 63 sectors/track, 364801 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disk identifier: 0x000e76a6
Device Boot Start End Blocks Id System
/dev/sdb1 1 1567 12582912+ 83 Linux
/dev/sdb2 1567 1633 524288+ fd Linux raid autodetect
/dev/sdb3 1633 135307 1073741824+ fd Linux raid autodetect
/dev/sdb4 135307 364802 1843413464 f W95 Ext'd (LBA)
/dev/sdb5 135308 364802 1843412440 fd Linux raid autodetect
Disk /dev/sda: 3000.6 GB, 3000592982016 bytes
255 heads, 63 sectors/track, 364801 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disk identifier: 0x00074207
Device Boot Start End Blocks Id System
Disk /dev/md3: 1887.7 GB, 1887654199296 bytes
2 heads, 4 sectors/track, 460853076 cylinders
Units = cylinders of 8 * 512 = 4096 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disk identifier: 0x00000000
Disk /dev/md1: 536 MB, 536858624 bytes
2 heads, 4 sectors/track, 131069 cylinders
Units = cylinders of 8 * 512 = 4096 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disk identifier: 0x00000000
Disk /dev/md2: 1099.5 GB, 1099511488512 bytes
2 heads, 4 sectors/track, 268435422 cylinders
Units = cylinders of 8 * 512 = 4096 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disk identifier: 0x00000000
archivo -s /dev/sdb
/dev/sdb: x86 boot sector; GRand Unified Bootloader, stage1 version 0x3, stage2 address 0x2000, stage2 segment 0x200, GRUB version 0.94; partition 1: ID=0x83, starthead 32, startsector 2048, 25165825 sectors; partition 2: ID=0xfd, starthead 254, startsector 25169920, 1048577 sectors; partition 3: ID=0xfd, starthead 254, startsector 26220544, 2147483649 sectors; partition 4: ID=0xf, starthead 254, startsector 2173706240, 3686826928 sectors, code offset 0x48
archivo -s /dev/sda
/dev/sda: x86 boot sector, code offset 0xb8
gato /etc/fstab
proc /proc proc defaults 0 0
none /dev/pts devpts gid=5,mode=620 0 0
/dev/md0 none swap sw 0 0
/dev/md1 /boot ext3 defaults 0 0
/dev/md2 / ext4 defaults 0 0
/dev/md3 /home ext4 defaults 0 0
gato /boot/grub/grub.conf
timeout 5
default 0
title CentOS (2.6.32-573.7.1.el6.x86_64)
root (hd0,1)
kernel /vmlinuz-2.6.32-573.7.1.el6.x86_64 ro root=/dev/md2 rd_NO_LUKS rd_NO_DM nomodeset crashkernel=auto SYSFONT=latarcyrheb-sun16 LANG=en_US.UTF-8 KEYTABLE=de
initrd /initramfs-2.6.32-573.7.1.el6.x86_64.img
title CentOS (2.6.32-504.1.3.el6.x86_64)
root (hd0,1)
kernel /vmlinuz-2.6.32-504.1.3.el6.x86_64 ro root=/dev/md2 rd_NO_LUKS rd_NO_DM nomodeset crashkernel=auto SYSFONT=latarcyrheb-sun16 LANG=en_US.UTF-8 KEYTABLE=de
initrd /initramfs-2.6.32-504.1.3.el6.x86_64.img
gato /proc/mdstat
Personalities : [raid1]
md2 : active raid1 sdb3[1]
1073741688 blocks super 1.0 [2/1] [_U]
md1 : active raid1 sdb2[1]
524276 blocks super 1.0 [2/1] [_U]
md3 : active raid1 sdb5[1]
1843412304 blocks super 1.0 [2/1] [_U]
unused devices: <none>
Cualquier ayuda al respecto será muy apreciada.
Gracias.
Respuesta1
En primer lugar, debe entenderse que no se trata de cambiar un disco defectuoso en una matriz RAID-1, sino de cómo eliminar completamente la matriz RAID, clonar el disco que está a punto de fallar y luego arrancar el sistema desde la configuración correcta. disco sin ninguna configuración RAID. La razón de este enfoque es porque el primer disco (sda), que es el disco bueno, está completamente vacío, no tiene particiones ni sistemas de archivos y cuando lo agrego a la matriz no se sincroniza (reconstruye) probablemente porque hay errores de lectura. en el segundo disco (sdb). Además, el segundo disco (el defectuoso) es desde donde arranca el sistema. Los pasos necesarios para completar esta tarea son bastante simples si conoce Linux y sus comandos; sin embargo, el procedimiento implica tareas de partición, clonación e instalación de MBR que destruirán sus datos si no tiene el suficiente cuidado. Finalmente, el siguiente procedimiento es específico para la configuración de los discos descritos en la pregunta, pero debería funcionar en otros sistemas si sustituye cuidadosamente los dispositivos y nombres de partición necesarios.
Aquí está el procedimiento:
1. Inicie el sistema en modo de rescate.
Como vamos a clonar datos del disco de arranque del sistema, no necesitamos preocuparnos por ningún archivo bloqueado o cosas así. La mejor manera de hacerlo es iniciar en modo de rescate. Afortunadamente, mi empresa de alojamiento de servidores lo admite de una manera muy sencilla. En un servidor al que tiene acceso directo (sin control remoto), sería algo así como iniciar desde un CD en vivo o seleccionar "Modo de rescate" en el menú de inicio.
2. Prepare el primer disco (/dev/sda) para clonar los datos.
Para preparar sda necesitamos obtener información de partición de sdb. En realidad este paso no es obligatorio porque nuestro objetivo es arrancar el sistema sin ninguna configuración RAID o sin ninguna relación con sdb, si lo prefieres, así que si el esquema de partición actual no es el que queremos esta es la oportunidad de cambiarlo. Lo único que debemos tener en cuenta es que las nuevas particiones deben tener suficiente espacio para contener los datos de sdb. Sin embargo, particionar en Linux requiere un conocimiento profundo sobre alineación y cosas así y como sdb ya está particionado correctamente, me resultó más fácil hacer lo mismo en sda. Para hacer eso primero necesitamos ver las particiones en sdb, yo usé parted para eso.
Nota:La tarea más difícil cuando investigas cómo hacer cosas con Linux es encontrar qué comando (de muchos) es mejor usar. Por ejemplo, hay bastantes comandos y utilidades de partición y decidir cuál usar requiere una cantidad significativa de tiempo leyendo y comparando información. Elegí usar parted aquí porque muestra el sistema de archivos junto con las particiones y porque tiene mejor soporte para discos grandes. (No estoy seguro).
# parted /dev/sdb
(parted) unit s
(parted) print
producción:
Model: ATA ST3000DM001-1CH1 (scsi)
Disk /dev/sdb: 5860533168s
Sector size (logical/physical): 512B/4096B
Partition Table: msdos
Number Start End Size Type File system Flags
1 2048s 25167872s 25165825s primary
2 25169920s 26218496s 1048577s primary ext3 raid
3 26220544s 2173704192s 2147483649s primary ext4 raid
4 2173706240s 5860533167s 3686826928s extended lba
5 2173708288s 5860533167s 3686824880s logical ext4 raid
(parted) quit
Como podemos ver aquí, sdb tiene una tabla de particiones de tipo msdos, eso significa que podemos crear hasta 4 particiones primarias en el disco. En este caso tiene 3 particiones primarias (1,2,3) y una extendida (4) que contiene una partición lógica (5).
El siguiente paso es crear las mismas particiones en sda:
# parted /dev/sda
(parted) unit s
(parted) mkpart primary 2048 25167872
(parted) mkpart primary 25169920 26218496
(parted) mkpart primary 26220544 2173704192
(parted) mkpart extended 2173706240 5860533167
(parted) mkpart logical 2173708288 5860533167
(parted) quit
Como puede ver, utilicé los mismos sectores de inicio y fin de sdb; por supuesto, los discos son los mismos; de lo contrario, deberá organizar los sectores en consecuencia.
Ahora necesitamos informarle al sistema sobre los cambios de partición en sda:
# partprobe /dev/sda
Finalmente, necesitamos crear los sistemas de archivos en sda. Probablemente este paso no sea necesario en absoluto porque vamos a clonar las particiones desde sdb, por lo que el procedimiento de clonación también copiará la información del sistema de archivos, aunque no hará daño.
# mkfs -t ext3 /dev/sda2
# mkfs -t ext4 /dev/sda3
# mkfs -t ext4 /dev/sda5
Observe que no creamos un sistema de archivos en la partición 4 (sda4). Esto se debe a que es una partición extendida que contiene una partición lógica (sda5), solo tenemos que crear el sistema de archivos en la lógica.
Ahora tenemos sda particionado y listo para guardar nuestros datos.
3. Copiar los datos de sdb.
Este paso requirió mayor investigación principalmente porque hay muchas formas de copiar datos. Probablemente cp -a sería suficiente, sin embargo, no logré encontrar ninguna información sólida sobre cómo manejar archivos ocultos, enlaces, etc. para iniciar el sistema correctamente. Así que decidí utilizar una utilidad de copia (clonación) de byte a byte en lugar de un comando de copia de archivos. La utilidad que utilicé fue dd:
# dd if=/dev/md1 of=/dev/sda2 bs=512 conv=noerror,sync,notrunc
# dd if=/dev/md2 of=/dev/sda3 bs=512 conv=noerror,sync,notrunc
# dd if=/dev/md3 of=/dev/sda5 bs=512 conv=noerror,sync,notrunc
Notas: En primer lugar, observe que estamos copiando desde /dev/md* y no desde /dev/sdb*. Esto se debe a que nuestro disco sdb es en realidad parte de una matriz RAID-1. Esa fue otra parte sobre la cual no logré encontrar ninguna información sólida. Por ejemplo, el sistema 've' /dev/sdb2, /dev/sdb3 y /dev/sdb5 que son las particiones que contienen nuestros datos, pero de acuerdo con el archivo /etc/fstab monta /dev/md1, /dev/md2 y /dev/md3 así que supuse que es mejor copiar desde /dev/md*. Otra cosa que debes tener en cuenta es en qué parte del sda vas a copiar los datos. En otras palabras, dónde se debe copiar sda /dev/md1,2,3. Bueno, en este caso es fácil averiguarlo según los tamaños de partición y los sistemas de archivos, aunque en un sistema diferente.df-kpuede mostrar esto pero no desde dentro del modo de rescate; necesitas iniciar normalmente para que esto funcione.
Finalmente, con los comandos anteriores le indicamos a dd que clone cada partición por separado, byte a byte, sin detenerse en ningún error de lectura (parámetro noerror). Por supuesto, esto puede llevar a que el sistema no pueda arrancar si hay algún error de lectura de datos en sdb (que existe en este caso). Sin embargo, antes de terminar usando dd, utilicé algunas técnicas para encontrar qué archivos estaban afectados y si eran seguros. para proceder con la clonación. Esta tarea está más allá del alcance de esta respuesta, pero un buen lugar para comenzar esaquí.
Otro punto importante de atención es el parámetro de tamaño de bloque (bs). Según la documentación de dd, debe configurar bs en 512 bytes porque si hay un error de lectura, y ocurrirá, solo "destruirá" 512 bytes en el disco de destino en lugar de un área más grande; sin embargo, el proceso será más lento. Nuevamente, no logré encontrar ninguna información sólida sobre esto y probablemente un tamaño de bloque de 4096 bytes tendría los mismos resultados.
Finalmente, dd no produce ningún resultado durante su operación y tardará bastante en finalizar debido al tamaño de las particiones. Si desea ver dónde está, debe abrir una nueva sesión de consola (en mi caso, una nueva sesión remota ssh ya que lo hago de forma remota) y ejecutar el comando:
# kill -USR1 $(pidof dd)
Esto obligará a dd a imprimir su progreso actual en la primera sesión de la consola.
4. Haga que sda sea de arranque.
Esto es bastante sencillo de hacer. Primero que nada necesitas montar los puntos de montaje necesarios en sda:
# mount -t ext4 /dev/sda3 /mnt
# mount -t proc proc /mnt/proc
# mount -t sysfs sys /mnt/sys
# mount -o bind /dev /mnt/dev
# mount -t ext3 /dev/sda2 /mnt/boot
Nota: el último comando no es necesario si no tiene una partición separada para /boot en su sistema.
A continuación, debe convertirse en root en el disco /dev/sda; ahora mismo es root en el sistema de rescate.
# chroot /mnt /bin/bash
A continuación necesitamos actualizar nuestro archivo etc/mtab. Realmente no sé por qué deberíamos hacer eso, lo encontré en otro tutorial de rescate sin explicación.
# grep -v rootfs /proc/mounts > /etc/mtab
Lo siguiente que necesitamos es instalar GRUB en sda.
# grub-install --recheck /dev/sda
producción:
Probing devices to guess BIOS drives. This may take a long time.
Installation finished. No error reported.
En este momento tenemos sda listo para iniciar, sin embargo, hay algunos pasos más para que el sistema sepa dónde encontrar el archivo necesario después de iniciar desde sda.
Lo primero es editar/boot/grub/grub.conffile que es el archivo que GRUB leerá para saber cómo procederá. En mi caso tuve que reemplazar cada"raíz (hd0,0)"instancia con"raíz (hd0,1)"y cada"/dev/md2"instancia con"/dev/sda3".
grub.confPuede resultar muy confuso, especialmente para alguien que no lo ha usado antes. La parte más confusa son los parámetros raíz, en grub hay dos significados diferentes de la palabra raíz. Cuando aparece como "root (hd0,1)", le dice a grub dónde está su directorio raíz para encontrar los kernels de Linux necesarios e instrucciones sobre cómo iniciarlos. Mucha gente lo confunde con el directorio raíz "/" del sistema cuando está completamente iniciado, pero lo que grub necesita aquí es dónde está el directorio /boot. En este caso, tengo una partición separada (/dev/sda2) que contiene el directorio /boot y debido a que /dev/sda2 es la segunda partición del primer disco, necesito decirle a grub exactamente eso, pero comenzando con cero (la primera partición es 0, el segundo es 1 y así sucesivamente), por lo que el comando "root (hd0,1)" le dice a grub que encontrará los archivos que necesita en la segunda partición del primer disco.
Cuando la raíz aparece como "/dev/", le dice al kernel dónde estará la raíz del sistema de archivos, es decir, "/" cuando el sistema esté completamente iniciado. Entonces, en este caso estamos ingresando el nombre de la partición (como la ve Linux) donde está "/", en mi caso /dev/sda3.
Finalmente necesitamos editar/etc/fstabarchivo para decirle al sistema qué montar y dónde cuando se inicia.
En mi caso, tuve que reemplazar todas las entradas "/dev/md*" con las particiones "/dev/sda*" correspondientes, que eran:
/dev/md1 --> /dev/sda2
/dev/md2 --> /dev/sda3
/dev/md3 --> /dev/sda5
5. Verifique y deshabilite el inicio desde sdb.
Si eres compulsivo como yo entonces quizás quieras correr.
# file -s /dev/sda
para ver si grub está instalado en sda. Si obtienes un resultado como:
/dev/sda: sticky x86 boot sector; GRand Unified Bootloader, stage1 version 0x3, stage2 address 0x2000, stage2 segment 0x200, GRUB version 0.94;
luego se instala grub (GRand Unified Bootloader) en sda.
Aunque no es necesario, es posible que desees eliminar grub del sdd. Lo hice porque si algo en la configuración anterior está mal, entonces el sistema arrancará desde sdb y eso puede resultar confuso. Para eliminar grub de sdb utilicé dd:
# dd if=/dev/zero of=/dev/sdb bs=446 count=1
Eso escribirá de cero a los primeros 446 bytes del disco, que es donde reside grub en los discos con tablas de particiones msdos.
$ file -s /dev/sdb
Eso comprobará que se haya eliminado el grub.
6. Salga de chroot y desmonte todo.
# exit
# umount /mnt/boot
# umount /mnt/dev
# umount /mnt/sys
# umount /mnt/proc
# umount /mnt
Si aparece algún error durante la ejecución de los comandos anteriores, significa que algo no terminó o salió mal en nuestra sesión chroot y probablemente necesitemos comenzar de nuevo.
7. Reinicie.
Ahora cruza los dedos y reinicia
# reboot
Si logra iniciar sesión en el servidor con sus credenciales raíz originales y todo parece funcionar bien (bases de datos, sitios web, etc.), entonces ha iniciado exitosamente desde sda.
8. Prepare el sdb para su reemplazo.
En mi caso, quería borrar todos los datos de sdb antes de pedirle al soporte técnico que los reemplazara. Además, necesitaba eliminar por completo la configuración RAID del sistema para poder construir uno nuevo desde cero cuando el nuevo disco esté en su lugar. Empecé ejecutando parted para eliminar las particiones:
# parted /dev/sdb
# (parted) rm 5
# (parted) rm 4
# (parted) rm 2
# (parted) rm 2
# (parted) rm 1
# (parted) quit
Luego noté que todas las configuraciones RAID también se eliminaron, por lo que supuse que la definición RAID estaba dentro de las particiones, por lo que no procedí a realizar ninguna acción adicional al respecto. Luego aseguré el sdb borrado. Hay muchas maneras de hacerlo. elegí el/dev/urandommétodo deaquí
Respuesta2
Quizás sea mejor no intentar esto y empezar de nuevo o algo así. No habría intentado esto cuando era nuevo en Linux.
Dicho esto, todo lo que necesita hacer es particionar y agregar /dev/sda nuevamente a la matriz raid y una vez reconstruido, reemplazar /dev/sdb. Asegúrese de que grub esté en ambos discos y que la BIOS probará ambos discos al iniciar.