Mostrando entradas con la etiqueta ec2. Mostrar todas las entradas
Mostrando entradas con la etiqueta ec2. Mostrar todas las entradas

sábado, 14 de noviembre de 2015

Snapshots automáticos y consistentes en AWS

Los snapshots pueden ser una forma muy tentadora de backups, dado que proveen una imagen de un volumen en un punto particular del tiempo. Pero como todo tipo de backup debemos asegurarnos que se hagan correctamente, de lo contrario el día que lo precisemos podríamos arrepentirnos de no haberlo hecho xD.

AWS permite crear snapshots de los volúmenes EBS que tengamos bajo nuestro control. Estos son algunos de los detalles al respecto:
  • Se almacenan en S3, por lo tanto la durabilidad y disponibilidad de los mismos es mas que razonable.
  • Son incrementales, por lo tanto son eficientes en espacio y tiempo.
  • Restaurar un snapshot es muy sencillo, simplemente hay que crear un nuevo volumen del snapshot.
Los mismos documentos de AWS sugieren que para obtener snapshots consistentes y evitar la corrupción de los datos se deben detener las operaciones de escritura sobre el volumen por el tiempo que demore la creación del snapshot. Una forma muy sencilla de hacer esto es deteniendo totalmente la instancia, por ejemplo, o al menos desmontando el volumen del cual se está tomando el snapshot.

En casos donde detener la instancia o desmontar los volúmenes no sea posible se puede optar por congelar el sistema de archivos durante la creación del snapshot haciendo uso de xfs_freeze.

xfs_freeze permite detener las operaciones de escrituras sobre un sistema de archivos (-f), y luego retomarlas (-u).
En este post se va a describir una prueba de concepto de como se puede lograr un snapshot consistente deteniendo las operaciones de escritura sobre el volumen.

Role IAM para las instancias


Para poder tomar los snapshots de manera automática y desde las mismas instancias debemos permitirles ciertas operaciones (API calls) como CreateSnapshot, DescribeInstances y DescribeSnapshots. Para lograr esta parte podemos valernos de un Role IAM y adjuntarle la siguiente Policy:
 
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Stmt1447448059000",
            "Effect": "Allow",
            "Action": [
                "ec2:CreateSnapshot",
                "ec2:DescribeInstances",
                "ec2:DescribeSnapshots"
            ],
            "Resource": [
                "*"
            ]
        }
    ]
}

El rol nos permitirá darle a las instancias la capacidad de acceder a este subconjunto de la API sin tener que preocuparnos por mantener las credenciales.

Una vez creado el rol las instancias deben lanzarse utilizando dicho rol. Para comprobar que el rol se encuentra aplicado a la instancia correctamente podemos hacer lo siguiente:

[ec2-user@ip-172-31-20-132 ~]$ curl http://169.254.169.254/latest/meta-data/iam/security-credentials/
EC2-BackupRole

[ec2-user@ip-172-31-20-132 ~]$

Se puede ver que el role EC2-BackupRole se encuentra asociado a la instancia. Para comprobar la autorización podemos, por ejemplo, describir el volumen del que tomaremos el snapshot:

[ec2-user@ip-172-31-20-132 ~]$ aws ec2 describe-instances --instance-ids i-8161a338  --query 'Reservations[0].Instances[0].BlockDeviceMappings[?DeviceName==`/dev/sdb`]' --output json
[
    {
        "DeviceName": "/dev/sdb",
        "Ebs": {
            "Status": "attached",
            "DeleteOnTermination": false,
            "VolumeId": "vol-e3490220",
            "AttachTime": "2015-11-14T10:28:41.000Z"
        }
    }
]
[ec2-user@ip-172-31-20-132 ~]$


Script para la creación de los snapshots


Una vez solucionada la parte de la autorización con IAM, sólo queda escribir el script que cree los snapshots. Los siguientes puntos se tendrán en cuenta:
  • El script debe crear un snapshot del volumen /dev/sdb, o cualquiera sea el volumen en cuestión.
  • El snapshot debe ser consistente. Por lo tanto debe detener las operaciones de escritura.
  • Se debe poder definir un timeout que permita recuperar las operaciones de escritura en caso de que la creación del snapshot demore demasiado tiempo. Por supuesto, esto pone en riesgo la integridad del snapshot, pero garantiza que se conocerá el tiempo máximo que el servicio se encontrará degradado (sin posibilidades de escribir).
