mirror of
https://github.com/ventoy/Ventoy.git
synced 2025-09-17 09:21:15 +00:00
Compare commits
12 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
392d8ef4fa | ||
|
d1900c75cd | ||
|
fa7e1d5fa0 | ||
|
6ae8bf840d | ||
|
ce862da402 | ||
|
6d4f5ff00b | ||
|
ab0f25d097 | ||
|
ff14c07c4e | ||
|
f7fac26c91 | ||
|
ebae102f41 | ||
|
c3718d6001 | ||
|
d0744513a6 |
2
.github/FUNDING.yml
vendored
2
.github/FUNDING.yml
vendored
@@ -6,7 +6,7 @@ open_collective: # Replace with a single Open Collective username
|
||||
ko_fi: # Replace with a single Ko-fi username
|
||||
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
|
||||
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
|
||||
liberapay: # Replace with a single Liberapay username
|
||||
liberapay: Ventoy
|
||||
issuehunt: # Replace with a single IssueHunt username
|
||||
otechie: # Replace with a single Otechie username
|
||||
custom: ['https://www.paypal.me/ventoy', 'https://www.ventoy.net/en/donation.html'] # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
|
||||
|
2
.github/ISSUE_TEMPLATE/issue_template.yml
vendored
2
.github/ISSUE_TEMPLATE/issue_template.yml
vendored
@@ -21,7 +21,7 @@ body:
|
||||
attributes:
|
||||
label: Ventoy Version
|
||||
description: What version of ventoy are you running?
|
||||
placeholder: 1.0.70
|
||||
placeholder: 1.0.71
|
||||
validations:
|
||||
required: true
|
||||
- type: dropdown
|
||||
|
@@ -108,10 +108,10 @@
|
||||
cd /home/Ventoy-master/VtoyTool
|
||||
sh build.sh
|
||||
|
||||
4.8 == Build vtoyfat ==
|
||||
cd /home/Ventoy-master/vtoyfat/fat_io_lib
|
||||
4.8 == Build vtoycli ==
|
||||
cd /home/Ventoy-master/vtoycli/fat_io_lib
|
||||
sh buildlib.sh
|
||||
cd /home/Ventoy-master/vtoyfat
|
||||
cd /home/Ventoy-master/vtoycli
|
||||
sh build.sh
|
||||
|
||||
4.9 == Build exfat-util ==
|
||||
|
@@ -137,6 +137,10 @@ static grub_uint64_t g_enumerate_start_time_ms;
|
||||
static grub_uint64_t g_enumerate_finish_time_ms;
|
||||
int g_vtoy_file_flt[VTOY_FILE_FLT_BUTT] = {0};
|
||||
|
||||
static char g_iso_vd_id_publisher[130];
|
||||
static char g_iso_vd_id_prepare[130];
|
||||
static char g_iso_vd_id_application[130];
|
||||
|
||||
static int g_pager_flag = 0;
|
||||
static char g_old_pager[32];
|
||||
|
||||
@@ -5469,6 +5473,98 @@ out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static grub_err_t ventoy_iso_vd_id_clear(grub_extcmd_context_t ctxt, int argc, char **args)
|
||||
{
|
||||
(void)ctxt;
|
||||
(void)argc;
|
||||
(void)args;
|
||||
|
||||
g_iso_vd_id_publisher[0] = 0;
|
||||
g_iso_vd_id_prepare[0] = 0;
|
||||
g_iso_vd_id_application[0] = 0;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static grub_err_t ventoy_cmd_iso_vd_id_parse(grub_extcmd_context_t ctxt, int argc, char **args)
|
||||
{
|
||||
int ret = 1;
|
||||
int offset = 318;
|
||||
grub_file_t file = NULL;
|
||||
|
||||
(void)ctxt;
|
||||
(void)argc;
|
||||
|
||||
file = grub_file_open(args[0], VENTOY_FILE_TYPE);
|
||||
if (!file)
|
||||
{
|
||||
grub_printf("Failed to open %s\n", args[0]);
|
||||
goto out;
|
||||
}
|
||||
|
||||
grub_file_seek(file, 16 * 2048 + offset);
|
||||
grub_file_read(file, g_iso_vd_id_publisher, 128);
|
||||
|
||||
offset += 128;
|
||||
grub_file_seek(file, 16 * 2048 + offset);
|
||||
grub_file_read(file, g_iso_vd_id_prepare, 128);
|
||||
|
||||
offset += 128;
|
||||
grub_file_seek(file, 16 * 2048 + offset);
|
||||
grub_file_read(file, g_iso_vd_id_application, 128);
|
||||
|
||||
out:
|
||||
|
||||
check_free(file, grub_file_close);
|
||||
grub_errno = GRUB_ERR_NONE;
|
||||
return ret;
|
||||
}
|
||||
|
||||
static grub_err_t ventoy_cmd_iso_vd_id_begin(grub_extcmd_context_t ctxt, int argc, char **args)
|
||||
{
|
||||
int ret = 1;
|
||||
char *id = g_iso_vd_id_publisher;
|
||||
|
||||
(void)ctxt;
|
||||
(void)argc;
|
||||
|
||||
if (args[0][0] == '1')
|
||||
{
|
||||
id = g_iso_vd_id_prepare;
|
||||
}
|
||||
else if (args[0][0] == '2')
|
||||
{
|
||||
id = g_iso_vd_id_application;
|
||||
}
|
||||
|
||||
if (args[1][0] == '0' && grub_strncasecmp(id, args[2], grub_strlen(args[2])) == 0)
|
||||
{
|
||||
ret = 0;
|
||||
}
|
||||
|
||||
if (args[1][0] == '1' && grub_strncmp(id, args[2], grub_strlen(args[2])) == 0)
|
||||
{
|
||||
ret = 0;
|
||||
}
|
||||
|
||||
grub_errno = GRUB_ERR_NONE;
|
||||
return ret;
|
||||
}
|
||||
|
||||
static grub_err_t ventoy_cmd_fn_mutex_lock(grub_extcmd_context_t ctxt, int argc, char **args)
|
||||
{
|
||||
(void)ctxt;
|
||||
(void)argc;
|
||||
|
||||
g_ventoy_fn_mutex = 0;
|
||||
if (argc == 1 && args[0][0] == '1' && args[0][1] == 0)
|
||||
{
|
||||
g_ventoy_fn_mutex = 1;
|
||||
}
|
||||
|
||||
VENTOY_CMD_RETURN(GRUB_ERR_NONE);
|
||||
}
|
||||
|
||||
int ventoy_env_init(void)
|
||||
{
|
||||
char buf[64];
|
||||
@@ -5630,7 +5726,9 @@ static cmd_para ventoy_cmds[] =
|
||||
{ "vt_unix_parse_freebsd_ver", ventoy_cmd_unix_freebsd_ver, 0, NULL, "", "", NULL },
|
||||
{ "vt_unix_parse_freebsd_ver_elf", ventoy_cmd_unix_freebsd_ver_elf, 0, NULL, "", "", NULL },
|
||||
{ "vt_unix_reset", ventoy_cmd_unix_reset, 0, NULL, "", "", NULL },
|
||||
{ "vt_unix_check_vlnk", ventoy_cmd_unix_check_vlnk, 0, NULL, "", "", NULL },
|
||||
{ "vt_unix_replace_conf", ventoy_cmd_unix_replace_conf, 0, NULL, "", "", NULL },
|
||||
{ "vt_unix_replace_grub_conf", ventoy_cmd_unix_replace_grub_conf, 0, NULL, "", "", NULL },
|
||||
{ "vt_unix_replace_ko", ventoy_cmd_unix_replace_ko, 0, NULL, "", "", NULL },
|
||||
{ "vt_unix_ko_fillmap", ventoy_cmd_unix_ko_fillmap, 0, NULL, "", "", NULL },
|
||||
{ "vt_unix_fill_image_desc", ventoy_cmd_unix_fill_image_desc, 0, NULL, "", "", NULL },
|
||||
@@ -5664,6 +5762,10 @@ static cmd_para ventoy_cmds[] =
|
||||
{ "vt_get_vlnk_dst", grub_cmd_get_vlnk_dst, 0, NULL, "", "", NULL },
|
||||
{ "vt_set_fake_vlnk", ventoy_cmd_set_fake_vlnk, 0, NULL, "", "", NULL },
|
||||
{ "vt_reset_fake_vlnk", ventoy_cmd_reset_fake_vlnk, 0, NULL, "", "", NULL },
|
||||
{ "vt_iso_vd_id_parse", ventoy_cmd_iso_vd_id_parse, 0, NULL, "", "", NULL },
|
||||
{ "vt_iso_vd_id_clear", ventoy_iso_vd_id_clear, 0, NULL, "", "", NULL },
|
||||
{ "vt_iso_vd_id_begin", ventoy_cmd_iso_vd_id_begin, 0, NULL, "", "", NULL },
|
||||
{ "vt_fn_mutex_lock", ventoy_cmd_fn_mutex_lock, 0, NULL, "", "", NULL },
|
||||
};
|
||||
|
||||
int ventoy_register_all_cmd(void)
|
||||
|
@@ -1019,6 +1019,7 @@ extern int g_ventoy_grub2_mode;
|
||||
extern int g_ventoy_wimboot_mode;
|
||||
extern int g_ventoy_iso_uefi_drv;
|
||||
extern int g_ventoy_case_insensitive;
|
||||
extern int g_ventoy_fn_mutex;
|
||||
extern grub_uint8_t g_ventoy_chain_type;
|
||||
extern int g_vhdboot_enable;
|
||||
|
||||
@@ -1093,7 +1094,9 @@ grub_err_t ventoy_cmd_locate_wim_patch(grub_extcmd_context_t ctxt, int argc, cha
|
||||
grub_err_t ventoy_cmd_unix_chain_data(grub_extcmd_context_t ctxt, int argc, char **args);
|
||||
int ventoy_get_disk_guid(const char *filename, grub_uint8_t *guid, grub_uint8_t *signature);
|
||||
grub_err_t ventoy_cmd_unix_reset(grub_extcmd_context_t ctxt, int argc, char **args);
|
||||
grub_err_t ventoy_cmd_unix_check_vlnk(grub_extcmd_context_t ctxt, int argc, char **args);
|
||||
grub_err_t ventoy_cmd_unix_replace_conf(grub_extcmd_context_t ctxt, int argc, char **args);
|
||||
grub_err_t ventoy_cmd_unix_replace_grub_conf(grub_extcmd_context_t ctxt, int argc, char **args);
|
||||
grub_err_t ventoy_cmd_unix_replace_ko(grub_extcmd_context_t ctxt, int argc, char **args);
|
||||
grub_err_t ventoy_cmd_unix_ko_fillmap(grub_extcmd_context_t ctxt, int argc, char **args);
|
||||
grub_err_t ventoy_cmd_unix_fill_image_desc(grub_extcmd_context_t ctxt, int argc, char **args);
|
||||
|
@@ -48,6 +48,7 @@ int g_mod_new_len = 0;
|
||||
char *g_mod_new_data = NULL;
|
||||
|
||||
int g_mod_search_magic = 0;
|
||||
int g_unix_vlnk_boot = 0;
|
||||
|
||||
int g_ko_fillmap_len = 0;
|
||||
char *g_ko_fillmap_data = NULL;
|
||||
@@ -273,13 +274,14 @@ static void ventoy_unix_fill_virt_data( grub_uint64_t isosize, ventoy_chain_h
|
||||
return;
|
||||
}
|
||||
|
||||
static int ventoy_freebsd_append_conf(char *buf, const char *isopath)
|
||||
static int ventoy_freebsd_append_conf(char *buf, const char *isopath, const char *alias)
|
||||
{
|
||||
int pos = 0;
|
||||
grub_uint32_t i;
|
||||
grub_disk_t disk;
|
||||
grub_file_t isofile;
|
||||
char uuid[64] = {0};
|
||||
const char *val = NULL;
|
||||
ventoy_img_chunk *chunk;
|
||||
grub_uint8_t disk_sig[4];
|
||||
grub_uint8_t disk_guid[16];
|
||||
@@ -295,12 +297,30 @@ static int ventoy_freebsd_append_conf(char *buf, const char *isopath)
|
||||
vtoy_ssprintf(buf, pos, "ventoy_load=\"%s\"\n", "YES");
|
||||
vtoy_ssprintf(buf, pos, "ventoy_name=\"%s\"\n", g_ko_mod_path);
|
||||
|
||||
if (alias)
|
||||
{
|
||||
vtoy_ssprintf(buf, pos, "hint.ventoy.0.alias=\"%s\"\n", alias);
|
||||
}
|
||||
|
||||
if (g_unix_vlnk_boot)
|
||||
{
|
||||
vtoy_ssprintf(buf, pos, "hint.ventoy.0.vlnk=%d\n", 1);
|
||||
}
|
||||
|
||||
val = ventoy_get_env("VTOY_UNIX_REMOUNT");
|
||||
if (val && val[0] == '1' && val[1] == 0)
|
||||
{
|
||||
vtoy_ssprintf(buf, pos, "hint.ventoy.0.remount=%d\n", 1);
|
||||
}
|
||||
|
||||
if (g_mod_search_magic)
|
||||
{
|
||||
debug("hint.ventoy NO need\n");
|
||||
goto out;
|
||||
}
|
||||
|
||||
debug("Fill hint.ventoy info\n");
|
||||
|
||||
disk = isofile->device->disk;
|
||||
|
||||
ventoy_get_disk_guid(isofile->name, disk_guid, disk_sig);
|
||||
@@ -349,6 +369,7 @@ grub_err_t ventoy_cmd_unix_reset(grub_extcmd_context_t ctxt, int argc, char **ar
|
||||
(void)argc;
|
||||
(void)args;
|
||||
|
||||
g_unix_vlnk_boot = 0;
|
||||
g_mod_search_magic = 0;
|
||||
g_conf_new_len = 0;
|
||||
g_mod_new_len = 0;
|
||||
@@ -363,6 +384,27 @@ grub_err_t ventoy_cmd_unix_reset(grub_extcmd_context_t ctxt, int argc, char **ar
|
||||
VENTOY_CMD_RETURN(GRUB_ERR_NONE);
|
||||
}
|
||||
|
||||
grub_err_t ventoy_cmd_unix_check_vlnk(grub_extcmd_context_t ctxt, int argc, char **args)
|
||||
{
|
||||
grub_file_t file;
|
||||
|
||||
(void)ctxt;
|
||||
|
||||
if (argc != 1)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
file = grub_file_open(args[0], VENTOY_FILE_TYPE);
|
||||
if (file)
|
||||
{
|
||||
g_unix_vlnk_boot = file->vlnk;
|
||||
grub_file_close(file);
|
||||
}
|
||||
|
||||
VENTOY_CMD_RETURN(GRUB_ERR_NONE);
|
||||
}
|
||||
|
||||
grub_err_t ventoy_cmd_parse_freenas_ver(grub_extcmd_context_t ctxt, int argc, char **args)
|
||||
{
|
||||
grub_file_t file;
|
||||
@@ -647,6 +689,109 @@ out:
|
||||
VENTOY_CMD_RETURN(GRUB_ERR_NONE);
|
||||
}
|
||||
|
||||
grub_err_t ventoy_cmd_unix_replace_grub_conf(grub_extcmd_context_t ctxt, int argc, char **args)
|
||||
{
|
||||
int len = 0;
|
||||
grub_uint32_t i;
|
||||
char *data;
|
||||
char *pos;
|
||||
const char *val = NULL;
|
||||
grub_uint64_t offset;
|
||||
grub_file_t file;
|
||||
char extcfg[512];
|
||||
const char *confile = NULL;
|
||||
const char * loader_conf[] =
|
||||
{
|
||||
"/boot/grub/grub.cfg",
|
||||
};
|
||||
|
||||
(void)ctxt;
|
||||
|
||||
if (argc != 1 && argc != 2)
|
||||
{
|
||||
debug("Replace conf invalid argc %d\n", argc);
|
||||
return 1;
|
||||
}
|
||||
|
||||
for (i = 0; i < sizeof(loader_conf) / sizeof(loader_conf[0]); i++)
|
||||
{
|
||||
if (ventoy_get_file_override(loader_conf[i], &offset) == 0)
|
||||
{
|
||||
confile = loader_conf[i];
|
||||
g_conf_override_offset = offset;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (confile == NULL)
|
||||
{
|
||||
debug("Can't find grub.cfg file from %u locations\n", i);
|
||||
return 1;
|
||||
}
|
||||
|
||||
file = ventoy_grub_file_open(GRUB_FILE_TYPE_LINUX_INITRD, "(loop)/%s", confile);
|
||||
if (!file)
|
||||
{
|
||||
debug("Failed to open %s \n", confile);
|
||||
return 1;
|
||||
}
|
||||
|
||||
debug("old grub2 conf file size:%d\n", (int)file->size);
|
||||
|
||||
data = grub_malloc(VTOY_MAX_SCRIPT_BUF);
|
||||
if (!data)
|
||||
{
|
||||
grub_file_close(file);
|
||||
return 1;
|
||||
}
|
||||
|
||||
grub_file_read(file, data, file->size);
|
||||
grub_file_close(file);
|
||||
|
||||
g_conf_new_data = data;
|
||||
g_conf_new_len = (int)file->size;
|
||||
|
||||
pos = grub_strstr(data, "kfreebsd /boot/kernel/kernel");
|
||||
if (pos)
|
||||
{
|
||||
pos += grub_strlen("kfreebsd /boot/kernel/kernel");
|
||||
if (grub_strncmp(pos, ".gz", 3) == 0)
|
||||
{
|
||||
pos += 3;
|
||||
}
|
||||
|
||||
if (argc == 2)
|
||||
{
|
||||
vtoy_ssprintf(extcfg, len, ";kfreebsd_module_elf %s; set kFreeBSD.hint.ventoy.0.alias=\"%s\"", args[0], args[1]);
|
||||
}
|
||||
else
|
||||
{
|
||||
vtoy_ssprintf(extcfg, len, ";kfreebsd_module_elf %s", args[0]);
|
||||
}
|
||||
|
||||
if (g_unix_vlnk_boot)
|
||||
{
|
||||
vtoy_ssprintf(extcfg, len, ";set kFreeBSD.hint.ventoy.0.vlnk=%d", 1);
|
||||
}
|
||||
|
||||
val = ventoy_get_env("VTOY_UNIX_REMOUNT");
|
||||
if (val && val[0] == '1' && val[1] == 0)
|
||||
{
|
||||
vtoy_ssprintf(extcfg, len, ";set kFreeBSD.hint.ventoy.0.remount=%d", 1);
|
||||
}
|
||||
|
||||
grub_memmove(pos + len, pos, (int)(file->size - (pos - data)));
|
||||
grub_memcpy(pos, extcfg, len);
|
||||
g_conf_new_len += len;
|
||||
}
|
||||
else
|
||||
{
|
||||
debug("no kfreebsd found\n");
|
||||
}
|
||||
|
||||
VENTOY_CMD_RETURN(GRUB_ERR_NONE);
|
||||
}
|
||||
|
||||
grub_err_t ventoy_cmd_unix_replace_conf(grub_extcmd_context_t ctxt, int argc, char **args)
|
||||
{
|
||||
grub_uint32_t i;
|
||||
@@ -662,7 +807,7 @@ grub_err_t ventoy_cmd_unix_replace_conf(grub_extcmd_context_t ctxt, int argc, ch
|
||||
|
||||
(void)ctxt;
|
||||
|
||||
if (argc != 2)
|
||||
if (argc != 2 && argc != 3)
|
||||
{
|
||||
debug("Replace conf invalid argc %d\n", argc);
|
||||
return 1;
|
||||
@@ -691,7 +836,7 @@ grub_err_t ventoy_cmd_unix_replace_conf(grub_extcmd_context_t ctxt, int argc, ch
|
||||
return 1;
|
||||
}
|
||||
|
||||
debug("old conf file size:%d\n", (int)file->size);
|
||||
debug("old conf file <%s> size:%d\n", confile, (int)file->size);
|
||||
|
||||
data = grub_malloc(VTOY_MAX_SCRIPT_BUF);
|
||||
if (!data)
|
||||
@@ -708,7 +853,7 @@ grub_err_t ventoy_cmd_unix_replace_conf(grub_extcmd_context_t ctxt, int argc, ch
|
||||
|
||||
if (grub_strcmp(args[0], "FreeBSD") == 0)
|
||||
{
|
||||
g_conf_new_len += ventoy_freebsd_append_conf(data + file->size, args[1]);
|
||||
g_conf_new_len += ventoy_freebsd_append_conf(data + file->size, args[1], (argc > 2) ? args[2] : NULL);
|
||||
}
|
||||
else if (grub_strcmp(args[0], "DragonFly") == 0)
|
||||
{
|
||||
@@ -723,13 +868,13 @@ static int ventoy_unix_search_magic(char *data, int len)
|
||||
int i;
|
||||
grub_uint32_t *magic = NULL;
|
||||
|
||||
for (i = 0; i < len; i += 65536)
|
||||
for (i = 0; i < len; i += 4096)
|
||||
{
|
||||
magic = (grub_uint32_t *)(data + i);
|
||||
if (magic[0] == VENTOY_UNIX_SEG_MAGIC0 && magic[1] == VENTOY_UNIX_SEG_MAGIC1 &&
|
||||
magic[2] == VENTOY_UNIX_SEG_MAGIC2 && magic[3] == VENTOY_UNIX_SEG_MAGIC3)
|
||||
{
|
||||
debug("unix find search magic at 0x%x loop:%d\n", i, (i >> 16));
|
||||
debug("unix find search magic at 0x%x loop:%d\n", i, (i >> 12));
|
||||
g_mod_search_magic = i;
|
||||
return 0;
|
||||
}
|
||||
|
@@ -52,8 +52,12 @@ ventoy_get_os_type() {
|
||||
fi
|
||||
fi
|
||||
|
||||
# PrimeOS :
|
||||
if $GREP -q 'PrimeOS' /proc/version; then
|
||||
echo 'primeos'; return
|
||||
|
||||
# Debian :
|
||||
if $GREP -q '[Dd]ebian' /proc/version; then
|
||||
elif $GREP -q '[Dd]ebian' /proc/version; then
|
||||
echo 'debian'; return
|
||||
|
||||
# Ubuntu : do the same process with debian
|
||||
|
@@ -500,6 +500,8 @@ function ventoy_freebsd_proc {
|
||||
if [ "$vt_freebsd_ver" = "xx" ]; then
|
||||
if [ -e (loop)/boot/kernel/kernel ]; then
|
||||
vt_unix_parse_freebsd_ver_elf (loop)/boot/kernel/kernel $vt_freebsd_bit vt_freebsd_ver
|
||||
elif [ -e (loop)/boot/kernel/kernel.gz ]; then
|
||||
vt_unix_parse_freebsd_ver_elf (loop)/boot/kernel/kernel.gz $vt_freebsd_bit vt_freebsd_ver
|
||||
fi
|
||||
|
||||
if [ "$vt_freebsd_ver" = "xx" ]; then
|
||||
@@ -519,8 +521,17 @@ function ventoy_freebsd_proc {
|
||||
fi
|
||||
done
|
||||
|
||||
if [ -n "$vt_unix_mod_path" ]; then
|
||||
vt_unix_replace_ko $vt_unix_mod_path (vtunix)/ventoy_unix/$vtFreeBsdDistro/geom_ventoy_ko/$vt_freebsd_ver/$vt_freebsd_bit/geom_ventoy.ko.xz
|
||||
vt_unix_replace_conf FreeBSD "${1}${chosen_path}"
|
||||
elif [ -e (loop)/easyre.ufs.uzip ]; then
|
||||
vt_unix_replace_ko "/boot/grub/i386-pc/linux.mod" (vtunix)/ventoy_unix/$vtFreeBsdDistro/geom_ventoy_ko/$vt_freebsd_ver/$vt_freebsd_bit/geom_ventoy.ko.xz
|
||||
if [ "$grub_platform" = "pc" ]; then
|
||||
vt_unix_replace_grub_conf "/boot/grub/i386-pc/linux.mod" "cd9"
|
||||
else
|
||||
vt_unix_replace_conf FreeBSD "${1}${chosen_path}" "cd9"
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
function ventoy_dragonfly_proc {
|
||||
@@ -542,6 +553,8 @@ function ventoy_dragonfly_proc {
|
||||
function ventoy_unix_comm_proc {
|
||||
vt_unix_reset
|
||||
|
||||
vt_unix_check_vlnk "${1}${chosen_path}"
|
||||
|
||||
if [ "$ventoy_compatible" = "NO" ]; then
|
||||
loopback vtunix $vtoy_efi_part/ventoy/ventoy_unix.cpio
|
||||
|
||||
@@ -1303,14 +1316,32 @@ function iso_common_menuentry {
|
||||
set vtcompat=1
|
||||
fi
|
||||
|
||||
if [ "$grub_platform" = "pc" ]; then
|
||||
|
||||
# auto memdisk mode for some special ISO files
|
||||
vt_iso_vd_id_parse "${vtoy_iso_part}${vt_chosen_path}"
|
||||
unset vtMemDiskBoot
|
||||
if vt_check_mode 0; then
|
||||
set vtMemDiskBoot=1
|
||||
else
|
||||
if [ "$grub_platform" = "pc" ]; then
|
||||
if vt_iso_vd_id_begin 1 0 "Memtest86+"; then
|
||||
set vtMemDiskBoot=1
|
||||
elif vt_iso_vd_id_begin 0 1 "KolibriOS"; then
|
||||
set vtMemDiskBoot=1
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
vt_iso_vd_id_clear
|
||||
|
||||
|
||||
if [ "$grub_platform" = "pc" ]; then
|
||||
if [ -n "$vtMemDiskBoot" ]; then
|
||||
legacy_iso_memdisk $vtoy_iso_part "$vt_chosen_path"
|
||||
else
|
||||
legacy_iso_menu_func $vtoy_iso_part "$vt_chosen_path"
|
||||
fi
|
||||
else
|
||||
if vt_check_mode 0; then
|
||||
if [ -n "$vtMemDiskBoot" ]; then
|
||||
uefi_iso_memdisk $vtoy_iso_part "$vt_chosen_path"
|
||||
else
|
||||
uefi_iso_menu_func $vtoy_iso_part "$vt_chosen_path"
|
||||
@@ -2082,7 +2113,7 @@ function img_unsupport_menuentry {
|
||||
#############################################################
|
||||
#############################################################
|
||||
|
||||
set VENTOY_VERSION="1.0.70"
|
||||
set VENTOY_VERSION="1.0.71"
|
||||
|
||||
#ACPI not compatible with Window7/8, so disable by default
|
||||
set VTOY_PARAM_NO_ACPI=1
|
||||
@@ -2305,33 +2336,6 @@ export VTOY_HELP_TXT_LANGUAGE
|
||||
export VTOY_CHKSUM_FILE_PATH
|
||||
|
||||
|
||||
#special VTOY_DEFAULT_IMAGE process
|
||||
if [ -n "$VTOY_DEFAULT_IMAGE" ]; then
|
||||
if regexp --set 1:vtHotkey --set 2:vtDefault "(F[2-9])>(.*)" "$VTOY_DEFAULT_IMAGE"; then
|
||||
|
||||
set default="$vtDefault"
|
||||
if [ -z "$VTOY_MENU_TIMEOUT" ]; then
|
||||
set timeout=0
|
||||
else
|
||||
set timeout=$VTOY_MENU_TIMEOUT
|
||||
fi
|
||||
|
||||
export timeout
|
||||
export default
|
||||
|
||||
if [ "$vtHotkey" = "F4" ]; then
|
||||
ventoy_localboot
|
||||
elif [ "$vtHotkey" = "F5" ]; then
|
||||
ventoy_diagnosis
|
||||
elif [ "$vtHotkey" = "F6" ]; then
|
||||
ventoy_ext_menu
|
||||
fi
|
||||
|
||||
unset timeout
|
||||
unset default
|
||||
fi
|
||||
fi
|
||||
|
||||
#colect all image files (iso files)
|
||||
set ventoy_img_count=0
|
||||
vt_list_img $vtoy_iso_part ventoy_img_count
|
||||
@@ -2356,3 +2360,39 @@ else
|
||||
reboot
|
||||
}
|
||||
fi
|
||||
|
||||
|
||||
#special VTOY_DEFAULT_IMAGE process
|
||||
if [ -n "$VTOY_DEFAULT_IMAGE" ]; then
|
||||
if regexp --set 1:vtHotkey --set 2:vtDefault "(F[2-9])>(.*)" "$VTOY_DEFAULT_IMAGE"; then
|
||||
|
||||
set default="$vtDefault"
|
||||
if [ -z "$VTOY_MENU_TIMEOUT" ]; then
|
||||
set timeout=0
|
||||
else
|
||||
set timeout=$VTOY_MENU_TIMEOUT
|
||||
fi
|
||||
|
||||
export timeout
|
||||
export default
|
||||
|
||||
vt_fn_mutex_lock 1
|
||||
|
||||
if [ "$vtHotkey" = "F2" ]; then
|
||||
unset timeout
|
||||
vt_browser_disk
|
||||
elif [ "$vtHotkey" = "F4" ]; then
|
||||
ventoy_localboot
|
||||
elif [ "$vtHotkey" = "F5" ]; then
|
||||
ventoy_diagnosis
|
||||
elif [ "$vtHotkey" = "F6" ]; then
|
||||
ventoy_ext_menu
|
||||
fi
|
||||
|
||||
vt_fn_mutex_lock 0
|
||||
|
||||
unset timeout
|
||||
unset default
|
||||
fi
|
||||
fi
|
||||
|
||||
|
@@ -1,8 +1,8 @@
|
||||
h - この画面を表示する
|
||||
F1 - 主記憶装置上に記憶域を作成する(容量の小さなWinPE・LiveCD専用)
|
||||
F2 - Browse and boot files in local disk
|
||||
F2 - 手元の記憶装置にある起動ファイルを選択して実行する
|
||||
F3 - 表示形式を切り替える(一覧 ↔ 階層)
|
||||
F4 - 手元の記憶装置にあるOSを起動する
|
||||
F4 - 手元の記憶装置にあるWindowsまたはLinuxを起動する
|
||||
F5 - 諸機能
|
||||
F6 - Grub2の構成を読み込む
|
||||
F7 - 操作形式を切り替える(GUI ↔ CUI)
|
||||
@@ -15,4 +15,4 @@ Ctrl+u - ISO efiドライバーを読み取る(開発用,非公式)
|
||||
|
||||
|
||||
|
||||
この画面を閉じるにはESCを押してください
|
||||
この画面を閉じるにはESCを押してください ......
|
||||
|
18
INSTALL/grub/help/ko_KR.txt
Normal file
18
INSTALL/grub/help/ko_KR.txt
Normal file
@@ -0,0 +1,18 @@
|
||||
h - 이 도움말 정보 표시
|
||||
F1 - Memdisk 모드 (작은 WinPE/LiveCD ISO/IMG 전용)
|
||||
F2 - 로컬 디스크에서 파일 찾아보기 및 부팅
|
||||
F3 - 트리보기 <-> 목록보기 간에 메뉴 모드 전환
|
||||
F4 - 로컬 디스크에서 Windows/Linux 부팅
|
||||
F5 - 유틸리티
|
||||
F6 - 사용자 지정 Grub2 메뉴 로드
|
||||
F7 - GUI 모드 <-> TEXT 모드 간에 전환
|
||||
|
||||
m - 체크섬 이미지 파일 (md5/sha1/sha256/sha512)
|
||||
Ctrl+w - WIMBOOT 모드 (표준 Windows ISO 전용)
|
||||
Ctrl+r - Grub2 모드 (일부 Linux 배포판에만 해당)
|
||||
Ctrl+i - 호환 모드 (디버그 전용)
|
||||
Ctrl+u - ISO eFi 드라이버 로드 (디버그 전용, 공식적으로 사용할 수 없음)
|
||||
|
||||
|
||||
|
||||
돌아가려면 ESC를 누르십시오 ......
|
Binary file not shown.
@@ -1 +1 @@
|
||||
de_DEen_USfr_FRhr_HRid_IDja_JPpt_PTsr_RStr_TRzh_CN
|
||||
de_DEen_USfr_FRhr_HRid_IDja_JPko_KRpt_PTsr_RStr_TRzh_CN
|
@@ -723,7 +723,7 @@
|
||||
|
||||
<footer class="main-footer">
|
||||
<div class="pull-right hidden-xs">
|
||||
<b id="plugson_build_date">20220204 16:31:23</b>
|
||||
<b id="plugson_build_date">20220311 21:24:51</b>
|
||||
</div>
|
||||
<strong><a href="https://www.ventoy.net" target="_blank">https://www.ventoy.net</a></strong>
|
||||
</footer>
|
||||
@@ -818,11 +818,6 @@
|
||||
|
||||
|
||||
(function ventoy_handshake() {
|
||||
|
||||
if (m_syntax_error === 1) {
|
||||
|
||||
}
|
||||
|
||||
callVtoyCatchErr({
|
||||
method : 'handshake'
|
||||
},
|
||||
@@ -844,6 +839,13 @@
|
||||
m_invalid_config = 0;
|
||||
}
|
||||
|
||||
if (data.save_error === 1) {
|
||||
var title = g_current_language == 'en' ? g_vtoy_cur_language_en.STR_INFO : g_vtoy_cur_language_cn.STR_INFO;
|
||||
var msg = g_current_language == 'en' ? g_vtoy_cur_language_en.STR_CONFIG_SAVE_ERROR_TIP : g_vtoy_cur_language_cn.STR_CONFIG_SAVE_ERROR_TIP;
|
||||
Modal.alert({title:title,msg:msg}).on(function(e) {
|
||||
});
|
||||
}
|
||||
|
||||
setTimeout(function() {
|
||||
ventoy_handshake();
|
||||
}, 1000);
|
||||
|
@@ -17,7 +17,7 @@ You can also browse ISO/WIM/IMG/VHD(x)/EFI files in local disk and boot them.<br
|
||||
x86 Legacy BIOS, IA32 UEFI, x86_64 UEFI, ARM64 UEFI and MIPS64EL UEFI are supported in the same way.<br/>
|
||||
Both MBR and GPT partition style are supported in the same way.<br/>
|
||||
Most type of OS supported(Windows/WinPE/Linux/Unix/ChromeOS/Vmware/Xen...) <br/>
|
||||
810+ ISO files are tested (<a href="https://www.ventoy.net/en/isolist.html">List</a>). 90%+ distros in <a href="https://distrowatch.com/">distrowatch.com</a> supported (<a href="https://www.ventoy.net/en/distrowatch.html">Details</a>). <br/>
|
||||
830+ ISO files are tested (<a href="https://www.ventoy.net/en/isolist.html">List</a>). 90%+ distros in <a href="https://distrowatch.com/">distrowatch.com</a> supported (<a href="https://www.ventoy.net/en/distrowatch.html">Details</a>). <br/>
|
||||
<br/>Official Website: <a href=https://www.ventoy.net>https://www.ventoy.net</a>
|
||||
</h4>
|
||||
|
||||
@@ -41,7 +41,7 @@ VMware ESXi, Citrix XenServer, Xen XCP-ng
|
||||
[【How to report a successfully tested image file】](https://github.com/ventoy/Ventoy/issues/1195)
|
||||
|
||||
# Ventoy Browser
|
||||
With Ventoy you can also browse ISO/WIM/IMG/VHD(x)/EFI files in local disk and boot them. [Notes](https://www.ventoy.net/en/doc_browser.html)
|
||||
With Ventoy, you can also browse ISO/WIM/IMG/VHD(x)/EFI files in local disk and boot them. [Notes](https://www.ventoy.net/en/doc_browser.html)
|
||||
|
||||
# VentoyPlugson
|
||||
A GUI Ventoy plugin configurator. [VentoyPlugson](https://www.ventoy.net/en/plugin_plugson.html)
|
||||
@@ -63,7 +63,7 @@ A GUI Ventoy plugin configurator. [VentoyPlugson](https://www.ventoy.net/en/plug
|
||||
* FAT32/exFAT/NTFS/UDF/XFS/Ext2(3)(4) supported for main partition
|
||||
* ISO files larger than 4GB supported
|
||||
* Native boot menu style for Legacy & UEFI
|
||||
* Most type of OS supported, 810+ iso files tested
|
||||
* Most types of OS supported, 830+ iso files tested
|
||||
* Linux vDisk boot supported
|
||||
* Not only boot but also complete installation process
|
||||
* Menu dynamically switchable between List/TreeView mode
|
||||
@@ -122,7 +122,7 @@ See [https://www.ventoy.net/en/faq.html](https://www.ventoy.net/en/faq.html) for
|
||||
|
||||
# Donation
|
||||
It would be much appreciated if you want to make a small donation to support my work!
|
||||
Alipay, WeChat Pay, PayPal and Bitcoin are avaliable for donation. You can chose any of them.
|
||||
Alipay, WeChat Pay, PayPal and Bitcoin are available for donation. You can choose any of them.
|
||||
|
||||
Alipay | WeChat Pay
|
||||
-|-
|
||||
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -65,11 +65,22 @@ static g_taste_t g_ventoy_taste;
|
||||
static g_ctl_req_t g_ventoy_config;
|
||||
static g_dumpconf_t g_ventoy_dumpconf;
|
||||
|
||||
static const char *g_ventoy_disk_uuid = NULL;
|
||||
static char g_ventoy_disk_uuid[64];
|
||||
static bool g_ventoy_tasted = false;
|
||||
static off_t g_ventoy_disk_size = 0;
|
||||
static off_t g_disk_map_start = 0;
|
||||
static off_t g_disk_map_end = 0;
|
||||
static int g_ventoy_remount = 0;
|
||||
|
||||
struct g_ventoy_map g_ventoy_map_data __attribute__((aligned (4096))) =
|
||||
{
|
||||
{ VENTOY_UNIX_SEG_MAGIC0, VENTOY_UNIX_SEG_MAGIC1, VENTOY_UNIX_SEG_MAGIC2, VENTOY_UNIX_SEG_MAGIC3 },
|
||||
{ 0, 0, 0, 0 },
|
||||
0, 0,
|
||||
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ { 0, 0 } },
|
||||
{ VENTOY_UNIX_SEG_MAGIC0, VENTOY_UNIX_SEG_MAGIC1, VENTOY_UNIX_SEG_MAGIC2, VENTOY_UNIX_SEG_MAGIC3 }
|
||||
};
|
||||
|
||||
struct g_class g_ventoy_class = {
|
||||
.name = G_VENTOY_CLASS_NAME,
|
||||
@@ -191,12 +202,19 @@ g_ventoy_access(struct g_provider *pp, int dr, int dw, int de)
|
||||
g_topology_assert();
|
||||
gp = pp->geom;
|
||||
|
||||
if (g_ventoy_remount)
|
||||
{
|
||||
de = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* On first open, grab an extra "exclusive" bit */
|
||||
if (pp->acr == 0 && pp->acw == 0 && pp->ace == 0)
|
||||
de++;
|
||||
/* ... and let go of it on last close */
|
||||
if ((pp->acr + dr) == 0 && (pp->acw + dw) == 0 && (pp->ace + de) == 0)
|
||||
de--;
|
||||
}
|
||||
|
||||
LIST_FOREACH_SAFE(cp1, &gp->consumer, consumer, tmp) {
|
||||
error = g_access(cp1, dr, dw, de);
|
||||
@@ -642,23 +660,51 @@ g_ventoy_destroy_geom(struct gctl_req *req __unused,
|
||||
static bool g_vtoy_check_disk(struct g_class *mp, struct g_provider *pp)
|
||||
{
|
||||
int i;
|
||||
int vlnk = 0;
|
||||
bool ret = true;
|
||||
uint8_t *buf;
|
||||
char uuid[64];
|
||||
const char *value;
|
||||
struct g_consumer *cp;
|
||||
struct g_geom *gp;
|
||||
uint8_t mbrdata[] = {
|
||||
0xEB, 0x63, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x56, 0x54, 0x00, 0x47, 0x65, 0x00, 0x48, 0x44, 0x00, 0x52, 0x64, 0x00, 0x20, 0x45, 0x72, 0x0D,
|
||||
};
|
||||
|
||||
if (g_ventoy_disk_size == 0)
|
||||
{
|
||||
if (VENTOY_MAP_VALID(g_ventoy_map_data.magic2))
|
||||
{
|
||||
G_DEBUG("ventoy map data is valid. [OK]\n");
|
||||
|
||||
for (i = 0; i < 16; i++)
|
||||
{
|
||||
sprintf(uuid + i * 2, "%02x", g_ventoy_map_data.diskuuid[i]);
|
||||
}
|
||||
snprintf(g_ventoy_disk_uuid, sizeof(g_ventoy_disk_uuid), "%s", uuid);
|
||||
g_ventoy_disk_size = g_ventoy_map_data.disksize;
|
||||
|
||||
G_DEBUG("ventoy.disksize: %llu\n", (unsigned long long)g_ventoy_disk_size);
|
||||
G_DEBUG("ventoy.diskuuid: <%s>\n", g_ventoy_disk_uuid);
|
||||
}
|
||||
else
|
||||
{
|
||||
G_DEBUG("ventoy map data is invalid, get from resource\n");
|
||||
|
||||
if (resource_string_value("ventoy", 0, "disksize", &value) == 0)
|
||||
{
|
||||
G_DEBUG("ventoy.disksize: %s\n", value);
|
||||
g_ventoy_disk_size = strtouq(value, NULL, 0);
|
||||
}
|
||||
|
||||
if (resource_string_value("ventoy", 0, "diskuuid", &g_ventoy_disk_uuid) == 0)
|
||||
if (resource_string_value("ventoy", 0, "diskuuid", &value) == 0)
|
||||
{
|
||||
G_DEBUG("ventoy.diskuuid: <%s>\n", g_ventoy_disk_uuid);
|
||||
snprintf(g_ventoy_disk_uuid, sizeof(g_ventoy_disk_uuid), "%s", value);
|
||||
G_DEBUG("ventoy.diskuuid: <%s>\n", value);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -700,14 +746,28 @@ static bool g_vtoy_check_disk(struct g_class *mp, struct g_provider *pp)
|
||||
{
|
||||
sprintf(uuid + i * 2, "%02x", buf[0x180 + i]);
|
||||
}
|
||||
g_free(buf);
|
||||
|
||||
if (strncmp(g_ventoy_disk_uuid, uuid, 32) == 0)
|
||||
if (strncmp(g_ventoy_disk_uuid, uuid, 32))
|
||||
{
|
||||
return true;
|
||||
ret = false;
|
||||
}
|
||||
|
||||
return false;
|
||||
if (resource_int_value("ventoy", 0, "vlnk", &vlnk) || (vlnk != 1))
|
||||
{
|
||||
if (memcmp(mbrdata, buf, 0x30) || memcmp(mbrdata + 0x30, buf + 0x190, 16))
|
||||
{
|
||||
ret = false;
|
||||
}
|
||||
}
|
||||
|
||||
g_free(buf);
|
||||
|
||||
if (ret)
|
||||
{
|
||||
G_DEBUG("ventoy disk check OK\n");
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static struct g_geom *
|
||||
@@ -716,8 +776,10 @@ g_ventoy_taste(struct g_class *mp, struct g_provider *pp, int flags __unused)
|
||||
int i;
|
||||
int error;
|
||||
int disknum;
|
||||
int remount = 0;
|
||||
char *endpos;
|
||||
const char *value;
|
||||
const char *alias = NULL;
|
||||
struct g_geom *gp;
|
||||
struct g_ventoy_metadata md;
|
||||
struct g_ventoy_softc *sc;
|
||||
@@ -741,9 +803,32 @@ g_ventoy_taste(struct g_class *mp, struct g_provider *pp, int flags __unused)
|
||||
|
||||
g_ventoy_tasted = true;
|
||||
|
||||
G_DEBUG("######### ventoy disk <%s> #############\n", pp->name);
|
||||
G_DEBUG("###### ventoy disk <%s> ######\n", pp->name);
|
||||
|
||||
/* hint.ventoy.0.remount=1 */
|
||||
if (resource_int_value("ventoy", 0, "remount", &remount) == 0 && remount == 1)
|
||||
{
|
||||
g_ventoy_remount = 1;
|
||||
G_DEBUG("###### ventoy remount enabled ######\n");
|
||||
}
|
||||
|
||||
/* hint.ventoy.0.alias=xxx */
|
||||
if (resource_string_value("ventoy", 0, "alias", &alias) == 0 && alias)
|
||||
{
|
||||
G_DEBUG("###### ventoy alias <%s> ######\n", alias);
|
||||
setenv("kern.devalias.ventoy/IMAGE", alias);
|
||||
}
|
||||
|
||||
if (VENTOY_MAP_VALID(g_ventoy_map_data.magic2))
|
||||
{
|
||||
disknum = (int)g_ventoy_map_data.segnum;
|
||||
G_DEBUG("segnum from map data is:<%d>\n", disknum);
|
||||
}
|
||||
else
|
||||
{
|
||||
resource_int_value("ventoy", 0, "segnum", &disknum);
|
||||
G_DEBUG("segnum from resource is:<%d>\n", disknum);
|
||||
}
|
||||
|
||||
strlcpy(md.md_magic, G_VENTOY_MAGIC, sizeof(md.md_magic));
|
||||
md.md_version = G_VENTOY_VERSION;
|
||||
@@ -764,6 +849,17 @@ g_ventoy_taste(struct g_class *mp, struct g_provider *pp, int flags __unused)
|
||||
sc = gp->softc;
|
||||
|
||||
for (i = 0; i < disknum; i ++)
|
||||
{
|
||||
if (VENTOY_MAP_VALID(g_ventoy_map_data.magic2))
|
||||
{
|
||||
G_DEBUG("[map] ventoy segment%d: 0x%llx@0x%llx\n", i,
|
||||
(long long)g_ventoy_map_data.seglist[i].seg_start_bytes,
|
||||
(long long)g_ventoy_map_data.seglist[i].seg_end_bytes);
|
||||
|
||||
g_disk_map_start = (off_t)g_ventoy_map_data.seglist[i].seg_start_bytes;
|
||||
g_disk_map_end = (off_t)g_ventoy_map_data.seglist[i].seg_end_bytes;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (resource_string_value("ventoy", i, "seg", &value) == 0)
|
||||
{
|
||||
@@ -775,8 +871,8 @@ g_ventoy_taste(struct g_class *mp, struct g_provider *pp, int flags __unused)
|
||||
printf("Failed to parse ventoy seg %d\n", i);
|
||||
continue;
|
||||
}
|
||||
|
||||
G_DEBUG("ventoy segment%d: %s\n", i, value);
|
||||
G_DEBUG("[resource] ventoy segment%d: %s\n", i, value);
|
||||
}
|
||||
|
||||
G_VENTOY_DEBUG(1, "Adding disk %s to %s.", pp->name, gp->name);
|
||||
error = g_ventoy_add_disk(sc, pp, i);
|
||||
|
@@ -76,6 +76,33 @@ struct g_ventoy_softc {
|
||||
struct mtx sc_lock;
|
||||
};
|
||||
#define sc_name sc_geom->name
|
||||
|
||||
|
||||
#pragma pack(1)
|
||||
#define VENTOY_UNIX_SEG_MAGIC0 0x11223344
|
||||
#define VENTOY_UNIX_SEG_MAGIC1 0x55667788
|
||||
#define VENTOY_UNIX_SEG_MAGIC2 0x99aabbcc
|
||||
#define VENTOY_UNIX_SEG_MAGIC3 0xddeeff00
|
||||
#define VENTOY_UNIX_MAX_SEGNUM 40960
|
||||
struct g_ventoy_seg {
|
||||
uint64_t seg_start_bytes;
|
||||
uint64_t seg_end_bytes;
|
||||
};
|
||||
|
||||
struct g_ventoy_map{
|
||||
uint32_t magic1[4];
|
||||
uint32_t magic2[4];
|
||||
uint64_t segnum;
|
||||
uint64_t disksize;
|
||||
uint8_t diskuuid[16];
|
||||
struct g_ventoy_seg seglist[VENTOY_UNIX_MAX_SEGNUM];
|
||||
uint32_t magic3[4];
|
||||
};
|
||||
#pragma pack()
|
||||
|
||||
#define VENTOY_MAP_VALID(magic2) \
|
||||
(magic2[0] == VENTOY_UNIX_SEG_MAGIC0 && magic2[1] == VENTOY_UNIX_SEG_MAGIC1 && magic2[2] == VENTOY_UNIX_SEG_MAGIC2 && magic2[3] == VENTOY_UNIX_SEG_MAGIC3)
|
||||
|
||||
#endif /* _KERNEL */
|
||||
|
||||
struct g_ventoy_metadata {
|
||||
|
@@ -65,11 +65,22 @@ static g_taste_t g_ventoy_taste;
|
||||
static g_ctl_req_t g_ventoy_config;
|
||||
static g_dumpconf_t g_ventoy_dumpconf;
|
||||
|
||||
static const char *g_ventoy_disk_uuid = NULL;
|
||||
static char g_ventoy_disk_uuid[64];
|
||||
static bool g_ventoy_tasted = false;
|
||||
static off_t g_ventoy_disk_size = 0;
|
||||
static off_t g_disk_map_start = 0;
|
||||
static off_t g_disk_map_end = 0;
|
||||
static int g_ventoy_remount = 0;
|
||||
|
||||
struct g_ventoy_map g_ventoy_map_data __attribute__((aligned (4096))) =
|
||||
{
|
||||
{ VENTOY_UNIX_SEG_MAGIC0, VENTOY_UNIX_SEG_MAGIC1, VENTOY_UNIX_SEG_MAGIC2, VENTOY_UNIX_SEG_MAGIC3 },
|
||||
{ 0, 0, 0, 0 },
|
||||
0, 0,
|
||||
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ { 0, 0 } },
|
||||
{ VENTOY_UNIX_SEG_MAGIC0, VENTOY_UNIX_SEG_MAGIC1, VENTOY_UNIX_SEG_MAGIC2, VENTOY_UNIX_SEG_MAGIC3 }
|
||||
};
|
||||
|
||||
struct g_class g_ventoy_class = {
|
||||
.name = G_VENTOY_CLASS_NAME,
|
||||
@@ -191,12 +202,19 @@ g_ventoy_access(struct g_provider *pp, int dr, int dw, int de)
|
||||
g_topology_assert();
|
||||
gp = pp->geom;
|
||||
|
||||
if (g_ventoy_remount)
|
||||
{
|
||||
de = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* On first open, grab an extra "exclusive" bit */
|
||||
if (pp->acr == 0 && pp->acw == 0 && pp->ace == 0)
|
||||
de++;
|
||||
/* ... and let go of it on last close */
|
||||
if ((pp->acr + dr) == 0 && (pp->acw + dw) == 0 && (pp->ace + de) == 0)
|
||||
de--;
|
||||
}
|
||||
|
||||
LIST_FOREACH_SAFE(cp1, &gp->consumer, consumer, tmp) {
|
||||
error = g_access(cp1, dr, dw, de);
|
||||
@@ -678,23 +696,51 @@ g_ventoy_destroy_geom(struct gctl_req *req __unused,
|
||||
static bool g_vtoy_check_disk(struct g_class *mp, struct g_provider *pp)
|
||||
{
|
||||
int i;
|
||||
int vlnk = 0;
|
||||
bool ret = true;
|
||||
uint8_t *buf;
|
||||
char uuid[64];
|
||||
const char *value;
|
||||
struct g_consumer *cp;
|
||||
struct g_geom *gp;
|
||||
uint8_t mbrdata[] = {
|
||||
0xEB, 0x63, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x56, 0x54, 0x00, 0x47, 0x65, 0x00, 0x48, 0x44, 0x00, 0x52, 0x64, 0x00, 0x20, 0x45, 0x72, 0x0D,
|
||||
};
|
||||
|
||||
if (g_ventoy_disk_size == 0)
|
||||
{
|
||||
if (VENTOY_MAP_VALID(g_ventoy_map_data.magic2))
|
||||
{
|
||||
G_DEBUG("ventoy map data is valid. [OK]\n");
|
||||
|
||||
for (i = 0; i < 16; i++)
|
||||
{
|
||||
sprintf(uuid + i * 2, "%02x", g_ventoy_map_data.diskuuid[i]);
|
||||
}
|
||||
snprintf(g_ventoy_disk_uuid, sizeof(g_ventoy_disk_uuid), "%s", uuid);
|
||||
g_ventoy_disk_size = g_ventoy_map_data.disksize;
|
||||
|
||||
G_DEBUG("ventoy.disksize: %llu\n", (unsigned long long)g_ventoy_disk_size);
|
||||
G_DEBUG("ventoy.diskuuid: <%s>\n", g_ventoy_disk_uuid);
|
||||
}
|
||||
else
|
||||
{
|
||||
G_DEBUG("ventoy map data is invalid, get from resource\n");
|
||||
|
||||
if (resource_string_value("ventoy", 0, "disksize", &value) == 0)
|
||||
{
|
||||
G_DEBUG("ventoy.disksize: %s\n", value);
|
||||
g_ventoy_disk_size = strtouq(value, NULL, 0);
|
||||
}
|
||||
|
||||
if (resource_string_value("ventoy", 0, "diskuuid", &g_ventoy_disk_uuid) == 0)
|
||||
if (resource_string_value("ventoy", 0, "diskuuid", &value) == 0)
|
||||
{
|
||||
G_DEBUG("ventoy.diskuuid: <%s>\n", g_ventoy_disk_uuid);
|
||||
snprintf(g_ventoy_disk_uuid, sizeof(g_ventoy_disk_uuid), "%s", value);
|
||||
G_DEBUG("ventoy.diskuuid: <%s>\n", value);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -736,14 +782,93 @@ static bool g_vtoy_check_disk(struct g_class *mp, struct g_provider *pp)
|
||||
{
|
||||
sprintf(uuid + i * 2, "%02x", buf[0x180 + i]);
|
||||
}
|
||||
g_free(buf);
|
||||
|
||||
if (strncmp(g_ventoy_disk_uuid, uuid, 32) == 0)
|
||||
if (strncmp(g_ventoy_disk_uuid, uuid, 32))
|
||||
{
|
||||
return true;
|
||||
ret = false;
|
||||
}
|
||||
|
||||
return false;
|
||||
if (resource_int_value("ventoy", 0, "vlnk", &vlnk) || (vlnk != 1))
|
||||
{
|
||||
if (memcmp(mbrdata, buf, 0x30) || memcmp(mbrdata + 0x30, buf + 0x190, 16))
|
||||
{
|
||||
ret = false;
|
||||
}
|
||||
}
|
||||
|
||||
g_free(buf);
|
||||
|
||||
if (ret)
|
||||
{
|
||||
G_DEBUG("ventoy disk check OK\n");
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
struct g_dev_softc {
|
||||
struct mtx sc_mtx;
|
||||
struct cdev *sc_dev;
|
||||
struct cdev *sc_alias;
|
||||
int sc_open;
|
||||
int sc_active;
|
||||
};
|
||||
|
||||
static int g_ventoy_devalias(struct g_provider *pp)
|
||||
{
|
||||
static int firstflag = 0;
|
||||
const static char *ventoy_alias = NULL;
|
||||
static struct g_provider *ventoy_pp = NULL;
|
||||
struct g_consumer *cp;
|
||||
struct cdev *adev;
|
||||
struct g_dev_softc *sc;
|
||||
|
||||
if (firstflag == 0)
|
||||
{
|
||||
/* hint.ventoy.0.alias=xxx */
|
||||
if (resource_string_value("ventoy", 0, "alias", &ventoy_alias) == 0)
|
||||
{
|
||||
G_DEBUG("###### ventoy alias <%s> ######\n", ventoy_alias);
|
||||
}
|
||||
else
|
||||
{
|
||||
ventoy_alias = NULL;
|
||||
}
|
||||
firstflag = 1;
|
||||
}
|
||||
|
||||
if (!ventoy_alias)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!ventoy_pp)
|
||||
{
|
||||
if (strcmp(pp->name, "ventoy/IMAGE") == 0)
|
||||
{
|
||||
ventoy_pp = pp;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
LIST_FOREACH(cp, &ventoy_pp->consumers, consumers) {
|
||||
if (cp->geom && cp->geom->class && cp->geom->class->name)
|
||||
{
|
||||
printf("111 cp->geom->class->name=<%s>\n", cp->geom->class->name);
|
||||
|
||||
if (strcmp(cp->geom->class->name, "DEV") == 0)
|
||||
{
|
||||
sc = cp->private;
|
||||
|
||||
make_dev_alias_p(MAKEDEV_CHECKNAME | MAKEDEV_WAITOK, &adev, sc->sc_dev, "%s", ventoy_alias);
|
||||
G_DEBUG("Create devalias for ventoy <%s>\n", ventoy_alias);
|
||||
ventoy_alias = NULL;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct g_geom *
|
||||
@@ -752,12 +877,15 @@ g_ventoy_taste(struct g_class *mp, struct g_provider *pp, int flags __unused)
|
||||
int i;
|
||||
int error;
|
||||
int disknum;
|
||||
int remount = 0;
|
||||
char *endpos;
|
||||
const char *value;
|
||||
struct g_geom *gp;
|
||||
struct g_ventoy_metadata md;
|
||||
struct g_ventoy_softc *sc;
|
||||
|
||||
g_ventoy_devalias(pp);
|
||||
|
||||
if (g_ventoy_tasted)
|
||||
{
|
||||
return NULL;
|
||||
@@ -777,9 +905,25 @@ g_ventoy_taste(struct g_class *mp, struct g_provider *pp, int flags __unused)
|
||||
|
||||
g_ventoy_tasted = true;
|
||||
|
||||
G_DEBUG("######### ventoy disk <%s> #############\n", pp->name);
|
||||
G_DEBUG("###### ventoy disk <%s> ######\n", pp->name);
|
||||
|
||||
/* hint.ventoy.0.remount=1 */
|
||||
if (resource_int_value("ventoy", 0, "remount", &remount) == 0 && remount == 1)
|
||||
{
|
||||
g_ventoy_remount = 1;
|
||||
G_DEBUG("###### ventoy remount enabled ######\n");
|
||||
}
|
||||
|
||||
if (VENTOY_MAP_VALID(g_ventoy_map_data.magic2))
|
||||
{
|
||||
disknum = (int)g_ventoy_map_data.segnum;
|
||||
G_DEBUG("segnum from map data is:<%d>\n", disknum);
|
||||
}
|
||||
else
|
||||
{
|
||||
resource_int_value("ventoy", 0, "segnum", &disknum);
|
||||
G_DEBUG("segnum from resource is:<%d>\n", disknum);
|
||||
}
|
||||
|
||||
strlcpy(md.md_magic, G_VENTOY_MAGIC, sizeof(md.md_magic));
|
||||
md.md_version = G_VENTOY_VERSION;
|
||||
@@ -800,6 +944,17 @@ g_ventoy_taste(struct g_class *mp, struct g_provider *pp, int flags __unused)
|
||||
sc = gp->softc;
|
||||
|
||||
for (i = 0; i < disknum; i ++)
|
||||
{
|
||||
if (VENTOY_MAP_VALID(g_ventoy_map_data.magic2))
|
||||
{
|
||||
G_DEBUG("[map] ventoy segment%d: 0x%llx@0x%llx\n", i,
|
||||
(long long)g_ventoy_map_data.seglist[i].seg_start_bytes,
|
||||
(long long)g_ventoy_map_data.seglist[i].seg_end_bytes);
|
||||
|
||||
g_disk_map_start = (off_t)g_ventoy_map_data.seglist[i].seg_start_bytes;
|
||||
g_disk_map_end = (off_t)g_ventoy_map_data.seglist[i].seg_end_bytes;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (resource_string_value("ventoy", i, "seg", &value) == 0)
|
||||
{
|
||||
@@ -811,8 +966,8 @@ g_ventoy_taste(struct g_class *mp, struct g_provider *pp, int flags __unused)
|
||||
printf("Failed to parse ventoy seg %d\n", i);
|
||||
continue;
|
||||
}
|
||||
|
||||
G_DEBUG("ventoy segment%d: %s\n", i, value);
|
||||
G_DEBUG("[resource] ventoy segment%d: %s\n", i, value);
|
||||
}
|
||||
|
||||
G_VENTOY_DEBUG(1, "Adding disk %s to %s.", pp->name, gp->name);
|
||||
error = g_ventoy_add_disk(sc, pp, i);
|
||||
@@ -1066,3 +1221,4 @@ g_ventoy_dumpconf(struct sbuf *sb, const char *indent, struct g_geom *gp,
|
||||
}
|
||||
|
||||
DECLARE_GEOM_CLASS(g_ventoy_class, g_ventoy);
|
||||
//MODULE_VERSION(geom_ventoy, 0);
|
||||
|
@@ -76,6 +76,33 @@ struct g_ventoy_softc {
|
||||
struct mtx sc_lock;
|
||||
};
|
||||
#define sc_name sc_geom->name
|
||||
|
||||
|
||||
#pragma pack(1)
|
||||
#define VENTOY_UNIX_SEG_MAGIC0 0x11223344
|
||||
#define VENTOY_UNIX_SEG_MAGIC1 0x55667788
|
||||
#define VENTOY_UNIX_SEG_MAGIC2 0x99aabbcc
|
||||
#define VENTOY_UNIX_SEG_MAGIC3 0xddeeff00
|
||||
#define VENTOY_UNIX_MAX_SEGNUM 40960
|
||||
struct g_ventoy_seg {
|
||||
uint64_t seg_start_bytes;
|
||||
uint64_t seg_end_bytes;
|
||||
};
|
||||
|
||||
struct g_ventoy_map{
|
||||
uint32_t magic1[4];
|
||||
uint32_t magic2[4];
|
||||
uint64_t segnum;
|
||||
uint64_t disksize;
|
||||
uint8_t diskuuid[16];
|
||||
struct g_ventoy_seg seglist[VENTOY_UNIX_MAX_SEGNUM];
|
||||
uint32_t magic3[4];
|
||||
};
|
||||
#pragma pack()
|
||||
|
||||
#define VENTOY_MAP_VALID(magic2) \
|
||||
(magic2[0] == VENTOY_UNIX_SEG_MAGIC0 && magic2[1] == VENTOY_UNIX_SEG_MAGIC1 && magic2[2] == VENTOY_UNIX_SEG_MAGIC2 && magic2[3] == VENTOY_UNIX_SEG_MAGIC3)
|
||||
|
||||
#endif /* _KERNEL */
|
||||
|
||||
struct g_ventoy_metadata {
|
||||
|
@@ -70,8 +70,9 @@ static bool g_ventoy_tasted = false;
|
||||
static off_t g_ventoy_disk_size = 0;
|
||||
static off_t g_disk_map_start = 0;
|
||||
static off_t g_disk_map_end = 0;
|
||||
static int g_ventoy_remount = 0;
|
||||
|
||||
struct g_ventoy_map g_ventoy_map_data __attribute__((aligned (65536))) =
|
||||
struct g_ventoy_map g_ventoy_map_data __attribute__((aligned (4096))) =
|
||||
{
|
||||
{ VENTOY_UNIX_SEG_MAGIC0, VENTOY_UNIX_SEG_MAGIC1, VENTOY_UNIX_SEG_MAGIC2, VENTOY_UNIX_SEG_MAGIC3 },
|
||||
{ 0, 0, 0, 0 },
|
||||
@@ -200,12 +201,19 @@ g_ventoy_access(struct g_provider *pp, int dr, int dw, int de)
|
||||
g_topology_assert();
|
||||
gp = pp->geom;
|
||||
|
||||
if (g_ventoy_remount)
|
||||
{
|
||||
de = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* On first open, grab an extra "exclusive" bit */
|
||||
if (pp->acr == 0 && pp->acw == 0 && pp->ace == 0)
|
||||
de++;
|
||||
/* ... and let go of it on last close */
|
||||
if ((pp->acr + dr) == 0 && (pp->acw + dw) == 0 && (pp->ace + de) == 0)
|
||||
de--;
|
||||
}
|
||||
|
||||
LIST_FOREACH_SAFE(cp1, &gp->consumer, consumer, tmp) {
|
||||
error = g_access(cp1, dr, dw, de);
|
||||
@@ -687,6 +695,7 @@ g_ventoy_destroy_geom(struct gctl_req *req __unused,
|
||||
static bool g_vtoy_check_disk(struct g_class *mp, struct g_provider *pp)
|
||||
{
|
||||
int i;
|
||||
int vlnk = 0;
|
||||
bool ret = true;
|
||||
uint8_t *buf;
|
||||
char uuid[64];
|
||||
@@ -778,10 +787,13 @@ static bool g_vtoy_check_disk(struct g_class *mp, struct g_provider *pp)
|
||||
ret = false;
|
||||
}
|
||||
|
||||
if (resource_int_value("ventoy", 0, "vlnk", &vlnk) || (vlnk != 1))
|
||||
{
|
||||
if (memcmp(mbrdata, buf, 0x30) || memcmp(mbrdata + 0x30, buf + 0x190, 16))
|
||||
{
|
||||
ret = false;
|
||||
}
|
||||
}
|
||||
|
||||
g_free(buf);
|
||||
|
||||
@@ -799,8 +811,10 @@ g_ventoy_taste(struct g_class *mp, struct g_provider *pp, int flags __unused)
|
||||
int i;
|
||||
int error;
|
||||
int disknum;
|
||||
int remount = 0;
|
||||
char *endpos;
|
||||
const char *value;
|
||||
const char *alias = NULL;
|
||||
struct g_geom *gp;
|
||||
struct g_ventoy_metadata md;
|
||||
struct g_ventoy_softc *sc;
|
||||
@@ -824,7 +838,24 @@ g_ventoy_taste(struct g_class *mp, struct g_provider *pp, int flags __unused)
|
||||
|
||||
g_ventoy_tasted = true;
|
||||
|
||||
G_DEBUG("######### ventoy disk <%s> #############\n", pp->name);
|
||||
G_DEBUG("###### ventoy disk <%s> ######\n", pp->name);
|
||||
|
||||
/* hint.ventoy.0.remount=1 */
|
||||
if (resource_int_value("ventoy", 0, "remount", &remount) == 0 && remount == 1)
|
||||
{
|
||||
g_ventoy_remount = 1;
|
||||
G_DEBUG("###### ventoy remount enabled ######\n");
|
||||
}
|
||||
|
||||
/* hint.ventoy.0.alias=xxx */
|
||||
if (resource_string_value("ventoy", 0, "alias", &alias) == 0)
|
||||
{
|
||||
G_DEBUG("###### ventoy alias <%s> ######\n", alias);
|
||||
}
|
||||
else
|
||||
{
|
||||
alias = NULL;
|
||||
}
|
||||
|
||||
if (VENTOY_MAP_VALID(g_ventoy_map_data.magic2))
|
||||
{
|
||||
@@ -895,6 +926,11 @@ g_ventoy_taste(struct g_class *mp, struct g_provider *pp, int flags __unused)
|
||||
g_disk_map_end = 0;
|
||||
}
|
||||
|
||||
if (alias)
|
||||
{
|
||||
g_geom_add_alias(gp, alias);
|
||||
}
|
||||
|
||||
return (gp);
|
||||
}
|
||||
|
||||
|
@@ -70,8 +70,9 @@ static bool g_ventoy_tasted = false;
|
||||
static off_t g_ventoy_disk_size = 0;
|
||||
static off_t g_disk_map_start = 0;
|
||||
static off_t g_disk_map_end = 0;
|
||||
static int g_ventoy_remount = 0;
|
||||
|
||||
struct g_ventoy_map g_ventoy_map_data __attribute__((aligned (65536))) =
|
||||
struct g_ventoy_map g_ventoy_map_data __attribute__((aligned (4096))) =
|
||||
{
|
||||
{ VENTOY_UNIX_SEG_MAGIC0, VENTOY_UNIX_SEG_MAGIC1, VENTOY_UNIX_SEG_MAGIC2, VENTOY_UNIX_SEG_MAGIC3 },
|
||||
{ 0, 0, 0, 0 },
|
||||
@@ -200,12 +201,19 @@ g_ventoy_access(struct g_provider *pp, int dr, int dw, int de)
|
||||
g_topology_assert();
|
||||
gp = pp->geom;
|
||||
|
||||
if (g_ventoy_remount)
|
||||
{
|
||||
de = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* On first open, grab an extra "exclusive" bit */
|
||||
if (pp->acr == 0 && pp->acw == 0 && pp->ace == 0)
|
||||
de++;
|
||||
/* ... and let go of it on last close */
|
||||
if ((pp->acr + dr) == 0 && (pp->acw + dw) == 0 && (pp->ace + de) == 0)
|
||||
de--;
|
||||
}
|
||||
|
||||
LIST_FOREACH_SAFE(cp1, &gp->consumer, consumer, tmp) {
|
||||
error = g_access(cp1, dr, dw, de);
|
||||
@@ -721,6 +729,7 @@ g_ventoy_destroy_geom(struct gctl_req *req __unused,
|
||||
static bool g_vtoy_check_disk(struct g_class *mp, struct g_provider *pp)
|
||||
{
|
||||
int i;
|
||||
int vlnk = 0;
|
||||
bool ret = true;
|
||||
uint8_t *buf;
|
||||
char uuid[64];
|
||||
@@ -812,10 +821,13 @@ static bool g_vtoy_check_disk(struct g_class *mp, struct g_provider *pp)
|
||||
ret = false;
|
||||
}
|
||||
|
||||
if (resource_int_value("ventoy", 0, "vlnk", &vlnk) || (vlnk != 1))
|
||||
{
|
||||
if (memcmp(mbrdata, buf, 0x30) || memcmp(mbrdata + 0x30, buf + 0x190, 16))
|
||||
{
|
||||
ret = false;
|
||||
}
|
||||
}
|
||||
|
||||
g_free(buf);
|
||||
|
||||
@@ -833,8 +845,10 @@ g_ventoy_taste(struct g_class *mp, struct g_provider *pp, int flags __unused)
|
||||
int i;
|
||||
int error;
|
||||
int disknum;
|
||||
int remount = 0;
|
||||
char *endpos;
|
||||
const char *value;
|
||||
const char *alias = NULL;
|
||||
struct g_geom *gp;
|
||||
struct g_ventoy_metadata md;
|
||||
struct g_ventoy_softc *sc;
|
||||
@@ -858,7 +872,24 @@ g_ventoy_taste(struct g_class *mp, struct g_provider *pp, int flags __unused)
|
||||
|
||||
g_ventoy_tasted = true;
|
||||
|
||||
G_DEBUG("######### ventoy disk <%s> #############\n", pp->name);
|
||||
G_DEBUG("###### ventoy disk <%s> ######\n", pp->name);
|
||||
|
||||
/* hint.ventoy.0.remount=1 */
|
||||
if (resource_int_value("ventoy", 0, "remount", &remount) == 0 && remount == 1)
|
||||
{
|
||||
g_ventoy_remount = 1;
|
||||
G_DEBUG("###### ventoy remount enabled ######\n");
|
||||
}
|
||||
|
||||
/* hint.ventoy.0.alias=xxx */
|
||||
if (resource_string_value("ventoy", 0, "alias", &alias) == 0)
|
||||
{
|
||||
G_DEBUG("###### ventoy alias <%s> ######\n", alias);
|
||||
}
|
||||
else
|
||||
{
|
||||
alias = NULL;
|
||||
}
|
||||
|
||||
if (VENTOY_MAP_VALID(g_ventoy_map_data.magic2))
|
||||
{
|
||||
@@ -929,6 +960,11 @@ g_ventoy_taste(struct g_class *mp, struct g_provider *pp, int flags __unused)
|
||||
g_disk_map_end = 0;
|
||||
}
|
||||
|
||||
if (alias && sc && sc->sc_provider)
|
||||
{
|
||||
g_provider_add_alias(sc->sc_provider, "%s", alias);
|
||||
}
|
||||
|
||||
return (gp);
|
||||
}
|
||||
|
||||
|
@@ -65,11 +65,22 @@ static g_taste_t g_ventoy_taste;
|
||||
static g_ctl_req_t g_ventoy_config;
|
||||
static g_dumpconf_t g_ventoy_dumpconf;
|
||||
|
||||
static const char *g_ventoy_disk_uuid = NULL;
|
||||
static char g_ventoy_disk_uuid[64];
|
||||
static bool g_ventoy_tasted = false;
|
||||
static off_t g_ventoy_disk_size = 0;
|
||||
static off_t g_disk_map_start = 0;
|
||||
static off_t g_disk_map_end = 0;
|
||||
static int g_ventoy_remount = 0;
|
||||
|
||||
struct g_ventoy_map g_ventoy_map_data __attribute__((aligned (4096))) =
|
||||
{
|
||||
{ VENTOY_UNIX_SEG_MAGIC0, VENTOY_UNIX_SEG_MAGIC1, VENTOY_UNIX_SEG_MAGIC2, VENTOY_UNIX_SEG_MAGIC3 },
|
||||
{ 0, 0, 0, 0 },
|
||||
0, 0,
|
||||
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ { 0, 0 } },
|
||||
{ VENTOY_UNIX_SEG_MAGIC0, VENTOY_UNIX_SEG_MAGIC1, VENTOY_UNIX_SEG_MAGIC2, VENTOY_UNIX_SEG_MAGIC3 }
|
||||
};
|
||||
|
||||
struct g_class g_ventoy_class = {
|
||||
.name = G_VENTOY_CLASS_NAME,
|
||||
@@ -191,12 +202,19 @@ g_ventoy_access(struct g_provider *pp, int dr, int dw, int de)
|
||||
g_topology_assert();
|
||||
gp = pp->geom;
|
||||
|
||||
if (g_ventoy_remount)
|
||||
{
|
||||
de = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* On first open, grab an extra "exclusive" bit */
|
||||
if (pp->acr == 0 && pp->acw == 0 && pp->ace == 0)
|
||||
de++;
|
||||
/* ... and let go of it on last close */
|
||||
if ((pp->acr + dr) == 0 && (pp->acw + dw) == 0 && (pp->ace + de) == 0)
|
||||
de--;
|
||||
}
|
||||
|
||||
LIST_FOREACH_SAFE(cp1, &gp->consumer, consumer, tmp) {
|
||||
error = g_access(cp1, dr, dw, de);
|
||||
@@ -642,23 +660,51 @@ g_ventoy_destroy_geom(struct gctl_req *req __unused,
|
||||
static bool g_vtoy_check_disk(struct g_class *mp, struct g_provider *pp)
|
||||
{
|
||||
int i;
|
||||
int vlnk = 0;
|
||||
bool ret = true;
|
||||
uint8_t *buf;
|
||||
char uuid[64];
|
||||
const char *value;
|
||||
struct g_consumer *cp;
|
||||
struct g_geom *gp;
|
||||
uint8_t mbrdata[] = {
|
||||
0xEB, 0x63, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x56, 0x54, 0x00, 0x47, 0x65, 0x00, 0x48, 0x44, 0x00, 0x52, 0x64, 0x00, 0x20, 0x45, 0x72, 0x0D,
|
||||
};
|
||||
|
||||
if (g_ventoy_disk_size == 0)
|
||||
{
|
||||
if (VENTOY_MAP_VALID(g_ventoy_map_data.magic2))
|
||||
{
|
||||
G_DEBUG("ventoy map data is valid. [OK]\n");
|
||||
|
||||
for (i = 0; i < 16; i++)
|
||||
{
|
||||
sprintf(uuid + i * 2, "%02x", g_ventoy_map_data.diskuuid[i]);
|
||||
}
|
||||
snprintf(g_ventoy_disk_uuid, sizeof(g_ventoy_disk_uuid), "%s", uuid);
|
||||
g_ventoy_disk_size = g_ventoy_map_data.disksize;
|
||||
|
||||
G_DEBUG("ventoy.disksize: %llu\n", (unsigned long long)g_ventoy_disk_size);
|
||||
G_DEBUG("ventoy.diskuuid: <%s>\n", g_ventoy_disk_uuid);
|
||||
}
|
||||
else
|
||||
{
|
||||
G_DEBUG("ventoy map data is invalid, get from resource\n");
|
||||
|
||||
if (resource_string_value("ventoy", 0, "disksize", &value) == 0)
|
||||
{
|
||||
G_DEBUG("ventoy.disksize: %s\n", value);
|
||||
g_ventoy_disk_size = strtouq(value, NULL, 0);
|
||||
}
|
||||
|
||||
if (resource_string_value("ventoy", 0, "diskuuid", &g_ventoy_disk_uuid) == 0)
|
||||
if (resource_string_value("ventoy", 0, "diskuuid", &value) == 0)
|
||||
{
|
||||
G_DEBUG("ventoy.diskuuid: <%s>\n", g_ventoy_disk_uuid);
|
||||
snprintf(g_ventoy_disk_uuid, sizeof(g_ventoy_disk_uuid), "%s", value);
|
||||
G_DEBUG("ventoy.diskuuid: <%s>\n", value);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -700,14 +746,28 @@ static bool g_vtoy_check_disk(struct g_class *mp, struct g_provider *pp)
|
||||
{
|
||||
sprintf(uuid + i * 2, "%02x", buf[0x180 + i]);
|
||||
}
|
||||
g_free(buf);
|
||||
|
||||
if (strncmp(g_ventoy_disk_uuid, uuid, 32) == 0)
|
||||
if (strncmp(g_ventoy_disk_uuid, uuid, 32))
|
||||
{
|
||||
return true;
|
||||
ret = false;
|
||||
}
|
||||
|
||||
return false;
|
||||
if (resource_int_value("ventoy", 0, "vlnk", &vlnk) || (vlnk != 1))
|
||||
{
|
||||
if (memcmp(mbrdata, buf, 0x30) || memcmp(mbrdata + 0x30, buf + 0x190, 16))
|
||||
{
|
||||
ret = false;
|
||||
}
|
||||
}
|
||||
|
||||
g_free(buf);
|
||||
|
||||
if (ret)
|
||||
{
|
||||
G_DEBUG("ventoy disk check OK\n");
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static struct g_geom *
|
||||
@@ -716,8 +776,10 @@ g_ventoy_taste(struct g_class *mp, struct g_provider *pp, int flags __unused)
|
||||
int i;
|
||||
int error;
|
||||
int disknum;
|
||||
int remount = 0;
|
||||
char *endpos;
|
||||
const char *value;
|
||||
const char *alias = NULL;
|
||||
struct g_geom *gp;
|
||||
struct g_ventoy_metadata md;
|
||||
struct g_ventoy_softc *sc;
|
||||
@@ -741,9 +803,32 @@ g_ventoy_taste(struct g_class *mp, struct g_provider *pp, int flags __unused)
|
||||
|
||||
g_ventoy_tasted = true;
|
||||
|
||||
G_DEBUG("######### ventoy disk <%s> #############\n", pp->name);
|
||||
G_DEBUG("###### ventoy disk <%s> ######\n", pp->name);
|
||||
|
||||
/* hint.ventoy.0.remount=1 */
|
||||
if (resource_int_value("ventoy", 0, "remount", &remount) == 0 && remount == 1)
|
||||
{
|
||||
g_ventoy_remount = 1;
|
||||
G_DEBUG("###### ventoy remount enabled ######\n");
|
||||
}
|
||||
|
||||
/* hint.ventoy.0.alias=xxx */
|
||||
if (resource_string_value("ventoy", 0, "alias", &alias) == 0 && alias)
|
||||
{
|
||||
G_DEBUG("###### ventoy alias <%s> ######\n", alias);
|
||||
setenv("kern.devalias.ventoy/IMAGE", alias);
|
||||
}
|
||||
|
||||
if (VENTOY_MAP_VALID(g_ventoy_map_data.magic2))
|
||||
{
|
||||
disknum = (int)g_ventoy_map_data.segnum;
|
||||
G_DEBUG("segnum from map data is:<%d>\n", disknum);
|
||||
}
|
||||
else
|
||||
{
|
||||
resource_int_value("ventoy", 0, "segnum", &disknum);
|
||||
G_DEBUG("segnum from resource is:<%d>\n", disknum);
|
||||
}
|
||||
|
||||
strlcpy(md.md_magic, G_VENTOY_MAGIC, sizeof(md.md_magic));
|
||||
md.md_version = G_VENTOY_VERSION;
|
||||
@@ -764,6 +849,17 @@ g_ventoy_taste(struct g_class *mp, struct g_provider *pp, int flags __unused)
|
||||
sc = gp->softc;
|
||||
|
||||
for (i = 0; i < disknum; i ++)
|
||||
{
|
||||
if (VENTOY_MAP_VALID(g_ventoy_map_data.magic2))
|
||||
{
|
||||
G_DEBUG("[map] ventoy segment%d: 0x%llx@0x%llx\n", i,
|
||||
(long long)g_ventoy_map_data.seglist[i].seg_start_bytes,
|
||||
(long long)g_ventoy_map_data.seglist[i].seg_end_bytes);
|
||||
|
||||
g_disk_map_start = (off_t)g_ventoy_map_data.seglist[i].seg_start_bytes;
|
||||
g_disk_map_end = (off_t)g_ventoy_map_data.seglist[i].seg_end_bytes;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (resource_string_value("ventoy", i, "seg", &value) == 0)
|
||||
{
|
||||
@@ -775,8 +871,8 @@ g_ventoy_taste(struct g_class *mp, struct g_provider *pp, int flags __unused)
|
||||
printf("Failed to parse ventoy seg %d\n", i);
|
||||
continue;
|
||||
}
|
||||
|
||||
G_DEBUG("ventoy segment%d: %s\n", i, value);
|
||||
G_DEBUG("[resource] ventoy segment%d: %s\n", i, value);
|
||||
}
|
||||
|
||||
G_VENTOY_DEBUG(1, "Adding disk %s to %s.", pp->name, gp->name);
|
||||
error = g_ventoy_add_disk(sc, pp, i);
|
||||
|
@@ -76,6 +76,33 @@ struct g_ventoy_softc {
|
||||
struct mtx sc_lock;
|
||||
};
|
||||
#define sc_name sc_geom->name
|
||||
|
||||
|
||||
#pragma pack(1)
|
||||
#define VENTOY_UNIX_SEG_MAGIC0 0x11223344
|
||||
#define VENTOY_UNIX_SEG_MAGIC1 0x55667788
|
||||
#define VENTOY_UNIX_SEG_MAGIC2 0x99aabbcc
|
||||
#define VENTOY_UNIX_SEG_MAGIC3 0xddeeff00
|
||||
#define VENTOY_UNIX_MAX_SEGNUM 40960
|
||||
struct g_ventoy_seg {
|
||||
uint64_t seg_start_bytes;
|
||||
uint64_t seg_end_bytes;
|
||||
};
|
||||
|
||||
struct g_ventoy_map{
|
||||
uint32_t magic1[4];
|
||||
uint32_t magic2[4];
|
||||
uint64_t segnum;
|
||||
uint64_t disksize;
|
||||
uint8_t diskuuid[16];
|
||||
struct g_ventoy_seg seglist[VENTOY_UNIX_MAX_SEGNUM];
|
||||
uint32_t magic3[4];
|
||||
};
|
||||
#pragma pack()
|
||||
|
||||
#define VENTOY_MAP_VALID(magic2) \
|
||||
(magic2[0] == VENTOY_UNIX_SEG_MAGIC0 && magic2[1] == VENTOY_UNIX_SEG_MAGIC1 && magic2[2] == VENTOY_UNIX_SEG_MAGIC2 && magic2[3] == VENTOY_UNIX_SEG_MAGIC3)
|
||||
|
||||
#endif /* _KERNEL */
|
||||
|
||||
struct g_ventoy_metadata {
|
||||
|
Reference in New Issue
Block a user