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
#!/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
- Entra a tu cuenta o crea una para poder comentar.
# 113048 Interesante aportación espero
Interesante aportación espero no tener que usarla :)
¿lo usas?, ¿la lees?, ¿las conoces?,Herramienta útil
# 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!!!!
Registered Linux user #472290
MiniBOFH 2008 - MediumBOFH - KapyBOFH - Utiliza RecoverDrake!! (Proyecto Derix)
Usuario
# 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.
# 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>"
"¿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>"
"¿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>"
"¿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>"
"¿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>"
"¿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!!!!
Registered Linux user #472290
MiniBOFH 2008 - MediumBOFH - KapyBOFH - Utiliza RecoverDrake!! (Proyecto Derix)