A continuación el script:
#!/bin/bash

VOLUME='/dev/sdb'
MOUNT='/mnt'
LOGS=/var/log/backups.log
DONE=0
TIMEOUT=300
TIMEDOUT=0
SLEEP=30
INSTANCEID=`curl http://169.254.169.254/latest/meta-data/instance-id 2>/dev/null`
REGION=`curl http://169.254.169.254/latest/dynamic/instance-identity/document 2>/dev/null | grep region | awk -F\" '{print $4}'`
VOLUMEID=`aws ec2 describe-instances --instance-ids $INSTANCEID --region $REGION --query "Reservations[0].Instances[0].BlockDeviceMappings[?DeviceName=='$VOLUME'].Ebs.{ID:VolumeId}" --output text`
DESCRIPTION="$INSTANCEID-$VOLUMEID-$(date +%F)"

echo "$(date) Iniciando backup de: $INSTANCEID $REGION $VOLUMEID"

#Detener los servicios que quieras detener aqui

###

sync
xfs_freeze -f $MOUNT
echo "$(date) Escrituras detenidas."
SNAPSHOTID=`aws ec2 create-snapshot --volume-id $VOLUMEID --region $REGION --description $DESCRIPTION --query '{ID:SnapshotId}' --output text`
OUT=$?
if [ $OUT -ne 0 ]; then
        echo "$(date) La creacion del snapshot fallo."
        xfs_freeze -u $MOUNT
        echo "$(date) Escrituras reestablecidas."
        exit
fi
while [ $DONE = "0" ]; do
        PROGRESS=`aws ec2 describe-snapshots --snapshot-id $SNAPSHOTID --region $REGION --query 'Snapshots[0].{Progress:Progress}' --output text`
        OUT=$?
        if [ $OUT -ne 0 ]; then
                echo "$(date) Snapshot $SNAPSHOTID aun no esta disponible."
                sleep $SLEEP
                TIMEOUT=`echo "$TIMEOUT-$SLEEP" | bc`
        else
                if [ $PROGRESS = "100%" ]; then
                        DONE="1"
                        echo "$(date) Snapshot $SNAPSHOTID listo"
    else
                        echo "$(date) Snapshot $SNAPSHOTID $PROGRESS"
                        sleep $SLEEP
                        TIMEOUT=`echo "$TIMEOUT-$SLEEP" | bc`
                fi
        fi
        if [ $TIMEOUT -le 0 ]; then
                DONE="1"
                TIMEDOUT="1"
        fi
done
xfs_freeze -u $MOUNT
echo "$(date) Escrituras reestablecidas."
if [ $TIMEDOUT = "1" ]; then
        echo "$(date) Snapshot $SNAPSHOTID timed out!!! Podria ser inconsistente"
else
        echo "$(date) Snapshot $SNAPSHOTID terminado exitosamente"
fi

Prueba 1: Primer snapshot


Dada la naturaleza incremental de los snapshots, mientras mas bloques "Sucios" haya por copiar mas va a demorar el snapshot. Esto se hace mas evidente generalmente en el primer snapshot que se tome de un volumen.

Lanzamos una escritura aleatoria en background de unos 12GB de la siguiente manera

[ec2-user@ip-172-31-20-132 ~]$ sudo dd if=/dev/urandom of=/mnt/archivo_borrar bs=1M count=12000 &
[2] 4783

[ec2-user@ip-172-31-20-132 ~]$ 

cuando llevan escritos unos 8GB

[ec2-user@ip-172-31-20-132 ~]$ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/xvda1      7.8G  1.1G  6.6G  15% /
devtmpfs        3.9G   60K  3.9G   1% /dev
tmpfs           3.9G     0  3.9G   0% /dev/shm
/dev/xvdb        99G  8.4G   85G   9% /mnt
[ec2-user@ip-172-31-20-132 ~]$


lanzamos el snapshot

[ec2-user@ip-172-31-20-132 ~]$ sudo ./backups.sh
Sat Nov 14 17:13:24 UTC 2015 Iniciando backup de: i-8161a338 eu-west-1 vol-e3490220
Sat Nov 14 17:13:26 UTC 2015 Escrituras detenidas.
Sat Nov 14 17:13:26 UTC 2015 Snapshot snap-27582071 0%
Sat Nov 14 17:13:57 UTC 2015 Snapshot snap-27582071 0%
Sat Nov 14 17:14:27 UTC 2015 Snapshot snap-27582071 0%
Sat Nov 14 17:14:58 UTC 2015 Snapshot snap-27582071 0%
Sat Nov 14 17:15:28 UTC 2015 Snapshot snap-27582071 0%
Sat Nov 14 17:15:58 UTC 2015 Snapshot snap-27582071 0%
Sat Nov 14 17:16:29 UTC 2015 Snapshot snap-27582071 0%
Sat Nov 14 17:16:59 UTC 2015 Snapshot snap-27582071 0%
Sat Nov 14 17:17:30 UTC 2015 Snapshot snap-27582071 0%
Sat Nov 14 17:18:00 UTC 2015 Snapshot snap-27582071 0%
Sat Nov 14 17:18:30 UTC 2015 Escrituras reestablecidas.
Sat Nov 14 17:18:30 UTC 2015 Snapshot snap-27582071 timed out!!! Podria ser inconsistente
[ec2-user@ip-172-31-20-132 ~]$


este primer snapshot no pudo terminar en el lapso de los 300 segundos, por lo tanto podría tratarse de un snapshot inconsistente.

Poco antes de lanzar la creación del snapshot, en una segunda consola puse a correr iostat para ver el comportamiento de las operaciones de escritura, aquí están los resultados:

[ec2-user@ip-172-31-20-132 ~]$ sudo iostat -x -d /dev/xvdb 5 30
Linux 4.1.10-17.31.amzn1.x86_64 (ip-172-31-20-132)      11/14/2015      _x86_64_        (2 CPU)

Device:         rrqm/s   wrqm/s     r/s     w/s   rsec/s   wsec/s avgrq-sz avgqu-sz   await  svctm  %util
xvdb              0.00    10.24    0.12   78.65     1.00 20046.09   254.48     9.79  124.28   0.92   7.27

Device:         rrqm/s   wrqm/s     r/s     w/s   rsec/s   wsec/s avgrq-sz avgqu-sz   await  svctm  %util
xvdb              0.00     1.60    0.00  637.40     0.00 163038.40   255.79    84.64  132.79   0.95  60.24

Device:         rrqm/s   wrqm/s     r/s     w/s   rsec/s   wsec/s avgrq-sz avgqu-sz   await  svctm  %util
xvdb              0.00     0.20    0.00    0.40     0.00     4.80    12.00     0.00    0.00   0.00   0.00

Device:         rrqm/s   wrqm/s     r/s     w/s   rsec/s   wsec/s avgrq-sz avgqu-sz   await  svctm  %util
xvdb              0.00     0.20    0.00   54.80     0.00 13931.20   254.22     4.92   55.08   0.64   3.52

Device:         rrqm/s   wrqm/s     r/s     w/s   rsec/s   wsec/s avgrq-sz avgqu-sz   await  svctm  %util
xvdb              0.00     2.40    0.00  171.60     0.00 43056.00   250.91    21.20  134.67   0.95  16.32

Device:         rrqm/s   wrqm/s     r/s     w/s   rsec/s   wsec/s avgrq-sz avgqu-sz   await  svctm  %util
xvdb              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00

Device:         rrqm/s   wrqm/s     r/s     w/s   rsec/s   wsec/s avgrq-sz avgqu-sz   await  svctm  %util
xvdb              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00

Device:         rrqm/s   wrqm/s     r/s     w/s   rsec/s   wsec/s avgrq-sz avgqu-sz   await  svctm  %util
xvdb              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00

...

Device:         rrqm/s   wrqm/s     r/s     w/s   rsec/s   wsec/s avgrq-sz avgqu-sz   await  svctm  %util
xvdb              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00

