Commit d02f184a authored by longpanda's avatar longpanda
Browse files

add support for linux vdisk(vhd/vdi/raw)

parent 3c649b28
...@@ -20,7 +20,7 @@ get_disk_size() { ...@@ -20,7 +20,7 @@ get_disk_size() {
enum_disk() { enum_disk() {
id=1 id=1
rm -f /device.list rm -f /device.list
ls /sys/block/ | grep 'd[a-z]' | while read dev; do ls /sys/block/ | egrep 'd[a-z]|nvme|mmc' | while read dev; do
if ! [ -b /dev/$dev ]; then if ! [ -b /dev/$dev ]; then
continue continue
fi fi
...@@ -145,7 +145,7 @@ ventoy_configuration() { ...@@ -145,7 +145,7 @@ ventoy_configuration() {
elif [ "$Answer" = "1" ]; then elif [ "$Answer" = "1" ]; then
while true; do while true; do
read -p "Please input the preserve space in MB: " Answer read -p "Please input the preserve space in MB: " Answer
if echo $Answer | grep -q "^[1-9][0-9]*$"; then if echo $Answer | grep -q "^[0-9][0-9]*$"; then
echo $Answer > /preserve.txt echo $Answer > /preserve.txt
break break
fi fi
......
...@@ -507,9 +507,18 @@ static int vtoydm_print_linear_table(const char *img_map_file, const char *diskn ...@@ -507,9 +507,18 @@ static int vtoydm_print_linear_table(const char *img_map_file, const char *diskn
(sector_start << 2), disk_sector_num, (sector_start << 2), disk_sector_num,
diskname, (unsigned long long)chunk[i].disk_start_sector); diskname, (unsigned long long)chunk[i].disk_start_sector);
#else #else
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", printf("%u %u linear %s1 %llu\n",
(sector_start << 2), disk_sector_num, (sector_start << 2), disk_sector_num,
diskname, (unsigned long long)chunk[i].disk_start_sector - 2048); diskname, (unsigned long long)chunk[i].disk_start_sector - 2048);
}
#endif #endif
} }
......
...@@ -120,7 +120,9 @@ typedef struct ventoy_os_param ...@@ -120,7 +120,9 @@ typedef struct ventoy_os_param
uint64_t vtoy_reserved[4]; // Internal use by ventoy 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; }ventoy_os_param;
#pragma pack() #pragma pack()
...@@ -218,6 +220,11 @@ static void vtoy_dump_os_param(ventoy_os_param *param) ...@@ -218,6 +220,11 @@ static void vtoy_dump_os_param(ventoy_os_param *param)
printf("param->vtoy_disk_guid = %02x %02x %02x %02x\n", printf("param->vtoy_disk_guid = %02x %02x %02x %02x\n",
param->vtoy_disk_guid[0], param->vtoy_disk_guid[1], param->vtoy_disk_guid[0], param->vtoy_disk_guid[1],
param->vtoy_disk_guid[2], param->vtoy_disk_guid[3]); 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_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_id = %u\n", param->vtoy_disk_part_id);
printf("param->vtoy_disk_part_type = %u\n", param->vtoy_disk_part_type); 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) ...@@ -231,7 +238,7 @@ static void vtoy_dump_os_param(ventoy_os_param *param)
printf("\n"); 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 i = 0;
int fd = 0; int fd = 0;
...@@ -244,6 +251,9 @@ static int vtoy_get_disk_guid(const char *diskname, uint8_t *vtguid) ...@@ -244,6 +251,9 @@ static int vtoy_get_disk_guid(const char *diskname, uint8_t *vtguid)
{ {
lseek(fd, 0x180, SEEK_SET); lseek(fd, 0x180, SEEK_SET);
read(fd, vtguid, 16); read(fd, vtguid, 16);
lseek(fd, 0x1b8, SEEK_SET);
read(fd, vtsig, 4);
close(fd); close(fd);
debug("GUID for %s: <", devdisk); debug("GUID for %s: <", devdisk);
...@@ -380,13 +390,14 @@ static int vtoy_find_disk_by_size(unsigned long long size, char *diskname) ...@@ -380,13 +390,14 @@ static int vtoy_find_disk_by_size(unsigned long long size, char *diskname)
return rc; 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 rc = 0;
int count = 0; int count = 0;
DIR* dir = NULL; DIR* dir = NULL;
struct dirent* p = NULL; struct dirent* p = NULL;
uint8_t vtguid[16]; uint8_t vtguid[16];
uint8_t vtsig[16];
dir = opendir("/sys/block"); dir = opendir("/sys/block");
if (!dir) if (!dir)
...@@ -403,8 +414,9 @@ static int vtoy_find_disk_by_guid(uint8_t *guid, char *diskname) ...@@ -403,8 +414,9 @@ static int vtoy_find_disk_by_guid(uint8_t *guid, char *diskname)
} }
memset(vtguid, 0, sizeof(vtguid)); memset(vtguid, 0, sizeof(vtguid));
rc = vtoy_get_disk_guid(p->d_name, vtguid); rc = vtoy_get_disk_guid(p->d_name, vtguid, vtsig);
if (rc == 0 && memcmp(vtguid, guid, 16) == 0) 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); sprintf(diskname, "%s", p->d_name);
count++; count++;
...@@ -430,11 +442,11 @@ static int vtoy_print_os_param(ventoy_os_param *param, char *diskname) ...@@ -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); cnt = vtoy_find_disk_by_size(param->vtoy_disk_size, diskname);
if (cnt > 1) 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) 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); 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) ...@@ -462,17 +474,19 @@ static int vtoy_check_device(ventoy_os_param *param, const char *device)
{ {
unsigned long long size; unsigned long long size;
uint8_t vtguid[16] = {0}; uint8_t vtguid[16] = {0};
uint8_t vtsig[4] = {0};
debug("vtoy_check_device for <%s>\n", device); debug("vtoy_check_device for <%s>\n", device);
size = vtoy_get_disk_size_in_byte(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", debug("param->vtoy_disk_size=%llu size=%llu\n",
(unsigned long long)param->vtoy_disk_size, (unsigned long long)size); (unsigned long long)param->vtoy_disk_size, (unsigned long long)size);
if ((param->vtoy_disk_size == size || param->vtoy_disk_size == size + 512) && 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); debug("<%s> is right ventoy disk\n", device);
return 0; return 0;
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment