Opa, acho que criei um pouco de confusão sem querer, então vou esclarecer um pouco:

O Valor 0xAA55 na posição 510 do disco, é utilizado pela BIOS para identificar uma partição de boot válida. Como a bios não "boota" partições, e sim procura pelos MBR dos discos na ordem configurada no SETUP, esse valor 0xAA55 deve se encontrar na MBR de um disco. Já a Flag "Bootavel", aquela que voce pode marcar com o cfdisk por exemplo, não é utilizada pela BIOS (Até onde eu sei) o grub e lilo ignoram ela. O Boot loader do Windows utiliza essa FLAG para saber qual partição carregar, em alguns casos, considera a partição com essa flag a partição ativa "C:"

Resumindo:
0xAA55 na posição 510 do MBR identifica o registro como um boot válido para BIOS. Boot Flag: Uma flag dentro da MBR identificando a partição como bootavel e utilizado somente por alguns boot loaders (do windows, etc).

Abraço


On 08/16/2010 03:00 PM, Ellington Santos wrote:
2010/8/16 Diego<[email protected]>:
Salvem camaradas, fiz um programinha em C pro amigo verificar se a a
partição contém a assinatura de boot, bem como corrigi-lá se necessário.
Lembrando que, para uma partição ser "bootavel" ela precisa conter a palavra
0xAA55 na posição 510 no primeiro registro do disco.

Segue o código:
Compilar com gcc -Wall bootsig.c -o bootsig
Rodar como root

/*
  * bootsig.c
  *
  * Verifica se a assinatura de boot do disco esta ok
  * Permite corrigir a assinatura do boot
  * Use somente em partições que devem ser bootaveis!
  *
  * Autor: aveng3r / irc.freenode.net / #slackware-br
  *
  */

#include<unistd.h>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<fcntl.h>
#include<sys/types.h>

static char *prog = "boot_sig";

static void help(void)
{
        fprintf(stderr, "\nUso: [-u] %s<particao>\n\n"
                        "exemplos:\n\t%s /dev/sda1   (Imprime a assinatura
atual)\n"
                        "\n\t%s -u /dev/sda1   (Regrava a assinatura de
boot)\n\n", prog, prog, prog);
        exit(1);
}

#define DIE(x) \
        do { \
                perror(x); \
                exit(1); \
        } while (0)

int main(int argc, char **argv)
{
        char *part;
        int fd;
        unsigned short boot_sig = 0;
        const unsigned short BOOT_SIGNATURE = 0xAA55;
        int update = 0;

        prog = *argv;

        if (argc<  2) {
                help();
        }

        if (strcmp(argv[1], "-u") == 0) {
                if (argc<  3) {
                        fprintf(stderr, "\nInforme a particao!\n");
                        help();
                }
                part = argv[2];
                update = 1;
        } else {
                part = argv[1];
        }

        if ((fd = open(part, O_RDWR))<  0) {
                DIE("open");
        }
        if (lseek(fd, 510, SEEK_SET) == (off_t)-1) {
                DIE("lseek");
        }
        if (update) {
                if (write(fd, (const void *)&BOOT_SIGNATURE, 2) != 2) {
                        DIE("write");
                }
                printf("Assinatura de boot atualizada com sucesso\n");
        } else {
                if (read(fd, (void *)&boot_sig, 2) != 2) {
                        DIE("read");
                }
                printf("Assinatura de boot atual = 0x%02X\n", boot_sig);
        }
        close(fd);

        return 0;
}

Demonstração de uso:

r...@dark:c# fdisk -l

Disk /dev/sda: 80.0 GB, 80026361856 bytes
255 heads, 63 sectors/track, 9729 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x13a313a3

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1        4438    35648203+   7  HPFS/NTFS
/dev/sda2   *        4439        4560      979965   83  Linux
/dev/sda3            4561        7235    21486937+  83  Linux
/dev/sda4            7236        9729    20033055    5  Extended
/dev/sda5            7236        9423    17575078+  83  Linux
/dev/sda6            9424        9729     2457913+  82  Linux swap
r...@dark:c# gcc bootsig.c -o bootsig
r...@dark:c# ./bootsig /dev/sda1
Assinatura de boot atual = 0xAA55
r...@dark:c# ./bootsig /dev/sda6
Assinatura de boot atual = 0x00
r...@dark:c# ./bootsig -u /dev/sda6
Assinatura de boot atualizada com sucesso
r...@dark:c# ./bootsig /dev/sda6
Assinatura de boot atual = 0xAA55

Abraço

On 08/16/2010 02:04 PM, Ellington Santos wrote:
2010/8/16 Isaac Filho<[email protected]>:

Tente usar o kernel huge.s. Ele já vem com os módulos necessários. o
hugesmp.s (que é o padrão) as vezes não funciona em máquinas antigas.


Opa necropresto,

Então, coloquei o huge.s, mas lá na hora de finalizar a instalação o lilo
retorna:

"Fatal: first sector of /des/sdb1 doesn't have a valid boot signature"

O curioso é que quando usei o cfdisk, eu intalei no /dev/sda1. Listando
via
fdisk -l, as opções eram: sda1, sdb1, sdc1.

Vou dar boot pelo cd e tentar mexer no lilo, talvez o caminho da
instalação
tenha se perdido...

Abraço, yzak


--
GUS-BR - Grupo de Usuários de Slackware Brasil
http://www.slackwarebrasil.org/
http://groups.google.com/group/slack-users-br

Antes de perguntar:
http://www.istf.com.br/perguntas/

Para sair da lista envie um e-mail para:
[email protected]

Você não instalou o LILO na MBR?


--
GUS-BR - Grupo de Usuários de Slackware Brasil
http://www.slackwarebrasil.org/
http://groups.google.com/group/slack-users-br

Antes de perguntar:
http://www.istf.com.br/perguntas/

Para sair da lista envie um e-mail para:
[email protected]
Boa Diego!!!
Mas ainda é necessário marcar essa flag?? Há anos que eu não faço mais isso.


--
GUS-BR - Grupo de Usuários de Slackware Brasil
http://www.slackwarebrasil.org/
http://groups.google.com/group/slack-users-br

Antes de perguntar:
http://www.istf.com.br/perguntas/

Para sair da lista envie um e-mail para:
[email protected]

Responder a