* Imagenes de instalación de las versiones estables para Mageia y OpenMandriva.

OpenMandriva: Mageia (Mageia 9) 20/Agosto/2023 - Anuncio, Descargas.

Blogdrake recomienda descargar las imágenes de instalación (iso) vía torrent para evitar corrupción de datos, aprovechar mejor su ancho de banda y mejorar la difusión de las distribuciones.

Respaldar/Restaurar MBR

Hola BlogDrakers, Bueno, aquí con mi primera aportación a este foro.


#!/bin/bash

# Objetivo: Crear y Restaurar respaldo del mbr de arranque, si se ejecuta
# el script sin parametros modificadores (-f, -r), se genera el
# archivo {archivoRespaldoMBR} de 512 bytes con un respaldo del
# mbr del dispositivo sda (valido para la gran mayoria).
# Sintaxis: mbrbackup [-r|-f] {archivoRespaldoMBR} [Dispositivo del mbr]
# Parametros:
# -r Restaurar mbr sin tabla de particiones
# -f Restaurar mbr completo (incluye tabla de particiones)
#
# Estructura del MBR
#
# |----Boot Loader 446 bytes----|-Partition Table 64 bytes-|-Magic Number 2 bytes-|
#

shortName=$(basename $0)

# Objetivo: Informar de la utilización del script y errores
# Parametros:
# $1 Mensaje de error
# $2 Código de salida
function help ()
{
echo "Error: $1" > /dev/stderr
echo "" > /dev/stderr
echo "Objetivo: Crear y Restaurar respaldo del mbr de arranque, si se" > /dev/stderr
echo " ejecuta el script sin parametros modificadores (-f, -r), se" > /dev/stderr
echo " genera el archivo {archivoRespaldoMBR} de 512 bytes con un" > /dev/stderr
echo " respaldo del mbr del dispositivo sda (valido para la gran" > /dev/stderr
echo " mayoria)." > /dev/stderr
echo "Sintaxis: $shortName [-r|-f] {archivoRespaldoMBR} [Dispositivo del mbr]" > /dev/stderr
echo "Parametros:" > /dev/stderr
echo "-r Restaurar mbr sin incluir la tabla de particiones" > /dev/stderr
echo "-f Restaurar mbr completo (incluye tabla de particiones)" > /dev/stderr
exit $2
}

if [ "$UID" != "0" ]; then
help "Privilegios de root requeridos para la ejecución del presente script ($shortName)" 1
fi

# inicialmente asumimos que habra proceso de respaldo
toDo=respalda
bsP=512
countP=1

# verificamos primero que sea un FULL restore, si se incluyen ambos (-f y -r),
# encontrara de segundo la restauración exclusiva del mbr sin particiones,
# mas seguro que primero vrificar -r
if [ "[$1]" == "[-f]" ]; then
# restauramos TODO el mbr
toDo=restaura
bsP=512
countP=1
shift
fi

if [ "[$1]" == "[-r]" ]; then
# restauramos solo los primeros 466 bytes
toDo=restaura
bsP=466
countP=1
shift
fi

if [ "[$1]" == "[]" ]; then
help "Nombre de archivo de respaldo del mbr faltante " 2
fi

diskDevice=${2:-'/dev/sda'}

if [ "$toDo" == "respalda" ]; then
if [ -f "$1" ]; then
help "Archivo de respaldo del mbr existente, no se sobreescribira" 3
fi

dd if=$diskDevice of=$1 bs=$bsP count=$countP
else
if [ ! -f "$1" ]; then
help "Archivo de respaldo del mbr NO existente" 4
fi
dd if=$1 of=$diskDevice bs=$bsP count=$countP
fi

## VERA

Como algunos por aquí, cada cierto tiempo (o simplemente por curiosidad) me gusta probar otras distros en mi segundo disco, donde tengo instalado mi mdv, bueno, debido a eso tengo 20 GB libres al final de dicho disco, y también como algunos, me lanzo (valientemente ¿o será inconscientemente (por no decir lo que pense :P)?) e instalo en los 20 gb libres y paff, al final de instalar y todo, la nueva distro destruyo mi mbr (una vez mas) y mi arranque de grub, desde donde inicio el guindous (instalado por desgracia y por razones de trabajo), mi mdv y algunas cosas ahí medio raras que tengo :P, y bueno, pus a buscar el cd de supergrub y pelear un rato para arreglar la cosa y que quede resuelto todo, claro, no sin el miedo de romper algo extra (creo que ese miedo es como el de los actores de salir a escena, nunca se quita), pues bueno cansado de ese reparar, cree un script que respalda y restaura mi mbr en un tris, lo dejo para los "valientes" (y novatos, que no faltaran) que como yo que confían en arreglar siempre bien sin respaldos ni nada :P . Gracias anticipadas por las correcciones. Vicx,

