GPT是EFI的一部分,为保护GPT不受MBR类磁盘管理软件的危害,GPT在主引导扇区建立了一个保护分区的MBR分区表,这种分区的类型标识为0xEE。它可以让MBR类磁盘管理软件把gpt看成一个未知格式的分区,而不是当成一个未分区的磁盘。
基于上面的一段话,在用fdisk命令查看磁盘的时候,可以找到一般GPT 磁盘有"ee EFI GPT"的描述,因此可以search这样的关键字判断是否为GPT磁盘。一般在mount GPT HDD的时候会发生mount fail的情形,这个时候是拿不到dev_path的,但是可以拿到dev_name。因此下面的一段代码实现是用于查看GPT HDD的。
void get_gpt_flag(char * dev_name)
{
CHAR *ps_getgptcmd = NULL;
CHAR *ps_dev_path = NULL;
INT32 i4_gptret = 0;
CHAR uc_gpt_flag[32];
FILE *fp = NULL;
//init
c_memset(&uc_gpt_flag, 0, sizeof(CHAR)*32);
c_memset(&ps_dev_path, 0, sizeof(CHAR)*32);
c_memset(&ps_getgptcmd, 0, sizeof(CHAR)*64);
//get command fdisk -l /dev/sd*|grep "ee EFI GPT"|wc -l >/tmp/gpt.txt
c_strncpy(ps_dev_path, " /dev/", c_strlen(" /dev/")); //ERROR1
c_strncat(ps_dev_path, dev_name, c_strlen(dev_name));
c_strncpy(ps_getgptcmd, "fdisk -l", c_strlen("fdisk -l"));
c_strncat(ps_getgptcmd, ps_dev_path, c_strlen(ps_dev_path));
c_strncat(ps_getgptcmd, "|grep \"ee EFI GPT\"|wc -l >/tmp/gpt.txt", c_strlen("|grep \"ee EFI GPT\"|wc -l >/tmp/gpt.txt"));
fp = fopen("/tmp/gpt.txt", "wt+"); //ERROR2
i4_gptret = ipcd_exec(ps_getgptcmd, NULL);
//read gpt flag and then set it.
if ((0 ==i4_gptret) && (1 == fread(&uc_gpt_flag, sizeof(CHAR)*32, 1, fp)) )
{
//command exec ok and save result to uc_gpt_flag.
if (c_strncasecmp(&uc_gpt_flag[0], "1", 1) ==0)
set gpt flag TRUE here;
}
else
{
execute error;
}
//free memory
fclose(fp);
fp = NULL;
c_mem_free(ps_getgptcmd);
c_mem_free(ps_dev_path);
}