Compare commits

..

21 Commits

Author SHA1 Message Date
longpanda
ba5978d298 1.0.66 release 2022-02-13 17:00:39 +08:00
longpanda
c57717aea2 Add tip in Plugson web page when old ventoy.json contains invalid configuration. 2022-02-06 18:00:29 +08:00
longpanda
be0e19fc5b update tip message for recalbox img file. 2022-02-06 12:26:36 +08:00
longpanda
34a36bfc3e Fix the issue when booting the latest recalbox img file. (#1423) 2022-02-06 00:25:27 +08:00
longpanda
82e99a3b37 1.0.65 release 2022-02-04 17:05:14 +08:00
Sopor
b685431d66 Update Swedish language (#1415) 2022-02-03 12:08:42 +08:00
Guillem
8be8fd50b3 Add catalan language (#1407) 2022-02-03 12:08:27 +08:00
heidiwenger
999b15c4ef Update languages.json (#1401)
Finnish language update
2022-02-03 12:07:31 +08:00
longpanda
28998edd94 Add check for size in CreatePersistentImg.sh (#1384) 2022-01-15 09:13:46 +08:00
longpanda
2ad69decad issue template update 2022-01-15 09:00:48 +08:00
longpanda
c2cc0bd3dc update tip message for VTOY_DEFAULT_SEARCH_ROOT (#1373) 2022-01-14 09:09:57 +08:00
longpanda
b128a0b6d3 fix the page language display issue in VentoyPlugson 2022-01-13 11:03:55 +08:00
longpanda
676831dbbe fix typo 2022-01-12 11:10:15 +08:00
longpanda
e5fa5e6d84 VTOY_LINUX_REMOUNT support for both 64bit(x86_64) and 32bit(i386) linux distro. 2022-01-12 10:24:44 +08:00
longpanda
76a6b8061c fix plugson page language issue 2022-01-11 09:39:01 +08:00
longpanda
036b58ff0c add intree flag for ko 2022-01-10 19:14:39 +08:00
longpanda
8e529c8559 Fix Plugson Web update issue. 2022-01-10 19:02:29 +08:00
longpanda
b8e624b0a0 1.0.64 2022-01-08 23:23:26 +08:00
longpanda
1f49265f29 1.0.64 release 2022-01-08 23:07:04 +08:00
longpanda
25dc323522 Support CentOS-9-Stream (#1335) 2021-12-24 10:32:59 +08:00
longpanda
446597d880 fix compile error for vtoyjump in debug mode. 2021-12-22 09:13:35 +08:00
332 changed files with 4985 additions and 289 deletions

View File

@@ -21,7 +21,7 @@ body:
attributes:
label: Ventoy Version
description: What version of ventoy are you running?
placeholder: 1.0.63
placeholder: 1.0.66
validations:
required: true
- type: dropdown

View File

@@ -27,6 +27,10 @@ jobs:
with:
name: ventoy-livecd
path: INSTALL/ventoy-*livecd*
- uses: actions/upload-artifact@v2
with:
name: SHA256SUM
path: INSTALL/sha256.txt
- uses: actions/upload-artifact@v2
with:
name: xxx-build-log

View File

@@ -1,9 +1,11 @@
#!/bin/sh
DSTDIR=../../IMG/cpio/ventoy/busybox
DSTDIR1=../../IMG/cpio_x86/ventoy/busybox
DSTDIR2=../../IMG/cpio_arm64/ventoy/busybox
DSTDIR3=../../IMG/cpio_mips64/ventoy/busybox
rm -f vtchmod32 vtchmod64 vtchmod64_musl vtchmodaa64
rm -f $DSTDIR/vtchmod32 $DSTDIR/vtchmod64 $DSTDIR/vtchmodaa64 $DSTDIR/vtchmodm64e
rm -f $DSTDIR1/vtchmod32 $DSTDIR1/vtchmod64 $DSTDIR2/vtchmodaa64 $DSTDIR3/vtchmodm64e
/opt/diet32/bin/diet gcc -Os -m32 vtchmod.c -o vtchmod32
/opt/diet64/bin/diet gcc -Os vtchmod.c -o vtchmod64
@@ -23,9 +25,9 @@ chmod 777 vtchmodaa64
chmod 777 vtchmod64_musl
chmod 777 vtchmodm64e
cp -a vtchmod32 $DSTDIR/
cp -a vtchmod64 $DSTDIR/
cp -a vtchmodaa64 $DSTDIR/
cp -a vtchmod64_musl $DSTDIR/
cp -a vtchmodm64e $DSTDIR/
cp -a vtchmod32 $DSTDIR1/
cp -a vtchmod64 $DSTDIR1/
cp -a vtchmod64_musl $DSTDIR1/
cp -a vtchmodaa64 $DSTDIR2/
cp -a vtchmodm64e $DSTDIR3/

View File

@@ -1,5 +1,8 @@
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/utsname.h>
int main(int argc, char **argv)
{
@@ -8,6 +11,24 @@ int main(int argc, char **argv)
return 1;
}
if (argv[1][0] == '-' && argv[1][1] == '6')
{
struct utsname buf;
if (0 == uname(&buf))
{
if (strstr(buf.machine, "amd64"))
{
return 0;
}
if (strstr(buf.machine, "x86_64"))
{
return 0;
}
}
return 1;
}
return chmod(argv[1], 0777);
}

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

7
DMPATCH/Makefile Normal file
View File

@@ -0,0 +1,7 @@
obj-m += dm_patch.o
EXTRA_CFLAGS := -Wall
dm_patch-objs := dmpatch.o

187
DMPATCH/dmpatch.c Normal file
View File

@@ -0,0 +1,187 @@
/******************************************************************************
* dmpatch.c ---- patch for device-mapper
*
* Copyright (c) 2021, longpanda <admin@ventoy.net>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, see <http://www.gnu.org/licenses/>.
*
*/
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kallsyms.h>
#include <linux/mutex.h>
#include <linux/mempool.h>
#include <linux/delay.h>
#include <linux/wait.h>
#include <linux/slab.h>
#define MAX_PATCH 4
#define magic_sig 0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF
typedef int (*kprobe_reg_pf)(void *);
typedef void (*kprobe_unreg_pf)(void *);
typedef int (*printk_pf)(const char *fmt, ...);
typedef int (*set_memory_attr_pf)(unsigned long addr, int numpages);
#pragma pack(1)
typedef struct ko_param
{
unsigned char magic[16];
unsigned long struct_size;
unsigned long pgsize;
unsigned long printk_addr;
unsigned long ro_addr;
unsigned long rw_addr;
unsigned long reg_kprobe_addr;
unsigned long unreg_kprobe_addr;
unsigned long sym_get_addr;
unsigned long sym_get_size;
unsigned long sym_put_addr;
unsigned long sym_put_size;
unsigned long padding[3];
}ko_param;
#pragma pack()
static printk_pf kprintf = NULL;
static set_memory_attr_pf set_mem_ro = NULL;
static set_memory_attr_pf set_mem_rw = NULL;
static kprobe_reg_pf reg_kprobe = NULL;
static kprobe_unreg_pf unreg_kprobe = NULL;
static volatile ko_param g_ko_param =
{
{ magic_sig },
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
};
#if defined(CONFIG_X86_64)
#define PATCH_OP_POS 3
#define CODE_MATCH(code, i) \
(code[i] == 0x40 && code[i + 1] == 0x80 && code[i + 2] == 0xce && code[i + 3] == 0x80)
#elif defined(CONFIG_X86_32)
#define PATCH_OP_POS 2
#define CODE_MATCH(code, i) \
(code[i] == 0x80 && code[i + 1] == 0xca && code[i + 2] == 0x80 && code[i + 3] == 0xe8)
#else
#error "unsupported arch"
#endif
#define vdebug(fmt, args...) if(kprintf) kprintf(KERN_ERR fmt, ##args)
static int notrace dmpatch_replace_code(unsigned long addr, unsigned long size, int expect, const char *desc)
{
int i = 0;
int cnt = 0;
unsigned long align;
unsigned char *patch[MAX_PATCH];
unsigned char *opCode = (unsigned char *)addr;
vdebug("patch for %s 0x%lx %d\n", desc, addr, (int)size);
for (i = 0; i < (int)size - 4; i++)
{
if (CODE_MATCH(opCode, i) && cnt < MAX_PATCH)
{
patch[cnt] = opCode + i + PATCH_OP_POS;
cnt++;
}
}
if (cnt != expect || cnt >= MAX_PATCH)
{
vdebug("patch error: cnt=%d expect=%d\n", cnt, expect);
return 1;
}
for (i = 0; i < cnt; i++)
{
opCode = patch[i];
align = (unsigned long)opCode / g_ko_param.pgsize * g_ko_param.pgsize;
set_mem_rw(align, 1);
*opCode = 0;
set_mem_ro(align, 1);
}
return 0;
}
static int notrace dmpatch_init(void)
{
int r = 0;
int rc = 0;
kprintf = (printk_pf)(g_ko_param.printk_addr);
vdebug("dmpatch_init start pagesize=%lu ...\n", g_ko_param.pgsize);
if (g_ko_param.struct_size != sizeof(ko_param))
{
vdebug("Invalid struct size %d %d\n", (int)g_ko_param.struct_size, (int)sizeof(ko_param));
return -EINVAL;
}
if (g_ko_param.sym_get_addr == 0 || g_ko_param.sym_put_addr == 0 ||
g_ko_param.ro_addr == 0 || g_ko_param.rw_addr == 0)
{
return -EINVAL;
}
set_mem_ro = (set_memory_attr_pf)(g_ko_param.ro_addr);
set_mem_rw = (set_memory_attr_pf)(g_ko_param.rw_addr);
reg_kprobe = (kprobe_reg_pf)g_ko_param.reg_kprobe_addr;
unreg_kprobe = (kprobe_unreg_pf)g_ko_param.unreg_kprobe_addr;
r = dmpatch_replace_code(g_ko_param.sym_get_addr, g_ko_param.sym_get_size, 2, "dm_get_table_device");
if (r)
{
rc = -EINVAL;
goto out;
}
vdebug("patch dm_get_table_device success\n");
r = dmpatch_replace_code(g_ko_param.sym_put_addr, g_ko_param.sym_put_size, 1, "dm_put_table_device");
if (r)
{
rc = -EINVAL;
goto out;
}
vdebug("patch dm_put_table_device success\n");
vdebug("#####################################\n");
vdebug("######## dm patch success ###########\n");
vdebug("#####################################\n");
out:
return rc;
}
static void notrace dmpatch_exit(void)
{
}
module_init(dmpatch_init);
module_exit(dmpatch_exit);
MODULE_DESCRIPTION("dmpatch driver");
MODULE_AUTHOR("longpanda <admin@ventoy.net>");
MODULE_LICENSE("GPL");

36
DMPATCH/readme.txt Normal file
View File

@@ -0,0 +1,36 @@
1. install ubuntu 21.10
2. apt-get install build-essential flex libncurses-dev linux-headers-generic linux-source libssl-dev ...... and so on
3. cp /lib/modules/5.13.0-23-generic/build/Module.symvers ./
4. /boot/config-5.13.0-23-generic as .config make oldconfig
5. make menuconfig
1. close CONFIG_STACKPROTECTOR
2. close CONFIG_RETPOLINE
6. modify ./scripts/mod/modpost.c
1. skip add_srcversion (just return)
2. force add_retpoline (#ifdef --> #ifndef)
3. force add_intree_flag
7. make modules_prepare LOCALVERSION=-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
8. Append padding at the end of struct module <include/linux/module.h>
struct module {
enum module_state state;
/* Member of list of modules */
struct list_head list;
/* Unique handle for this module */
char name[MODULE_NAME_LEN];
....
char padding[1024];
};
This is because struct module size is different in different kernel versions or with different CONFIG item.
9. make modules M=/home/dmpatch
10. strip --strip-debug /home/dmpatch/dm_patch.ko

View File

@@ -249,6 +249,12 @@ EFI_STATUS EFIAPI vdisk_exit_boot_service_wrapper
IN UINTN MapKey
)
{
if (g_org_get_variable)
{
gRT->GetVariable = g_org_get_variable;
g_org_get_variable = NULL;
}
return g_org_exit_boot_service(ImageHandle, MapKey);
}

View File

@@ -71,6 +71,9 @@ STATIC BOOLEAN g_hook_keyboard = FALSE;
CHAR16 gFirstTryBootFile[256] = {0};
STATIC EFI_GET_VARIABLE g_org_get_variable = NULL;
STATIC EFI_EXIT_BOOT_SERVICES g_org_exit_boot_service = NULL;
/* Boot filename */
UINTN gBootFileStartIndex = 1;
CONST CHAR16 *gEfiBootFileName[] =
@@ -226,12 +229,14 @@ static void EFIAPI ventoy_dump_chain(ventoy_chain_head *chain)
debug("os_param->vtoy_img_size=<%llu>", chain->os_param.vtoy_img_size);
debug("os_param->vtoy_img_location_addr=<0x%llx>", chain->os_param.vtoy_img_location_addr);
debug("os_param->vtoy_img_location_len=<%u>", chain->os_param.vtoy_img_location_len);
debug("os_param->vtoy_reserved=<%u %u %u %u %u>",
debug("os_param->vtoy_reserved=<%u %u %u %u %u %u %u>",
g_os_param_reserved[0],
g_os_param_reserved[1],
g_os_param_reserved[2],
g_os_param_reserved[3],
g_os_param_reserved[4]
g_os_param_reserved[4],
g_os_param_reserved[5],
g_os_param_reserved[6]
);
ventoy_debug_pause();
@@ -575,7 +580,7 @@ STATIC EFI_STATUS EFIAPI ventoy_find_iso_disk(IN EFI_HANDLE ImageHandle)
if (CompareMem(g_chain->os_param.vtoy_disk_guid, pBuffer + 0x180, 16) == 0)
{
pMBR = (MBR_HEAD *)pBuffer;
if (pMBR->PartTbl[0].FsFlag != 0xEE)
if (g_os_param_reserved[6] == 0 && pMBR->PartTbl[0].FsFlag != 0xEE)
{
if (pMBR->PartTbl[0].StartSectorId != 2048 ||
pMBR->PartTbl[1].SectorCount != 65536 ||
@@ -739,6 +744,77 @@ STATIC EFI_STATUS ventoy_proc_img_replace_name(ventoy_grub_param_file_replace *r
return EFI_SUCCESS;
}
EFI_STATUS EFIAPI ventoy_get_variable_wrapper
(
IN CHAR16 *VariableName,
IN EFI_GUID *VendorGuid,
OUT UINT32 *Attributes, OPTIONAL
IN OUT UINTN *DataSize,
OUT VOID *Data OPTIONAL
)
{
EFI_STATUS Status = EFI_SUCCESS;
Status = g_org_get_variable(VariableName, VendorGuid, Attributes, DataSize, Data);
if (StrCmp(VariableName, L"SecureBoot") == 0)
{
if ((*DataSize == 1) && Data)
{
*(UINT8 *)Data = 0;
}
}
return Status;
}
EFI_STATUS EFIAPI ventoy_exit_boot_service_wrapper
(
IN EFI_HANDLE ImageHandle,
IN UINTN MapKey
)
{
if (g_org_get_variable)
{
gRT->GetVariable = g_org_get_variable;
g_org_get_variable = NULL;
}
return g_org_exit_boot_service(ImageHandle, MapKey);
}
STATIC EFI_STATUS EFIAPI ventoy_disable_secure_boot(IN EFI_HANDLE ImageHandle)
{
UINT8 Value = 0;
UINTN DataSize = 1;
EFI_STATUS Status = EFI_SUCCESS;
Status = gRT->GetVariable(L"SecureBoot", &gEfiGlobalVariableGuid, NULL, &DataSize, &Value);
if (!EFI_ERROR(Status))
{
if (DataSize == 1 && Value == 0)
{
debug("Current secure boot is off, no need to disable");
return EFI_SUCCESS;
}
}
debug("ventoy_disable_secure_boot");
/* step1: wrapper security protocol. */
/* Do we still need it since we have been loaded ? */
/* step2: fake SecureBoot variable */
g_org_exit_boot_service = gBS->ExitBootServices;
gBS->ExitBootServices = ventoy_exit_boot_service_wrapper;
g_org_get_variable = gRT->GetVariable;
gRT->GetVariable = ventoy_get_variable_wrapper;
return EFI_SUCCESS;
}
STATIC EFI_STATUS EFIAPI ventoy_parse_cmdline(IN EFI_HANDLE ImageHandle)
{
UINT32 i = 0;
@@ -882,6 +958,7 @@ STATIC EFI_STATUS EFIAPI ventoy_parse_cmdline(IN EFI_HANDLE ImageHandle)
debug("memdisk mode iso_buf_size:%u", g_iso_buf_size);
g_chain = chain;
g_os_param_reserved = (UINT8 *)(g_chain->os_param.vtoy_reserved);
gMemdiskMode = TRUE;
}
else
@@ -910,6 +987,11 @@ STATIC EFI_STATUS EFIAPI ventoy_parse_cmdline(IN EFI_HANDLE ImageHandle)
g_hook_keyboard = TRUE;
}
if (g_os_param_reserved[5] == 1 && g_os_param_reserved[2] == ventoy_chain_linux)
{
ventoy_disable_secure_boot(ImageHandle);
}
debug("internal param: secover:%u keyboard:%u", g_fixup_iso9660_secover_enable, g_hook_keyboard);
for (i = 0; i < sizeof(ventoy_os_param); i++)

View File

@@ -42,6 +42,7 @@
DebugLib
[Guids]
gEfiGlobalVariableGuid
gShellVariableGuid
gEfiVirtualCdGuid
gEfiFileInfoGuid

View File

@@ -106,20 +106,110 @@ int ventoy_check_file_exist(const char * fmt, ...)
}
}
typedef struct grub_vlnk
{
int srclen;
char src[512];
char dst[512];
struct grub_vlnk *next;
}grub_vlnk;
static grub_vlnk *g_vlnk_list;
int grub_file_is_vlnk_suffix(const char *name, int len)
{
grub_uint32_t suffix;
if (len > 9)
{
suffix = *(grub_uint32_t *)(name + len - 4);
if (grub_strncmp(name + len - 9, ".vlnk.", 6) == 0)
{
/* .iso .wim .img .vhd .efi .dat */
if (suffix == 0x6F73692E || suffix == 0x6D69772E ||
suffix == 0x676D692E || suffix == 0x6468762E ||
suffix == 0x6966652E || suffix == 0x7461642E)
{
return 1;
}
}
else if (len > 10 && grub_strncmp(name + len - 10, ".vlnk.", 6) == 0)
{
/* vhdx vtoy */
if (suffix == 0x78646876 || suffix == 0x796F7476)
{
return 1;
}
}
}
return 0;
}
int grub_file_add_vlnk(const char *src, const char *dst)
{
grub_vlnk *node = NULL;
if (src && dst)
{
node = grub_zalloc(sizeof(grub_vlnk));
if (node)
{
node->srclen = (int)grub_strlen(src);
grub_strncpy(node->src, src, sizeof(node->src) - 1);
grub_strncpy(node->dst, dst, sizeof(node->dst) - 1);
node->next = g_vlnk_list;
g_vlnk_list = node;
return 0;
}
}
return 1;
}
const char *grub_file_get_vlnk(const char *name, int *vlnk)
{
int len;
grub_vlnk *node = g_vlnk_list;
len = grub_strlen(name);
if (!grub_file_is_vlnk_suffix(name, len))
{
return name;
}
while (node)
{
if (node->srclen == len && grub_strcmp(name, node->src) == 0)
{
*vlnk = 1;
return node->dst;
}
node = node->next;
}
return name;
}
grub_file_t
grub_file_open (const char *name, enum grub_file_type type)
{
int vlnk = 0;
grub_device_t device = 0;
grub_file_t file = 0, last_file = 0;
char *device_name;
const char *file_name;
grub_file_filter_id_t filter;
/* <DESC> : mem:xxx:size:xxx format in chainloader */
if (grub_strncmp(name, GRUB_MEMFILE_MEM, grub_strlen(GRUB_MEMFILE_MEM)) == 0) {
/* <DESC> : mem:xxx:size:xxx format in chainloader grub_strlen(GRUB_MEMFILE_MEM) */
if (grub_strncmp(name, GRUB_MEMFILE_MEM, 4) == 0) {
return grub_memfile_open(name);
}
if (g_vlnk_list && (type & GRUB_FILE_TYPE_NO_VLNK) == 0)
name = grub_file_get_vlnk(name, &vlnk);
device_name = grub_file_get_device_name (name);
if (grub_errno)
goto fail;
@@ -141,6 +231,7 @@ grub_file_open (const char *name, enum grub_file_type type)
goto fail;
file->device = device;
file->vlnk = vlnk;
/* In case of relative pathnames and non-Unix systems (like Windows)
* name of host files may not start with `/'. Blocklists for host files

View File

@@ -42,6 +42,44 @@ probe_dummy_iter (const char *filename __attribute__ ((unused)),
return 1;
}
grub_fs_t grub_fs_list_probe(grub_device_t device, const char **list)
{
int i;
grub_fs_t p;
if (!device->disk)
return 0;
for (p = grub_fs_list; p; p = p->next)
{
for (i = 0; list[i]; i++)
{
if (grub_strcmp(p->name, list[i]) == 0)
break;
}
if (list[i] == NULL)
continue;
grub_dprintf("fs", "Detecting %s...\n", p->name);
(p->fs_dir) (device, "/", probe_dummy_iter, NULL);
if (grub_errno == GRUB_ERR_NONE)
return p;
grub_error_push ();
grub_dprintf ("fs", "%s detection failed.\n", p->name);
grub_error_pop ();
if (grub_errno != GRUB_ERR_BAD_FS && grub_errno != GRUB_ERR_OUT_OF_RANGE) {
return 0;
}
grub_errno = GRUB_ERR_NONE;
}
return 0;
}
grub_fs_t
grub_fs_probe (grub_device_t device)
{

View File

@@ -102,6 +102,7 @@ ventoy_img_chunk_list g_img_chunk_list;
int g_wimboot_enable = 0;
ventoy_img_chunk_list g_wimiso_chunk_list;
char *g_wimiso_path = NULL;
grub_uint32_t g_wimiso_size = 0;
int g_vhdboot_enable = 0;
@@ -124,6 +125,7 @@ static int g_list_script_pos = 0;
static char *g_part_list_buf = NULL;
static int g_part_list_pos = 0;
static grub_uint64_t g_part_end_max = 0;
static int g_video_mode_max = 0;
static int g_video_mode_num = 0;
@@ -154,6 +156,8 @@ static char g_vtoy_prompt_msg[64];
static char g_json_case_mis_path[32];
static ventoy_vlnk_part *g_vlnk_part_list = NULL;
static int ventoy_get_fs_type(const char *fs)
{
if (NULL == fs)
@@ -698,32 +702,6 @@ grub_file_t ventoy_grub_file_open(enum grub_file_type type, const char *fmt, ...
return file;
}
int ventoy_is_file_exist(const char *fmt, ...)
{
va_list ap;
int len;
char *pos = NULL;
char buf[256] = {0};
grub_snprintf(buf, sizeof(buf), "%s", "[ -f \"");
pos = buf + 6;
va_start (ap, fmt);
len = grub_vsnprintf(pos, 255, fmt, ap);
va_end (ap);
grub_strncpy(pos + len, "\" ]", 3);
debug("script exec %s\n", buf);
if (0 == grub_script_execute_sourcecode(buf))
{
return 1;
}
return 0;
}
int ventoy_is_dir_exist(const char *fmt, ...)
{
va_list ap;
@@ -1006,6 +984,7 @@ static grub_err_t ventoy_cmd_load_wimboot(grub_extcmd_context_t ctxt, int argc,
(void)args;
g_wimboot_enable = 0;
g_wimiso_size = 0;
grub_check_free(g_wimiso_path);
grub_check_free(g_wimiso_chunk_list.chunk);
@@ -1029,7 +1008,7 @@ static grub_err_t ventoy_cmd_load_wimboot(grub_extcmd_context_t ctxt, int argc,
g_wimboot_enable = 1;
g_wimiso_path = grub_strdup(args[0]);
g_wimiso_size = (grub_uint32_t)(file->size);
grub_file_close(file);
return 0;
@@ -1073,6 +1052,11 @@ static grub_err_t ventoy_cmd_concat_efi_iso(grub_extcmd_context_t ctxt, int argc
return 1;
}
if (grub_strncmp(args[0], g_iso_path, grub_strlen(g_iso_path)))
{
file->vlnk = 1;
}
totlen += ventoy_align_2k(file->size);
dirent = (ventoy_iso9660_override *)(buf + offset);
@@ -1610,12 +1594,231 @@ static int ventoy_img_name_valid(const char *filename, grub_size_t namelen)
return 1;
}
static int ventoy_vlnk_iterate_partition(struct grub_disk *disk, const grub_partition_t partition, void *data)
{
ventoy_vlnk_part *node = NULL;
grub_uint32_t *pSig = (grub_uint32_t *)data;
node = grub_zalloc(sizeof(ventoy_vlnk_part));
if (node)
{
node->disksig = *pSig;
node->partoffset = (partition->start << GRUB_DISK_SECTOR_BITS);
grub_snprintf(node->disk, sizeof(node->disk) - 1, "%s", disk->name);
grub_snprintf(node->device, sizeof(node->device) - 1, "%s,%d", disk->name, partition->number + 1);
node->next = g_vlnk_part_list;
g_vlnk_part_list = node;
}
return 0;
}
static int ventoy_vlnk_iterate_disk(const char *name, void *data)
{
grub_disk_t disk;
grub_uint32_t sig;
(void)data;
disk = grub_disk_open(name);
if (disk)
{
grub_disk_read(disk, 0, 0x1b8, 4, &sig);
/* skip ventoy device self */
if (sig != *(grub_uint32_t *)data)
{
grub_partition_iterate(disk, ventoy_vlnk_iterate_partition, &sig);
}
grub_disk_close(disk);
}
return 0;
}
static int ventoy_vlnk_probe_fs(ventoy_vlnk_part *cur)
{
const char *fs[ventoy_fs_max + 1] =
{
"exfat", "ntfs", "ext2", "xfs", "udf", "fat", NULL
};
if (!cur->dev)
{
cur->dev = grub_device_open(cur->device);
}
if (cur->dev)
{
cur->fs = grub_fs_list_probe(cur->dev, fs);
}
return 0;
}
static int ventoy_check_vlnk_data(ventoy_vlnk *vlnk, int print, char *dst, int size)
{
int diskfind = 0;
int partfind = 0;
int filefind = 0;
char *disk, *device;
grub_uint32_t readcrc, calccrc;
ventoy_vlnk_part *cur;
grub_fs_t fs = NULL;
if (grub_memcmp(&(vlnk->guid), &g_ventoy_guid, sizeof(ventoy_guid)))
{
if (print)
{
grub_printf("VLNK invalid guid\n");
grub_refresh();
}
return 1;
}
readcrc = vlnk->crc32;
vlnk->crc32 = 0;
calccrc = grub_getcrc32c(0, vlnk, sizeof(ventoy_vlnk));
if (readcrc != calccrc)
{
if (print)
{
grub_printf("VLNK invalid crc 0x%08x 0x%08x\n", calccrc, readcrc);
grub_refresh();
}
return 1;
}
if (!g_vlnk_part_list)
{
grub_disk_dev_iterate(ventoy_vlnk_iterate_disk, g_ventoy_part_info->MBR.BootCode + 0x1b8);
}
for (cur = g_vlnk_part_list; cur && filefind == 0; cur = cur->next)
{
if (cur->disksig == vlnk->disk_signature)
{
diskfind = 1;
disk = cur->disk;
if (cur->partoffset == vlnk->part_offset)
{
partfind = 1;
device = cur->device;
if (cur->probe == 0)
{
cur->probe = 1;
ventoy_vlnk_probe_fs(cur);
}
if (!fs)
{
fs = cur->fs;
}
if (cur->fs)
{
struct grub_file file;
grub_memset(&file, 0, sizeof(file));
file.device = cur->dev;
if (cur->fs->fs_open(&file, vlnk->filepath) == GRUB_ERR_NONE)
{
filefind = 1;
cur->fs->fs_close(&file);
grub_snprintf(dst, size - 1, "(%s)%s", cur->device, vlnk->filepath);
}
}
}
}
}
if (print)
{
grub_printf("\n==== VLNK Information ====\n"
"Disk Signature: %08x\n"
"Partition Offset: %llu\n"
"File Path: <%s>\n\n",
vlnk->disk_signature, (ulonglong)vlnk->part_offset, vlnk->filepath);
if (diskfind)
{
grub_printf("Disk Find: [ YES ] [ %s ]\n", disk);
}
else
{
grub_printf("Disk Find: [ NO ]\n");
}
if (partfind)
{
grub_printf("Part Find: [ YES ] [ %s ] [ %s ]\n", device, fs ? fs->name : "N/A");
}
else
{
grub_printf("Part Find: [ NO ]\n");
}
grub_printf("File Find: [ %s ]\n", filefind ? "YES" : "NO");
if (filefind)
{
grub_printf("VLNK File: <%s>\n", dst);
}
grub_printf("\n");
grub_refresh();
}
return (1 - filefind);
}
int ventoy_add_vlnk_file(char *dir, const char *name)
{
int rc = 1;
char src[512];
char dst[512];
grub_file_t file = NULL;
ventoy_vlnk vlnk;
if (!dir)
{
grub_snprintf(src, sizeof(src), "%s%s", g_iso_path, name);
}
else if (dir[0] == '/')
{
grub_snprintf(src, sizeof(src), "%s%s%s", g_iso_path, dir, name);
}
else
{
grub_snprintf(src, sizeof(src), "%s/%s%s", g_iso_path, dir, name);
}
file = grub_file_open(src, VENTOY_FILE_TYPE);
if (!file)
{
return 1;
}
grub_memset(&vlnk, 0, sizeof(vlnk));
grub_file_read(file, &vlnk, sizeof(vlnk));
grub_file_close(file);
if (ventoy_check_vlnk_data(&vlnk, 0, dst, sizeof(dst)) == 0)
{
rc = grub_file_add_vlnk(src, dst);
}
return rc;
}
static int ventoy_collect_img_files(const char *filename, const struct grub_dirhook_info *info, void *data)
{
//int i = 0;
int type = 0;
int ignore = 0;
int index = 0;
int vlnk = 0;
grub_size_t len;
img_info *img;
img_info *tail;
@@ -1785,6 +1988,18 @@ static int ventoy_collect_img_files(const char *filename, const struct grub_dirh
}
}
if (info->size == VTOY_FILT_MIN_FILE_SIZE || info->size == 0)
{
if (grub_file_is_vlnk_suffix(filename, len))
{
vlnk = 1;
if (ventoy_add_vlnk_file(node->dir, filename) != 0)
{
return 0;
}
}
}
img = grub_zalloc(sizeof(img_info));
if (img)
{
@@ -1795,10 +2010,17 @@ static int ventoy_collect_img_files(const char *filename, const struct grub_dirh
img->pathlen = grub_snprintf(img->path, sizeof(img->path), "%s%s", node->dir, img->name);
img->size = info->size;
if (0 == img->size)
if (vlnk || 0 == img->size)
{
if (node->dir[0] == '/')
{
img->size = ventoy_grub_get_file_size("%s%s%s", g_iso_path, node->dir, filename);
}
else
{
img->size = ventoy_grub_get_file_size("%s/%s%s", g_iso_path, node->dir, filename);
}
}
if (img->size < VTOY_FILT_MIN_FILE_SIZE)
{
@@ -2748,6 +2970,7 @@ void ventoy_fill_os_param(grub_file_t file, ventoy_os_param *param)
{
char *pos;
const char *fs = NULL;
const char *val = NULL;
const char *cdprompt = NULL;
grub_uint32_t i;
grub_uint8_t chksum = 0;
@@ -2794,6 +3017,17 @@ void ventoy_fill_os_param(grub_file_t file, ventoy_os_param *param)
param->vtoy_reserved[3] = 1;
}
param->vtoy_reserved[5] = 0;
val = ventoy_get_env("VTOY_LINUX_REMOUNT");
if (val && val[0] == '1' && val[1] == 0)
{
param->vtoy_reserved[5] = 1;
}
/* ventoy_disk_signature used for vlnk */
param->vtoy_reserved[6] = file->vlnk;
grub_memcpy(param->vtoy_reserved + 7, g_ventoy_part_info->MBR.BootCode + 0x1b8, 4);
/* calculate checksum */
for (i = 0; i < sizeof(ventoy_os_param); i++)
{
@@ -3638,6 +3872,7 @@ end:
static int ventoy_img_partition_callback (struct grub_disk *disk, const grub_partition_t partition, void *data)
{
grub_uint64_t end_max = 0;
int *pCnt = (int *)data;
(void)disk;
@@ -3647,6 +3882,12 @@ static int ventoy_img_partition_callback (struct grub_disk *disk, const grub_par
"0 %llu linear /dev/ventoy %llu\n",
(ulonglong)partition->len, (ulonglong)partition->start);
end_max = (partition->len + partition->start) * 512;
if (end_max > g_part_end_max)
{
g_part_end_max = end_max;
}
return 0;
}
@@ -3660,6 +3901,7 @@ static grub_err_t ventoy_cmd_img_part_info(grub_extcmd_context_t ctxt, int argc,
(void)ctxt;
g_part_list_pos = 0;
g_part_end_max = 0;
grub_env_unset("vtoy_img_part_file");
if (argc != 1)
@@ -3689,6 +3931,9 @@ static grub_err_t ventoy_cmd_img_part_info(grub_extcmd_context_t ctxt, int argc,
grub_snprintf(buf, sizeof(buf), "%d", cnt);
grub_env_set("vtoy_img_part_cnt", buf);
grub_snprintf(buf, sizeof(buf), "%llu", (ulonglong)g_part_end_max);
grub_env_set("vtoy_img_max_part_end", buf);
end:
check_free(device_name, grub_free);
@@ -5064,6 +5309,114 @@ out:
return ret;
}
static grub_err_t grub_cmd_vlnk_dump_part(grub_extcmd_context_t ctxt, int argc, char **args)
{
int n = 0;
ventoy_vlnk_part *node;
(void)ctxt;
(void)argc;
(void)args;
for (node = g_vlnk_part_list; node; node = node->next)
{
grub_printf("[%d] %s disksig:%08x offset:%llu fs:%s\n",
++n, node->device, node->disksig,
(ulonglong)node->partoffset, (node->fs ? node->fs->name : "N/A"));
}
return 0;
}
static grub_err_t grub_cmd_is_vlnk_name(grub_extcmd_context_t ctxt, int argc, char **args)
{
int len = 0;
(void)ctxt;
if (argc == 1)
{
len = (int)grub_strlen(args[0]);
if (grub_file_is_vlnk_suffix(args[0], len))
{
return 0;
}
}
return 1;
}
static grub_err_t grub_cmd_get_vlnk_dst(grub_extcmd_context_t ctxt, int argc, char **args)
{
int vlnk = 0;
const char *name = NULL;
(void)ctxt;
if (argc == 2)
{
grub_env_unset(args[1]);
name = grub_file_get_vlnk(args[0], &vlnk);
if (vlnk)
{
debug("VLNK SRC: <%s>\n", args[0]);
debug("VLNK DST: <%s>\n", name);
grub_env_set(args[1], name);
return 0;
}
}
return 1;
}
static grub_err_t grub_cmd_check_vlnk(grub_extcmd_context_t ctxt, int argc, char **args)
{
int ret = 1;
int len = 0;
grub_file_t file = NULL;
ventoy_vlnk vlnk;
char dst[512];
(void)ctxt;
if (argc != 1)
{
goto out;
}
len = (int)grub_strlen(args[0]);
if (!grub_file_is_vlnk_suffix(args[0], len))
{
grub_printf("Invalid vlnk suffix\n");
goto out;
}
file = grub_file_open(args[0], VENTOY_FILE_TYPE | GRUB_FILE_TYPE_NO_VLNK);
if (!file)
{
grub_printf("Failed to open %s\n", args[0]);
goto out;
}
if (file->size != 32768)
{
grub_printf("Invalid vlnk file (size=%llu).\n", (ulonglong)file->size);
goto out;
}
grub_memset(&vlnk, 0, sizeof(vlnk));
grub_file_read(file, &vlnk, sizeof(vlnk));
ret = ventoy_check_vlnk_data(&vlnk, 1, dst, sizeof(dst));
out:
grub_refresh();
check_free(file, grub_file_close);
grub_errno = GRUB_ERR_NONE;
return ret;
}
int ventoy_env_init(void)
{
char buf[64];
@@ -5251,6 +5604,10 @@ static cmd_para ventoy_cmds[] =
{ "vt_append_extra_sector", ventoy_cmd_append_ext_sector, 0, NULL, "", "", NULL },
{ "gptpriority", grub_cmd_gptpriority, 0, NULL, "", "", NULL },
{ "vt_syslinux_need_nojoliet", grub_cmd_syslinux_nojoliet, 0, NULL, "", "", NULL },
{ "vt_vlnk_check", grub_cmd_check_vlnk, 0, NULL, "", "", NULL },
{ "vt_vlnk_dump_part", grub_cmd_vlnk_dump_part, 0, NULL, "", "", NULL },
{ "vt_is_vlnk_name", grub_cmd_is_vlnk_name, 0, NULL, "", "", NULL },
{ "vt_get_vlnk_dst", grub_cmd_get_vlnk_dst, 0, NULL, "", "", NULL },
};
int ventoy_register_all_cmd(void)

View File

@@ -304,6 +304,7 @@ extern ventoy_guid g_ventoy_guid;
extern ventoy_img_chunk_list g_img_chunk_list;
extern ventoy_img_chunk_list g_wimiso_chunk_list;
extern char *g_wimiso_path;
extern grub_uint32_t g_wimiso_size;
extern char g_arch_mode_suffix[64];
extern const char *g_menu_prefix[img_type_max];
@@ -604,7 +605,6 @@ grub_err_t ventoy_cmd_trailer_cpio(grub_extcmd_context_t ctxt, int argc, char **
int ventoy_cpio_newc_fill_head(void *buf, int filesize, const void *filedata, const char *name);
grub_file_t ventoy_grub_file_open(enum grub_file_type type, const char *fmt, ...);
grub_uint64_t ventoy_grub_get_file_size(const char *fmt, ...);
int ventoy_is_file_exist(const char *fmt, ...);
int ventoy_is_dir_exist(const char *fmt, ...);
int ventoy_fill_data(grub_uint32_t buflen, char *buffer);
grub_err_t ventoy_cmd_load_plugin(grub_extcmd_context_t ctxt, int argc, char **args);
@@ -826,6 +826,7 @@ typedef struct ventoy_video_mode
typedef struct file_fullpath
{
char path[256];
int vlnk_add;
}file_fullpath;
typedef struct theme_list
@@ -1153,5 +1154,20 @@ struct g_ventoy_map{
};
#pragma pack()
typedef struct ventoy_vlnk_part
{
grub_uint32_t disksig;
grub_uint64_t partoffset;
char disk[64];
char device[64];
grub_device_t dev;
grub_fs_t fs;
int probe;
struct ventoy_vlnk_part *next;
}ventoy_vlnk_part;
extern char g_iso_path[256];
int ventoy_add_vlnk_file(char *dir, const char *name);
#endif /* __VENTOY_DEF_H__ */

View File

@@ -171,11 +171,11 @@ static int ventoy_plugin_theme_check(VTOY_JSON *json, const char *isodisk)
grub_printf("file: %s\n", value);
if (value[0] == '/')
{
exist = ventoy_is_file_exist("%s%s", isodisk, value);
exist = ventoy_check_file_exist("%s%s", isodisk, value);
}
else
{
exist = ventoy_is_file_exist("%s/ventoy/%s", isodisk, value);
exist = ventoy_check_file_exist("%s/ventoy/%s", isodisk, value);
}
if (exist == 0)
@@ -195,11 +195,11 @@ static int ventoy_plugin_theme_check(VTOY_JSON *json, const char *isodisk)
grub_printf("file: %s\n", value);
if (value[0] == '/')
{
exist = ventoy_is_file_exist("%s%s", isodisk, value);
exist = ventoy_check_file_exist("%s%s", isodisk, value);
}
else
{
exist = ventoy_is_file_exist("%s/ventoy/%s", isodisk, value);
exist = ventoy_check_file_exist("%s/ventoy/%s", isodisk, value);
}
if (exist == 0)
@@ -463,7 +463,7 @@ static int ventoy_plugin_check_path(const char *path, const char *file)
return 1;
}
if (!ventoy_is_file_exist("%s%s", path, file))
if (!ventoy_check_file_exist("%s%s", path, file))
{
grub_printf("%s%s does NOT exist\n", path, file);
return 1;
@@ -561,7 +561,7 @@ static int ventoy_plugin_parse_fullpath
{
debug("%s is string type data\n", node->pcName);
if ((node->unData.pcStrVal[0] != '/') || (!ventoy_is_file_exist("%s%s", isodisk, node->unData.pcStrVal)))
if ((node->unData.pcStrVal[0] != '/') || (!ventoy_check_file_exist("%s%s", isodisk, node->unData.pcStrVal)))
{
debug("%s%s file not found\n", isodisk, node->unData.pcStrVal);
return 1;
@@ -596,7 +596,7 @@ static int ventoy_plugin_parse_fullpath
for (count = 0, child = node->pstChild; child; child = child->pstNext)
{
if (ventoy_is_file_exist("%s%s", isodisk, child->unData.pcStrVal))
if (ventoy_check_file_exist("%s%s", isodisk, child->unData.pcStrVal))
{
grub_snprintf(path->path, sizeof(path->path), "%s", child->unData.pcStrVal);
path++;
@@ -1401,7 +1401,7 @@ static int ventoy_plugin_menualias_check(VTOY_JSON *json, const char *isodisk)
{
grub_printf("image: <%s> [ * ]\n", path);
}
else if (ventoy_is_file_exist("%s%s", isodisk, path))
else if (ventoy_check_file_exist("%s%s", isodisk, path))
{
grub_printf("image: <%s> [ OK ]\n", path);
}
@@ -1542,7 +1542,7 @@ static int ventoy_plugin_menutip_check(VTOY_JSON *json, const char *isodisk)
{
grub_printf("image: <%s> [ * ]\n", path);
}
else if (ventoy_is_file_exist("%s%s", isodisk, path))
else if (ventoy_check_file_exist("%s%s", isodisk, path))
{
grub_printf("image: <%s> [ OK ]\n", path);
}
@@ -2684,6 +2684,8 @@ persistence_config * ventoy_plugin_find_persistent(const char *isopath)
int ventoy_plugin_get_persistent_chunklist(const char *isopath, int index, ventoy_img_chunk_list *chunk_list)
{
int rc = 1;
int len = 0;
char *path = NULL;
grub_uint64_t start = 0;
grub_file_t file = NULL;
persistence_config *node = NULL;
@@ -2704,10 +2706,22 @@ int ventoy_plugin_get_persistent_chunklist(const char *isopath, int index, vento
return 1;
}
file = ventoy_grub_file_open(VENTOY_FILE_TYPE, "%s%s", g_iso_disk_name, node->backendpath[index].path);
path = node->backendpath[index].path;
if (node->backendpath[index].vlnk_add == 0)
{
len = grub_strlen(path);
if (len > 9 && grub_strncmp(path + len - 9, ".vlnk.dat", 9) == 0)
{
ventoy_add_vlnk_file(NULL, path);
node->backendpath[index].vlnk_add = 1;
}
}
file = ventoy_grub_file_open(VENTOY_FILE_TYPE, "%s%s", g_iso_disk_name, path);
if (!file)
{
debug("Failed to open file %s%s\n", g_iso_disk_name, node->backendpath[index].path);
debug("Failed to open file %s%s\n", g_iso_disk_name, path);
goto end;
}

View File

@@ -667,6 +667,11 @@ grub_err_t ventoy_cmd_raw_chain_data(grub_extcmd_context_t ctxt, int argc, char
return 1;
}
if (grub_strncmp(args[0], g_iso_path, grub_strlen(g_iso_path)))
{
file->vlnk = 1;
}
img_chunk_size = g_img_chunk_list.cur_chunk * sizeof(ventoy_img_chunk);
size = sizeof(ventoy_chain_head) + img_chunk_size;

View File

@@ -1994,21 +1994,12 @@ static grub_uint32_t ventoy_get_wim_iso_offset(const char *filepath)
return imgoffset;
}
static int ventoy_get_wim_chunklist(const char *filename, ventoy_img_chunk_list *wimchunk, grub_uint64_t *wimsize)
static int ventoy_get_wim_chunklist(grub_file_t wimfile, ventoy_img_chunk_list *wimchunk)
{
grub_file_t wimfile;
wimfile = ventoy_grub_file_open(VENTOY_FILE_TYPE, "%s", filename);
if (!wimfile)
{
return 1;
}
grub_memset(wimchunk, 0, sizeof(ventoy_img_chunk_list));
wimchunk->chunk = grub_malloc(sizeof(ventoy_img_chunk) * DEFAULT_CHUNK_NUM);
if (NULL == wimchunk->chunk)
{
grub_file_close(wimfile);
return grub_error(GRUB_ERR_OUT_OF_MEMORY, "Can't allocate image chunk memoty\n");
}
@@ -2017,9 +2008,6 @@ static int ventoy_get_wim_chunklist(const char *filename, ventoy_img_chunk_list
ventoy_get_block_list(wimfile, wimchunk, wimfile->device->disk->partition->start);
*wimsize = wimfile->size;
grub_file_close(wimfile);
return 0;
}
@@ -2058,7 +2046,7 @@ grub_err_t ventoy_cmd_wim_check_bootable(grub_extcmd_context_t ctxt, int argc, c
VENTOY_CMD_RETURN(GRUB_ERR_NONE);
}
grub_err_t ventoy_cmd_wim_chain_data(grub_extcmd_context_t ctxt, int argc, char **args)
static grub_err_t ventoy_vlnk_wim_chain_data(grub_file_t wimfile)
{
grub_uint32_t i = 0;
grub_uint32_t imgoffset = 0;
@@ -2079,10 +2067,7 @@ grub_err_t ventoy_cmd_wim_chain_data(grub_extcmd_context_t ctxt, int argc, char
ventoy_img_chunk_list wimchunk;
char envbuf[128];
(void)ctxt;
(void)argc;
debug("wim chain data begin <%s> ...\n", args[0]);
debug("vlnk wim chain data begin <%s> ...\n", wimfile->name);
if (NULL == g_wimiso_chunk_list.chunk || NULL == g_wimiso_path)
{
@@ -2097,11 +2082,177 @@ grub_err_t ventoy_cmd_wim_chain_data(grub_extcmd_context_t ctxt, int argc, char
return 1;
}
if (0 != ventoy_get_wim_chunklist(args[0], &wimchunk, &wimsize))
if (0 != ventoy_get_wim_chunklist(wimfile, &wimchunk))
{
grub_printf("Failed to get wim chunklist\n");
return 1;
}
wimsize = wimfile->size;
file = ventoy_grub_file_open(VENTOY_FILE_TYPE, "%s", g_wimiso_path);
if (!file)
{
return 1;
}
boot_catlog = ventoy_get_iso_boot_catlog(file);
img_chunk1_size = g_wimiso_chunk_list.cur_chunk * sizeof(ventoy_img_chunk);
img_chunk2_size = wimchunk.cur_chunk * sizeof(ventoy_img_chunk);
override_size = sizeof(ventoy_override_chunk) + g_wimiso_size;
size = sizeof(ventoy_chain_head) + img_chunk1_size + img_chunk2_size + override_size;
pLastChain = grub_env_get("vtoy_chain_mem_addr");
if (pLastChain)
{
chain = (ventoy_chain_head *)grub_strtoul(pLastChain, NULL, 16);
if (chain)
{
debug("free last chain memory %p\n", chain);
grub_free(chain);
}
}
chain = grub_malloc(size);
if (!chain)
{
grub_printf("Failed to alloc chain memory size %u\n", size);
grub_file_close(file);
return 1;
}
grub_snprintf(envbuf, sizeof(envbuf), "0x%lx", (unsigned long)chain);
grub_env_set("vtoy_chain_mem_addr", envbuf);
grub_snprintf(envbuf, sizeof(envbuf), "%u", size);
grub_env_set("vtoy_chain_mem_size", envbuf);
grub_memset(chain, 0, sizeof(ventoy_chain_head));
/* part 1: os parameter */
g_ventoy_chain_type = ventoy_chain_wim;
ventoy_fill_os_param(wimfile, &(chain->os_param));
/* part 2: chain head */
disk = wimfile->device->disk;
chain->disk_drive = disk->id;
chain->disk_sector_size = (1 << disk->log_sector_size);
chain->real_img_size_in_bytes = ventoy_align_2k(file->size) + ventoy_align_2k(wimsize);
chain->virt_img_size_in_bytes = chain->real_img_size_in_bytes;
chain->boot_catalog = boot_catlog;
if (!ventoy_is_efi_os())
{
grub_file_seek(file, boot_catlog * 2048);
grub_file_read(file, chain->boot_catalog_sector, sizeof(chain->boot_catalog_sector));
}
/* part 3: image chunk */
chain->img_chunk_offset = sizeof(ventoy_chain_head);
chain->img_chunk_num = g_wimiso_chunk_list.cur_chunk + wimchunk.cur_chunk;
grub_memcpy((char *)chain + chain->img_chunk_offset, g_wimiso_chunk_list.chunk, img_chunk1_size);
chunknode = (ventoy_img_chunk *)((char *)chain + chain->img_chunk_offset);
for (i = 0; i < g_wimiso_chunk_list.cur_chunk; i++)
{
chunknode->disk_end_sector = chunknode->disk_end_sector - chunknode->disk_start_sector;
chunknode->disk_start_sector = 0;
chunknode++;
}
/* fs cluster size >= 2048, so don't need to proc align */
/* align by 2048 */
chunknode = wimchunk.chunk + wimchunk.cur_chunk - 1;
i = (chunknode->disk_end_sector + 1 - chunknode->disk_start_sector) % 4;
if (i)
{
chunknode->disk_end_sector += 4 - i;
}
isosector = (grub_uint32_t)((file->size + 2047) / 2048);
for (i = 0; i < wimchunk.cur_chunk; i++)
{
chunknode = wimchunk.chunk + i;
chunknode->img_start_sector = isosector;
chunknode->img_end_sector = chunknode->img_start_sector +
((chunknode->disk_end_sector + 1 - chunknode->disk_start_sector) / 4) - 1;
isosector = chunknode->img_end_sector + 1;
}
grub_memcpy((char *)chain + chain->img_chunk_offset + img_chunk1_size, wimchunk.chunk, img_chunk2_size);
/* part 4: override chunk */
chain->override_chunk_offset = chain->img_chunk_offset + img_chunk1_size + img_chunk2_size;
chain->override_chunk_num = 1;
override = (ventoy_override_chunk *)((char *)chain + chain->override_chunk_offset);
override->img_offset = 0;
override->override_size = g_wimiso_size;
grub_file_seek(file, 0);
grub_file_read(file, override->override_data, file->size);
dirent = (ventoy_iso9660_override *)(override->override_data + imgoffset);
dirent->first_sector = (grub_uint32_t)((file->size + 2047) / 2048);
dirent->size = (grub_uint32_t)(wimsize);
dirent->first_sector_be = grub_swap_bytes32(dirent->first_sector);
dirent->size_be = grub_swap_bytes32(dirent->size);
debug("imgoffset=%u first_sector=0x%x size=0x%x\n", imgoffset, dirent->first_sector, dirent->size);
if (ventoy_is_efi_os() == 0)
{
ventoy_windows_drive_map(chain);
}
grub_file_close(file);
VENTOY_CMD_RETURN(GRUB_ERR_NONE);
}
static grub_err_t ventoy_normal_wim_chain_data(grub_file_t wimfile)
{
grub_uint32_t i = 0;
grub_uint32_t imgoffset = 0;
grub_uint32_t size = 0;
grub_uint32_t isosector = 0;
grub_uint64_t wimsize = 0;
grub_uint32_t boot_catlog = 0;
grub_uint32_t img_chunk1_size = 0;
grub_uint32_t img_chunk2_size = 0;
grub_uint32_t override_size = 0;
grub_file_t file;
grub_disk_t disk;
const char *pLastChain = NULL;
ventoy_chain_head *chain;
ventoy_iso9660_override *dirent;
ventoy_img_chunk *chunknode;
ventoy_override_chunk *override;
ventoy_img_chunk_list wimchunk;
char envbuf[128];
debug("normal wim chain data begin <%s> ...\n", wimfile->name);
if (NULL == g_wimiso_chunk_list.chunk || NULL == g_wimiso_path)
{
grub_printf("ventoy not ready\n");
return 1;
}
imgoffset = ventoy_get_wim_iso_offset(g_wimiso_path);
if (imgoffset == 0)
{
grub_printf("image offset not found\n");
return 1;
}
if (0 != ventoy_get_wim_chunklist(wimfile, &wimchunk))
{
grub_printf("Failed to get wim chunklist\n");
return 1;
}
wimsize = wimfile->size;
file = ventoy_grub_file_open(VENTOY_FILE_TYPE, "%s", g_wimiso_path);
if (!file)
@@ -2214,6 +2365,33 @@ grub_err_t ventoy_cmd_wim_chain_data(grub_extcmd_context_t ctxt, int argc, char
VENTOY_CMD_RETURN(GRUB_ERR_NONE);
}
grub_err_t ventoy_cmd_wim_chain_data(grub_extcmd_context_t ctxt, int argc, char **args)
{
grub_err_t ret;
grub_file_t wimfile;
(void)ctxt;
(void)argc;
wimfile = grub_file_open(args[0], VENTOY_FILE_TYPE);
if (!wimfile)
{
return 1;
}
if (wimfile->vlnk)
{
ret = ventoy_vlnk_wim_chain_data(wimfile);
}
else
{
ret = ventoy_normal_wim_chain_data(wimfile);
}
grub_file_close(wimfile);
return ret;
}
int ventoy_chain_file_size(const char *path)
{
int size;

View File

@@ -132,7 +132,8 @@ enum grub_file_type
/* --skip-sig is specified. */
GRUB_FILE_TYPE_SKIP_SIGNATURE = 0x10000,
GRUB_FILE_TYPE_NO_DECOMPRESS = 0x20000
GRUB_FILE_TYPE_NO_DECOMPRESS = 0x20000,
GRUB_FILE_TYPE_NO_VLNK = 0x40000,
};
/* File description. */
@@ -141,6 +142,8 @@ struct grub_file
/* File name. */
char *name;
int vlnk;
/* The underlying device. */
grub_device_t device;
@@ -213,6 +216,10 @@ grub_ssize_t EXPORT_FUNC(grub_file_read) (grub_file_t file, void *buf,
grub_off_t EXPORT_FUNC(grub_file_seek) (grub_file_t file, grub_off_t offset);
grub_err_t EXPORT_FUNC(grub_file_close) (grub_file_t file);
int EXPORT_FUNC(grub_file_is_vlnk_suffix)(const char *name, int len);
int EXPORT_FUNC(grub_file_add_vlnk)(const char *src, const char *dst);
const char * EXPORT_FUNC(grub_file_get_vlnk)(const char *name, int *vlnk);
/* Return value of grub_file_size() in case file size is unknown. */
#define GRUB_FILE_SIZE_UNKNOWN 0xffffffffffffffffULL

View File

@@ -128,5 +128,6 @@ grub_fs_unregister (grub_fs_t fs)
#define FOR_FILESYSTEMS(var) FOR_LIST_ELEMENTS((var), (grub_fs_list))
grub_fs_t EXPORT_FUNC(grub_fs_probe) (grub_device_t device);
grub_fs_t EXPORT_FUNC(grub_fs_list_probe) (grub_device_t device, const char **list);
#endif /* ! GRUB_FS_HEADER */

View File

@@ -121,6 +121,9 @@ typedef struct ventoy_os_param
* vtoy_reserved[2]: vtoy_chain_type 0:Linux 1:Windows 2:wimfile
* vtoy_reserved[3]: vtoy_iso_format 0:iso9660 1:udf
* vtoy_reserved[4]: vtoy_windows_cd_prompt
* vtoy_reserved[5]: vtoy_linux_remount
* vtoy_reserved[6]: vtoy_vlnk
* vtoy_reserved[7~10]: vtoy_disk_sig[4] used for vlnk
*
*/
grub_uint8_t vtoy_reserved[32]; // Internal use by ventoy
@@ -150,11 +153,23 @@ typedef struct ventoy_secure_data
grub_uint8_t magic2[16]; /* VENTOY_GUID */
}ventoy_secure_data;
typedef struct ventoy_vlnk
{
ventoy_guid guid; // VENTOY_GUID
grub_uint32_t crc32; // crc32
grub_uint32_t disk_signature;
grub_uint64_t part_offset; // in bytes
char filepath[384];
grub_uint8_t reserved[96];
}ventoy_vlnk;
#pragma pack()
// compile assert check : sizeof(ventoy_os_param) must be 512
COMPILE_ASSERT(1,sizeof(ventoy_os_param) == 512);
COMPILE_ASSERT(2,sizeof(ventoy_secure_data) == 4096);
COMPILE_ASSERT(3,sizeof(ventoy_vlnk) == 512);

View File

@@ -48,6 +48,12 @@ else
fi
fi
if [ "$VTOY_ARCH" = "i386" ]; then
if $BUSYBOX_PATH/vtchmod32 -6; then
export VTOY_ARCH=x86_64
fi
fi
echo $VTOY_ARCH > $VTOY_PATH/ventoy_arch
@@ -81,6 +87,7 @@ export PATH=$BUSYBOX_PATH/:$VTOY_PATH/tool
export VTOY_BREAK_LEVEL=$(hexdump -n 1 -s 449 -e '1/1 "%02x"' $VTOY_PATH/ventoy_os_param)
export VTOY_DEBUG_LEVEL=$(hexdump -n 1 -s 450 -e '1/1 "%02x"' $VTOY_PATH/ventoy_os_param)
export VTOY_LINUX_REMOUNT=$(hexdump -n 1 -s 454 -e '1/1 "%02x"' $VTOY_PATH/ventoy_os_param)
#Fixme: busybox shell output redirect seems to have some bug in rhel5
if uname -a | grep -q el5; then

View File

@@ -54,9 +54,16 @@ fi
if [ -f $VTOY_PATH/autoinstall ]; then
echo "Do auto install ..." >> $VTLOG
if $GREP -q '^autoinstall:' $VTOY_PATH/autoinstall; then
echo "cloud-init auto install ..." >> $VTLOG
if $GREP -q "maybe_break init" /init; then
$SED "/maybe_break init/i $BUSYBOX_PATH/sh $VTOY_PATH/hook/debian/ventoy-cloud-init.sh \$rootmnt" -i /init
fi
else
if $GREP -q "^mount /proc$" /init; then
$SED "/^mount \/proc/a export file=$VTOY_PATH/autoinstall; export auto='true'; export priority='critical'" -i /init
fi
fi
fi
#for ARMA aka Omoikane

View File

@@ -0,0 +1,63 @@
#!/ventoy/busybox/sh
#************************************************************************************
# Copyright (c) 2020, longpanda <admin@ventoy.net>
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License as
# published by the Free Software Foundation; either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, see <http://www.gnu.org/licenses/>.
#
#************************************************************************************
. /ventoy/hook/ventoy-hook-lib.sh
vtlog "####### $0 $* ########"
VTPATH_OLD=$PATH; PATH=$BUSYBOX_PATH:$VTOY_PATH/tool:$PATH
newroot=$1
dd if=/dev/zero of=$newroot/tmp/cidata.img bs=1M count=8 status=none
freeloop=$(losetup -f)
losetup $freeloop $newroot/tmp/cidata.img
mkfs.vfat -n CIDATA $freeloop
mkdir /tmpcidata
mount $newroot/tmp/cidata.img /tmpcidata
vtSplit=$(grep VENTOY_META_DATA_SPLIT $VTOY_PATH/autoinstall | wc -l)
if [ $vtSplit -eq 1 ]; then
vtlog "split autoinstall script to user-data and meta-data"
vtLine=$(grep -n VENTOY_META_DATA_SPLIT $VTOY_PATH/autoinstall | awk -F: '{print $1}')
vtLine1=$(expr $vtLine - 1)
vtLine2=$(expr $vtLine + 1)
vtlog "Line number: $vtLine $vtLine1 $vtLine2"
sed -n "1,${vtLine1}p" $VTOY_PATH/autoinstall >/tmpcidata/user-data
sed -n "${vtLine2},\$p" $VTOY_PATH/autoinstall >/tmpcidata/meta-data
else
vtlog "only user-data avaliable"
cp -a $VTOY_PATH/autoinstall /tmpcidata/user-data
touch /tmpcidata/meta-data
fi
umount /tmpcidata
rm -rf /tmpcidata
vtCMD=$(cat /proc/cmdline)
echo "autoinstall $vtCMD" > $newroot/tmp/kcmdline
mount --bind $newroot/tmp/kcmdline /proc/cmdline
PATH=$VTPATH_OLD

View File

@@ -92,7 +92,8 @@ if [ -f /etc/system-release ]; then
vtNeedRepo="yes"
fi
fi
if $GREP -q el8 /proc/version; then
if $GREP -q 'el[89]' /proc/version; then
vtNeedRepo="yes"
fi
@@ -102,6 +103,8 @@ if $GREP -i -q Fedora /proc/version; then
fi
fi
echo "vtNeedRepo=$vtNeedRepo" >> $VTLOG
if [ "$vtNeedRepo" = "yes" ]; then
$BUSYBOX_PATH/cp -a $VTOY_PATH/hook/rhel7/ventoy-repo.sh /lib/dracut/hooks/pre-pivot/99-ventoy-repo.sh
fi

View File

@@ -30,6 +30,8 @@ SLEEP=$BUSYBOX_PATH/sleep
HEAD=$BUSYBOX_PATH/head
VTOY_DM_PATH=/dev/mapper/ventoy
VTOY_DEBUG_LEVEL=$($BUSYBOX_PATH/hexdump -n 1 -s 450 -e '1/1 "%02x"' $VTOY_PATH/ventoy_os_param)
VTOY_LINUX_REMOUNT=$($BUSYBOX_PATH/hexdump -n 1 -s 454 -e '1/1 "%02x"' $VTOY_PATH/ventoy_os_param)
VTOY_VLNK_BOOT=$($BUSYBOX_PATH/hexdump -n 1 -s 455 -e '1/1 "%02x"' $VTOY_PATH/ventoy_os_param)
if [ "$VTOY_DEBUG_LEVEL" = "01" ]; then
if [ -e /dev/console ]; then
@@ -65,12 +67,16 @@ set_ventoy_hook_finish() {
}
get_ventoy_disk_name() {
if [ "$VTOY_VLNK_BOOT" = "01" ]; then
$VTOY_PATH/tool/vtoydump -t /ventoy/ventoy_os_param
else
line=$($VTOY_PATH/tool/vtoydump -f /ventoy/ventoy_os_param)
if [ $? -eq 0 ]; then
echo ${line%%#*}
else
echo "unknown"
fi
fi
}
get_ventoy_iso_name() {
@@ -120,14 +126,6 @@ check_usb_disk_ready() {
[ -e "${vtpart2}" ]
}
is_ventoy_disk() {
if $VTOY_PATH/tool/vtoydump -f $VTOY_PATH/ventoy_os_param -c "$1"; then
$BUSYBOX_PATH/true
else
$BUSYBOX_PATH/false
fi
}
not_ventoy_disk() {
if echo $1 | $EGREP -q "nvme.*p$|mmc.*p$|nbd.*p$"; then
vtDiskName=${1:0:-1}
@@ -135,11 +133,16 @@ not_ventoy_disk() {
vtDiskName=$1
fi
if [ "$VTOY_VLNK_BOOT" = "01" ]; then
vtVtoyDisk=$($VTOY_PATH/tool/vtoydump -t $VTOY_PATH/ventoy_os_param)
[ "$vtVtoyDisk" != "/dev/$vtDiskName" ]
else
if $VTOY_PATH/tool/vtoydump -f $VTOY_PATH/ventoy_os_param -c "$vtDiskName"; then
$BUSYBOX_PATH/false
else
$BUSYBOX_PATH/true
fi
fi
}
ventoy_get_vblade_bin() {
@@ -220,6 +223,143 @@ ventoy_check_dm_module() {
fi
}
ventoy_need_dm_patch() {
if [ "$VTOY_LINUX_REMOUNT" != "01" ]; then
$BUSYBOX_PATH/false; return
fi
if $GREP -q 'device-mapper' /proc/devices; then
:
else
$BUSYBOX_PATH/false; return
fi
if $GREP -q 'dm_patch' /proc/modules; then
$BUSYBOX_PATH/false; return
fi
vtMajorVer=$($BUSYBOX_PATH/uname -r | $AWK -F. '{print $1}')
vtMinorVer=$($BUSYBOX_PATH/uname -r | $AWK -F. '{print $2}')
if [ $vtMajorVer -lt 3 ]; then
$BUSYBOX_PATH/false; return
elif [ $vtMajorVer -eq 3 -a $vtMinorVer -lt 10 ]; then
$BUSYBOX_PATH/false; return
fi
$BUSYBOX_PATH/true
}
ventoy_dm_patch() {
vtMType=$($BUSYBOX_PATH/uname -m)
vtlog "######### ventoy_dm_patch ############"
if echo $vtMType | $EGREP -i -q "x86.64|amd64"; then
vtKoName=dm_patch_64.ko
elif echo $vtMType | $EGREP -i -q "i[3-6]86"; then
vtKoName=dm_patch_32.ko
else
vtlog "unsupported machine type $vtMType"
return
fi
if [ -f $VTOY_PATH/tool/$vtKoName ]; then
vtlog "/ventoy/tool/$vtKoName exist OK"
else
vtlog "/ventoy/tool/$vtKoName NOT exist"
return
fi
$CAT /proc/kallsyms | $BUSYBOX_PATH/sort > $VTOY_PATH/kallsyms
vtLine=$($VTOY_PATH/tool/vtoyksym dm_get_table_device $VTOY_PATH/kallsyms)
get_addr=$(echo $vtLine | $AWK '{print $1}')
get_size=$(echo $vtLine | $AWK '{print $2}')
vtLine=$($VTOY_PATH/tool/vtoyksym dm_put_table_device $VTOY_PATH/kallsyms)
put_addr=$(echo $vtLine | $AWK '{print $1}')
put_size=$(echo $vtLine | $AWK '{print $2}')
ro_addr=$($GREP ' set_memory_ro$' /proc/kallsyms | $AWK '{print $1}')
rw_addr=$($GREP ' set_memory_rw$' /proc/kallsyms | $AWK '{print $1}')
kprobe_reg_addr=$($GREP ' register_kprobe$' /proc/kallsyms | $AWK '{print $1}')
kprobe_unreg_addr=$($GREP ' unregister_kprobe$' /proc/kallsyms | $AWK '{print $1}')
if [ "$VTOY_DEBUG_LEVEL" = "01" ]; then
printk_addr=$($GREP ' printk$' /proc/kallsyms | $AWK '{print $1}')
vtDebug="-v"
else
printk_addr=0
fi
#printk_addr=$($GREP ' printk$' /proc/kallsyms | $AWK '{print $1}')
#vtDebug="-v"
vtlog get_addr=$get_addr get_size=$get_size
vtlog put_addr=$put_addr put_size=$put_size
vtlog kprobe_reg_addr=$kprobe_reg_addr kprobe_unreg_addr=$kprobe_unreg_addr
vtlog ro_addr=$ro_addr rw_addr=$rw_addr printk_addr=$printk_addr
if [ "$get_addr" = "0" -o "$put_addr" = "0" ]; then
vtlog "Invalid symbol address"
return
fi
if [ "$ro_addr" = "0" -o "$rw_addr" = "0" ]; then
vtlog "Invalid symbol address"
return
fi
vtKv=$($BUSYBOX_PATH/uname -r)
if [ ! -d /lib/modules/$vtKv ]; then
vtlog "No modules directory found"
return
elif [ -d /lib/modules/$vtKv/kernel/fs ]; then
vtModPath=$($FIND /lib/modules/$vtKv/kernel/fs/ -name "*.ko*" | $HEAD -n1)
else
vtModPath=$($FIND /lib/modules/$vtKv/kernel/ -name "xfs.ko*" | $HEAD -n1)
fi
if [ -z "$vtModPath" ]; then
vtModPath=$($FIND /lib/modules/$vtKv/kernel/ -name "*.ko*" | $HEAD -n1)
fi
vtModName=$($BUSYBOX_PATH/basename $vtModPath)
vtlog "template module is $vtModPath $vtModName"
if [ -z "$vtModPath" ]; then
vtlog "No template module found"
return
elif echo $vtModPath | $GREP -q "[.]ko$"; then
$BUSYBOX_PATH/cp -a $vtModPath $VTOY_PATH/$vtModName
elif echo $vtModPath | $GREP -q "[.]ko[.]xz$"; then
$BUSYBOX_PATH/xzcat $vtModPath > $VTOY_PATH/$vtModName
elif echo $vtModPath | $GREP -q "[.]ko[.]gz$"; then
$BUSYBOX_PATH/zcat $vtModPath > $VTOY_PATH/$vtModName
else
vtlog "unsupport module type"
return
fi
#step1: modify vermagic/mod crc/relocation
$VTOY_PATH/tool/vtoykmod -u $VTOY_PATH/tool/$vtKoName $VTOY_PATH/$vtModName $vtDebug
#step2: fill parameters
vtPgsize=$($VTOY_PATH/tool/vtoyksym -p)
$VTOY_PATH/tool/vtoykmod -f $VTOY_PATH/tool/$vtKoName $vtPgsize 0x$printk_addr 0x$ro_addr 0x$rw_addr $get_addr $get_size $put_addr $put_size 0x$kprobe_reg_addr 0x$kprobe_unreg_addr $vtDebug
$BUSYBOX_PATH/insmod $VTOY_PATH/tool/$vtKoName
if $GREP -q 'dm_patch' /proc/modules; then
echo "done" > $VTOY_PATH/dm_patch_done
fi
}
create_ventoy_device_mapper() {
vtlog "create_ventoy_device_mapper $*"
@@ -238,11 +378,28 @@ create_ventoy_device_mapper() {
fi
$VTOY_PATH/tool/vtoydm -p -f $VTOY_PATH/ventoy_image_map -d $1 > $VTOY_PATH/ventoy_dm_table
vtLevel1=$($CAT /proc/sys/kernel/printk | $AWK '{print $1}')
vtLevel2=$($CAT /proc/sys/kernel/printk | $AWK '{print $2}')
vtLevel3=$($CAT /proc/sys/kernel/printk | $AWK '{print $3}')
vtLevel4=$($CAT /proc/sys/kernel/printk | $AWK '{print $4}')
if ventoy_need_dm_patch; then
ventoy_dm_patch
#suppress printk message
echo 0 $vtLevel2 0 $vtLevel4 > /proc/sys/kernel/printk
fi
if [ -z "$2" ]; then
$VT_DM_BIN create ventoy $VTOY_PATH/ventoy_dm_table >>$VTLOG 2>&1
else
$VT_DM_BIN "$2" create ventoy $VTOY_PATH/ventoy_dm_table >>$VTLOG 2>&1
fi
if ventoy_need_dm_patch; then
#recover printk level
echo $vtLevel1 $vtLevel2 $vtLevel3 $vtLevel4 > /proc/sys/kernel/printk
fi
}
create_persistent_device_mapper() {
@@ -263,7 +420,23 @@ create_persistent_device_mapper() {
fi
$VTOY_PATH/tool/vtoydm -p -f $VTOY_PATH/ventoy_persistent_map -d $1 > $VTOY_PATH/persistent_dm_table
vtLevel1=$($CAT /proc/sys/kernel/printk | $AWK '{print $1}')
vtLevel2=$($CAT /proc/sys/kernel/printk | $AWK '{print $2}')
vtLevel3=$($CAT /proc/sys/kernel/printk | $AWK '{print $3}')
vtLevel4=$($CAT /proc/sys/kernel/printk | $AWK '{print $4}')
if [ -f $VTOY_PATH/dm_patch_done ]; then
#suppress printk message
echo 0 $vtLevel2 0 $vtLevel4 > /proc/sys/kernel/printk
fi
$VT_DM_BIN create vtoy_persistent $VTOY_PATH/persistent_dm_table >>$VTLOG 2>&1
if [ -f $VTOY_PATH/dm_patch_done ]; then
#recover printk level
echo $vtLevel1 $vtLevel2 $vtLevel3 $vtLevel4 > /proc/sys/kernel/printk
fi
}
@@ -493,6 +666,22 @@ ventoy_create_persistent_link() {
fi
}
ventoy_partname_to_diskname() {
if echo $1 | $EGREP -q "nvme.*p[0-9]$|mmc.*p[0-9]$|nbd.*p[0-9]$"; then
echo -n "${1:0:-2}"
else
echo -n "${1:0:-1}"
fi
}
ventoy_diskname_to_partname() {
if echo $1 | $EGREP -q "nvme.*p[0-9]$|mmc.*p[0-9]$|nbd.*p[0-9]$"; then
echo -n "${1}p$2"
else
echo -n "${1}$2"
fi
}
ventoy_udev_disk_common_hook() {
if echo $1 | $EGREP -q "nvme.*p[0-9]$|mmc.*p[0-9]$|nbd.*p[0-9]$"; then
VTDISK="${1:0:-2}"
@@ -541,6 +730,10 @@ ventoy_udev_disk_common_hook() {
create_persistent_device_mapper "/dev/$VTDISK"
ventoy_create_persistent_link
fi
if $GREP -q 'dm_patch' /proc/modules; then
$BUSYBOX_PATH/rmmod dm_patch
fi
}
ventoy_create_dev_ventoy_part() {
@@ -550,6 +743,15 @@ ventoy_create_dev_ventoy_part() {
if [ -e /vtoy_dm_table ]; then
vtPartid=1
vtLevel1=$($CAT /proc/sys/kernel/printk | $AWK '{print $1}')
vtLevel2=$($CAT /proc/sys/kernel/printk | $AWK '{print $2}')
vtLevel3=$($CAT /proc/sys/kernel/printk | $AWK '{print $3}')
vtLevel4=$($CAT /proc/sys/kernel/printk | $AWK '{print $4}')
if [ -f $VTOY_PATH/dm_patch_done ]; then
#suppress printk message
echo 0 $vtLevel2 0 $vtLevel4 > /proc/sys/kernel/printk
fi
$CAT /vtoy_dm_table | while read vtline; do
echo $vtline > /ventoy/dm_table_part${vtPartid}
$VTOY_PATH/tool/dmsetup create ventoy${vtPartid} /ventoy/dm_table_part${vtPartid}
@@ -559,6 +761,11 @@ ventoy_create_dev_ventoy_part() {
vtPartid=$(expr $vtPartid + 1)
done
if [ -f $VTOY_PATH/dm_patch_done ]; then
#recover printk level
echo $vtLevel1 $vtLevel2 $vtLevel3 $vtLevel4 > /proc/sys/kernel/printk
fi
fi
}
@@ -598,7 +805,12 @@ is_inotify_ventoy_part() {
fi
if [ -e /dev/$vtShortName ]; then
if [ "$VTOY_VLNK_BOOT" = "01" ]; then
vtOrgDiskName=$($VTOY_PATH/tool/vtoydump -t $VTOY_PATH/ventoy_os_param)
[ "$vtOrgDiskName" = "/dev/$vtShortName" ]
else
$VTOY_PATH/tool/vtoydump -f $VTOY_PATH/ventoy_os_param -c $vtShortName
fi
return
fi
fi

View File

@@ -129,6 +129,10 @@ mount -t devtmpfs dev /newdev
cp -a /dev/mapper/ventoy* /newdev/mapper/
cp -a /dev/ventoy* /newdev/
if [ "$VTOY_VLNK_BOOT" = "01" ]; then
vtLine=$($VTOY_PATH/tool/vtoydump -f /ventoy/ventoy_os_param)
vtdiskname=${vtLine%%#*}
fi
vtshortname="${vtdiskname#/dev/}"
mv /newdev/${vtshortname} /newdev/backup_${vtshortname}

View File

@@ -129,6 +129,10 @@ mount -t devtmpfs dev /newdev
cp -a /dev/mapper/ventoy* /newdev/mapper/
cp -a /dev/ventoy* /newdev/
if [ "$VTOY_VLNK_BOOT" = "01" ]; then
vtLine=$($VTOY_PATH/tool/vtoydump -f /ventoy/ventoy_os_param)
vtdiskname=${vtLine%%#*}
fi
vtshortname="${vtdiskname#/dev/}"
mv /newdev/${vtshortname} /newdev/backup_${vtshortname}

View File

@@ -0,0 +1,45 @@
#!/ventoy/busybox/sh
#************************************************************************************
# Copyright (c) 2020, longpanda <admin@ventoy.net>
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License as
# published by the Free Software Foundation; either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, see <http://www.gnu.org/licenses/>.
#
#************************************************************************************
. /ventoy/hook/ventoy-hook-lib.sh
VTPATH_OLD=$PATH; PATH=$BUSYBOX_PATH:$VTOY_PATH/tool:$PATH
if [ -f /vtoy_dm_table ]; then
vtPartCnt=$(cat /vtoy_dm_table | wc -l)
if [ $vtPartCnt -ne 1 ]; then
exit 0
fi
else
exit 0
fi
vtlog "try patch init script"
if [ -f /new_root/etc/init.d/S11share ]; then
cp -a /new_root/etc/init.d/S11share /new_root/overlay/S11share
sed "/^ *createMissingPartitions *$/r $VTOY_PATH/loop/recalbox/ventoy-share.sh" -i /new_root/overlay/S11share
vtFile=$(ls -1 /new_root/etc/init.d/ | grep -m1 S01)
mount --bind /new_root/overlay/S11share /new_root/etc/init.d/$vtFile
vtlog "patch S11share to $vtFile"
fi
PATH=$VTPATH_OLD

View File

@@ -36,10 +36,15 @@ if [ "$vtdiskname" = "unknown" ]; then
exit 0
fi
if [ -f $VTOY_PATH/modules/dm-mod.ko ]; then
insmod $VTOY_PATH/modules/dm-mod.ko
fi
ventoy_udev_disk_common_hook "${vtdiskname#/dev/}2" "noreplace"
ventoy_create_dev_ventoy_part
PATH=$VTPATH_OLD
set_ventoy_hook_finish

View File

@@ -20,4 +20,6 @@
. $VTOY_PATH/hook/ventoy-os-lib.sh
$SED "/mount.*devtmpfs/a\ $BUSYBOX_PATH/sh $VTOY_PATH/loop/recalbox/ventoy-disk.sh" -i /init
$SED "/switch_root/i\ $BUSYBOX_PATH/sh $VTOY_PATH/loop/recalbox/ventoy-create-part.sh" -i /init
#$SED "/switch_root/i\ exec /ventoy/busybox/sh" -i /init

View File

@@ -0,0 +1,21 @@
sync
while [ -n "Y" ]; do
clear > /dev/console
echo '################################################' > /dev/console
echo '################################################' > /dev/console
echo '### Please reboot and load from Ventoy again ###' > /dev/console
echo '### This only needed for the first boot time ###' > /dev/console
echo '################################################' > /dev/console
echo '################################################' > /dev/console
clear > /dev/tty0
echo '################################################' > /dev/tty0
echo '################################################' > /dev/tty0
echo '### Please reboot and load from Ventoy again ###' > /dev/tty0
echo '### This only needed for the first boot time ###' > /dev/tty0
echo '################################################' > /dev/tty0
echo '################################################' > /dev/tty0
sleep 1
done

Binary file not shown.

Binary file not shown.

View File

@@ -56,8 +56,13 @@ fi
# check size
if echo $size | grep -q "^[0-9][0-9]*$"; then
if [ $size -le 1 ]; then
echo "Invalid size $size"
vtMinSize=1
if echo $fstype | grep -q '^xfs$'; then
vtMinSize=16
fi
if [ $size -lt $vtMinSize ]; then
echo "size too small ($size)"
exit 1
fi
else

View File

@@ -26,6 +26,14 @@ Please refer https://www.ventoy.net/en/doc_start.html for details.
1. sudo sh VentoyPlugson.sh
2. open your browser and visit http://127.0.0.1:24681
========== VentoyVlnk.sh ===============
Usage: sudo sh VentoyVlnk.sh CMD FILE
CMD:
-c FILE create vlnk for FILE
-l VLNK parse vlnk file
-v print verbose info
-h print this help
========= VentoyGUI ===================
VentoyGUI is native GUI program for Linux (GTK/QT)

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.

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.

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.

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.

View File

@@ -1390,7 +1390,19 @@ function efi_common_menuentry {
return
fi
vt_concat_efi_iso "${vtoy_iso_part}${vt_chosen_path}" vtoy_iso_buf
unset vt_vlnk_dst
if vt_is_vlnk_name "${vt_chosen_path}"; then
vt_get_vlnk_dst "${vtoy_iso_part}${vt_chosen_path}" vt_vlnk_dst
if [ -z "$vt_vlnk_dst" ]; then
echo -e "\n### VLNK FILE NOT FOUND ###\n### VLNK 文件不存在 ###\n"
ventoy_pause
return
fi
else
vt_vlnk_dst="${vtoy_iso_part}${vt_chosen_path}"
fi
vt_concat_efi_iso "${vt_vlnk_dst}" vtoy_iso_buf
ventoy_debug_pause
@@ -1402,7 +1414,7 @@ function efi_common_menuentry {
if [ -n "$vtoy_dotefi_retry" ]; then
unset vtoy_dotefi_retry
chainloader "${vtoy_iso_part}${vt_chosen_path}"
chainloader "${vt_vlnk_dst}"
boot
fi
@@ -1438,17 +1450,6 @@ function vhdboot_common_func {
}
function vhd_common_menuentry {
if [ "$VTOY_VHD_NO_WARNING" != "1" ]; then
if [ "$vtoy_iso_fs" != "ntfs" ]; then
echo -e "!!! WARNING !!!\n"
echo -e "\nPartition1 ($vtoy_iso_fs) is NOT ntfs, the VHD(x) file may not boot normally \n"
echo -e "\nVHD(x) 文件所在分区不是 ntfs 格式, 可能无法正常启动 \n\n"
echo -n "press ENTER to continue boot (请按 回车 键继续) ..."
read vtInputKey
fi
fi
vt_chosen_img_path vt_chosen_path vt_chosen_size
if vt_check_password "${vt_chosen_path}"; then
@@ -1459,7 +1460,28 @@ function vhd_common_menuentry {
return
fi
vhdboot_common_func "${vt_chosen_path}"
unset vt_vlnk_dst
if vt_is_vlnk_name "${vt_chosen_path}"; then
vt_get_vlnk_dst "${vtoy_iso_part}${vt_chosen_path}" vt_vlnk_dst
if [ -z "$vt_vlnk_dst" ]; then
echo -e "\n### VLNK FILE NOT FOUND ###\n### VLNK 文件不存在 ###\n"
ventoy_pause
return
fi
else
vt_vlnk_dst="${vt_chosen_path}"
if [ "$VTOY_VHD_NO_WARNING" != "1" ]; then
if [ "$vtoy_iso_fs" != "ntfs" ]; then
echo -e "!!! WARNING !!!\n"
echo -e "\nPartition1 ($vtoy_iso_fs) is NOT ntfs, the VHD(x) file may not boot normally \n"
echo -e "\nVHD(x) 文件所在分区不是 ntfs 格式, 可能无法正常启动 \n\n"
echo -n "press ENTER to continue boot (请按 回车 键继续) ..."
read vtInputKey
fi
fi
fi
vhdboot_common_func "${vt_vlnk_dst}"
}
function vhd_unsupport_menuentry {
@@ -1535,7 +1557,19 @@ function vtoy_common_menuentry {
return
fi
vtoyboot_common_func "${vtoy_iso_part}${vt_chosen_path}"
unset vt_vlnk_dst
if vt_is_vlnk_name "${vt_chosen_path}"; then
vt_get_vlnk_dst "${vtoy_iso_part}${vt_chosen_path}" vt_vlnk_dst
if [ -z "$vt_vlnk_dst" ]; then
echo -e "\n### VLNK FILE NOT FOUND ###\n### VLNK 文件不存在 ###\n"
ventoy_pause
return
fi
else
vt_vlnk_dst="${vtoy_iso_part}${vt_chosen_path}"
fi
vtoyboot_common_func "${vt_vlnk_dst}"
}
function vtoy_unsupport_menuentry {
@@ -1688,9 +1722,23 @@ function ventoy_img_ubos {
}
function ventoy_img_recalbox {
if [ $vtoy_img_max_part_end -gt $vt_chosen_size ]; then
echo -e "\nPlease extend the img file size before boot it. \n"
ventoy_pause
return
fi
vt_load_cpio $vtoy_path "${vt_chosen_path}" ${vtoy_iso_part} "busybox=$ventoy_busybox_ver"
vt_trailer_cpio ${vtoy_iso_part} "${vt_chosen_path}" noinit
if [ -e (vtimghd,1)/boot/recalbox ]; then
loopback recalbox (vtimghd,1)/boot/recalbox
vt_get_lib_module_ver (recalbox) /lib/modules/ vt_module_ver
if [ -n "$vt_module_ver" ]; then
vt_img_extra_initrd_append (recalbox)/lib/modules/$vt_module_ver/kernel/drivers/md/dm-mod.ko
fi
fi
ventoy_debug_pause
#boot image file
@@ -1971,7 +2019,7 @@ function img_common_menuentry {
ventoy_img_batocera
elif vt_str_begin "$vtImgHd1Label" "Tails"; then
ventoy_img_tails
elif [ "$vtImgHd2Label" = "RECALBOX" ]; then
elif [ "$vtImgHd2Label" = "RECALBOX" -o "$vtImgHd1Label" = "RECALBOX" ]; then
ventoy_img_recalbox
elif [ "$vtImgHd1Label" = "ESYSRESCUE" ]; then
ventoy_img_esysrescue
@@ -2022,7 +2070,7 @@ function img_unsupport_menuentry {
#############################################################
#############################################################
set VENTOY_VERSION="1.0.63"
set VENTOY_VERSION="1.0.66"
#ACPI not compatible with Window7/8, so disable by default
set VTOY_PARAM_NO_ACPI=1
@@ -2030,7 +2078,7 @@ set VTOY_PARAM_NO_ACPI=1
# Default menu display mode, you can change it as you want.
# 0: List mode
# 1: TreeView mode
set VTOY_DEFAULT_MENU_MODE=0
set VTOY_DEFAULT_MENU_MODE=1
set VTOY_MEM_DISK_STR="[Memdisk]"
set VTOY_ISO_RAW_STR="Compatible Mode"
@@ -2142,6 +2190,7 @@ else
set VTOY_HOTKEY_TIP="h:Help F1:Memdisk F2:Power F3:ListView F4:Localboot F5:Tools F6:ExMenu"
fi
terminal_output console
if [ -n "$vtoy_gfxmode" ]; then
set gfxmode=$vtoy_gfxmode

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.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Some files were not shown because too many files have changed in this diff Show More