Siendo sincero, la verdad es que este no es un escenario que se le vaya a presentar a muchas personas, pero me pareció interesante explorarlo.
Entonces tenemos dos instancias idénticas:
- Corriendo en la misma AZ (para poder intercambiar los discos)
- Una instancia la llamaré auxiliar, que es donde se hará el trabajo sucio.
- La otra instancia se llama oveja_negra y es la que recibirá el cambio de sistema de particionado.
Estado inicial de oveja_negra
Como primera medida voy a ver cuál es el estado general del volumen y cómo está compuesto.
ubuntu@oveja-negra:~$ sudo parted /dev/xvda
GNU Parted 2.3
Using /dev/xvda
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) unit s
(parted) print
Model: Xen Virtual Block Device (xvd)
Disk /dev/xvda: 16777216s
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Number Start End Size Type File system Flags
1 16065s 16771859s 16755795s primary ext4 boot
(parted) quit
ubuntu@oveja-negra:~$
Vemos que se trata de un disco de 8GB, con tabla de partición msdos y con una sola partición primaria booteable que comienza en el sector 16065 y termina en el sector 16771859. Aquí me voy a detener para hace foco en dos cosas:
- La partición comienza en el sector 16065!!! Es decir que los sectores entre el LBA1 y LBA16064 están disponibles (poco menos de 8 Mbytes).
- La partición termina en el sector 16771859, mientras que el disco tiene 16777216 sectores... Osea que entre el final de la partición y el del disco hay unos 5357 sectores disponibles (unos 2.5Mbytes).
NOTA: este es el momento donde deberías tomar un snapshot del disco raiz en caso de que algo salga mal!!!
Que comience la cirugía
Una vez que la instancia se encuentre detenida, es necesario desconectar el disco y conectar a la instancia auxiliar. Con el disco conectado a la instancia auxiliar vemos que fue agregado como /dev/xvdf:
ubuntu@auxiliar:~$ sudo lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
xvda 202:0 0 8G 0 disk
`-xvda1 202:1 0 8G 0 part /
xvdf 202:80 0 8G 0 disk
`-xvdf1 202:81 0 8G 0 part
ubuntu@auxiliar:~$
Damos una última mirada a la tabla de particiones de nuevo
ubuntu@auxiliar:~$ sudo parted /dev/xvdf
GNU Parted 2.3
Using /dev/xvdf
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted)unit s
(parted)print
Model: Xen Virtual Block Device (xvd)
Disk /dev/xvdf: 16777216s
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Number Start End Size Type File system Flags
1 16065s 16771859s 16755795s primary ext4 boot
(parted)
Ahora en un acto de casi locura procedemos a eliminar la tabla de particiones
(parted)mklabel
New disk label type? gpt
Warning: Partition(s) on /dev/xvdf are being used.
Ignore/Cancel? Ignore
Warning: The existing disk label on /dev/xvdf will be destroyed and all data on
this disk will be lost. Do you want to continue?
Yes/No? Yes
(parted) print
Model: Xen Virtual Block Device (xvd)
Disk /dev/xvdf: 16777216s
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Number Start End Size File system Name Flags
(parted)
Este es el momento donde nuestra información se encuentra en lo que yo llamaría el limbo informático. hemos perdido toda referencia e información de la misma, ya que hemos reemplazada la tabla de particiones msdos por una gpt. De hecho si cerramos parted podemos corroborar que ya no existe /dev/xvdf1:
ubuntu@auxiliar:~$ sudo lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
xvda 202:0 0 8G 0 disk
`-xvda1 202:1 0 8G 0 part /
xvdf 202:80 0 8G 0 disk
ubuntu@auxiliar:~$
Lo bueno de todo esto es que nada está perdido! Ahora hay que reconstruir la tabla de particiones con la información que teníamos previamente:
ubuntu@auxiliar:~$ sudo parted /dev/xvdf
GNU Parted 2.3
Using /dev/xvdf
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted)unit s
(parted)mkpart
Partition name? []?
File system type? [ext2]? ext4
Start? 16065
End? 16771859
Warning: The resulting partition is not properly aligned for best performance.
Ignore/Cancel? Ignore
(parted) print
Model: Xen Virtual Block Device (xvd)
Disk /dev/xvdf: 16777216s
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Number Start End Size File system Name Flags
1 16065s 16771859s 16755795s ext4
(parted)
Sencillamente creamos una entra en la tabla de particiones GPT que indique donde se encontraba nuestra partición previamente. Ahora ya deberíamos ser capaces de ver la partición y montarla perfectamente de nuevo:
ubuntu@auxiliar:~$ sudo lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
xvda 202:0 0 8G 0 disk
`-xvda1 202:1 0 8G 0 part /
xvdf 202:80 0 8G 0 disk
`-xvdf1 202:81 0 8G 0 part
ubuntu@auxiliar:~$ sudo fsck.ext4 -f /dev/xvdf1
e2fsck 1.42.9 (4-Feb-2014)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
cloudimg-rootfs: 58327/524288 files (0.2% non-contiguous), 265348/2094474 blocks
ubuntu@auxiliar:~$ sudo mount /dev/xvdf1 /mnt/
ubuntu@auxiliar:~$ ls /mnt/
bin dev home lib lost+found mnt proc run srv tmp var
boot etc initrd.img lib64 media opt root sbin sys usr vmlinuz
ubuntu@auxiliar:~$
En este punto ya está casi todo terminado, de hecho si no se tratara del volumen principal del sistema podríamos terminar acá. Pero si volviésemos a poner el volumen en la instancia oveja-negra notaríamos que la instancia no arranca y jamás lo volverá a hacer en esas condiciones. ¿Por qué? Básicamente porque hemos jugado con la tabla de particiones y los sectores de arranque del sistema. Para arreglar esto re-instalamos GRUB para que repare cualquier situación extraña (/dev/xvdf1 está montado en /mnt)
ubuntu@auxiliar:~$ sudo grub-install --boot-directory=/mnt/boot /dev/xvdf
Installing for i386-pc platform.
grub-install: warning: this GPT partition label contains no BIOS Boot Partition; embedding won't be possible.
grub-install: warning: Embedding is not possible. GRUB can only be installed in this setup by using blocklists. However, blocklists are UNRELIABLE and their use is discouraged..
grub-install: error: will not proceed with blocklists.
ubuntu@auxiliar:~$
WTF!!! Si, si bien GRUB 2 permite bootear de particiones GPT, en sistemas BIOS requiere de algo llamado BIOS Boot Partition donde aloja la segunda etapa de su código (NO necesario en sistemas UEFI). Esto se debe a que al utilizar GPT los bloques que se encuentran a continuación del sector LBA0 (MBR) están ocupados por el encabezado GPT y el arreglo de particiones. Teniendo esta partición GRUB 2 se asegura de tener espacio suficiente donde poner el código necesario, la partición no requiere mucho espacio unos 2MB son mas que suficiente.
Creando la partición "BIOS boot partition"
Crearemos una partición de aproximadamente 2MB entre los sectores 2048 y 6144, esto nos debería garantizar que no estamos sobre escribiendo nada que no debamos:
(parted)mkpart
Partition name? []?
File system type? [ext2]?
Start?2048
End?6144
(parted)print
Model: Xen Virtual Block Device (xvd)
Disk /dev/xvdf: 16777216s
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Number Start End Size File system Name Flags
2 2048s 6144s 4097s
1 16065s 16771859s 16755795s ext4 boot
(parted)
un detalle mas es que debemos marcar la partición con el flag bios_grub para que GRUB sepa que es allí donde debe buscar el código:
(parted) set 2 bios_grub on
(parted)print
Model: Xen Virtual Block Device (xvd)
Disk /dev/xvdf: 16777216s
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Number Start End Size File system Name Flags
2 2048s 6144s 4097s bios_grub
1 16065s 16771859s 16755795s ext4 boot
(parted)
Ahora deberíamos poder instalar grub perfectamente:
ubuntu@auxiliar:~$ sudo mount /dev/xvdf1 /mnt/
ubuntu@auxiliar:~$ sudo grub-install --boot-directory=/mnt/boot /dev/xvdf
Installing for i386-pc platform.
Installation finished. No error reported.ubuntu@auxiliar:~$ sudo umount /mnt
ubuntu@auxiliar:~$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
xvda 202:0 0 8G 0 disk
`-xvda1 202:1 0 8G 0 part /
xvdf 202:80 0 8G 0 disk
|-xvdf1 202:81 0 8G 0 part
`-xvdf2 202:82 0 2M 0 part
ubuntu@auxiliar:~$
Podemos ver que si intentamos montar la partición resulta complicado:
ubuntu@auxiliar:~$ sudo mount /dev/xvdf2 /mnt/
mount: block device /dev/xvdf2 is write-protected, mounting read-only
mount: you must specify the filesystem typeubuntu@auxiliar:~$
Si bien no tengo certezas es bastante probable que esta partición no tenga ningún formato conocido sino que sea solamente una reserva de espacio donde hay código binario ejecutable correspondiente a la etapa 2 de GRUB.
Ahora llegó el momento de la verdad, volvemos el disco a oveja-negra y le damos start a la instancia:
ubuntu@oveja-negra:~$ sudo parted /dev/xvda
GNU Parted 2.3
Using /dev/xvda
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) print
Model: Xen Virtual Block Device (xvd)
Disk /dev/xvda: 8590MB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Number Start End Size File system Name Flags
2 1049kB 3146kB 2098kB bios_grub
1 8225kB 8587MB 8579MB ext4 boot
(parted) quit
ubuntu@oveja-negra:~$
Sin un raspón, sana, salva y con GPT!!!