Device:         rrqm/s   wrqm/s     r/s     w/s   rsec/s   wsec/s avgrq-sz avgqu-sz   await  svctm  %util
xvdb              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00

Device:         rrqm/s   wrqm/s     r/s     w/s   rsec/s   wsec/s avgrq-sz avgqu-sz   await  svctm  %util
xvdb              0.00     0.00    0.00    0.20     0.00     1.60     8.00     0.00    0.00   0.00   0.00


Device:         rrqm/s   wrqm/s     r/s     w/s   rsec/s   wsec/s avgrq-sz avgqu-sz   await  svctm  %util
xvdb              0.00     0.80    0.00  101.40     0.00 25816.00   254.60     7.65   75.46   0.78   7.92


Device:         rrqm/s   wrqm/s     r/s     w/s   rsec/s   wsec/s avgrq-sz avgqu-sz   await  svctm  %util
xvdb              0.00     0.80    0.00    0.40     0.00     9.60    24.00     0.00    0.00   0.00   0.00

Device:         rrqm/s   wrqm/s     r/s     w/s   rsec/s   wsec/s avgrq-sz avgqu-sz   await  svctm  %util
xvdb              0.00     0.20    0.00    0.40     0.00     4.80    12.00     0.00    0.00   0.00   0.00

^C[ec2-user@ip-172-31-20-132 ~]$


se puede ver la linea en negrita (azul), como a partir de ese punto no hay mas operaciones de escritura sobre el disco. Los altos valores de escrituras en ese momento se deben a las operaciones sync y xfs_freeze. Las operaciones de escritura se re establecen mas adelante (también en negrita, roja) cuando el timeout se cumple en el script.

Prueba 2: Segundo snapshot


El segundo snapshot termina antes del timeout, por lo que se lo puede considerar aboslutamente consistente.

[ec2-user@ip-172-31-20-132 ~]$ sudo ./backups.sh
Sat Nov 14 18:14:26 UTC 2015 Iniciando backup de: i-8161a338 eu-west-1 vol-e3490220
Sat Nov 14 18:14:26 UTC 2015 Escrituras detenidas.
Sat Nov 14 18:14:27 UTC 2015 Snapshot snap-39405312 0%
Sat Nov 14 18:14:57 UTC 2015 Snapshot snap-39405312 0%
Sat Nov 14 18:15:27 UTC 2015 Snapshot snap-39405312 0%
Sat Nov 14 18:15:58 UTC 2015 Snapshot snap-39405312 0%
Sat Nov 14 18:16:28 UTC 2015 Snapshot snap-39405312 0%
Sat Nov 14 18:16:59 UTC 2015 Snapshot snap-39405312 0%
Sat Nov 14 18:17:29 UTC 2015 Snapshot snap-39405312 listo
Sat Nov 14 18:17:29 UTC 2015 Escrituras reestablecidas.
Sat Nov 14 18:17:29 UTC 2015 Snapshot snap-39405312 terminado exitosamente
[ec2-user@ip-172-31-20-132 ~]$
 

Resumen


Esto es una simple prueba de concepto y no fue realmente probado en ambientes de producción. Desde mis pruebas puedo decir que dd (el proceso bloqueado por xfs_freeze) no sufrió mas que el bloqueo que era de esperarse, posiblemente esto no sea tan factible en una partición donde trabaja una BD que realiza muchos inserts por ejemplo. El script podría lanzarse sencillamente desde un cronjob y tendriamos todo automatizado y aceitado!!!

domingo, 4 de octubre de 2015

Cómo convertir de MBR a GPT nuestro disco y no morir en el intento!

Este post es un poco la continuación de ¿MBR o GPT? deep dive pero ahora voy a mostrar de qué manera se puede convertir un volumen root de MBR a GPT sin morir en el intento. Para hacer esto voy a utilizar dos instancias EC2 corriendo Ubuntu 14.04 LTS.

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).
Si se acuerdan, GPT utliza bastante mas espacio que el sistema convencional de particiones, por lo tanto es importante saber que se cuenta con ese espacio disponible. Habiendo confirmado que todo está en orden para continuar, lancé shutdown a la instancia para comenzar.

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 type
ubuntu@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!!!