Opciones de visualización de comentarios

Seleccione la forma que desee de mostrar los comentarios y haga clic en «Guardar opciones» para activar los cambios.


Gravatar de katnatek

# 113048 Interesante aportación espero

Interesante aportación espero no tener que usarla :)



Gravatar de kapyderi

# 113243 Una pregunta....

Una pregunta porque me parece interesante para incluir algo parecido en RecoverDrake, ya que lo tenia previsto, pero no sabia por donde empezar.

Porque coges los 512 o 466 bts primeros de la unidad sda?. Me refiero que 512 es lo que ocupa el arranque, pero ¿ porque 466 ?

Comentas...

Saludos!!!!

Linux es como el Barça...lo tiene todo para ser el número uno
Registered Linux user #472290
MiniBOFH 2008 - MediumBOFH - KapyBOFH - Utiliza RecoverDrake!! (Proyecto Derix)



Gravatar de Vicx

# 113260 Ok, Los primeros 512 bytes

Ok,

Los primeros 512 bytes del sector de arranque se conforman así:

|----Cargador de arranque 446 bytes----|-Tabla de Particiones 64 bytes-|-Número Mágico 2 bytes-|

Como se ve, el cargador de arranque se encuentran en los primeros 466 bytes, en los siguientes 64 bytes se encuentra la tabla de particiones del disco, y al final 2 bytes de firma del mbr (0xAA55).

el script te permite elegir que restaurar, por ejemplo, respaldas tu mbr (siempre se respalda los 512 bytes) y posteriormente, un mes después, creas una partición nueva en un espacio sin asignar que tenias en el disco, si haces una restauración completa (-f = full), adiós a tu nueva partición y lo que hayas guardado ahí.

El script en sí, es no destructivo, mientras no le digas en especifico con un parámetro, no hará nada destructivo (restaurar), y si no especificas que quieres una restauración completa, solo te restaurara el cargador de arranque y tu tabla de particiones permanecerá intacta.

Espero que esto ayude, y no dudes en preguntar o corregir ;).

suerte, siempre la necesitamos.

Vicx.



Gravatar de kapyderi

# 113495 Gracias...

Ya esta implementado en RecoverDrake.

Este es el codigo...

void recoverdrake::on_actionSalvaguardar_Grub_de_arranque_triggered()
{
    int respuesta = 0;
    int respuesta1 =0;
    bool ok;



    respuesta = QMessageBox::question(this, tr("Backup del MBR del Grub"),
                           tr("<center><b>Backup del MBR del Grub</b></center><p>"



                           "El master boot record (MBR) es el primer sector (\"sector cero\") de un dispositivo "
                           "de almacenamiento de datos, como un disco duro. A veces, se emplea para el arranque "
                           "del sistema operativo instalando en el un cargador bootstrap, otras veces es usado "
                           "para almacenar una tabla de particiones.<p>"



                           "<B>GUARDE LOS FICHEROS GENERADOS EN UN LUGAR SEGURO.<P>"
                           "SERAN DOS FICHEROS; UNO CON EL NOMBRE QUE HAYAS ELEGIDO Y CON EXTENSION .MBR "
                           "Y EL OTRO FIJO, DENOMINADO: tabla-particiones.sf<B><P>"



                           "<B>NOTA: Debe esperar a que termine completamente el "
                           "proceso seleccionado, el cual le sera notificado "
                           "cuando finalice, en la consola de procesos.</B><p>"



                           "&iquest;Realizar Backup de MBR del Grub?"), QMessageBox::Ok, QMessageBox::No);



    if (respuesta == QMessageBox::Ok){
            QString path="/home/%1/Documentos/";
            path=path.arg(user);



            QString texto = QInputDialog::getText(this, tr("Disco con sector de arranque"),
            tr("Introduzca el nombre de disco <b>ORIGEN</b>.<P> "



                "<FONT COLOR=\"RED\">Ejemplo:<p>"



                "<FONT COLOR=\"RED\">sda<p>"),
                QLineEdit::Normal,
                "sda",
                &ok);
                if (ok && !texto.isEmpty()){



                    respuesta1 = QMessageBox::question(this, tr("Tabla de particiones"),
                                           tr("<center><b>Tabla de particiones</b></center><p>"



                                           "Tambien puede hacer una backup de la tabla de particiones, ademas del "
                                           "MBR del Grub.<p>"



                                           "&iquest;Realizar Backup de la tabla de particiones?"), QMessageBox::Ok, QMessageBox::No);



                    if (respuesta1 == QMessageBox::Ok){



                        QString fileNameDirectori = QFileDialog::getExistingDirectory(this,tr("Donde guardar los ficheros .mbr y .sf?"),path,QFileDialog::ShowDirsOnly);
                        if (fileNameDirectori.isEmpty())
                            return;



                        QString cm ="echo Realizando backup del MBR...";
                        QString cmd = "dd if=/dev/%1 of=%2/RecoverMBR.mbr bs=512 count=1";
                        QString cmd1 = "echo Creando tabla de particiones...";
                        system("sfdisk -d /dev/'"+texto+"' > '"+fileNameDirectori+"'/tabla-particiones.sf");
                        cmd = cmd.arg(texto).arg(fileNameDirectori);
                        QStringList comandos;
                        comandos<< cm << cmd << cmd1;



                        if (mib != 0)
                            delete mib;
                        mib = new DrakeProcesos(comandos, this);
                        connect(mib, SIGNAL(publicarDatos(QString)), this, SLOT(mibEscribir(QString)));
                        connect(mib, SIGNAL(finProceso()), this, SLOT(mibFin()));
                        mib->iniciarProceso();}
                    else
                    {
                        QString fileNameDirectori = QFileDialog::getExistingDirectory(this,tr("Donde guardar los ficheros .mbr y .sf?"),path,QFileDialog::ShowDirsOnly);
                        if (fileNameDirectori.isEmpty())
                            return;



                        QString cm ="echo Realizando backup del MBR...";
                        QString cmd = "dd if=/dev/%1 of=%2/RecoverMBR.mbr bs=512 count=1";
                        cmd = cmd.arg(texto).arg(fileNameDirectori);
                        QStringList comandos;
                        comandos<< cm << cmd;



                        if (mib != 0)
                            delete mib;
                        mib = new DrakeProcesos(comandos, this);
                        connect(mib, SIGNAL(publicarDatos(QString)), this, SLOT(mibEscribir(QString)));
                        connect(mib, SIGNAL(finProceso()), this, SLOT(mibFin()));
                        mib->iniciarProceso();}
                    }
              }
              return;
}

