mirror of
https://github.com/ventoy/Ventoy.git
synced 2025-08-27 16:01:14 +00:00
add support for linux vdisk(vhd/vdi/raw)
This commit is contained in:
@@ -507,9 +507,18 @@ static int vtoydm_print_linear_table(const char *img_map_file, const char *diskn
|
||||
(sector_start << 2), disk_sector_num,
|
||||
diskname, (unsigned long long)chunk[i].disk_start_sector);
|
||||
#else
|
||||
printf("%u %u linear %s1 %llu\n",
|
||||
if (strstr(diskname, "nvme") || strstr(diskname, "mmc"))
|
||||
{
|
||||
printf("%u %u linear %sp1 %llu\n",
|
||||
(sector_start << 2), disk_sector_num,
|
||||
diskname, (unsigned long long)chunk[i].disk_start_sector - 2048);
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("%u %u linear %s1 %llu\n",
|
||||
(sector_start << 2), disk_sector_num,
|
||||
diskname, (unsigned long long)chunk[i].disk_start_sector - 2048);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
|
@@ -120,7 +120,9 @@ typedef struct ventoy_os_param
|
||||
|
||||
uint64_t vtoy_reserved[4]; // Internal use by ventoy
|
||||
|
||||
uint8_t reserved[31];
|
||||
uint8_t vtoy_disk_signature[4];
|
||||
|
||||
uint8_t reserved[27];
|
||||
}ventoy_os_param;
|
||||
|
||||
#pragma pack()
|
||||
@@ -218,6 +220,11 @@ static void vtoy_dump_os_param(ventoy_os_param *param)
|
||||
printf("param->vtoy_disk_guid = %02x %02x %02x %02x\n",
|
||||
param->vtoy_disk_guid[0], param->vtoy_disk_guid[1],
|
||||
param->vtoy_disk_guid[2], param->vtoy_disk_guid[3]);
|
||||
|
||||
printf("param->vtoy_disk_signature = %02x %02x %02x %02x\n",
|
||||
param->vtoy_disk_signature[0], param->vtoy_disk_signature[1],
|
||||
param->vtoy_disk_signature[2], param->vtoy_disk_signature[3]);
|
||||
|
||||
printf("param->vtoy_disk_size = %llu\n", (unsigned long long)param->vtoy_disk_size);
|
||||
printf("param->vtoy_disk_part_id = %u\n", param->vtoy_disk_part_id);
|
||||
printf("param->vtoy_disk_part_type = %u\n", param->vtoy_disk_part_type);
|
||||
@@ -231,7 +238,7 @@ static void vtoy_dump_os_param(ventoy_os_param *param)
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
static int vtoy_get_disk_guid(const char *diskname, uint8_t *vtguid)
|
||||
static int vtoy_get_disk_guid(const char *diskname, uint8_t *vtguid, uint8_t *vtsig)
|
||||
{
|
||||
int i = 0;
|
||||
int fd = 0;
|
||||
@@ -244,6 +251,9 @@ static int vtoy_get_disk_guid(const char *diskname, uint8_t *vtguid)
|
||||
{
|
||||
lseek(fd, 0x180, SEEK_SET);
|
||||
read(fd, vtguid, 16);
|
||||
|
||||
lseek(fd, 0x1b8, SEEK_SET);
|
||||
read(fd, vtsig, 4);
|
||||
close(fd);
|
||||
|
||||
debug("GUID for %s: <", devdisk);
|
||||
@@ -380,13 +390,14 @@ static int vtoy_find_disk_by_size(unsigned long long size, char *diskname)
|
||||
return rc;
|
||||
}
|
||||
|
||||
static int vtoy_find_disk_by_guid(uint8_t *guid, char *diskname)
|
||||
static int vtoy_find_disk_by_guid(ventoy_os_param *param, char *diskname)
|
||||
{
|
||||
int rc = 0;
|
||||
int count = 0;
|
||||
DIR* dir = NULL;
|
||||
struct dirent* p = NULL;
|
||||
uint8_t vtguid[16];
|
||||
uint8_t vtsig[16];
|
||||
|
||||
dir = opendir("/sys/block");
|
||||
if (!dir)
|
||||
@@ -403,8 +414,9 @@ static int vtoy_find_disk_by_guid(uint8_t *guid, char *diskname)
|
||||
}
|
||||
|
||||
memset(vtguid, 0, sizeof(vtguid));
|
||||
rc = vtoy_get_disk_guid(p->d_name, vtguid);
|
||||
if (rc == 0 && memcmp(vtguid, guid, 16) == 0)
|
||||
rc = vtoy_get_disk_guid(p->d_name, vtguid, vtsig);
|
||||
if (rc == 0 && memcmp(vtguid, param->vtoy_disk_guid, 16) == 0 &&
|
||||
memcmp(vtsig, param->vtoy_disk_signature, 4) == 0)
|
||||
{
|
||||
sprintf(diskname, "%s", p->d_name);
|
||||
count++;
|
||||
@@ -430,11 +442,11 @@ static int vtoy_print_os_param(ventoy_os_param *param, char *diskname)
|
||||
cnt = vtoy_find_disk_by_size(param->vtoy_disk_size, diskname);
|
||||
if (cnt > 1)
|
||||
{
|
||||
cnt = vtoy_find_disk_by_guid(param->vtoy_disk_guid, diskname);
|
||||
cnt = vtoy_find_disk_by_guid(param, diskname);
|
||||
}
|
||||
else if (cnt == 0)
|
||||
{
|
||||
cnt = vtoy_find_disk_by_guid(param->vtoy_disk_guid, diskname);
|
||||
cnt = vtoy_find_disk_by_guid(param, diskname);
|
||||
debug("find 0 disk by size, try with guid cnt=%d...\n", cnt);
|
||||
}
|
||||
|
||||
@@ -462,17 +474,19 @@ static int vtoy_check_device(ventoy_os_param *param, const char *device)
|
||||
{
|
||||
unsigned long long size;
|
||||
uint8_t vtguid[16] = {0};
|
||||
uint8_t vtsig[4] = {0};
|
||||
|
||||
debug("vtoy_check_device for <%s>\n", device);
|
||||
|
||||
size = vtoy_get_disk_size_in_byte(device);
|
||||
vtoy_get_disk_guid(device, vtguid);
|
||||
vtoy_get_disk_guid(device, vtguid, vtsig);
|
||||
|
||||
debug("param->vtoy_disk_size=%llu size=%llu\n",
|
||||
(unsigned long long)param->vtoy_disk_size, (unsigned long long)size);
|
||||
|
||||
if ((param->vtoy_disk_size == size || param->vtoy_disk_size == size + 512) &&
|
||||
memcmp(vtguid, param->vtoy_disk_guid, 16) == 0)
|
||||
memcmp(vtguid, param->vtoy_disk_guid, 16) == 0 &&
|
||||
memcmp(vtsig, param->vtoy_disk_signature, 4) == 0)
|
||||
{
|
||||
debug("<%s> is right ventoy disk\n", device);
|
||||
return 0;
|
||||
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Reference in New Issue
Block a user