Smart Boot Manager deinstallieren! Partitionstabelle

Hallo, ich bräuchte mal recht dringend eure Hilfe. [EDIT: Ok, schon erledigt. Siehe unten.]

Ich habe mir vorhin den Smart Boot Manager in den MBR installiert. Ich habe Ubuntu (auf der zweiten Platte). Funktioniert auch wunderbar, allerdings hat der wohl meine GPT (auf der ersten Platte) nicht erkannt und jetzt sind leider die Daten auf der Platte futsch, da ist anstelle der alten Partitionen jetzt eine schöne, große fat16-Partition. :D
Aber glücklicherweise habe ich ja die Backup-Funktion zuvor benutzt. Bloß leider kommt beim Zurückspielen die Meldung "Invalid backup file". Schade nech? :wink:

Den Quellcode dazu gibt es hier: http://btmgr.sourceforge.net/download.html
Ich kann leider kein Stück C, deshalb bin ich jetzt auf eure Hilfe angewiesen.

Was hat das Programm in der Funktion backup() gemacht? Kann ich die Backup-Datei evtl. mit dd wieder zurückspielen?
Wen's interessiert, die Backup-Datei ist genau 23357 Bytes groß.

Edit: Hier mal eben den Code, damit ihr ihn euch nicht extra runterladen müsst:
Code:
void
backup ()
{
  int devd, ksectors;

  if (bk_fp == NULL)
    return;

  printf("Backing up the data...\n");

#ifdef __linux__

  devd = open_blk_dev (inst_dev);
  lseek (devd, 0, SEEK_SET);

  if (read (devd, buf_ldr, SECTOR_SIZE) != SECTOR_SIZE)
    die ("read %s: %s", inst_dev, strerror (errno));

  if (fwrite (BACKUP_MAGIC, strlen(BACKUP_MAGIC), 1, bk_fp) < 1 ||
      fwrite (inst_dev, 20, 1, bk_fp) < 1 ||
      fwrite (buf_ldr, SECTOR_SIZE, 1, bk_fp) < 1 )
    die ("fwrite backup file error");

  lseek (devd, SECTOR_SIZE * KNL_LBA, SEEK_SET);
  if (read (devd, buf_knl, knl_tsize) != knl_tsize)
    die ("read %s: %s", inst_dev, strerror (errno));

  if (fwrite (&knl_tsize, sizeof (knl_tsize), 1, bk_fp) < 1 ||
      fwrite (buf_knl, knl_tsize, 1, bk_fp) < 1 )
    die ("fwrite backup file error");

  close_blk_dev (devd,inst_dev);

#else

  check_dev (inst_devid);

  disk_io (2, inst_devid, LDR_HEAD, LDR_CYL, LDR_SECT, buf_ldr, 1);

  if (fwrite (BACKUP_MAGIC, strlen (BACKUP_MAGIC), 1, bk_fp) < 1 ||
      fwrite (&inst_devid, sizeof (inst_devid), 1, bk_fp) < 1 ||
      fwrite (buf_ldr, SECTOR_SIZE, 1, bk_fp) < 1)
    die ("write backup file error");

  ksectors = (knl_tsize + SECTOR_SIZE - 1) / SECTOR_SIZE;
  disk_io (2, inst_devid, KNL_HEAD, KNL_CYL, KNL_SECT, buf_knl, ksectors);

  if (fwrite (&ksectors, sizeof (ksectors), 1, bk_fp) < 1 ||
      fwrite (buf_knl, ksectors * SECTOR_SIZE, 1, bk_fp) < 1)
    die ("write backup file error");

#endif

  fclose (bk_fp);
}

void
unistall ()
{
  int ks;
  int devd;
  char buf[20];
  char sect_buf[SECTOR_SIZE+1];

  if (!always_yes)
    {
      printf ("Are you sure you want to uninstall Smart BootManager [y/n]?");
      fgets (buf, 19, stdin);

      if (buf[0] != 'y')
	die ("Abort uninstallation.");
    }

  if (fread (buf, strlen(BACKUP_MAGIC), 1, ui_fp) < 1)
    die ("fread backup file error");
  if (strcmp (buf, BACKUP_MAGIC) != 0)
    die ("Invalid backup file");

#ifdef __linux__

  if (fread (inst_dev, 20, 1, ui_fp) < 1 ||
      fread (buf_ldr, SECTOR_SIZE, 1, ui_fp) < 1 ||
      fread (&ks, sizeof (ks), 1, ui_fp) < 1 ||
      fread (buf_knl, ks, 1, ui_fp) < 1 )
    die ("fread backup file error");

  devd = open_blk_dev (inst_dev);
  lseek (devd, 0, SEEK_SET);
  if (write (devd, buf_ldr, SIZE_OF_MBR) != SIZE_OF_MBR)
    die ("write %s: %s", inst_dev, strerror (errno));

  lseek (devd, SECTOR_SIZE * KNL_LBA, SEEK_SET);
  if (write (devd, buf_knl, ks) != ks)
    die ("write %s: %s", inst_dev, strerror (errno));
  close_blk_dev (devd,inst_dev);

#else

  if (fread (&inst_devid, sizeof (inst_devid), 1, ui_fp) < 1 ||
      fread (buf_ldr, SECTOR_SIZE, 1, ui_fp) < 1 ||
      fread (&ks, sizeof (ks), 1, ui_fp) < 1 ||
      fread (buf_knl, ks * 512, 1, ui_fp) < 1)
    die ("fread backup file error");

  check_dev (inst_devid);

/* Retain current partition table */
  disk_io (2, inst_devid, LDR_HEAD, LDR_CYL, LDR_SECT, sect_buf, 1);
  memcpy(sect_buf, buf_ldr, SIZE_OF_MBR);
  *((word *)(sect_buf + BR_FLAG_OFF))=BR_GOOD_FLAG;
  disk_io (3, inst_devid, LDR_HEAD, LDR_CYL, LDR_SECT, sect_buf, 1);
  disk_io (3, inst_devid, KNL_HEAD, KNL_CYL, KNL_SECT, buf_knl, ks);

#endif

  fclose(ui_fp);
}

Viele Grüße, Blackbird++

Edit2: Ich weiß übrigens noch genau, wie die Partitionstabelle aussah. GPT, 100GB frei, und der Rest TrueCrypt-Partition. Kann jetzt nicht einfach mit GParted das ganze "nachbauen", d.h. neue Partitionstabelle, leere Partition an der entsprechenden Stelle erstellen und das ganze mit TC mounten? Würde das gehen?

Edit3: Jaa! :D:thumb_up: Habs genau so gemacht, und es hat tatsächlich funktioniert, unglaublich!
Ok hat sich dann wohl von selbst erledigt. :) ("rofl")
 
Zuletzt bearbeitet:
Zurück
Oben