void recoverdrake::on_actionRecuperar_Grub_de_arranque_triggered()

{
    int respuesta = 0;
    int respuesta1 = 0;
    int respuesta2 = 0;
    bool ok;



    respuesta = QMessageBox::question(this, tr("Recuperar del MBR del Grub"),
                           tr("<center><b>Recuperar del MBR del Grub</b></center><p>"



                           "Con esta opcion recuperamos el master boot record (MBR) es el primer sector (\"sector cero\") de un dispositivo "
                           "de almacenamiento de datos, como un disco duro.<p>"



                           "<B>NOTA: Debe esperar a que termine completamente el "
                           "proceso seleccionado, el cual le sera notificado "
                           "cuando finalice, en la consola de procesos.</B><p>"



                           "&iquest;Realizar recuperacion de MBR del Grub?"), QMessageBox::Ok, QMessageBox::No);



    if (respuesta == QMessageBox::Ok)
    {
            QString path="/home/%1/Documentos/";
            path=path.arg(user);



            QString texto = QInputDialog::getText(this, tr("Disco destino con sector de arranque"),
            tr("Introduzca el nombre de disco <b>DESTINO</b>.<P> "



                "<FONT COLOR=\"RED\">Ejemplo:<p>"



                "<FONT COLOR=\"RED\">sda<p>"),
                QLineEdit::Normal,
                "sda",
                &ok);
                if (ok && !texto.isEmpty())
                {



                    respuesta1 = QMessageBox::question(this, tr("Tabla de particiones"),
                                           tr("<center><b>Tabla de particiones</b></center><p>"



                                           "Tambien puedes recuperar la tabla de particiones, ademas del "
                                           "MBR del Grub.<p>"



                                           "Si elige esta opcion, se abrira diskdrake, para comprobar fisicamente "
                                           "que las unidades que se tienen en el fichero tabla-particiones.sf, "
                                           "corresponden realmente con las que hay fisicamente, ya que de no ser asi "
                                           "NO deberia utilizar esta recuperacion, ya que los resultados pueden ser "
                                           "fatales.<p>"



                                           "&iquest;Realizar recuperacion de la tabla de particiones?"), QMessageBox::Ok, QMessageBox::No);



                    if (respuesta1 == QMessageBox::Ok)
                    {
                        system("diskdrake");
                        QString fileNameSf = QFileDialog::getOpenFileName(this,tr("Abrir copia de pariticiones"),
                                            path,trUtf8("Fichero de particiones .sf (*.sf)"));
                        if (fileNameSf.isEmpty())
                            return;
                        system("kwrite '"+fileNameSf+"'");
                        respuesta2 =QMessageBox::question(this, tr("Tabla de particiones"),
                                                          tr("<center><b>Tabla de particiones</b></center><p>"



                                                          "Si las particiones definidas en diskdrake son iguales a las que "
                                                          "hay en el fichero de recuperacion de la tabla de particiones, "
                                                          "denominado tabla-particiones.sf, puede continuar sin ningun "
                                                          "sobresalto.<p>"



                                                          "&iquest;Son correctas las particiones?"), QMessageBox::Ok, QMessageBox::No);



                                   if (respuesta2 == QMessageBox::Ok)
                                   {
                                        QString fileNameOrigen = QFileDialog::getOpenFileName(this,tr("Abrir copia de seguridad del MBR"),
                                                            path,trUtf8("Fichero seguridad MBR .mbr (*.mbr)"));
                                        if (fileNameOrigen.isEmpty())
                                            return;



                                        QString fileNameOrigen1 = QFileDialog::getOpenFileName(this,tr("Abrir copia de pariticiones"),
                                                            path,trUtf8("Fichero de particiones .sf (*.sf)"));
                                        if (fileNameOrigen1.isEmpty())
                                            return;



                                         QString cm = "echo Restaurando MBR del Grub...";
                                         QString cmd = "dd if=%1 of=/dev/%2 bs=512 count=1";
                                         QString cmd1 = "echo Restaurando tabla de particiones...";
                                         system("sfdisk /dev/'"+texto+"' < '"+fileNameOrigen1+"'/tabla-particiones.sf");
                                         cmd = cmd.arg(fileNameOrigen).arg(texto);
                                         QStringList comandos;
                                         comandos<< cm << cmd << cmd1;



                                         if (mib != 0)
                                             delete mib;
                                         mib = new DrakeProcesos(comandos, this);
                                         connect(mib, SIGNAL(publicarDatos(QString)), this, SLOT(mibEscribir(QString)));
                                         connect(mib, SIGNAL(finProceso()), this, SLOT(mibFin()));
                                         mib->iniciarProceso();
                                   }
                                   else
                                   {
                                        QString fileNameOrigen = QFileDialog::getOpenFileName(this,tr("Abrir copia de seguridad del MBR"),
                                                            path,trUtf8("Fichero seguridad MBR .mbr (*.mbr)"));
                                        if (fileNameOrigen.isEmpty())
                                            return;



                                        QString cm = "echo Restaurando MBR del Grub...";
                                        QString cmd = "dd if=%1 of=/dev/%2 bs=512 count=1";
                                        cmd = cmd.arg(fileNameOrigen).arg(texto);
                                        QStringList comandos;
                                        comandos<< cm << cmd;



                                        if (mib != 0)
                                            delete mib;
                                        mib = new DrakeProcesos(comandos, this);
                                        connect(mib, SIGNAL(publicarDatos(QString)), this, SLOT(mibEscribir(QString)));
                                        connect(mib, SIGNAL(finProceso()), this, SLOT(mibFin()));
                                        mib->iniciarProceso();
                                   }
                                   return;
                    }
                    else
                    {
                           QString fileNameOrigen = QFileDialog::getOpenFileName(this,tr("Abrir copia de seguridad del MBR"),
                                                    path,trUtf8("Fichero seguridad MBR .mbr (*.mbr)"));
                           if (fileNameOrigen.isEmpty())
                                return;



                           QString cm = "echo Restaurando MBR del Grub...";
                           QString cmd = "dd if=%1 of=/dev/%2 bs=512 count=1";
                           cmd = cmd.arg(fileNameOrigen).arg(texto);
                           QStringList comandos;
                           comandos<< cm << cmd;



                           if (mib != 0)
                               delete mib;
                           mib = new DrakeProcesos(comandos, this);
                           connect(mib, SIGNAL(publicarDatos(QString)), this, SLOT(mibEscribir(QString)));
                           connect(mib, SIGNAL(finProceso()), this, SLOT(mibFin()));
                           mib->iniciarProceso();
                    }
                    return;
                }
                return;
    }
    return;
}

Saludos y gracias por la explicación!!!!

Linux es como el Barça...lo tiene todo para ser el número uno
Registered Linux user #472290
MiniBOFH 2008 - MediumBOFH - KapyBOFH - Utiliza RecoverDrake!! (Proyecto Derix)

Opciones de visualización de comentarios

Seleccione la forma que desee de mostrar los comentarios y haga clic en «Guardar opciones» para activar los cambios.