mirror of https://github.com/ventoy/Ventoy.git
1.0.07 release
This commit is contained in:
parent
d551fc2e3c
commit
d5b829f8e8
|
@ -53,15 +53,27 @@ ventoy_sector_flag *g_sector_flag = NULL;
|
||||||
UINT32 g_sector_flag_num = 0;
|
UINT32 g_sector_flag_num = 0;
|
||||||
static grub_env_get_pf grub_env_get = NULL;
|
static grub_env_get_pf grub_env_get = NULL;
|
||||||
|
|
||||||
|
EFI_FILE_OPEN g_original_fopen = NULL;
|
||||||
|
EFI_FILE_CLOSE g_original_fclose = NULL;
|
||||||
|
EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_OPEN_VOLUME g_original_open_volume = NULL;
|
||||||
|
|
||||||
|
ventoy_grub_param_file_replace *g_file_replace_list = NULL;
|
||||||
|
ventoy_efi_file_replace g_efi_file_replace;
|
||||||
|
|
||||||
|
CHAR16 gFirstTryBootFile[256] = {0};
|
||||||
|
|
||||||
CONST CHAR16 gIso9660EfiDriverPath[] = ISO9660_EFI_DRIVER_PATH;
|
CONST CHAR16 gIso9660EfiDriverPath[] = ISO9660_EFI_DRIVER_PATH;
|
||||||
|
|
||||||
/* Boot filename */
|
/* Boot filename */
|
||||||
|
UINTN gBootFileStartIndex = 1;
|
||||||
CONST CHAR16 *gEfiBootFileName[] =
|
CONST CHAR16 *gEfiBootFileName[] =
|
||||||
{
|
{
|
||||||
|
L"@",
|
||||||
EFI_REMOVABLE_MEDIA_FILE_NAME,
|
EFI_REMOVABLE_MEDIA_FILE_NAME,
|
||||||
L"\\EFI\\BOOT\\GRUBX64.EFI",
|
L"\\EFI\\BOOT\\GRUBX64.EFI",
|
||||||
L"\\EFI\\BOOT\\BOOTx64.EFI",
|
L"\\EFI\\BOOT\\BOOTx64.EFI",
|
||||||
L"\\EFI\\BOOT\\bootx64.efi",
|
L"\\EFI\\BOOT\\bootx64.efi",
|
||||||
|
L"\\efi\\boot\\bootx64.efi",
|
||||||
};
|
};
|
||||||
|
|
||||||
/* EFI block device vendor device path GUID */
|
/* EFI block device vendor device path GUID */
|
||||||
|
@ -886,6 +898,7 @@ static int ventoy_update_image_location(ventoy_os_param *param)
|
||||||
STATIC EFI_STATUS EFIAPI ventoy_parse_cmdline(IN EFI_HANDLE ImageHandle)
|
STATIC EFI_STATUS EFIAPI ventoy_parse_cmdline(IN EFI_HANDLE ImageHandle)
|
||||||
{
|
{
|
||||||
UINT32 i = 0;
|
UINT32 i = 0;
|
||||||
|
UINT32 old_cnt = 0;
|
||||||
UINTN size = 0;
|
UINTN size = 0;
|
||||||
UINT8 chksum = 0;
|
UINT8 chksum = 0;
|
||||||
CHAR16 *pPos = NULL;
|
CHAR16 *pPos = NULL;
|
||||||
|
@ -915,8 +928,33 @@ STATIC EFI_STATUS EFIAPI ventoy_parse_cmdline(IN EFI_HANDLE ImageHandle)
|
||||||
gLoadIsoEfi = TRUE;
|
gLoadIsoEfi = TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pPos = StrStr(pCmdLine, L"FirstTry=@");
|
||||||
|
if (pPos)
|
||||||
|
{
|
||||||
|
pPos += StrLen(L"FirstTry=");
|
||||||
|
for (i = 0; i < ARRAY_SIZE(gFirstTryBootFile); i++, pPos++)
|
||||||
|
{
|
||||||
|
if (*pPos != L' ' && *pPos != L'\t' && *pPos)
|
||||||
|
{
|
||||||
|
gFirstTryBootFile[i] = (*pPos == '@') ? '\\' : *pPos;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
gEfiBootFileName[0] = gFirstTryBootFile;
|
||||||
|
gBootFileStartIndex = 0;
|
||||||
|
}
|
||||||
|
|
||||||
debug("cmdline:<%s>", pCmdLine);
|
debug("cmdline:<%s>", pCmdLine);
|
||||||
|
|
||||||
|
if (gFirstTryBootFile[0])
|
||||||
|
{
|
||||||
|
debug("First Try:<%s>", gFirstTryBootFile);
|
||||||
|
}
|
||||||
|
|
||||||
pPos = StrStr(pCmdLine, L"env_param=");
|
pPos = StrStr(pCmdLine, L"env_param=");
|
||||||
if (!pPos)
|
if (!pPos)
|
||||||
{
|
{
|
||||||
|
@ -926,6 +964,18 @@ STATIC EFI_STATUS EFIAPI ventoy_parse_cmdline(IN EFI_HANDLE ImageHandle)
|
||||||
pGrubParam = (ventoy_grub_param *)StrHexToUintn(pPos + StrLen(L"env_param="));
|
pGrubParam = (ventoy_grub_param *)StrHexToUintn(pPos + StrLen(L"env_param="));
|
||||||
grub_env_get = pGrubParam->grub_env_get;
|
grub_env_get = pGrubParam->grub_env_get;
|
||||||
|
|
||||||
|
g_file_replace_list = &pGrubParam->file_replace;
|
||||||
|
old_cnt = g_file_replace_list->old_file_cnt;
|
||||||
|
debug("file replace: magic:0x%x virtid:%u name count:%u <%a> <%a> <%a> <%a>",
|
||||||
|
g_file_replace_list->magic,
|
||||||
|
g_file_replace_list->new_file_virtual_id,
|
||||||
|
old_cnt,
|
||||||
|
old_cnt > 0 ? g_file_replace_list->old_file_name[0] : "",
|
||||||
|
old_cnt > 1 ? g_file_replace_list->old_file_name[1] : "",
|
||||||
|
old_cnt > 2 ? g_file_replace_list->old_file_name[2] : "",
|
||||||
|
old_cnt > 3 ? g_file_replace_list->old_file_name[3] : ""
|
||||||
|
);
|
||||||
|
|
||||||
pPos = StrStr(pCmdLine, L"mem:");
|
pPos = StrStr(pCmdLine, L"mem:");
|
||||||
g_chain = (ventoy_chain_head *)StrHexToUintn(pPos + 4);
|
g_chain = (ventoy_chain_head *)StrHexToUintn(pPos + 4);
|
||||||
|
|
||||||
|
@ -970,8 +1020,85 @@ STATIC EFI_STATUS EFIAPI ventoy_parse_cmdline(IN EFI_HANDLE ImageHandle)
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EFI_STATUS EFIAPI ventoy_wrapper_file_open
|
||||||
|
(
|
||||||
|
EFI_FILE_HANDLE This,
|
||||||
|
EFI_FILE_HANDLE *New,
|
||||||
|
CHAR16 *Name,
|
||||||
|
UINT64 Mode,
|
||||||
|
UINT64 Attributes
|
||||||
|
)
|
||||||
|
{
|
||||||
|
UINT32 i = 0;
|
||||||
|
UINT32 j = 0;
|
||||||
|
UINT64 Sectors = 0;
|
||||||
|
EFI_STATUS Status = EFI_SUCCESS;
|
||||||
|
CHAR8 TmpName[256];
|
||||||
|
ventoy_virt_chunk *virt = NULL;
|
||||||
|
|
||||||
|
Status = g_original_fopen(This, New, Name, Mode, Attributes);
|
||||||
|
if (EFI_ERROR(Status))
|
||||||
|
{
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (g_file_replace_list && g_file_replace_list->magic == GRUB_FILE_REPLACE_MAGIC &&
|
||||||
|
g_file_replace_list->new_file_virtual_id < g_virt_chunk_num)
|
||||||
|
{
|
||||||
|
AsciiSPrint(TmpName, sizeof(TmpName), "%s", Name);
|
||||||
|
for (j = 0; j < 4; j++)
|
||||||
|
{
|
||||||
|
if (0 == AsciiStrCmp(g_file_replace_list[i].old_file_name[j], TmpName))
|
||||||
|
{
|
||||||
|
g_original_fclose(*New);
|
||||||
|
*New = &g_efi_file_replace.WrapperHandle;
|
||||||
|
ventoy_wrapper_file_procotol(*New);
|
||||||
|
|
||||||
|
virt = g_virt_chunk + g_file_replace_list->new_file_virtual_id;
|
||||||
|
|
||||||
|
Sectors = (virt->mem_sector_end - virt->mem_sector_start) + (virt->remap_sector_end - virt->remap_sector_start);
|
||||||
|
|
||||||
|
g_efi_file_replace.BlockIoSectorStart = virt->mem_sector_start;
|
||||||
|
g_efi_file_replace.FileSizeBytes = Sectors * 2048;
|
||||||
|
|
||||||
|
if (gDebugPrint)
|
||||||
|
{
|
||||||
|
debug("## ventoy_wrapper_file_open <%s> BlockStart:%lu Sectors:%lu Bytes:%lu", Name,
|
||||||
|
g_efi_file_replace.BlockIoSectorStart, Sectors, Sectors * 2048);
|
||||||
|
sleep(3);
|
||||||
|
}
|
||||||
|
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
EFI_STATUS EFIAPI ventoy_wrapper_open_volume
|
||||||
|
(
|
||||||
|
IN EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *This,
|
||||||
|
OUT EFI_FILE_PROTOCOL **Root
|
||||||
|
)
|
||||||
|
{
|
||||||
|
EFI_STATUS Status = EFI_SUCCESS;
|
||||||
|
|
||||||
|
Status = g_original_open_volume(This, Root);
|
||||||
|
if (!EFI_ERROR(Status))
|
||||||
|
{
|
||||||
|
g_original_fopen = (*Root)->Open;
|
||||||
|
g_original_fclose = (*Root)->Close;
|
||||||
|
(*Root)->Open = ventoy_wrapper_file_open;
|
||||||
|
}
|
||||||
|
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
EFI_STATUS EFIAPI ventoy_boot(IN EFI_HANDLE ImageHandle)
|
EFI_STATUS EFIAPI ventoy_boot(IN EFI_HANDLE ImageHandle)
|
||||||
{
|
{
|
||||||
|
UINTN t = 0;
|
||||||
UINTN i = 0;
|
UINTN i = 0;
|
||||||
UINTN j = 0;
|
UINTN j = 0;
|
||||||
UINTN Find = 0;
|
UINTN Find = 0;
|
||||||
|
@ -982,78 +1109,99 @@ EFI_STATUS EFIAPI ventoy_boot(IN EFI_HANDLE ImageHandle)
|
||||||
EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *pFile = NULL;
|
EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *pFile = NULL;
|
||||||
EFI_DEVICE_PATH_PROTOCOL *pDevPath = NULL;
|
EFI_DEVICE_PATH_PROTOCOL *pDevPath = NULL;
|
||||||
|
|
||||||
Status = gBS->LocateHandleBuffer(ByProtocol, &gEfiSimpleFileSystemProtocolGuid,
|
for (t = 0; t < 3; t++)
|
||||||
|
{
|
||||||
|
Count = 0;
|
||||||
|
Handles = NULL;
|
||||||
|
|
||||||
|
Status = gBS->LocateHandleBuffer(ByProtocol, &gEfiSimpleFileSystemProtocolGuid,
|
||||||
NULL, &Count, &Handles);
|
NULL, &Count, &Handles);
|
||||||
if (EFI_ERROR(Status))
|
|
||||||
{
|
|
||||||
return Status;
|
|
||||||
}
|
|
||||||
|
|
||||||
debug("ventoy_boot fs count:%u", Count);
|
|
||||||
|
|
||||||
for (i = 0; i < Count; i++)
|
|
||||||
{
|
|
||||||
Status = gBS->HandleProtocol(Handles[i], &gEfiSimpleFileSystemProtocolGuid, (VOID **)&pFile);
|
|
||||||
if (EFI_ERROR(Status))
|
if (EFI_ERROR(Status))
|
||||||
{
|
{
|
||||||
continue;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
Status = gBS->OpenProtocol(Handles[i], &gEfiDevicePathProtocolGuid,
|
debug("ventoy_boot fs count:%u", Count);
|
||||||
(VOID **)&pDevPath,
|
|
||||||
ImageHandle,
|
|
||||||
Handles[i],
|
|
||||||
EFI_OPEN_PROTOCOL_GET_PROTOCOL);
|
|
||||||
if (EFI_ERROR(Status))
|
|
||||||
{
|
|
||||||
debug("Failed to open device path protocol %r", Status);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
debug("Handle:%p FS DP: <%s>", Handles[i], ConvertDevicePathToText(pDevPath, FALSE, FALSE));
|
for (i = 0; i < Count; i++)
|
||||||
if (CompareMem(gBlockData.Path, pDevPath, gBlockData.DevicePathCompareLen))
|
|
||||||
{
|
{
|
||||||
debug("Not ventoy disk file system");
|
Status = gBS->HandleProtocol(Handles[i], &gEfiSimpleFileSystemProtocolGuid, (VOID **)&pFile);
|
||||||
continue;
|
if (EFI_ERROR(Status))
|
||||||
}
|
|
||||||
|
|
||||||
for (j = 0; j < ARRAY_SIZE(gEfiBootFileName); j++)
|
|
||||||
{
|
|
||||||
Status = ventoy_load_image(ImageHandle, pDevPath, gEfiBootFileName[j],
|
|
||||||
StrSize(gEfiBootFileName[j]), &Image);
|
|
||||||
if (EFI_SUCCESS == Status)
|
|
||||||
{
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
debug("FS:%u Protocol:%p OpenVolume:%p", i, pFile, pFile->OpenVolume);
|
||||||
|
|
||||||
|
Status = gBS->OpenProtocol(Handles[i], &gEfiDevicePathProtocolGuid,
|
||||||
|
(VOID **)&pDevPath,
|
||||||
|
ImageHandle,
|
||||||
|
Handles[i],
|
||||||
|
EFI_OPEN_PROTOCOL_GET_PROTOCOL);
|
||||||
|
if (EFI_ERROR(Status))
|
||||||
|
{
|
||||||
|
debug("Failed to open device path protocol %r", Status);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
debug("Handle:%p FS DP: <%s>", Handles[i], ConvertDevicePathToText(pDevPath, FALSE, FALSE));
|
||||||
|
if (CompareMem(gBlockData.Path, pDevPath, gBlockData.DevicePathCompareLen))
|
||||||
|
{
|
||||||
|
debug("Not ventoy disk file system");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (j = gBootFileStartIndex; j < ARRAY_SIZE(gEfiBootFileName); j++)
|
||||||
|
{
|
||||||
|
Status = ventoy_load_image(ImageHandle, pDevPath, gEfiBootFileName[j],
|
||||||
|
StrSize(gEfiBootFileName[j]), &Image);
|
||||||
|
if (EFI_SUCCESS == Status)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
debug("Failed to load image %r <%s>", Status, gEfiBootFileName[j]);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (j >= ARRAY_SIZE(gEfiBootFileName))
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
Find++;
|
||||||
|
debug("Find boot file, now try to boot .....");
|
||||||
|
ventoy_debug_pause();
|
||||||
|
|
||||||
|
if (gDebugPrint)
|
||||||
|
{
|
||||||
|
gST->ConIn->Reset(gST->ConIn, FALSE);
|
||||||
|
//ventoy_wrapper_system();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (g_file_replace_list && g_file_replace_list->magic == GRUB_FILE_REPLACE_MAGIC)
|
||||||
|
{
|
||||||
|
g_original_open_volume = pFile->OpenVolume;
|
||||||
|
pFile->OpenVolume = ventoy_wrapper_open_volume;
|
||||||
|
}
|
||||||
|
|
||||||
|
Status = gBS->StartImage(Image, NULL, NULL);
|
||||||
|
if (EFI_ERROR(Status))
|
||||||
|
{
|
||||||
|
debug("Failed to start image %r", Status);
|
||||||
|
sleep(3);
|
||||||
|
gBS->UnloadImage(Image);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
debug("Failed to load image %r <%s>", Status, gEfiBootFileName[j]);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (j >= ARRAY_SIZE(gEfiBootFileName))
|
FreePool(Handles);
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
Find++;
|
if (Find == 0)
|
||||||
debug("Find boot file, now try to boot .....");
|
|
||||||
ventoy_debug_pause();
|
|
||||||
|
|
||||||
if (gDebugPrint)
|
|
||||||
{
|
{
|
||||||
gST->ConIn->Reset(gST->ConIn, FALSE);
|
debug("Fs not found, now wait and retry...");
|
||||||
}
|
sleep(2);
|
||||||
|
|
||||||
Status = gBS->StartImage(Image, NULL, NULL);
|
|
||||||
if (EFI_ERROR(Status))
|
|
||||||
{
|
|
||||||
debug("Failed to start image %r", Status);
|
|
||||||
sleep(3);
|
|
||||||
gBS->UnloadImage(Image);
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
FreePool(Handles);
|
|
||||||
|
|
||||||
if (Find == 0)
|
if (Find == 0)
|
||||||
{
|
{
|
||||||
return EFI_NOT_FOUND;
|
return EFI_NOT_FOUND;
|
||||||
|
@ -1190,9 +1338,21 @@ EFI_STATUS EFIAPI VentoyEfiMain
|
||||||
Status = ventoy_boot(ImageHandle);
|
Status = ventoy_boot(ImageHandle);
|
||||||
if (EFI_NOT_FOUND == Status)
|
if (EFI_NOT_FOUND == Status)
|
||||||
{
|
{
|
||||||
gST->ConOut->OutputString(gST->ConOut, L"No bootfile found for UEFI!\r\n");
|
if (!gLoadIsoEfi)
|
||||||
gST->ConOut->OutputString(gST->ConOut, L"Maybe the image does not support " VENTOY_UEFI_DESC L"!\r\n");
|
{
|
||||||
sleep(300);
|
gLoadIsoEfi = TRUE;
|
||||||
|
ventoy_find_iso_disk_fs(ImageHandle);
|
||||||
|
ventoy_load_isoefi_driver(ImageHandle);
|
||||||
|
|
||||||
|
Status = ventoy_boot(ImageHandle);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (EFI_NOT_FOUND == Status)
|
||||||
|
{
|
||||||
|
gST->ConOut->OutputString(gST->ConOut, L"No bootfile found for UEFI!\r\n");
|
||||||
|
gST->ConOut->OutputString(gST->ConOut, L"Maybe the image does not support " VENTOY_UEFI_DESC L"!\r\n");
|
||||||
|
sleep(60);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ventoy_clean_env();
|
ventoy_clean_env();
|
||||||
|
|
|
@ -205,6 +205,7 @@ typedef struct vtoy_block_data
|
||||||
#define ISO9660_EFI_DRIVER_PATH L"\\ventoy\\iso9660_x64.efi"
|
#define ISO9660_EFI_DRIVER_PATH L"\\ventoy\\iso9660_x64.efi"
|
||||||
|
|
||||||
#define debug(expr, ...) if (gDebugPrint) VtoyDebug("[VTOY] "expr"\r\n", ##__VA_ARGS__)
|
#define debug(expr, ...) if (gDebugPrint) VtoyDebug("[VTOY] "expr"\r\n", ##__VA_ARGS__)
|
||||||
|
#define trace(expr, ...) VtoyDebug("[VTOY] "expr"\r\n", ##__VA_ARGS__)
|
||||||
#define sleep(sec) gBS->Stall(1000000 * (sec))
|
#define sleep(sec) gBS->Stall(1000000 * (sec))
|
||||||
|
|
||||||
#define ventoy_debug_pause() \
|
#define ventoy_debug_pause() \
|
||||||
|
@ -219,9 +220,32 @@ if (gDebugPrint) \
|
||||||
typedef const char * (*grub_env_get_pf)(const char *name);
|
typedef const char * (*grub_env_get_pf)(const char *name);
|
||||||
|
|
||||||
#pragma pack(1)
|
#pragma pack(1)
|
||||||
|
|
||||||
|
#define GRUB_FILE_REPLACE_MAGIC 0x1258BEEF
|
||||||
|
|
||||||
|
typedef struct ventoy_efi_file_replace
|
||||||
|
{
|
||||||
|
UINT64 BlockIoSectorStart;
|
||||||
|
|
||||||
|
UINT64 CurPos;
|
||||||
|
UINT64 FileSizeBytes;
|
||||||
|
|
||||||
|
EFI_FILE_PROTOCOL WrapperHandle;
|
||||||
|
}ventoy_efi_file_replace;
|
||||||
|
|
||||||
|
typedef struct ventoy_grub_param_file_replace
|
||||||
|
{
|
||||||
|
UINT32 magic;
|
||||||
|
char old_file_name[4][256];
|
||||||
|
UINT32 old_file_cnt;
|
||||||
|
UINT32 new_file_virtual_id;
|
||||||
|
}ventoy_grub_param_file_replace;
|
||||||
|
|
||||||
typedef struct ventoy_grub_param
|
typedef struct ventoy_grub_param
|
||||||
{
|
{
|
||||||
grub_env_get_pf grub_env_get;
|
grub_env_get_pf grub_env_get;
|
||||||
|
|
||||||
|
ventoy_grub_param_file_replace file_replace;
|
||||||
}ventoy_grub_param;
|
}ventoy_grub_param;
|
||||||
|
|
||||||
typedef struct ventoy_ram_disk
|
typedef struct ventoy_ram_disk
|
||||||
|
@ -233,8 +257,44 @@ typedef struct ventoy_ram_disk
|
||||||
#pragma pack()
|
#pragma pack()
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct well_known_guid
|
||||||
|
{
|
||||||
|
EFI_GUID *guid;
|
||||||
|
const char *name;
|
||||||
|
}well_known_guid;
|
||||||
|
|
||||||
|
typedef struct ventoy_system_wrapper
|
||||||
|
{
|
||||||
|
EFI_LOCATE_PROTOCOL NewLocateProtocol;
|
||||||
|
EFI_LOCATE_PROTOCOL OriLocateProtocol;
|
||||||
|
|
||||||
|
EFI_HANDLE_PROTOCOL NewHandleProtocol;
|
||||||
|
EFI_HANDLE_PROTOCOL OriHandleProtocol;
|
||||||
|
|
||||||
|
EFI_OPEN_PROTOCOL NewOpenProtocol;
|
||||||
|
EFI_OPEN_PROTOCOL OriOpenProtocol;
|
||||||
|
} ventoy_system_wrapper;
|
||||||
|
|
||||||
|
#define ventoy_wrapper(bs, wrapper, func, newfunc) \
|
||||||
|
{\
|
||||||
|
wrapper.Ori##func = bs->func;\
|
||||||
|
wrapper.New##func = newfunc;\
|
||||||
|
bs->func = wrapper.New##func;\
|
||||||
|
}
|
||||||
|
|
||||||
|
extern ventoy_efi_file_replace g_efi_file_replace;
|
||||||
extern BOOLEAN gDebugPrint;
|
extern BOOLEAN gDebugPrint;
|
||||||
VOID EFIAPI VtoyDebug(IN CONST CHAR8 *Format, ...);
|
VOID EFIAPI VtoyDebug(IN CONST CHAR8 *Format, ...);
|
||||||
|
EFI_STATUS EFIAPI ventoy_wrapper_system(VOID);
|
||||||
|
EFI_STATUS EFIAPI ventoy_wrapper_file_procotol(EFI_FILE_PROTOCOL *File);
|
||||||
|
EFI_STATUS EFIAPI ventoy_block_io_read
|
||||||
|
(
|
||||||
|
IN EFI_BLOCK_IO_PROTOCOL *This,
|
||||||
|
IN UINT32 MediaId,
|
||||||
|
IN EFI_LBA Lba,
|
||||||
|
IN UINTN BufferSize,
|
||||||
|
OUT VOID *Buffer
|
||||||
|
);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -28,6 +28,7 @@
|
||||||
[Sources]
|
[Sources]
|
||||||
Ventoy.h
|
Ventoy.h
|
||||||
Ventoy.c
|
Ventoy.c
|
||||||
|
VentoyDebug.c
|
||||||
|
|
||||||
[Packages]
|
[Packages]
|
||||||
MdePkg/MdePkg.dec
|
MdePkg/MdePkg.dec
|
||||||
|
@ -42,6 +43,7 @@
|
||||||
[Guids]
|
[Guids]
|
||||||
gShellVariableGuid
|
gShellVariableGuid
|
||||||
gEfiVirtualCdGuid
|
gEfiVirtualCdGuid
|
||||||
|
gEfiFileInfoGuid
|
||||||
|
|
||||||
[Protocols]
|
[Protocols]
|
||||||
gEfiLoadedImageProtocolGuid
|
gEfiLoadedImageProtocolGuid
|
||||||
|
@ -49,3 +51,30 @@
|
||||||
gEfiDevicePathProtocolGuid
|
gEfiDevicePathProtocolGuid
|
||||||
gEfiSimpleFileSystemProtocolGuid
|
gEfiSimpleFileSystemProtocolGuid
|
||||||
gEfiRamDiskProtocolGuid
|
gEfiRamDiskProtocolGuid
|
||||||
|
gEfiAbsolutePointerProtocolGuid
|
||||||
|
gEfiAcpiTableProtocolGuid
|
||||||
|
gEfiBlockIo2ProtocolGuid
|
||||||
|
gEfiBusSpecificDriverOverrideProtocolGuid
|
||||||
|
gEfiComponentNameProtocolGuid
|
||||||
|
gEfiComponentName2ProtocolGuid
|
||||||
|
gEfiDriverBindingProtocolGuid
|
||||||
|
gEfiDiskIoProtocolGuid
|
||||||
|
gEfiDiskIo2ProtocolGuid
|
||||||
|
gEfiGraphicsOutputProtocolGuid
|
||||||
|
gEfiHiiConfigAccessProtocolGuid
|
||||||
|
gEfiHiiFontProtocolGuid
|
||||||
|
gEfiLoadFileProtocolGuid
|
||||||
|
gEfiLoadFile2ProtocolGuid
|
||||||
|
gEfiLoadedImageProtocolGuid
|
||||||
|
gEfiLoadedImageDevicePathProtocolGuid
|
||||||
|
gEfiPciIoProtocolGuid
|
||||||
|
gEfiSerialIoProtocolGuid
|
||||||
|
gEfiSimpleTextInProtocolGuid
|
||||||
|
gEfiSimpleTextInputExProtocolGuid
|
||||||
|
gEfiSimpleTextOutProtocolGuid
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,325 @@
|
||||||
|
/******************************************************************************
|
||||||
|
* Ventoy.c
|
||||||
|
*
|
||||||
|
* 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/>.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <Uefi.h>
|
||||||
|
#include <Library/DebugLib.h>
|
||||||
|
#include <Library/PrintLib.h>
|
||||||
|
#include <Library/UefiLib.h>
|
||||||
|
#include <Library/BaseMemoryLib.h>
|
||||||
|
#include <Library/DevicePathLib.h>
|
||||||
|
#include <Library/MemoryAllocationLib.h>
|
||||||
|
#include <Library/UefiBootServicesTableLib.h>
|
||||||
|
#include <Library/UefiRuntimeServicesTableLib.h>
|
||||||
|
#include <Library/UefiApplicationEntryPoint.h>
|
||||||
|
#include <Protocol/LoadedImage.h>
|
||||||
|
#include <Guid/FileInfo.h>
|
||||||
|
#include <Guid/FileSystemInfo.h>
|
||||||
|
#include <Protocol/BlockIo.h>
|
||||||
|
#include <Protocol/RamDisk.h>
|
||||||
|
#include <Protocol/SimpleFileSystem.h>
|
||||||
|
#include <Ventoy.h>
|
||||||
|
|
||||||
|
STATIC ventoy_system_wrapper g_system_wrapper;
|
||||||
|
|
||||||
|
static struct well_known_guid g_efi_well_known_guids[] =
|
||||||
|
{
|
||||||
|
{ &gEfiAbsolutePointerProtocolGuid, "AbsolutePointer" },
|
||||||
|
{ &gEfiAcpiTableProtocolGuid, "AcpiTable" },
|
||||||
|
{ &gEfiBlockIoProtocolGuid, "BlockIo" },
|
||||||
|
{ &gEfiBlockIo2ProtocolGuid, "BlockIo2" },
|
||||||
|
{ &gEfiBusSpecificDriverOverrideProtocolGuid, "BusSpecificDriverOverride" },
|
||||||
|
{ &gEfiComponentNameProtocolGuid, "ComponentName" },
|
||||||
|
{ &gEfiComponentName2ProtocolGuid, "ComponentName2" },
|
||||||
|
{ &gEfiDevicePathProtocolGuid, "DevicePath" },
|
||||||
|
{ &gEfiDriverBindingProtocolGuid, "DriverBinding" },
|
||||||
|
{ &gEfiDiskIoProtocolGuid, "DiskIo" },
|
||||||
|
{ &gEfiDiskIo2ProtocolGuid, "DiskIo2" },
|
||||||
|
{ &gEfiGraphicsOutputProtocolGuid, "GraphicsOutput" },
|
||||||
|
{ &gEfiHiiConfigAccessProtocolGuid, "HiiConfigAccess" },
|
||||||
|
{ &gEfiHiiFontProtocolGuid, "HiiFont" },
|
||||||
|
{ &gEfiLoadFileProtocolGuid, "LoadFile" },
|
||||||
|
{ &gEfiLoadFile2ProtocolGuid, "LoadFile2" },
|
||||||
|
{ &gEfiLoadedImageProtocolGuid, "LoadedImage" },
|
||||||
|
{ &gEfiLoadedImageDevicePathProtocolGuid, "LoadedImageDevicePath"},
|
||||||
|
{ &gEfiPciIoProtocolGuid, "PciIo" },
|
||||||
|
{ &gEfiSerialIoProtocolGuid, "SerialIo" },
|
||||||
|
{ &gEfiSimpleFileSystemProtocolGuid, "SimpleFileSystem" },
|
||||||
|
{ &gEfiSimpleTextInProtocolGuid, "SimpleTextInput" },
|
||||||
|
{ &gEfiSimpleTextInputExProtocolGuid, "SimpleTextInputEx" },
|
||||||
|
{ &gEfiSimpleTextOutProtocolGuid, "SimpleTextOutput" },
|
||||||
|
};
|
||||||
|
|
||||||
|
STATIC CHAR8 gEfiGuidName[128];
|
||||||
|
|
||||||
|
static const char * ventoy_get_guid_name(EFI_GUID *guid)
|
||||||
|
{
|
||||||
|
UINTN i;
|
||||||
|
|
||||||
|
for (i = 0; i < ARRAY_SIZE(g_efi_well_known_guids); i++)
|
||||||
|
{
|
||||||
|
if (CompareGuid(g_efi_well_known_guids[i].guid, guid))
|
||||||
|
{
|
||||||
|
return g_efi_well_known_guids[i].name;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
AsciiSPrint(gEfiGuidName, sizeof(gEfiGuidName), "%g", guid);
|
||||||
|
return gEfiGuidName;
|
||||||
|
}
|
||||||
|
|
||||||
|
EFI_STATUS EFIAPI
|
||||||
|
ventoy_wrapper_fs_open(EFI_FILE_HANDLE This, EFI_FILE_HANDLE *New, CHAR16 *Name, UINT64 Mode, UINT64 Attributes)
|
||||||
|
{
|
||||||
|
(VOID)This;
|
||||||
|
(VOID)New;
|
||||||
|
(VOID)Name;
|
||||||
|
(VOID)Mode;
|
||||||
|
(VOID)Attributes;
|
||||||
|
return EFI_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
EFI_STATUS EFIAPI
|
||||||
|
ventoy_wrapper_file_open_ex(EFI_FILE_HANDLE This, EFI_FILE_HANDLE *New, CHAR16 *Name, UINT64 Mode, UINT64 Attributes, EFI_FILE_IO_TOKEN *Token)
|
||||||
|
{
|
||||||
|
return ventoy_wrapper_fs_open(This, New, Name, Mode, Attributes);
|
||||||
|
}
|
||||||
|
|
||||||
|
EFI_STATUS EFIAPI
|
||||||
|
ventoy_wrapper_file_delete(EFI_FILE_HANDLE This)
|
||||||
|
{
|
||||||
|
(VOID)This;
|
||||||
|
return EFI_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
EFI_STATUS EFIAPI
|
||||||
|
ventoy_wrapper_file_set_info(EFI_FILE_HANDLE This, EFI_GUID *Type, UINTN Len, VOID *Data)
|
||||||
|
{
|
||||||
|
return EFI_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
EFI_STATUS EFIAPI
|
||||||
|
ventoy_wrapper_file_flush(EFI_FILE_HANDLE This)
|
||||||
|
{
|
||||||
|
(VOID)This;
|
||||||
|
return EFI_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Ex version */
|
||||||
|
EFI_STATUS EFIAPI
|
||||||
|
ventoy_wrapper_file_flush_ex(EFI_FILE_HANDLE This, EFI_FILE_IO_TOKEN *Token)
|
||||||
|
{
|
||||||
|
(VOID)This;
|
||||||
|
(VOID)Token;
|
||||||
|
return EFI_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
EFI_STATUS EFIAPI
|
||||||
|
ventoy_wrapper_file_write(EFI_FILE_HANDLE This, UINTN *Len, VOID *Data)
|
||||||
|
{
|
||||||
|
(VOID)This;
|
||||||
|
(VOID)Len;
|
||||||
|
(VOID)Data;
|
||||||
|
|
||||||
|
return EFI_WRITE_PROTECTED;
|
||||||
|
}
|
||||||
|
|
||||||
|
EFI_STATUS EFIAPI
|
||||||
|
ventoy_wrapper_file_write_ex(IN EFI_FILE_PROTOCOL *This, IN OUT EFI_FILE_IO_TOKEN *Token)
|
||||||
|
{
|
||||||
|
return ventoy_wrapper_file_write(This, &(Token->BufferSize), Token->Buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static EFI_STATUS EFIAPI
|
||||||
|
ventoy_wrapper_file_close(EFI_FILE_HANDLE This)
|
||||||
|
{
|
||||||
|
(VOID)This;
|
||||||
|
return EFI_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static EFI_STATUS EFIAPI
|
||||||
|
ventoy_wrapper_file_set_pos(EFI_FILE_HANDLE This, UINT64 Position)
|
||||||
|
{
|
||||||
|
(VOID)This;
|
||||||
|
|
||||||
|
g_efi_file_replace.CurPos = Position;
|
||||||
|
return EFI_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
static EFI_STATUS EFIAPI
|
||||||
|
ventoy_wrapper_file_get_pos(EFI_FILE_HANDLE This, UINT64 *Position)
|
||||||
|
{
|
||||||
|
(VOID)This;
|
||||||
|
|
||||||
|
*Position = g_efi_file_replace.CurPos;
|
||||||
|
|
||||||
|
return EFI_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static EFI_STATUS EFIAPI
|
||||||
|
ventoy_wrapper_file_get_info(EFI_FILE_HANDLE This, EFI_GUID *Type, UINTN *Len, VOID *Data)
|
||||||
|
{
|
||||||
|
EFI_FILE_INFO *Info = (EFI_FILE_INFO *) Data;
|
||||||
|
|
||||||
|
debug("ventoy_wrapper_file_get_info ... %u", *Len);
|
||||||
|
|
||||||
|
if (!CompareGuid(Type, &gEfiFileInfoGuid))
|
||||||
|
{
|
||||||
|
return EFI_INVALID_PARAMETER;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (*Len == 0)
|
||||||
|
{
|
||||||
|
*Len = 384;
|
||||||
|
return EFI_BUFFER_TOO_SMALL;
|
||||||
|
}
|
||||||
|
|
||||||
|
ZeroMem(Data, sizeof(EFI_FILE_INFO));
|
||||||
|
|
||||||
|
Info->Size = sizeof(EFI_FILE_INFO);
|
||||||
|
Info->FileSize = g_efi_file_replace.FileSizeBytes;
|
||||||
|
Info->PhysicalSize = g_efi_file_replace.FileSizeBytes;
|
||||||
|
Info->Attribute = EFI_FILE_READ_ONLY;
|
||||||
|
//Info->FileName = EFI_FILE_READ_ONLY;
|
||||||
|
|
||||||
|
*Len = Info->Size;
|
||||||
|
|
||||||
|
return EFI_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
static EFI_STATUS EFIAPI
|
||||||
|
ventoy_wrapper_file_read(EFI_FILE_HANDLE This, UINTN *Len, VOID *Data)
|
||||||
|
{
|
||||||
|
EFI_LBA Lba;
|
||||||
|
UINTN ReadLen = *Len;
|
||||||
|
|
||||||
|
(VOID)This;
|
||||||
|
|
||||||
|
debug("ventoy_wrapper_file_read ... %u", *Len);
|
||||||
|
|
||||||
|
if (g_efi_file_replace.CurPos + ReadLen > g_efi_file_replace.FileSizeBytes)
|
||||||
|
{
|
||||||
|
ReadLen = g_efi_file_replace.FileSizeBytes - g_efi_file_replace.CurPos;
|
||||||
|
}
|
||||||
|
|
||||||
|
Lba = g_efi_file_replace.CurPos / 2048 + g_efi_file_replace.BlockIoSectorStart;
|
||||||
|
|
||||||
|
ventoy_block_io_read(NULL, 0, Lba, ReadLen, Data);
|
||||||
|
|
||||||
|
*Len = ReadLen;
|
||||||
|
|
||||||
|
g_efi_file_replace.CurPos += ReadLen;
|
||||||
|
|
||||||
|
return EFI_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
EFI_STATUS EFIAPI
|
||||||
|
ventoy_wrapper_file_read_ex(IN EFI_FILE_PROTOCOL *This, IN OUT EFI_FILE_IO_TOKEN *Token)
|
||||||
|
{
|
||||||
|
return ventoy_wrapper_file_read(This, &(Token->BufferSize), Token->Buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
EFI_STATUS EFIAPI ventoy_wrapper_file_procotol(EFI_FILE_PROTOCOL *File)
|
||||||
|
{
|
||||||
|
File->Revision = EFI_FILE_PROTOCOL_REVISION2;
|
||||||
|
File->Open = ventoy_wrapper_fs_open;
|
||||||
|
File->Close = ventoy_wrapper_file_close;
|
||||||
|
File->Delete = ventoy_wrapper_file_delete;
|
||||||
|
File->Read = ventoy_wrapper_file_read;
|
||||||
|
File->Write = ventoy_wrapper_file_write;
|
||||||
|
File->GetPosition = ventoy_wrapper_file_get_pos;
|
||||||
|
File->SetPosition = ventoy_wrapper_file_set_pos;
|
||||||
|
File->GetInfo = ventoy_wrapper_file_get_info;
|
||||||
|
File->SetInfo = ventoy_wrapper_file_set_info;
|
||||||
|
File->Flush = ventoy_wrapper_file_flush;
|
||||||
|
File->OpenEx = ventoy_wrapper_file_open_ex;
|
||||||
|
File->ReadEx = ventoy_wrapper_file_read_ex;
|
||||||
|
File->WriteEx = ventoy_wrapper_file_write_ex;
|
||||||
|
File->FlushEx = ventoy_wrapper_file_flush_ex;
|
||||||
|
|
||||||
|
return EFI_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
STATIC EFI_STATUS EFIAPI ventoy_handle_protocol
|
||||||
|
(
|
||||||
|
IN EFI_HANDLE Handle,
|
||||||
|
IN EFI_GUID *Protocol,
|
||||||
|
OUT VOID **Interface
|
||||||
|
)
|
||||||
|
{
|
||||||
|
EFI_STATUS Status = EFI_SUCCESS;
|
||||||
|
|
||||||
|
debug("ventoy_handle_protocol:%a", ventoy_get_guid_name(Protocol));
|
||||||
|
Status = g_system_wrapper.OriHandleProtocol(Handle, Protocol, Interface);
|
||||||
|
|
||||||
|
if (CompareGuid(Protocol, &gEfiSimpleFileSystemProtocolGuid))
|
||||||
|
{
|
||||||
|
EFI_FILE_PROTOCOL *FileProtocol = NULL;
|
||||||
|
EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *pFile = *((EFI_SIMPLE_FILE_SYSTEM_PROTOCOL **)(Interface));
|
||||||
|
|
||||||
|
pFile->OpenVolume(pFile, &FileProtocol);
|
||||||
|
|
||||||
|
debug("Handle FS Protocol: %p OpenVolume:%p, FileProtocol:%p, Open:%p",
|
||||||
|
pFile, pFile->OpenVolume, FileProtocol, FileProtocol->Open);
|
||||||
|
|
||||||
|
sleep(3);
|
||||||
|
}
|
||||||
|
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
STATIC EFI_STATUS EFIAPI ventoy_open_protocol
|
||||||
|
(
|
||||||
|
IN EFI_HANDLE Handle,
|
||||||
|
IN EFI_GUID *Protocol,
|
||||||
|
OUT VOID **Interface, OPTIONAL
|
||||||
|
IN EFI_HANDLE AgentHandle,
|
||||||
|
IN EFI_HANDLE ControllerHandle,
|
||||||
|
IN UINT32 Attributes
|
||||||
|
)
|
||||||
|
{
|
||||||
|
debug("ventoy_open_protocol:%a", ventoy_get_guid_name(Protocol));
|
||||||
|
return g_system_wrapper.OriOpenProtocol(Handle, Protocol, Interface, AgentHandle, ControllerHandle, Attributes);
|
||||||
|
}
|
||||||
|
|
||||||
|
STATIC EFI_STATUS EFIAPI ventoy_locate_protocol
|
||||||
|
(
|
||||||
|
IN EFI_GUID *Protocol,
|
||||||
|
IN VOID *Registration, OPTIONAL
|
||||||
|
OUT VOID **Interface
|
||||||
|
)
|
||||||
|
{
|
||||||
|
debug("ventoy_locate_protocol:%a", ventoy_get_guid_name(Protocol));
|
||||||
|
return g_system_wrapper.OriLocateProtocol(Protocol, Registration, Interface);
|
||||||
|
}
|
||||||
|
|
||||||
|
EFI_STATUS EFIAPI ventoy_wrapper_system(VOID)
|
||||||
|
{
|
||||||
|
ventoy_wrapper(gBS, g_system_wrapper, LocateProtocol, ventoy_locate_protocol);
|
||||||
|
ventoy_wrapper(gBS, g_system_wrapper, HandleProtocol, ventoy_handle_protocol);
|
||||||
|
ventoy_wrapper(gBS, g_system_wrapper, OpenProtocol, ventoy_open_protocol);
|
||||||
|
|
||||||
|
return EFI_SUCCESS;
|
||||||
|
}
|
||||||
|
|
|
@ -558,7 +558,7 @@ grub_fat_read_data (grub_disk_t disk, grub_fshelp_node_t node,
|
||||||
if (next_cluster >= node->data->cluster_eof_mark)
|
if (next_cluster >= node->data->cluster_eof_mark)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
if (next_cluster < 2 || next_cluster >= node->data->num_clusters)
|
if (next_cluster < 2 || (next_cluster - 2) >= node->data->num_clusters)
|
||||||
{
|
{
|
||||||
grub_error (GRUB_ERR_BAD_FS, "invalid cluster %u",
|
grub_error (GRUB_ERR_BAD_FS, "invalid cluster %u",
|
||||||
next_cluster);
|
next_cluster);
|
||||||
|
@ -1409,7 +1409,7 @@ int grub_fat_get_file_chunk(grub_uint64_t part_start, grub_file_t file, ventoy_i
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (next_cluster < 2 || next_cluster >= node->data->num_clusters)
|
if (next_cluster < 2 || (next_cluster - 2) >= node->data->num_clusters)
|
||||||
{
|
{
|
||||||
grub_error (GRUB_ERR_BAD_FS, "invalid cluster %u", next_cluster);
|
grub_error (GRUB_ERR_BAD_FS, "invalid cluster %u", next_cluster);
|
||||||
return -1;
|
return -1;
|
||||||
|
|
|
@ -65,7 +65,7 @@ grub_uint32_t g_ventoy_cpio_size = 0;
|
||||||
cpio_newc_header *g_ventoy_initrd_head = NULL;
|
cpio_newc_header *g_ventoy_initrd_head = NULL;
|
||||||
grub_uint8_t *g_ventoy_runtime_buf = NULL;
|
grub_uint8_t *g_ventoy_runtime_buf = NULL;
|
||||||
|
|
||||||
ventoy_grub_param g_grub_param;
|
ventoy_grub_param *g_grub_param = NULL;
|
||||||
|
|
||||||
ventoy_guid g_ventoy_guid = VENTOY_GUID;
|
ventoy_guid g_ventoy_guid = VENTOY_GUID;
|
||||||
|
|
||||||
|
@ -1085,6 +1085,8 @@ static grub_err_t ventoy_cmd_img_sector(grub_extcmd_context_t ctxt, int argc, ch
|
||||||
|
|
||||||
grub_file_close(file);
|
grub_file_close(file);
|
||||||
|
|
||||||
|
grub_memset(&g_grub_param->file_replace, 0, sizeof(g_grub_param->file_replace));
|
||||||
|
|
||||||
VENTOY_CMD_RETURN(GRUB_ERR_NONE);
|
VENTOY_CMD_RETURN(GRUB_ERR_NONE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1109,6 +1111,33 @@ static grub_err_t ventoy_cmd_dump_img_sector(grub_extcmd_context_t ctxt, int arg
|
||||||
VENTOY_CMD_RETURN(GRUB_ERR_NONE);
|
VENTOY_CMD_RETURN(GRUB_ERR_NONE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static grub_err_t ventoy_cmd_add_replace_file(grub_extcmd_context_t ctxt, int argc, char **args)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
ventoy_grub_param_file_replace *replace = NULL;
|
||||||
|
|
||||||
|
(void)ctxt;
|
||||||
|
(void)argc;
|
||||||
|
(void)args;
|
||||||
|
|
||||||
|
if (argc >= 2)
|
||||||
|
{
|
||||||
|
replace = &(g_grub_param->file_replace);
|
||||||
|
replace->magic = GRUB_FILE_REPLACE_MAGIC;
|
||||||
|
|
||||||
|
replace->old_name_cnt = 0;
|
||||||
|
for (i = 0; i < 4 && i + 1 < argc; i++)
|
||||||
|
{
|
||||||
|
replace->old_name_cnt++;
|
||||||
|
grub_snprintf(replace->old_file_name[i], sizeof(replace->old_file_name[i]), "%s", args[i + 1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
replace->new_file_virtual_id = (grub_uint32_t)grub_strtoul(args[0], NULL, 10);
|
||||||
|
}
|
||||||
|
|
||||||
|
VENTOY_CMD_RETURN(GRUB_ERR_NONE);
|
||||||
|
}
|
||||||
|
|
||||||
grub_file_t ventoy_grub_file_open(enum grub_file_type type, const char *fmt, ...)
|
grub_file_t ventoy_grub_file_open(enum grub_file_type type, const char *fmt, ...)
|
||||||
{
|
{
|
||||||
va_list ap;
|
va_list ap;
|
||||||
|
@ -1162,10 +1191,14 @@ static int ventoy_env_init(void)
|
||||||
grub_env_set("vtdebug_flag", "");
|
grub_env_set("vtdebug_flag", "");
|
||||||
|
|
||||||
ventoy_filt_register(0, ventoy_wrapper_open);
|
ventoy_filt_register(0, ventoy_wrapper_open);
|
||||||
|
|
||||||
g_grub_param.grub_env_get = grub_env_get;
|
g_grub_param = (ventoy_grub_param *)grub_zalloc(sizeof(ventoy_grub_param));
|
||||||
grub_snprintf(buf, sizeof(buf), "%p", &g_grub_param);
|
if (g_grub_param)
|
||||||
grub_env_set("env_param", buf);
|
{
|
||||||
|
g_grub_param->grub_env_get = grub_env_get;
|
||||||
|
grub_snprintf(buf, sizeof(buf), "%p", g_grub_param);
|
||||||
|
grub_env_set("env_param", buf);
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -1204,6 +1237,9 @@ static cmd_para ventoy_cmds[] =
|
||||||
{ "vt_windows_reset", ventoy_cmd_wimdows_reset, 0, NULL, "", "", NULL },
|
{ "vt_windows_reset", ventoy_cmd_wimdows_reset, 0, NULL, "", "", NULL },
|
||||||
{ "vt_windows_locate_wim", ventoy_cmd_wimdows_locate_wim, 0, NULL, "", "", NULL },
|
{ "vt_windows_locate_wim", ventoy_cmd_wimdows_locate_wim, 0, NULL, "", "", NULL },
|
||||||
{ "vt_windows_chain_data", ventoy_cmd_windows_chain_data, 0, NULL, "", "", NULL },
|
{ "vt_windows_chain_data", ventoy_cmd_windows_chain_data, 0, NULL, "", "", NULL },
|
||||||
|
|
||||||
|
{ "vt_add_replace_file", ventoy_cmd_add_replace_file, 0, NULL, "", "", NULL },
|
||||||
|
|
||||||
|
|
||||||
{ "vt_load_plugin", ventoy_cmd_load_plugin, 0, NULL, "", "", NULL },
|
{ "vt_load_plugin", ventoy_cmd_load_plugin, 0, NULL, "", "", NULL },
|
||||||
};
|
};
|
||||||
|
|
|
@ -183,9 +183,22 @@ typedef struct ventoy_img_chunk_list
|
||||||
typedef const char * (*grub_env_get_pf)(const char *name);
|
typedef const char * (*grub_env_get_pf)(const char *name);
|
||||||
|
|
||||||
#pragma pack(1)
|
#pragma pack(1)
|
||||||
|
|
||||||
|
#define GRUB_FILE_REPLACE_MAGIC 0x1258BEEF
|
||||||
|
|
||||||
|
typedef struct ventoy_grub_param_file_replace
|
||||||
|
{
|
||||||
|
grub_uint32_t magic;
|
||||||
|
char old_file_name[4][256];
|
||||||
|
grub_uint32_t old_name_cnt;
|
||||||
|
grub_uint32_t new_file_virtual_id;
|
||||||
|
}ventoy_grub_param_file_replace;
|
||||||
|
|
||||||
typedef struct ventoy_grub_param
|
typedef struct ventoy_grub_param
|
||||||
{
|
{
|
||||||
grub_env_get_pf grub_env_get;
|
grub_env_get_pf grub_env_get;
|
||||||
|
|
||||||
|
ventoy_grub_param_file_replace file_replace;
|
||||||
}ventoy_grub_param;
|
}ventoy_grub_param;
|
||||||
|
|
||||||
#pragma pack()
|
#pragma pack()
|
||||||
|
|
|
@ -0,0 +1,46 @@
|
||||||
|
#!/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
|
||||||
|
|
||||||
|
if is_ventoy_hook_finished || not_ventoy_disk "${1:0:-1}"; then
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
ventoy_udev_disk_common_hook $* "noreplace"
|
||||||
|
|
||||||
|
if ! [ -e $VTOY_DM_PATH ]; then
|
||||||
|
blkdev_num=$($VTOY_PATH/tool/dmsetup ls | grep ventoy | sed 's/.*(\([0-9][0-9]*\),.*\([0-9][0-9]*\).*/\1 \2/')
|
||||||
|
mknod -m 0666 $VTOY_DM_PATH b $blkdev_num
|
||||||
|
fi
|
||||||
|
|
||||||
|
#
|
||||||
|
# We do a trick for ATL series here.
|
||||||
|
# Use /dev/loop7 and wapper it as a cdrom with bind mount.
|
||||||
|
# Then the installer will accept /dev/loop7 as the install medium.
|
||||||
|
#
|
||||||
|
ventoy_copy_device_mapper /dev/loop7
|
||||||
|
$BUSYBOX_PATH/mkdir -p /tmp/loop7/device/
|
||||||
|
echo 5 > /tmp/loop7/device/type
|
||||||
|
$BUSYBOX_PATH/mount --bind /tmp/loop7 /sys/block/loop7 >> $VTLOG 2>&1
|
||||||
|
|
||||||
|
|
||||||
|
# OK finish
|
||||||
|
set_ventoy_hook_finish
|
||||||
|
|
|
@ -0,0 +1,24 @@
|
||||||
|
#!/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/>.
|
||||||
|
#
|
||||||
|
#************************************************************************************
|
||||||
|
|
||||||
|
. $VTOY_PATH/hook/ventoy-os-lib.sh
|
||||||
|
|
||||||
|
ventoy_systemd_udevd_work_around
|
||||||
|
|
||||||
|
ventoy_add_udev_rule "$VTOY_PATH/hook/alt/udev_disk_hook.sh %k"
|
|
@ -0,0 +1,43 @@
|
||||||
|
#!/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
|
||||||
|
|
||||||
|
if is_ventoy_hook_finished; then
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
vtlog "####### $0 $* ########"
|
||||||
|
|
||||||
|
VTPATH_OLD=$PATH; PATH=$BUSYBOX_PATH:$VTOY_PATH/tool:$PATH
|
||||||
|
|
||||||
|
wait_for_usb_disk_ready
|
||||||
|
|
||||||
|
vtdiskname=$(get_ventoy_disk_name)
|
||||||
|
if [ "$vtdiskname" = "unknown" ]; then
|
||||||
|
vtlog "ventoy disk not found"
|
||||||
|
PATH=$VTPATH_OLD
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
ventoy_udev_disk_common_hook "${vtdiskname#/dev/}2" "noreplace"
|
||||||
|
|
||||||
|
PATH=$VTPATH_OLD
|
||||||
|
|
||||||
|
set_ventoy_hook_finish
|
|
@ -0,0 +1,22 @@
|
||||||
|
#!/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/>.
|
||||||
|
#
|
||||||
|
#************************************************************************************
|
||||||
|
|
||||||
|
. $VTOY_PATH/hook/ventoy-os-lib.sh
|
||||||
|
|
||||||
|
$SED "/find_and_mount_installer *$/i\ $BUSYBOX_PATH/sh $VTOY_PATH/hook/clear/disk-hook.sh" -i /init
|
|
@ -0,0 +1,47 @@
|
||||||
|
#!/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
|
||||||
|
|
||||||
|
vtmountpoint=$1
|
||||||
|
|
||||||
|
if is_ventoy_hook_finished; then
|
||||||
|
PATH=$VTPATH_OLD
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
wait_for_usb_disk_ready
|
||||||
|
|
||||||
|
vtdiskname=$(get_ventoy_disk_name)
|
||||||
|
if [ "$vtdiskname" = "unknown" ]; then
|
||||||
|
vtlog "ventoy disk not found"
|
||||||
|
PATH=$VTPATH_OLD
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
ventoy_udev_disk_common_hook "${vtdiskname#/dev/}2"
|
||||||
|
|
||||||
|
$BUSYBOX_PATH/mount -t iso9660 $VTOY_DM_PATH $vtmountpoint
|
||||||
|
|
||||||
|
# OK finish
|
||||||
|
set_ventoy_hook_finish
|
|
@ -0,0 +1,47 @@
|
||||||
|
#!/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/>.
|
||||||
|
#
|
||||||
|
#************************************************************************************
|
||||||
|
|
||||||
|
drop_initramfs_workaround() {
|
||||||
|
mainfilelist=$($FIND / -name 9990-main.sh)
|
||||||
|
|
||||||
|
echo "mainfilelist=$mainfilelist" >> $VTLOG
|
||||||
|
|
||||||
|
if [ -z "$mainfilelist" ]; then
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
for vtfile in $mainfilelist; do
|
||||||
|
vtcnt=$($GREP -c 'panic.*Unable to find a medium' $vtfile)
|
||||||
|
if [ $vtcnt -ne 1 ]; then
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "direct_hook insert ..." >> $VTLOG
|
||||||
|
|
||||||
|
for vtfile in $mainfilelist; do
|
||||||
|
$SED "s#panic.*Unable to find a medium.*#$BUSYBOX_PATH/sh $VTOY_PATH/hook/debian/deepin-disk.sh \$mountpoint; livefs_root=\$mountpoint#" -i $vtfile
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
ventoy_systemd_udevd_work_around
|
||||||
|
ventoy_add_udev_rule "$VTOY_PATH/hook/debian/udev_disk_hook.sh %k"
|
||||||
|
|
||||||
|
drop_initramfs_workaround
|
||||||
|
|
|
@ -0,0 +1,43 @@
|
||||||
|
#!/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
|
||||||
|
|
||||||
|
wait_for_usb_disk_ready
|
||||||
|
|
||||||
|
vtdiskname=$(get_ventoy_disk_name)
|
||||||
|
if [ "$vtdiskname" = "unknown" ]; then
|
||||||
|
vtlog "ventoy disk not found"
|
||||||
|
PATH=$VTPATH_OLD
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
ventoy_udev_disk_common_hook "${vtdiskname#/dev/}2" "noreplace"
|
||||||
|
|
||||||
|
if ! [ -e $VTOY_DM_PATH ]; then
|
||||||
|
blkdev_num=$($VTOY_PATH/tool/dmsetup ls | grep ventoy | sed 's/.*(\([0-9][0-9]*\),.*\([0-9][0-9]*\).*/\1 \2/')
|
||||||
|
mknod -m 0666 $VTOY_DM_PATH b $blkdev_num
|
||||||
|
fi
|
||||||
|
|
||||||
|
PATH=$VTPATH_OLD
|
||||||
|
|
|
@ -0,0 +1,23 @@
|
||||||
|
#!/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/>.
|
||||||
|
#
|
||||||
|
#************************************************************************************
|
||||||
|
|
||||||
|
$SED '/^findknoppix/a\ return 0' -i /init
|
||||||
|
$SED '/^findknoppix/a\ trymount $ROOTDEV /mnt-system >/dev/null 2>&1' -i /init
|
||||||
|
$SED '/^findknoppix/a\ ROOTDEV=/dev/mapper/ventoy' -i /init
|
||||||
|
$SED "/^findknoppix/a\ $BUSYBOX_PATH/sh $VTOY_PATH/hook/debian/knoppix-disk.sh" -i /init
|
|
@ -0,0 +1,77 @@
|
||||||
|
#!/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
|
||||||
|
|
||||||
|
|
||||||
|
ventoy_os_install_dmsetup_by_fuse() {
|
||||||
|
vtlog "ventoy_os_install_dmsetup_by_fuse $*"
|
||||||
|
|
||||||
|
mkdir -p $VTOY_PATH/mnt/fuse $VTOY_PATH/mnt/iso $VTOY_PATH/mnt/squashfs
|
||||||
|
|
||||||
|
vtoydm -p -f $VTOY_PATH/ventoy_image_map -d $1 > $VTOY_PATH/ventoy_dm_table
|
||||||
|
vtoy_fuse_iso -f $VTOY_PATH/ventoy_dm_table -m $VTOY_PATH/mnt/fuse
|
||||||
|
|
||||||
|
mount -t iso9660 $VTOY_PATH/mnt/fuse/ventoy.iso $VTOY_PATH/mnt/iso
|
||||||
|
|
||||||
|
sfsfile=$(ls $VTOY_PATH/mnt/iso/porteus/base/*kernel.xzm)
|
||||||
|
|
||||||
|
mount -t squashfs $sfsfile $VTOY_PATH/mnt/squashfs
|
||||||
|
|
||||||
|
KoName=$(ls $VTOY_PATH/mnt/squashfs/lib/modules/$2/kernel/drivers/md/dm-mod.ko*)
|
||||||
|
vtlog "insmod $KoName"
|
||||||
|
insmod $KoName
|
||||||
|
|
||||||
|
umount $VTOY_PATH/mnt/squashfs
|
||||||
|
umount $VTOY_PATH/mnt/iso
|
||||||
|
umount $VTOY_PATH/mnt/fuse
|
||||||
|
}
|
||||||
|
|
||||||
|
ventoy_os_install_dmsetup() {
|
||||||
|
vtlog "ventoy_os_install_dmsetup"
|
||||||
|
|
||||||
|
if grep -q 'device-mapper' /proc/devices; then
|
||||||
|
vtlog "device-mapper module already loaded"
|
||||||
|
return;
|
||||||
|
fi
|
||||||
|
|
||||||
|
vtKerVer=$(uname -r)
|
||||||
|
|
||||||
|
ventoy_os_install_dmsetup_by_fuse $1 $vtKerVer
|
||||||
|
}
|
||||||
|
|
||||||
|
wait_for_usb_disk_ready
|
||||||
|
|
||||||
|
vtdiskname=$(get_ventoy_disk_name)
|
||||||
|
if [ "$vtdiskname" = "unknown" ]; then
|
||||||
|
vtlog "ventoy disk not found"
|
||||||
|
PATH=$VTPATH_OLD
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
ventoy_os_install_dmsetup $vtdiskname
|
||||||
|
|
||||||
|
ventoy_udev_disk_common_hook "${vtdiskname#/dev/}2" "noreplace"
|
||||||
|
|
||||||
|
PATH=$VTPATH_OLD
|
||||||
|
|
|
@ -0,0 +1,48 @@
|
||||||
|
#!/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/>.
|
||||||
|
#
|
||||||
|
#************************************************************************************
|
||||||
|
|
||||||
|
porteus_hook() {
|
||||||
|
$SED "/searching *for *\$SGN *file/i\ $BUSYBOX_PATH/sh $VTOY_PATH/hook/debian/porteus-disk.sh" -i $1
|
||||||
|
$SED "/searching *for *\$CFG *file/i\ $BUSYBOX_PATH/sh $VTOY_PATH/hook/debian/porteus-disk.sh" -i $1
|
||||||
|
}
|
||||||
|
|
||||||
|
if $GREP -q exfat /proc/filesystems; then
|
||||||
|
vtPath=$($VTOY_PATH/tool/vtoydump -p $VTOY_PATH/ventoy_os_param)
|
||||||
|
|
||||||
|
$GREP '`value from`' /usr/* -r | $AWK -F: '{print $1}' | while read vtline; do
|
||||||
|
echo "hooking $vtline ..." >> $VTLOG
|
||||||
|
$SED "s#\`value from\`#$vtPath#g" -i $vtline
|
||||||
|
done
|
||||||
|
|
||||||
|
else
|
||||||
|
for vtfile in '/init' '/linuxrc' ; do
|
||||||
|
if [ -e $vtfile ]; then
|
||||||
|
if ! $GREP -q ventoy $vtfile; then
|
||||||
|
echo "hooking $vtfile ..." >> $VTLOG
|
||||||
|
porteus_hook $vtfile
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
# replace blkid in system
|
||||||
|
vtblkid=$($BUSYBOX_PATH/which blkid)
|
||||||
|
$BUSYBOX_PATH/rm -f $vtblkid
|
||||||
|
$BUSYBOX_PATH/cp -a $BUSYBOX_PATH/blkid $vtblkid
|
|
@ -0,0 +1,48 @@
|
||||||
|
#!/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
|
||||||
|
|
||||||
|
if is_ventoy_hook_finished; then
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
vtlog "####### $0 $* ########"
|
||||||
|
|
||||||
|
VTPATH_OLD=$PATH; PATH=$BUSYBOX_PATH:$VTOY_PATH/tool:$PATH
|
||||||
|
|
||||||
|
wait_for_usb_disk_ready
|
||||||
|
|
||||||
|
vtdiskname=$(get_ventoy_disk_name)
|
||||||
|
if [ "$vtdiskname" = "unknown" ]; then
|
||||||
|
vtlog "ventoy disk not found"
|
||||||
|
PATH=$VTPATH_OLD
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
ventoy_udev_disk_common_hook "${vtdiskname#/dev/}2" "noreplace"
|
||||||
|
|
||||||
|
if ! [ -e $VTOY_DM_PATH ]; then
|
||||||
|
blkdev_num=$($VTOY_PATH/tool/dmsetup ls | grep ventoy | sed 's/.*(\([0-9][0-9]*\),.*\([0-9][0-9]*\).*/\1 \2/')
|
||||||
|
mknod -m 0666 $VTOY_DM_PATH b $blkdev_num
|
||||||
|
fi
|
||||||
|
|
||||||
|
PATH=$VTPATH_OLD
|
||||||
|
|
||||||
|
set_ventoy_hook_finish
|
|
@ -0,0 +1,22 @@
|
||||||
|
#!/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/>.
|
||||||
|
#
|
||||||
|
#************************************************************************************
|
||||||
|
|
||||||
|
$SED '1 apmedia=usbhd' -i /init
|
||||||
|
$SED "/^ *HAVE_PARTS=/a\ $BUSYBOX_PATH/sh $VTOY_PATH/hook/debian/puppy-disk.sh" -i /init
|
||||||
|
$SED "/^ *HAVE_PARTS=/a\ HAVE_PARTS='mapper/ventoy|iso9660'" -i /init
|
|
@ -0,0 +1,43 @@
|
||||||
|
#!/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
|
||||||
|
|
||||||
|
if is_ventoy_hook_finished; then
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
vtlog "####### $0 $* ########"
|
||||||
|
|
||||||
|
VTPATH_OLD=$PATH; PATH=$BUSYBOX_PATH:$VTOY_PATH/tool:$PATH
|
||||||
|
|
||||||
|
wait_for_usb_disk_ready
|
||||||
|
|
||||||
|
vtdiskname=$(get_ventoy_disk_name)
|
||||||
|
if [ "$vtdiskname" = "unknown" ]; then
|
||||||
|
vtlog "ventoy disk not found"
|
||||||
|
PATH=$VTPATH_OLD
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
ventoy_udev_disk_common_hook "${vtdiskname#/dev/}2" "noreplace"
|
||||||
|
|
||||||
|
PATH=$VTPATH_OLD
|
||||||
|
|
||||||
|
set_ventoy_hook_finish
|
|
@ -0,0 +1,21 @@
|
||||||
|
#!/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/>.
|
||||||
|
#
|
||||||
|
#************************************************************************************
|
||||||
|
|
||||||
|
$SED "/\/sys\/block\/hd\*/i\ $BUSYBOX_PATH/sh $VTOY_PATH/hook/debian/pve-disk.sh" -i /init
|
||||||
|
$SED "s#/sys/block/hd\*#/sys/block/dm* /sys/block/hd*#" -i /init
|
|
@ -0,0 +1,77 @@
|
||||||
|
#!/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
|
||||||
|
|
||||||
|
|
||||||
|
ventoy_os_install_dmsetup_by_fuse() {
|
||||||
|
vtlog "ventoy_os_install_dmsetup_by_fuse $*"
|
||||||
|
|
||||||
|
mkdir -p $VTOY_PATH/mnt/fuse $VTOY_PATH/mnt/iso $VTOY_PATH/mnt/squashfs
|
||||||
|
|
||||||
|
vtoydm -p -f $VTOY_PATH/ventoy_image_map -d $1 > $VTOY_PATH/ventoy_dm_table
|
||||||
|
vtoy_fuse_iso -f $VTOY_PATH/ventoy_dm_table -m $VTOY_PATH/mnt/fuse
|
||||||
|
|
||||||
|
mount -t iso9660 $VTOY_PATH/mnt/fuse/ventoy.iso $VTOY_PATH/mnt/iso
|
||||||
|
mount -t squashfs $VTOY_PATH/mnt/iso/slax/01-core.sb $VTOY_PATH/mnt/squashfs
|
||||||
|
|
||||||
|
KoName=$(ls $VTOY_PATH/mnt/squashfs/lib/modules/$2/kernel/drivers/md/dm-mod.ko*)
|
||||||
|
vtlog "insmod $KoName"
|
||||||
|
insmod $KoName
|
||||||
|
|
||||||
|
umount $VTOY_PATH/mnt/squashfs
|
||||||
|
umount $VTOY_PATH/mnt/iso
|
||||||
|
umount $VTOY_PATH/mnt/fuse
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
ventoy_os_install_dmsetup() {
|
||||||
|
vtlog "ventoy_os_install_dmsetup"
|
||||||
|
|
||||||
|
if grep -q 'device-mapper' /proc/devices; then
|
||||||
|
vtlog "device-mapper module already loaded"
|
||||||
|
return;
|
||||||
|
fi
|
||||||
|
|
||||||
|
vtKerVer=$(uname -r)
|
||||||
|
|
||||||
|
if modprobe fuse 2>>$VTLOG; then
|
||||||
|
ventoy_os_install_dmsetup_by_fuse $1 $vtKerVer
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
wait_for_usb_disk_ready
|
||||||
|
|
||||||
|
vtdiskname=$(get_ventoy_disk_name)
|
||||||
|
if [ "$vtdiskname" = "unknown" ]; then
|
||||||
|
vtlog "ventoy disk not found"
|
||||||
|
PATH=$VTPATH_OLD
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
ventoy_os_install_dmsetup $vtdiskname
|
||||||
|
|
||||||
|
ventoy_udev_disk_common_hook "${vtdiskname#/dev/}2" "noreplace"
|
||||||
|
|
||||||
|
PATH=$VTPATH_OLD
|
||||||
|
|
|
@ -0,0 +1,20 @@
|
||||||
|
#!/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/>.
|
||||||
|
#
|
||||||
|
#************************************************************************************
|
||||||
|
|
||||||
|
$SED "/find_data/i\ $BUSYBOX_PATH/sh $VTOY_PATH/hook/debian/slax-disk.sh" -i /init
|
|
@ -0,0 +1,24 @@
|
||||||
|
#!/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/>.
|
||||||
|
#
|
||||||
|
#************************************************************************************
|
||||||
|
|
||||||
|
$SED "s#.*livefs_root=.*find_livefs.*#$BUSYBOX_PATH/mount -t iso9660 /dev/mapper/ventoy \$mountpoint; livefs_root=\$mountpoint#" -i /usr/lib/live/boot/9990-main.sh
|
||||||
|
$SED "s#.*livefs_root=.*find_livefs.*#$BUSYBOX_PATH/mount -t iso9660 /dev/mapper/ventoy \$mountpoint; livefs_root=\$mountpoint#" -i /usr/bin/boot/9990-main.sh
|
||||||
|
|
||||||
|
ventoy_systemd_udevd_work_around
|
||||||
|
ventoy_add_udev_rule "$VTOY_PATH/hook/debian/udev_disk_hook.sh %k"
|
|
@ -0,0 +1,88 @@
|
||||||
|
#!/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
|
||||||
|
|
||||||
|
if is_ventoy_hook_finished; then
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
vtlog "####### $0 $* ########"
|
||||||
|
|
||||||
|
VTPATH_OLD=$PATH; PATH=$BUSYBOX_PATH:$VTOY_PATH/tool:$PATH
|
||||||
|
|
||||||
|
ventoy_os_install_dmsetup_by_fuse() {
|
||||||
|
vtlog "ventoy_os_install_dmsetup_by_fuse $*"
|
||||||
|
|
||||||
|
mkdir -p $VTOY_PATH/mnt/fuse $VTOY_PATH/mnt/iso $VTOY_PATH/mnt/squashfs
|
||||||
|
|
||||||
|
vtoydm -p -f $VTOY_PATH/ventoy_image_map -d $1 > $VTOY_PATH/ventoy_dm_table
|
||||||
|
vtoy_fuse_iso -f $VTOY_PATH/ventoy_dm_table -m $VTOY_PATH/mnt/fuse
|
||||||
|
|
||||||
|
mount -t iso9660 $VTOY_PATH/mnt/fuse/ventoy.iso $VTOY_PATH/mnt/iso
|
||||||
|
|
||||||
|
sfsfile=$(ls $VTOY_PATH/mnt/iso/adrv_veket*.sfs)
|
||||||
|
|
||||||
|
mount -t squashfs $sfsfile $VTOY_PATH/mnt/squashfs
|
||||||
|
|
||||||
|
KoName=$(ls $VTOY_PATH/mnt/squashfs/lib/modules/$2/kernel/drivers/dax/dax.ko*)
|
||||||
|
vtlog "insmod $KoName"
|
||||||
|
insmod $KoName
|
||||||
|
|
||||||
|
KoName=$(ls $VTOY_PATH/mnt/squashfs/lib/modules/$2/kernel/drivers/md/dm-mod.ko*)
|
||||||
|
vtlog "insmod $KoName"
|
||||||
|
insmod $KoName
|
||||||
|
|
||||||
|
umount $VTOY_PATH/mnt/squashfs
|
||||||
|
umount $VTOY_PATH/mnt/iso
|
||||||
|
umount $VTOY_PATH/mnt/fuse
|
||||||
|
}
|
||||||
|
|
||||||
|
ventoy_os_install_dmsetup() {
|
||||||
|
vtlog "ventoy_os_install_dmsetup"
|
||||||
|
|
||||||
|
if grep -q 'device-mapper' /proc/devices; then
|
||||||
|
vtlog "device-mapper module already loaded"
|
||||||
|
return;
|
||||||
|
fi
|
||||||
|
|
||||||
|
vtKerVer=$(uname -r)
|
||||||
|
|
||||||
|
ventoy_os_install_dmsetup_by_fuse $1 $vtKerVer
|
||||||
|
}
|
||||||
|
|
||||||
|
wait_for_usb_disk_ready
|
||||||
|
|
||||||
|
vtdiskname=$(get_ventoy_disk_name)
|
||||||
|
if [ "$vtdiskname" = "unknown" ]; then
|
||||||
|
vtlog "ventoy disk not found"
|
||||||
|
PATH=$VTPATH_OLD
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
ventoy_os_install_dmsetup $vtdiskname
|
||||||
|
|
||||||
|
ventoy_udev_disk_common_hook "${vtdiskname#/dev/}2" "noreplace"
|
||||||
|
|
||||||
|
blkdev_num=$($VTOY_PATH/tool/dmsetup ls | grep ventoy | sed 's/.*(\([0-9][0-9]*\),.*\([0-9][0-9]*\).*/\1 \2/')
|
||||||
|
mknod -m 0666 /dev/ventoy b $blkdev_num
|
||||||
|
|
||||||
|
PATH=$VTPATH_OLD
|
||||||
|
|
||||||
|
set_ventoy_hook_finish
|
|
@ -0,0 +1,22 @@
|
||||||
|
#!/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/>.
|
||||||
|
#
|
||||||
|
#************************************************************************************
|
||||||
|
|
||||||
|
$SED '1 apmedia=usbhd' -i /init
|
||||||
|
$SED "/^ *HAVE_PARTS=/a\ $BUSYBOX_PATH/sh $VTOY_PATH/hook/debian/veket-disk.sh" -i /init
|
||||||
|
$SED "/^ *HAVE_PARTS=/a\ HAVE_PARTS='ventoy|iso9660'" -i /init
|
|
@ -64,6 +64,8 @@ ventoy_os_install_device_mapper() {
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
wait_for_usb_disk_ready
|
||||||
|
|
||||||
vtdiskname=$(get_ventoy_disk_name)
|
vtdiskname=$(get_ventoy_disk_name)
|
||||||
ventoy_os_install_device_mapper $vtdiskname
|
ventoy_os_install_device_mapper $vtdiskname
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,44 @@
|
||||||
|
#!/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
|
||||||
|
|
||||||
|
if is_ventoy_hook_finished; then
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
vtlog "####### $0 $* ########"
|
||||||
|
|
||||||
|
VTPATH_OLD=$PATH; PATH=$BUSYBOX_PATH:$VTOY_PATH/tool:$PATH
|
||||||
|
|
||||||
|
wait_for_usb_disk_ready
|
||||||
|
|
||||||
|
vtdiskname=$(get_ventoy_disk_name)
|
||||||
|
if [ "$vtdiskname" = "unknown" ]; then
|
||||||
|
vtlog "ventoy disk not found"
|
||||||
|
PATH=$VTPATH_OLD
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
ventoy_udev_disk_common_hook "${vtdiskname#/dev/}2"
|
||||||
|
|
||||||
|
PATH=$VTPATH_OLD
|
||||||
|
|
||||||
|
set_ventoy_hook_finish
|
||||||
|
|
|
@ -20,10 +20,12 @@
|
||||||
. $VTOY_PATH/hook/ventoy-os-lib.sh
|
. $VTOY_PATH/hook/ventoy-os-lib.sh
|
||||||
|
|
||||||
ventoy_systemd_udevd_work_around
|
ventoy_systemd_udevd_work_around
|
||||||
|
|
||||||
ventoy_add_udev_rule "$VTOY_PATH/hook/default/udev_disk_hook.sh %k noreplace"
|
ventoy_add_udev_rule "$VTOY_PATH/hook/default/udev_disk_hook.sh %k noreplace"
|
||||||
|
|
||||||
|
#$BUSYBOX_PATH/cp -a $VTOY_PATH/hook/rhel7/ventoy-disk.sh /lib/dracut/hooks/initqueue/01-ventoy-disk.sh
|
||||||
|
|
||||||
# suppress write protected mount warning
|
# suppress write protected mount warning
|
||||||
if [ -e /usr/sbin/anaconda-diskroot ]; then
|
if [ -e /usr/sbin/anaconda-diskroot ]; then
|
||||||
$SED 's/^mount $dev $repodir/mount -oro $dev $repodir/' -i /usr/sbin/anaconda-diskroot
|
$SED 's/^mount $dev $repodir/mount -oro $dev $repodir/' -i /usr/sbin/anaconda-diskroot
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
|
@ -226,7 +226,7 @@ wait_for_ventoy_dm_disk_label() {
|
||||||
if ls -l /dev/disk/by-label/ | $GREP -q "$DM"; then
|
if ls -l /dev/disk/by-label/ | $GREP -q "$DM"; then
|
||||||
break
|
break
|
||||||
else
|
else
|
||||||
$SLEEP 0.3
|
$SLEEP 1
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
}
|
}
|
||||||
|
@ -395,7 +395,7 @@ ventoy_udev_disk_common_hook() {
|
||||||
else
|
else
|
||||||
vtlog "==== create ventoy device mapper failed ===="
|
vtlog "==== create ventoy device mapper failed ===="
|
||||||
|
|
||||||
$SLEEP 5
|
$SLEEP 3
|
||||||
|
|
||||||
if $GREP -q "/dev/$VTDISK" /proc/mounts; then
|
if $GREP -q "/dev/$VTDISK" /proc/mounts; then
|
||||||
$GREP "/dev/$VTDISK" /proc/mounts | while read vtLine; do
|
$GREP "/dev/$VTDISK" /proc/mounts | while read vtLine; do
|
||||||
|
|
|
@ -80,14 +80,19 @@ ventoy_add_udev_rule() {
|
||||||
# https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=869719
|
# https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=869719
|
||||||
#
|
#
|
||||||
ventoy_systemd_udevd_work_around() {
|
ventoy_systemd_udevd_work_around() {
|
||||||
VTSYSTEMUDEV="$VT_RULE_DIR_PREFIX/lib/systemd/system/systemd-udevd.service"
|
for vtdir in 'lib' 'usr/lib'; do
|
||||||
if [ -e $VTSYSTEMUDEV ]; then
|
|
||||||
if $GREP -q 'SystemCallArchitectures.*native' $VTSYSTEMUDEV; then
|
VTSYSTEMUDEV="$VT_RULE_DIR_PREFIX/$vtdir/systemd/system/systemd-udevd.service"
|
||||||
$SED "s/.*\(SystemCallArchitectures.*native\)/#\1/g" -i $VTSYSTEMUDEV
|
if [ -e $VTSYSTEMUDEV ]; then
|
||||||
|
if $GREP -q 'SystemCallArchitectures.*native' $VTSYSTEMUDEV; then
|
||||||
|
$SED "s/.*\(SystemCallArchitectures.*native\)/#\1/g" -i $VTSYSTEMUDEV
|
||||||
|
break
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
fi
|
done
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
ventoy_print_yum_repo() {
|
ventoy_print_yum_repo() {
|
||||||
echo "[$1]"
|
echo "[$1]"
|
||||||
echo "name=$1"
|
echo "name=$1"
|
||||||
|
|
|
@ -0,0 +1,42 @@
|
||||||
|
#!/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
|
||||||
|
|
||||||
|
wait_for_usb_disk_ready
|
||||||
|
|
||||||
|
vtdiskname=$(get_ventoy_disk_name)
|
||||||
|
if [ "$vtdiskname" = "unknown" ]; then
|
||||||
|
vtlog "ventoy disk not found"
|
||||||
|
PATH=$VTPATH_OLD
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
ventoy_udev_disk_common_hook "${vtdiskname#/dev/}2" "noreplace"
|
||||||
|
|
||||||
|
if ! [ -e $VTOY_DM_PATH ]; then
|
||||||
|
blkdev_num=$($VTOY_PATH/tool/dmsetup ls | grep ventoy | sed 's/.*(\([0-9][0-9]*\),.*\([0-9][0-9]*\).*/\1 \2/')
|
||||||
|
mknod -m 0666 $VTOY_DM_PATH b $blkdev_num
|
||||||
|
fi
|
||||||
|
|
||||||
|
PATH=$VTPATH_OLD
|
|
@ -0,0 +1,24 @@
|
||||||
|
#!/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/>.
|
||||||
|
#
|
||||||
|
#************************************************************************************
|
||||||
|
|
||||||
|
. $VTOY_PATH/hook/ventoy-os-lib.sh
|
||||||
|
|
||||||
|
|
||||||
|
$SED "/while.*\$device/i\ device=/dev/mapper/ventoy" -i /init
|
||||||
|
$SED "/while.*\$device/i\ $BUSYBOX_PATH/sh $VTOY_PATH/hook/zeroshell/disk_hook.sh" -i /init
|
|
@ -76,8 +76,19 @@ ventoy_unpack_initramfs() {
|
||||||
for vtx in '1F8B zcat' '1F9E zcat' '425A bzcat' '5D00 lzcat' 'FD37 xzcat' '894C lzopcat' '0221 lz4cat' '28B5 zstdcat' '3037 cat'; do
|
for vtx in '1F8B zcat' '1F9E zcat' '425A bzcat' '5D00 lzcat' 'FD37 xzcat' '894C lzopcat' '0221 lz4cat' '28B5 zstdcat' '3037 cat'; do
|
||||||
if [ "${vtx:0:4}" = "${vtmagic:0:4}" ]; then
|
if [ "${vtx:0:4}" = "${vtmagic:0:4}" ]; then
|
||||||
echo "vtx=$vtx" >> $VTLOG
|
echo "vtx=$vtx" >> $VTLOG
|
||||||
if [ $vtskip -eq 0 ]; then
|
if [ $vtskip -eq 0 ]; then
|
||||||
${vtx:5} $vtfile | (cpio -idmu 2>>$VTLOG; cat > $vttmp)
|
if [ "${vtx:5}" = "xzcat" ]; then
|
||||||
|
rm -f $VTOY_PATH/xzlog
|
||||||
|
${vtx:5} $vtfile 2> $VTOY_PATH/xzlog | (cpio -idmu 2>>$VTLOG; cat > $vttmp)
|
||||||
|
|
||||||
|
if grep -q 'corrupted data' $VTOY_PATH/xzlog; then
|
||||||
|
echo 'xzcat failed, now try xzminidec...' >> $VTLOG
|
||||||
|
cat $vtfile | xzminidec | (cpio -idmu 2>>$VTLOG; cat > $vttmp)
|
||||||
|
fi
|
||||||
|
|
||||||
|
else
|
||||||
|
${vtx:5} $vtfile | (cpio -idmu 2>>$VTLOG; cat > $vttmp)
|
||||||
|
fi
|
||||||
else
|
else
|
||||||
dd if=$vtfile skip=$vtskip iflag=skip_bytes status=none | ${vtx:5} | (cpio -idmu 2>>$VTLOG; cat > $vttmp)
|
dd if=$vtfile skip=$vtskip iflag=skip_bytes status=none | ${vtx:5} | (cpio -idmu 2>>$VTLOG; cat > $vttmp)
|
||||||
fi
|
fi
|
||||||
|
@ -104,64 +115,36 @@ ventoy_unpack_initrd() {
|
||||||
# This export is for busybox cpio command
|
# This export is for busybox cpio command
|
||||||
export EXTRACT_UNSAFE_SYMLINKS=1
|
export EXTRACT_UNSAFE_SYMLINKS=1
|
||||||
|
|
||||||
# special process
|
for vtfile in $(ls /initrd*); do
|
||||||
need_xzminidec() {
|
#decompress first initrd
|
||||||
if [ -e /initrd001 ]; then
|
vtmagic=$(hexdump -n 2 -e '2/1 "%02X"' $vtfile)
|
||||||
testmagic=$(hexdump -n 2 -e '2/1 "%02X"' /initrd001)
|
|
||||||
|
if ventoy_is_initrd_ramdisk; then
|
||||||
|
ventoy_unpack_initrd $vtfile $vtmagic ${vtfile}_tmp
|
||||||
|
mv ${vtfile}_tmp $vtfile
|
||||||
|
break
|
||||||
else
|
else
|
||||||
testmagic='xxxx'
|
ventoy_unpack_initramfs $vtfile 0 $vtmagic ${vtfile}_tmp
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ "FD37" = "${testmagic:0:4}" ]; then
|
|
||||||
if echo $vtkerver | grep -q 'kaspersky'; then
|
|
||||||
true
|
|
||||||
elif echo $vtkerver | grep -q 'kiosk.*Gentoo'; then
|
|
||||||
true
|
|
||||||
elif echo $vtkerver | grep -q 'porteus '; then
|
|
||||||
true
|
|
||||||
else
|
|
||||||
false
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
false
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
if need_xzminidec; then
|
#only for cpio,cpio,...,initrd sequence, initrd,cpio or initrd,initrd sequence is not supported
|
||||||
echo "use xzminidec" >> $VTLOG
|
while [ -e ${vtfile}_tmp ] && [ $(stat -c '%s' ${vtfile}_tmp) -gt 512 ]; do
|
||||||
cat /initrd001 | xzminidec | cpio -idmu 2>>$VTLOG
|
mv ${vtfile}_tmp $vtfile
|
||||||
rm -f /initrd001
|
vtdump=$(hexdump -n 512 -e '512/1 "%02X"' $vtfile)
|
||||||
else
|
vtmagic=$(echo $vtdump | sed 's/^\(00\)*//')
|
||||||
for vtfile in $(ls /initrd*); do
|
let vtoffset="(${#vtdump}-${#vtmagic})/2"
|
||||||
#decompress first initrd
|
|
||||||
vtmagic=$(hexdump -n 2 -e '2/1 "%02X"' $vtfile)
|
|
||||||
|
|
||||||
if ventoy_is_initrd_ramdisk; then
|
|
||||||
ventoy_unpack_initrd $vtfile $vtmagic ${vtfile}_tmp
|
|
||||||
mv ${vtfile}_tmp $vtfile
|
|
||||||
break
|
|
||||||
else
|
|
||||||
ventoy_unpack_initramfs $vtfile 0 $vtmagic ${vtfile}_tmp
|
|
||||||
fi
|
|
||||||
|
|
||||||
#only for cpio,cpio,...,initrd sequence, initrd,cpio or initrd,initrd sequence is not supported
|
|
||||||
while [ -e ${vtfile}_tmp ] && [ $(stat -c '%s' ${vtfile}_tmp) -gt 512 ]; do
|
|
||||||
mv ${vtfile}_tmp $vtfile
|
|
||||||
vtdump=$(hexdump -n 512 -e '512/1 "%02X"' $vtfile)
|
|
||||||
vtmagic=$(echo $vtdump | sed 's/^\(00\)*//')
|
|
||||||
let vtoffset="(${#vtdump}-${#vtmagic})/2"
|
|
||||||
|
|
||||||
if [ -z "$vtmagic" ]; then
|
|
||||||
echo "terminate with all zero data file" >> $VTLOG
|
|
||||||
break
|
|
||||||
fi
|
|
||||||
|
|
||||||
ventoy_unpack_initramfs $vtfile $vtoffset ${vtmagic:0:4} ${vtfile}_tmp
|
|
||||||
done
|
|
||||||
|
|
||||||
rm -f $vtfile ${vtfile}_tmp
|
if [ -z "$vtmagic" ]; then
|
||||||
|
echo "terminate with all zero data file" >> $VTLOG
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
|
||||||
|
ventoy_unpack_initramfs $vtfile $vtoffset ${vtmagic:0:4} ${vtfile}_tmp
|
||||||
done
|
done
|
||||||
fi
|
|
||||||
|
rm -f $vtfile ${vtfile}_tmp
|
||||||
|
done
|
||||||
|
|
||||||
|
|
||||||
#break here for debug
|
#break here for debug
|
||||||
if [ "$VTOY_BREAK_LEVEL" = "02" ] || [ "$VTOY_BREAK_LEVEL" = "12" ]; then
|
if [ "$VTOY_BREAK_LEVEL" = "02" ] || [ "$VTOY_BREAK_LEVEL" = "12" ]; then
|
||||||
|
|
|
@ -52,3 +52,12 @@ else
|
||||||
$BUSYBOX_PATH/cp -a $VTOY_PATH/tool/unsquashfs_32 $VTOY_PATH/tool/vtoy_unsquashfs
|
$BUSYBOX_PATH/cp -a $VTOY_PATH/tool/unsquashfs_32 $VTOY_PATH/tool/vtoy_unsquashfs
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
if $VTOY_PATH/tool/unsquashfs_64 -t 2>>$VTLOG; then
|
||||||
|
echo "use unsquashfs_64" >>$VTLOG
|
||||||
|
$BUSYBOX_PATH/cp -a $VTOY_PATH/tool/unsquashfs_64 $VTOY_PATH/tool/vtoy_unsquashfs
|
||||||
|
else
|
||||||
|
echo "use unsquashfs_32" >>$VTLOG
|
||||||
|
$BUSYBOX_PATH/cp -a $VTOY_PATH/tool/unsquashfs_32 $VTOY_PATH/tool/vtoy_unsquashfs
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
Binary file not shown.
|
@ -130,6 +130,7 @@ ventoy_get_os_type() {
|
||||||
echo 'xen'; return
|
echo 'xen'; return
|
||||||
elif $GREP -q 'SUSE ' /etc/os-release; then
|
elif $GREP -q 'SUSE ' /etc/os-release; then
|
||||||
echo 'suse'; return
|
echo 'suse'; return
|
||||||
|
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
@ -156,6 +157,14 @@ ventoy_get_os_type() {
|
||||||
echo 'debian'; return
|
echo 'debian'; return
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
if $GREP -q 'Clear Linux ' /proc/version; then
|
||||||
|
echo 'clear'; return
|
||||||
|
fi
|
||||||
|
|
||||||
|
if $GREP -q 'artix' /proc/version; then
|
||||||
|
echo 'arch'; return
|
||||||
|
fi
|
||||||
|
|
||||||
echo "default"
|
echo "default"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -1,5 +1,11 @@
|
||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
|
|
||||||
|
OLDDIR=$PWD
|
||||||
|
|
||||||
|
if ! [ -f ./tool/ventoy_lib.sh ]; then
|
||||||
|
cd ${0%Ventoy2Disk.sh}
|
||||||
|
fi
|
||||||
|
|
||||||
. ./tool/ventoy_lib.sh
|
. ./tool/ventoy_lib.sh
|
||||||
|
|
||||||
print_usage() {
|
print_usage() {
|
||||||
|
@ -18,12 +24,7 @@ echo '* longpanda admin@ventoy.net *'
|
||||||
echo '***********************************************************'
|
echo '***********************************************************'
|
||||||
echo ''
|
echo ''
|
||||||
|
|
||||||
vtdebug "############# Ventoy2Disk ################"
|
vtdebug "############# Ventoy2Disk $0 ################"
|
||||||
|
|
||||||
if ! [ -e ventoy/version ]; then
|
|
||||||
vterr "Please run under the correct directory!"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ "$1" = "-i" ]; then
|
if [ "$1" = "-i" ]; then
|
||||||
MODE="install"
|
MODE="install"
|
||||||
|
@ -34,11 +35,13 @@ elif [ "$1" = "-u" ]; then
|
||||||
MODE="update"
|
MODE="update"
|
||||||
else
|
else
|
||||||
print_usage
|
print_usage
|
||||||
|
cd $OLDDIR
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if ! [ -b "$2" ]; then
|
if ! [ -b "$2" ]; then
|
||||||
print_usage
|
print_usage
|
||||||
|
cd $OLDDIR
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
@ -46,6 +49,7 @@ if [ -z "$SUDO_USER" ]; then
|
||||||
if [ "$USER" != "root" ]; then
|
if [ "$USER" != "root" ]; then
|
||||||
vterr "EUID is $EUID root permission is required."
|
vterr "EUID is $EUID root permission is required."
|
||||||
echo ''
|
echo ''
|
||||||
|
cd $OLDDIR
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
@ -67,6 +71,7 @@ cd ../
|
||||||
|
|
||||||
if ! check_tool_work_ok; then
|
if ! check_tool_work_ok; then
|
||||||
vterr "Some tools can not run in current system. Please check log.txt for detail."
|
vterr "Some tools can not run in current system. Please check log.txt for detail."
|
||||||
|
cd $OLDDIR
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
@ -75,17 +80,26 @@ DISK=$2
|
||||||
|
|
||||||
if ! [ -b "$DISK" ]; then
|
if ! [ -b "$DISK" ]; then
|
||||||
vterr "Disk $DISK does not exist"
|
vterr "Disk $DISK does not exist"
|
||||||
|
cd $OLDDIR
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
if [ -e /sys/class/block/${DISK#/dev/}/start ]; then
|
if [ -e /sys/class/block/${DISK#/dev/}/start ]; then
|
||||||
vterr "$DISK is a partition, please use the whole disk"
|
vterr "$DISK is a partition, please use the whole disk"
|
||||||
|
cd $OLDDIR
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
grep "^$DISK" /proc/mounts | while read mtline; do
|
||||||
|
mtpnt=$(echo $mtline | awk '{print $2}')
|
||||||
|
vtdebug "Trying to umount $mtpnt ..."
|
||||||
|
umount $mtpnt >/dev/null 2>&1
|
||||||
|
done
|
||||||
|
|
||||||
if grep "$DISK" /proc/mounts; then
|
if grep "$DISK" /proc/mounts; then
|
||||||
vterr "$DISK is already mounted, please umount it first!"
|
vterr "$DISK is already mounted, please umount it first!"
|
||||||
|
cd $OLDDIR
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
@ -95,6 +109,7 @@ if [ "$MODE" = "install" ]; then
|
||||||
|
|
||||||
if ! fdisk -v >/dev/null 2>&1; then
|
if ! fdisk -v >/dev/null 2>&1; then
|
||||||
vterr "fdisk is needed by ventoy installation, but is not found in the system."
|
vterr "fdisk is needed by ventoy installation, but is not found in the system."
|
||||||
|
cd $OLDDIR
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
@ -105,6 +120,7 @@ if [ "$MODE" = "install" ]; then
|
||||||
vtwarn "Use -u option to do a safe upgrade operation."
|
vtwarn "Use -u option to do a safe upgrade operation."
|
||||||
vtwarn "OR if you really want to reinstall ventoy to $DISK, please use -I option."
|
vtwarn "OR if you really want to reinstall ventoy to $DISK, please use -I option."
|
||||||
vtwarn ""
|
vtwarn ""
|
||||||
|
cd $OLDDIR
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
@ -114,6 +130,7 @@ if [ "$MODE" = "install" ]; then
|
||||||
|
|
||||||
if [ $disk_sector_num -gt 4294967296 ]; then
|
if [ $disk_sector_num -gt 4294967296 ]; then
|
||||||
vterr "$DISK is over 2TB size, MBR will not work on it."
|
vterr "$DISK is over 2TB size, MBR will not work on it."
|
||||||
|
cd $OLDDIR
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
@ -150,7 +167,7 @@ if [ "$MODE" = "install" ]; then
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if ! dd if=/dev/zero of=$DISK bs=1 count=512 status=none; then
|
if ! dd if=/dev/zero of=$DISK bs=1 count=512 status=none conv=fsync; then
|
||||||
vterr "Write data to $DISK failed, please check whether it's in use."
|
vterr "Write data to $DISK failed, please check whether it's in use."
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
@ -178,15 +195,15 @@ if [ "$MODE" = "install" ]; then
|
||||||
|
|
||||||
chmod +x ./tool/vtoy_gen_uuid
|
chmod +x ./tool/vtoy_gen_uuid
|
||||||
|
|
||||||
dd status=none if=./boot/boot.img of=$DISK bs=1 count=446
|
dd status=none conv=fsync if=./boot/boot.img of=$DISK bs=1 count=446
|
||||||
./tool/xzcat ./boot/core.img.xz | dd status=none of=$DISK bs=512 count=2047 seek=1
|
./tool/xzcat ./boot/core.img.xz | dd status=none conv=fsync of=$DISK bs=512 count=2047 seek=1
|
||||||
./tool/xzcat ./ventoy/ventoy.disk.img.xz | dd status=none of=$DISK bs=512 count=$VENTOY_SECTOR_NUM seek=$part2_start_sector
|
./tool/xzcat ./ventoy/ventoy.disk.img.xz | dd status=none conv=fsync of=$DISK bs=512 count=$VENTOY_SECTOR_NUM seek=$part2_start_sector
|
||||||
|
|
||||||
#disk uuid
|
#disk uuid
|
||||||
./tool/vtoy_gen_uuid | dd status=none of=${DISK} seek=384 bs=1 count=16
|
./tool/vtoy_gen_uuid | dd status=none conv=fsync of=${DISK} seek=384 bs=1 count=16
|
||||||
|
|
||||||
#disk signature
|
#disk signature
|
||||||
./tool/vtoy_gen_uuid | dd status=none of=${DISK} skip=12 seek=440 bs=1 count=4
|
./tool/vtoy_gen_uuid | dd status=none conv=fsync of=${DISK} skip=12 seek=440 bs=1 count=4
|
||||||
|
|
||||||
sync
|
sync
|
||||||
|
|
||||||
|
@ -203,6 +220,7 @@ else
|
||||||
echo ""
|
echo ""
|
||||||
vtwarn "Please use -i option if you want to install ventoy to $DISK"
|
vtwarn "Please use -i option if you want to install ventoy to $DISK"
|
||||||
echo ""
|
echo ""
|
||||||
|
cd $OLDDIR
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
@ -214,19 +232,20 @@ else
|
||||||
read -p "Update Ventoy $oldver ===> $curver Continue? (y/n)" Answer
|
read -p "Update Ventoy $oldver ===> $curver Continue? (y/n)" Answer
|
||||||
if [ "$Answer" != "y" ]; then
|
if [ "$Answer" != "y" ]; then
|
||||||
if [ "$Answer" != "Y" ]; then
|
if [ "$Answer" != "Y" ]; then
|
||||||
|
cd $OLDDIR
|
||||||
exit 0
|
exit 0
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
PART2=$(get_disk_part_name $DISK 2)
|
PART2=$(get_disk_part_name $DISK 2)
|
||||||
|
|
||||||
dd status=none if=./boot/boot.img of=$DISK bs=1 count=440
|
dd status=none conv=fsync if=./boot/boot.img of=$DISK bs=1 count=440
|
||||||
|
|
||||||
./tool/xzcat ./boot/core.img.xz | dd status=none of=$DISK bs=512 count=2047 seek=1
|
./tool/xzcat ./boot/core.img.xz | dd status=none conv=fsync of=$DISK bs=512 count=2047 seek=1
|
||||||
|
|
||||||
disk_sector_num=$(cat /sys/block/${DISK#/dev/}/size)
|
disk_sector_num=$(cat /sys/block/${DISK#/dev/}/size)
|
||||||
part2_start=$(expr $disk_sector_num - $VENTOY_SECTOR_NUM)
|
part2_start=$(expr $disk_sector_num - $VENTOY_SECTOR_NUM)
|
||||||
./tool/xzcat ./ventoy/ventoy.disk.img.xz | dd status=none of=$DISK bs=512 count=$VENTOY_SECTOR_NUM seek=$part2_start
|
./tool/xzcat ./ventoy/ventoy.disk.img.xz | dd status=none conv=fsync of=$DISK bs=512 count=$VENTOY_SECTOR_NUM seek=$part2_start
|
||||||
|
|
||||||
sync
|
sync
|
||||||
|
|
||||||
|
@ -236,3 +255,5 @@ else
|
||||||
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
cd $OLDDIR
|
||||||
|
|
||||||
|
|
|
@ -76,7 +76,18 @@ function distro_specify_initrd_file {
|
||||||
vt_linux_specify_initrd_file /boot/initrd.xz
|
vt_linux_specify_initrd_file /boot/initrd.xz
|
||||||
elif [ -f (loop)/boot/initrd ]; then
|
elif [ -f (loop)/boot/initrd ]; then
|
||||||
vt_linux_specify_initrd_file /boot/initrd
|
vt_linux_specify_initrd_file /boot/initrd
|
||||||
|
elif [ -f (loop)/boot/x86_64/loader/initrd ]; then
|
||||||
|
vt_linux_specify_initrd_file /boot/x86_64/loader/initrd
|
||||||
|
elif [ -f (loop)/boot/initramfs-x86_64.img ]; then
|
||||||
|
vt_linux_specify_initrd_file /boot/initramfs-x86_64.img
|
||||||
|
|
||||||
|
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function distro_specify_initrd_file_phase2 {
|
||||||
|
if [ -f (loop)/boot/initrd.img ]; then
|
||||||
|
vt_linux_specify_initrd_file /boot/initrd.img
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -137,6 +148,17 @@ function uefi_linux_menu_func {
|
||||||
|
|
||||||
distro_specify_initrd_file
|
distro_specify_initrd_file
|
||||||
|
|
||||||
|
vt_linux_initrd_count vtcount
|
||||||
|
if [ $vtcount -eq 0 ]; then
|
||||||
|
distro_specify_initrd_file_phase2
|
||||||
|
|
||||||
|
if [ "$vt_efi_dir" = "NO" ]; then
|
||||||
|
if [ -f (loop)/efi.img ]; then
|
||||||
|
vt_add_replace_file 0 "initrd"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
locate_initrd
|
locate_initrd
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
@ -179,6 +201,14 @@ function uefi_iso_menu_func {
|
||||||
loopback loop ${1}${chosen_path}
|
loopback loop ${1}${chosen_path}
|
||||||
get_os_type (loop)
|
get_os_type (loop)
|
||||||
|
|
||||||
|
if [ -d (loop)/EFI ]; then
|
||||||
|
set vt_efi_dir=YES
|
||||||
|
elif [ -d (loop)/efi ]; then
|
||||||
|
set vt_efi_dir=YES
|
||||||
|
else
|
||||||
|
set vt_efi_dir=NO
|
||||||
|
fi
|
||||||
|
|
||||||
if [ -n "$vtcompat" ]; then
|
if [ -n "$vtcompat" ]; then
|
||||||
set ventoy_compatible=YES
|
set ventoy_compatible=YES
|
||||||
unset vtcompat
|
unset vtcompat
|
||||||
|
@ -193,6 +223,8 @@ function uefi_iso_menu_func {
|
||||||
if [ "$vtoy_os" = "Windows" ]; then
|
if [ "$vtoy_os" = "Windows" ]; then
|
||||||
if [ "$ventoy_fs_probe" = "iso9660" ]; then
|
if [ "$ventoy_fs_probe" = "iso9660" ]; then
|
||||||
set ventoy_compatible=YES
|
set ventoy_compatible=YES
|
||||||
|
elif [ -f (loop)/HBCD_PE.ini ]; then
|
||||||
|
set ventoy_compatible=YES
|
||||||
fi
|
fi
|
||||||
|
|
||||||
uefi_windows_menu_func $1
|
uefi_windows_menu_func $1
|
||||||
|
@ -279,6 +311,11 @@ function legacy_linux_menu_func {
|
||||||
|
|
||||||
distro_specify_initrd_file
|
distro_specify_initrd_file
|
||||||
|
|
||||||
|
vt_linux_initrd_count vtcount
|
||||||
|
if [ $vtcount -eq 0 ]; then
|
||||||
|
distro_specify_initrd_file_phase2
|
||||||
|
fi
|
||||||
|
|
||||||
locate_initrd
|
locate_initrd
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
@ -330,7 +367,10 @@ function legacy_iso_menu_func {
|
||||||
if [ "$vtoy_os" = "Windows" ]; then
|
if [ "$vtoy_os" = "Windows" ]; then
|
||||||
if [ "$ventoy_fs_probe" = "iso9660" ]; then
|
if [ "$ventoy_fs_probe" = "iso9660" ]; then
|
||||||
set ventoy_compatible=YES
|
set ventoy_compatible=YES
|
||||||
|
elif [ -f (loop)/HBCD_PE.ini ]; then
|
||||||
|
set ventoy_compatible=YES
|
||||||
fi
|
fi
|
||||||
|
|
||||||
legacy_windows_menu_func $1
|
legacy_windows_menu_func $1
|
||||||
else
|
else
|
||||||
legacy_linux_menu_func $1
|
legacy_linux_menu_func $1
|
||||||
|
@ -355,7 +395,7 @@ function legacy_iso_memdisk {
|
||||||
#############################################################
|
#############################################################
|
||||||
#############################################################
|
#############################################################
|
||||||
|
|
||||||
set VENTOY_VERSION="1.0.06"
|
set VENTOY_VERSION="1.0.07"
|
||||||
|
|
||||||
#disable timeout
|
#disable timeout
|
||||||
unset timeout
|
unset timeout
|
||||||
|
@ -385,7 +425,11 @@ if [ -f $iso_path/ventoy/ventoy.json ]; then
|
||||||
vt_load_plugin $iso_path
|
vt_load_plugin $iso_path
|
||||||
fi
|
fi
|
||||||
|
|
||||||
terminal_output gfxterm
|
if [ -n "$vtoy_gfxmode" ]; then
|
||||||
|
set gfxmode=$vtoy_gfxmode
|
||||||
|
else
|
||||||
|
set gfxmode=1920x1080,1366x768,1024x768
|
||||||
|
fi
|
||||||
|
|
||||||
if [ -n "$vtoy_theme" ]; then
|
if [ -n "$vtoy_theme" ]; then
|
||||||
set theme=$vtoy_theme
|
set theme=$vtoy_theme
|
||||||
|
@ -393,11 +437,7 @@ else
|
||||||
set theme=$prefix/themes/ventoy/theme.txt
|
set theme=$prefix/themes/ventoy/theme.txt
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ -n "$vtoy_gfxmode" ]; then
|
terminal_output gfxterm
|
||||||
set gfxmode=$vtoy_gfxmode
|
|
||||||
else
|
|
||||||
set gfxmode=1024x768
|
|
||||||
fi
|
|
||||||
|
|
||||||
#colect all image files (iso files)
|
#colect all image files (iso files)
|
||||||
set ventoy_img_count=0
|
set ventoy_img_count=0
|
||||||
|
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -2,7 +2,7 @@
|
||||||
Ventoy is an open source tool to create bootable USB drive for ISO files.
|
Ventoy is an open source tool to create bootable USB drive for ISO files.
|
||||||
With ventoy, you don't need to format the disk again and again, you just need to copy the iso file to the USB drive and boot it.
|
With ventoy, you don't need to format the disk again and again, you just need to copy the iso file to the USB drive and boot it.
|
||||||
You can copy many iso files at a time and ventoy will give you a boot menu to select them.
|
You can copy many iso files at a time and ventoy will give you a boot menu to select them.
|
||||||
Both Legacy BIOS and UEFI are supported in the same way. 160+ ISO files are tested.
|
Both Legacy BIOS and UEFI are supported in the same way. 200+ ISO files are tested.
|
||||||
A "Ventoy Compatible" concept is introduced by ventoy, which can help to support any ISO file.
|
A "Ventoy Compatible" concept is introduced by ventoy, which can help to support any ISO file.
|
||||||
|
|
||||||
See http://www.ventoy.net for detail.
|
See http://www.ventoy.net for detail.
|
||||||
|
@ -13,9 +13,10 @@ See http://www.ventoy.net for detail.
|
||||||
* Fast (limited only by the speed of copying iso file)
|
* Fast (limited only by the speed of copying iso file)
|
||||||
* Directly boot from iso file, no extraction needed
|
* Directly boot from iso file, no extraction needed
|
||||||
* Legacy + UEFI supported in the same way
|
* Legacy + UEFI supported in the same way
|
||||||
|
* UEFI Secure Boot supported (since 1.0.07+) Notes
|
||||||
* ISO files larger than 4GB supported
|
* ISO files larger than 4GB supported
|
||||||
* Native boot menu style for Legacy & UEFI
|
* Native boot menu style for Legacy & UEFI
|
||||||
* Most type of OS supported, 100+ iso files tested
|
* Most type of OS supported, 200+ iso files tested
|
||||||
* Not only boot but also complete installation process
|
* Not only boot but also complete installation process
|
||||||
* "Ventoy Compatible" concept
|
* "Ventoy Compatible" concept
|
||||||
* Plugin Framework
|
* Plugin Framework
|
||||||
|
|
|
@ -328,6 +328,11 @@ static int vtoy_find_disk_by_size(unsigned long long size, char *diskname)
|
||||||
int rc = 0;
|
int rc = 0;
|
||||||
|
|
||||||
dir = opendir("/sys/block");
|
dir = opendir("/sys/block");
|
||||||
|
if (!dir)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
while ((p = readdir(dir)) != NULL)
|
while ((p = readdir(dir)) != NULL)
|
||||||
{
|
{
|
||||||
if (!vtoy_is_possible_blkdev(p->d_name))
|
if (!vtoy_is_possible_blkdev(p->d_name))
|
||||||
|
@ -357,6 +362,11 @@ static int vtoy_find_disk_by_guid(uint8_t *guid, char *diskname)
|
||||||
uint8_t vtguid[16];
|
uint8_t vtguid[16];
|
||||||
|
|
||||||
dir = opendir("/sys/block");
|
dir = opendir("/sys/block");
|
||||||
|
if (!dir)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
while ((p = readdir(dir)) != NULL)
|
while ((p = readdir(dir)) != NULL)
|
||||||
{
|
{
|
||||||
if (!vtoy_is_possible_blkdev(p->d_name))
|
if (!vtoy_is_possible_blkdev(p->d_name))
|
||||||
|
@ -378,6 +388,12 @@ static int vtoy_find_disk_by_guid(uint8_t *guid, char *diskname)
|
||||||
return count;
|
return count;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int vtoy_printf_iso_path(ventoy_os_param *param)
|
||||||
|
{
|
||||||
|
printf("%s\n", param->vtoy_img_path);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int vtoy_print_os_param(ventoy_os_param *param, char *diskname)
|
static int vtoy_print_os_param(ventoy_os_param *param, char *diskname)
|
||||||
{
|
{
|
||||||
int cnt = 0;
|
int cnt = 0;
|
||||||
|
@ -458,12 +474,13 @@ int vtoydump_main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
int rc;
|
int rc;
|
||||||
int ch;
|
int ch;
|
||||||
|
int print_path = 0;
|
||||||
char filename[256] = {0};
|
char filename[256] = {0};
|
||||||
char diskname[256] = {0};
|
char diskname[256] = {0};
|
||||||
char device[64] = {0};
|
char device[64] = {0};
|
||||||
ventoy_os_param *param = NULL;
|
ventoy_os_param *param = NULL;
|
||||||
|
|
||||||
while ((ch = getopt(argc, argv, "c:f:v::")) != -1)
|
while ((ch = getopt(argc, argv, "c:f:p:v::")) != -1)
|
||||||
{
|
{
|
||||||
if (ch == 'f')
|
if (ch == 'f')
|
||||||
{
|
{
|
||||||
|
@ -477,6 +494,11 @@ int vtoydump_main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
strncpy(device, optarg, sizeof(device) - 1);
|
strncpy(device, optarg, sizeof(device) - 1);
|
||||||
}
|
}
|
||||||
|
else if (ch == 'p')
|
||||||
|
{
|
||||||
|
print_path = 1;
|
||||||
|
strncpy(filename, optarg, sizeof(filename) - 1);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
fprintf(stderr, "Usage: %s -f datafile [ -v ] \n", argv[0]);
|
fprintf(stderr, "Usage: %s -f datafile [ -v ] \n", argv[0]);
|
||||||
|
@ -513,7 +535,11 @@ int vtoydump_main(int argc, char **argv)
|
||||||
vtoy_dump_os_param(param);
|
vtoy_dump_os_param(param);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (device[0])
|
if (print_path)
|
||||||
|
{
|
||||||
|
rc = vtoy_printf_iso_path(param);
|
||||||
|
}
|
||||||
|
else if (device[0])
|
||||||
{
|
{
|
||||||
rc = vtoy_check_device(param, device);
|
rc = vtoy_check_device(param, device);
|
||||||
}
|
}
|
||||||
|
|
Binary file not shown.
Binary file not shown.
Loading…
Reference in New Issue