我有这个代码是一个项目源的一部分。 该代码findMBRtypes:GRUB或LILO,并相应地设置一个标志。
令人惊讶的是,在SLES 10-SP1(SUSE Linux Enterprise Server)中,无法确定。 /dev/sda1
是我的交换。 /dev/sda2
是包含MBR在内的整个目录。
相同的代码适用于SLES11等。 这里MBR_SIZE
被#defined
为0x1be
。
int lnxfsGetBootType(int pNumber) { int i, retval = -1, ccode; PartInfo *p = &cpuParts[pNumber]; char buffer[SECTOR_SIZE]; var64 offset = 0; isdLogFileOut(ZISD_LOG_DEVELOPER,"[lnxGBT]\n"); if (getenv("ZENDEVICE") || gUtilPart == 1) { offset = p->pOffset; // look at the partition BPB } //Now try to find the installed boot loader... lseek64(p->handle, (var64)offset, SEEK_SET); // either MBR or BPB ccode = read(p->handle, buffer, SECTOR_SIZE); for (i=0; i<MBR_SIZE-4;i++) { if (strncmp(&buffer[i], "LILO", 4) == 0) { if (offset == 0){ retval = FLAG_LNXFS_LILO; isdLogFileOut(ZISD_LOG_WARNING,"\tLILO MBR found on %s\n",p->header.deviceName); } else { retval = FLAG_LNXFS_LILO; // 10.31.06 _BPB; isdLogFileOut(ZISD_LOG_WARNING,"\tLILO BPB found on %s\n",p->header.deviceName); } } if (strncmp(&buffer[i], "GRUB", 4) == 0) { if (offset == 0){ retval = FLAG_LNXFS_GRUB; isdLogFileOut(ZISD_LOG_WARNING,"\tGRUB MBR found on %s\n",p->header.deviceName); } else { retval = FLAG_LNXFS_GRUB; // 10.31.06 _BPB; isdLogFileOut(ZISD_LOG_WARNING,"\tGRUB BPB found on %s\n",p->header.deviceName); } } } if (retval == -1) { isdLogFileOut(ZISD_LOG_WARNING,"\tLILO or GRUB mbr/bpb not found on %s\n",p->header.deviceName); } return retval; } // lnxfsGetBootType Here partinfo, is a struct of partition type: //Data structure used internally by the image engine to store information about the //partitions. It encapsulates the PartHeader struct, whcih is used to store partition //information in image archives typedef struct _PartInfo { PartHeader header; int handle; //file handle for reading/writing physical device var32 flags; //Various flags as needed. Defined above. var64 pOffset; //offset to partition from start of physical device int deviceNumber; //index into 'devices' where this partition's // physical device is located int archIndex; //for restoring only. Index into imgParts of the // archive partition this physical partition is // mapped to int bytesWritten; //track number of sectors written so the device-level // cache can be flushed void *info; //partition-type-specific info struct /* snip */
testing是在VMWare下使用不同的虚拟磁盘映像完成的。 我已经确认磁盘格式化为MBR而不是GPT。
我不确定你说的是什么意思。 如果你的观点是你的代码返回-1,你能告诉我们一个MBR的副本吗? 您可以使用此命令来捕获它:
sudo dd if=/dev/sda bs=512 count=1 | xxd
你提到你的MBR在/dev/sda2
。 这确实是非常不寻常的。 如果你的意思是这就是启动代码的安装位置,那就完全不同了。 MBR始终保存在磁盘的第一个扇区(假设它是DOS格式的MBR)。
我想这可能是一些失败案例中的问题是一个寻找失败或简短的阅读。 我做了一些调整,添加错误处理,并简化一点。
#define MBR_SIZE 0x1be int lnxfsGetBootType(int pNumber) { int retval = -1, ccode; PartInfo *p = &cpuParts[pNumber]; char buffer[SECTOR_SIZE]; off64_t offset = 0; void *plilo, *pgrub; const char *what = "MBR"; isdLogFileOut(ZISD_LOG_DEVELOPER,"[lnxGBT]\n"); if (getenv("ZENDEVICE") || gUtilPart == 1) { offset = p->pOffset; // look at the partition BPB what = "BPB"; } // Now try to find the installed boot loader... if (lseek64(p->handle, offset, SEEK_SET) == -1) { isdLogFileOut(ZISD_LOG_ERROR,"\tFailed to seek to %s: %s\n", what, strerror(errno)); return -1; } ccode = read(p->handle, buffer, SECTOR_SIZE); if (ccode != SECTOR_SIZE) { isdLogFileOut(ZISD_LOG_ERROR,"\tFailed to read BPB/MBR: %s\n", strerror(errno)); return -1; } plilo = memmem(buffer, ccode, "LILO", 4); pgrub = memmem(buffer, ccode, "GRUB", 4); if (plilo) { retval = FLAG_LNXFS_LILO; if (pgrub && pgrub < plilo) retval = FLAG_LNXFS_GRUB; } } else if (pgrub) { retval = FLAG_LNXFS_GRUB; } if (-1 == retval) { isdLogFileOut(ZISD_LOG_WARNING,"\tLILO or GRUB %s not found on %s\n", what, p->header.deviceName); } else { isdLogFileOut(ZISD_LOG_WARNING,"\t%s %s not found on %s\n", (retval == FLAG_LNXFS_GRUB ? "GRUB" : "LILO"), what, p->header.deviceName); } return retval; } // lnxfsGetBootType