From c5af17e04e5f0ca61a38247f2216ba3fae178527 Mon Sep 17 00:00:00 2001 From: longpanda Date: Thu, 26 Aug 2021 14:17:44 +0800 Subject: [PATCH] experimental support for chromium os (fydeos/cloudready) --- .../MOD_SRC/grub-2.04/grub-core/partmap/gpt.c | 232 ++++++++++++++++++ .../grub-2.04/grub-core/ventoy/ventoy_cmd.c | 66 ++++- .../grub-2.04/include/grub/partition.h | 141 +++++++++++ .../ventoy/loop/cloudready/ventoy-hook.sh | 134 ++++++++++ IMG/cpio/ventoy/loop/fydeos/ventoy-hook.sh | 134 ++++++++++ INSTALL/grub/grub.cfg | 105 +++++++- 6 files changed, 800 insertions(+), 12 deletions(-) create mode 100644 GRUB2/MOD_SRC/grub-2.04/grub-core/partmap/gpt.c create mode 100644 GRUB2/MOD_SRC/grub-2.04/include/grub/partition.h create mode 100644 IMG/cpio/ventoy/loop/cloudready/ventoy-hook.sh create mode 100644 IMG/cpio/ventoy/loop/fydeos/ventoy-hook.sh diff --git a/GRUB2/MOD_SRC/grub-2.04/grub-core/partmap/gpt.c b/GRUB2/MOD_SRC/grub-2.04/grub-core/partmap/gpt.c new file mode 100644 index 00000000..2975ad4a --- /dev/null +++ b/GRUB2/MOD_SRC/grub-2.04/grub-core/partmap/gpt.c @@ -0,0 +1,232 @@ +/* gpt.c - Read GUID Partition Tables (GPT). */ +/* + * GRUB -- GRand Unified Bootloader + * Copyright (C) 2002,2005,2006,2007,2008 Free Software Foundation, Inc. + * + * GRUB 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. + * + * GRUB 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 GRUB. If not, see . + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +GRUB_MOD_LICENSE ("GPLv3+"); + +static grub_uint8_t grub_gpt_magic[8] = + { + 0x45, 0x46, 0x49, 0x20, 0x50, 0x41, 0x52, 0x54 + }; + +static const grub_gpt_part_guid_t grub_gpt_partition_type_empty = GRUB_GPT_PARTITION_TYPE_EMPTY; + +#ifdef GRUB_UTIL +static const grub_gpt_part_guid_t grub_gpt_partition_type_bios_boot = GRUB_GPT_PARTITION_TYPE_BIOS_BOOT; +#endif + +/* 512 << 7 = 65536 byte sectors. */ +#define MAX_SECTOR_LOG 7 + +static struct grub_partition_map grub_gpt_partition_map; + + + +grub_err_t +grub_gpt_partition_map_iterate (grub_disk_t disk, + grub_partition_iterate_hook_t hook, + void *hook_data) +{ + struct grub_partition part; + struct grub_gpt_header gpt; + struct grub_gpt_partentry entry; + struct grub_msdos_partition_mbr mbr; + grub_uint64_t entries; + unsigned int i; + int last_offset = 0; + int sector_log = 0; + + /* Read the protective MBR. */ + if (grub_disk_read (disk, 0, 0, sizeof (mbr), &mbr)) + return grub_errno; + + /* Check if it is valid. */ + if (mbr.signature != grub_cpu_to_le16_compile_time (GRUB_PC_PARTITION_SIGNATURE)) + return grub_error (GRUB_ERR_BAD_PART_TABLE, "no signature"); + + /* Make sure the MBR is a protective MBR and not a normal MBR. */ + for (i = 0; i < 4; i++) + if (mbr.entries[i].type == GRUB_PC_PARTITION_TYPE_GPT_DISK) + break; + if (i == 4) + return grub_error (GRUB_ERR_BAD_PART_TABLE, "no GPT partition map found"); + + /* Read the GPT header. */ + for (sector_log = 0; sector_log < MAX_SECTOR_LOG; sector_log++) + { + if (grub_disk_read (disk, 1 << sector_log, 0, sizeof (gpt), &gpt)) + return grub_errno; + + if (grub_memcmp (gpt.magic, grub_gpt_magic, sizeof (grub_gpt_magic)) == 0) + break; + } + if (sector_log == MAX_SECTOR_LOG) + return grub_error (GRUB_ERR_BAD_PART_TABLE, "no valid GPT header"); + + grub_dprintf ("gpt", "Read a valid GPT header\n"); + + entries = grub_le_to_cpu64 (gpt.partitions) << sector_log; + for (i = 0; i < grub_le_to_cpu32 (gpt.maxpart); i++) + { + if (grub_disk_read (disk, entries, last_offset, + sizeof (entry), &entry)) + return grub_errno; + + if (grub_memcmp (&grub_gpt_partition_type_empty, &entry.type, + sizeof (grub_gpt_partition_type_empty))) + { + /* Calculate the first block and the size of the partition. */ + part.start = grub_le_to_cpu64 (entry.start) << sector_log; + part.len = (grub_le_to_cpu64 (entry.end) + - grub_le_to_cpu64 (entry.start) + 1) << sector_log; + part.offset = entries; + part.number = i; + part.index = last_offset; + part.partmap = &grub_gpt_partition_map; + part.parent = disk->partition; + part.gpt_attrib = entry.attrib; + + grub_dprintf ("gpt", "GPT entry %d: start=%lld, length=%lld\n", i, + (unsigned long long) part.start, + (unsigned long long) part.len); + + if (hook (disk, &part, hook_data)) + return grub_errno; + } + + last_offset += grub_le_to_cpu32 (gpt.partentry_size); + if (last_offset == GRUB_DISK_SECTOR_SIZE) + { + last_offset = 0; + entries++; + } + } + + return GRUB_ERR_NONE; +} + +#ifdef GRUB_UTIL +/* Context for gpt_partition_map_embed. */ +struct gpt_partition_map_embed_ctx +{ + grub_disk_addr_t start, len; +}; + +/* Helper for gpt_partition_map_embed. */ +static int +find_usable_region (grub_disk_t disk __attribute__ ((unused)), + const grub_partition_t p, void *data) +{ + struct gpt_partition_map_embed_ctx *ctx = data; + struct grub_gpt_partentry gptdata; + grub_partition_t p2; + + p2 = disk->partition; + disk->partition = p->parent; + if (grub_disk_read (disk, p->offset, p->index, + sizeof (gptdata), &gptdata)) + { + disk->partition = p2; + return 0; + } + disk->partition = p2; + + /* If there's an embed region, it is in a dedicated partition. */ + if (! grub_memcmp (&gptdata.type, &grub_gpt_partition_type_bios_boot, 16)) + { + ctx->start = p->start; + ctx->len = p->len; + return 1; + } + + return 0; +} + +static grub_err_t +gpt_partition_map_embed (struct grub_disk *disk, unsigned int *nsectors, + unsigned int max_nsectors, + grub_embed_type_t embed_type, + grub_disk_addr_t **sectors) +{ + struct gpt_partition_map_embed_ctx ctx = { + .start = 0, + .len = 0 + }; + unsigned i; + grub_err_t err; + + if (embed_type != GRUB_EMBED_PCBIOS) + return grub_error (GRUB_ERR_NOT_IMPLEMENTED_YET, + "GPT currently supports only PC-BIOS embedding"); + + err = grub_gpt_partition_map_iterate (disk, find_usable_region, &ctx); + if (err) + return err; + + if (ctx.len == 0) + return grub_error (GRUB_ERR_FILE_NOT_FOUND, + N_("this GPT partition label contains no BIOS Boot Partition;" + " embedding won't be possible")); + + if (ctx.len < *nsectors) + return grub_error (GRUB_ERR_OUT_OF_RANGE, + N_("your BIOS Boot Partition is too small;" + " embedding won't be possible")); + + *nsectors = ctx.len; + if (*nsectors > max_nsectors) + *nsectors = max_nsectors; + *sectors = grub_malloc (*nsectors * sizeof (**sectors)); + if (!*sectors) + return grub_errno; + for (i = 0; i < *nsectors; i++) + (*sectors)[i] = ctx.start + i; + + return GRUB_ERR_NONE; +} +#endif + + +/* Partition map type. */ +static struct grub_partition_map grub_gpt_partition_map = + { + .name = "gpt", + .iterate = grub_gpt_partition_map_iterate, +#ifdef GRUB_UTIL + .embed = gpt_partition_map_embed +#endif + }; + +GRUB_MOD_INIT(part_gpt) +{ + grub_partition_map_register (&grub_gpt_partition_map); +} + +GRUB_MOD_FINI(part_gpt) +{ + grub_partition_map_unregister (&grub_gpt_partition_map); +} diff --git a/GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_cmd.c b/GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_cmd.c index 848ba874..502f260a 100644 --- a/GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_cmd.c +++ b/GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_cmd.c @@ -3491,9 +3491,11 @@ end: static int ventoy_img_partition_callback (struct grub_disk *disk, const grub_partition_t partition, void *data) { + int *pCnt = (int *)data; + (void)disk; - (void)data; + (*pCnt)++; g_part_list_pos += grub_snprintf(g_part_list_buf + g_part_list_pos, VTOY_MAX_SCRIPT_BUF - g_part_list_pos, "0 %llu linear /dev/ventoy %llu\n", (ulonglong)partition->len, (ulonglong)partition->start); @@ -3503,6 +3505,7 @@ static int ventoy_img_partition_callback (struct grub_disk *disk, const grub_par static grub_err_t ventoy_cmd_img_part_info(grub_extcmd_context_t ctxt, int argc, char **args) { + int cnt = 0; char *device_name = NULL; grub_device_t dev = NULL; char buf[64]; @@ -3531,11 +3534,14 @@ static grub_err_t ventoy_cmd_img_part_info(grub_extcmd_context_t ctxt, int argc, goto end; } - grub_partition_iterate(dev->disk, ventoy_img_partition_callback, NULL); + grub_partition_iterate(dev->disk, ventoy_img_partition_callback, &cnt); grub_snprintf(buf, sizeof(buf), "newc:vtoy_dm_table:mem:0x%llx:size:%d", (ulonglong)(ulong)g_part_list_buf, g_part_list_pos); grub_env_set("vtoy_img_part_file", buf); + grub_snprintf(buf, sizeof(buf), "%d", cnt); + grub_env_set("vtoy_img_part_cnt", buf); + end: check_free(device_name, grub_free); @@ -4792,6 +4798,59 @@ out: VENTOY_CMD_RETURN(GRUB_ERR_NONE); } +static grub_err_t grub_cmd_gptpriority(grub_extcmd_context_t ctxt, int argc, char **args) +{ + grub_disk_t disk; + grub_partition_t part; + char priority_str[3]; /* Maximum value 15 */ + + (void)ctxt; + + if (argc < 2 || argc > 3) + return grub_error (GRUB_ERR_BAD_ARGUMENT, + "gptpriority DISKNAME PARTITIONNUM [VARNAME]"); + + /* Open the disk if it exists */ + disk = grub_disk_open (args[0]); + if (!disk) + { + return grub_error (GRUB_ERR_BAD_ARGUMENT, + "Not a disk"); + } + + part = grub_partition_probe (disk, args[1]); + if (!part) + { + grub_disk_close (disk); + return grub_error (GRUB_ERR_BAD_ARGUMENT, + "No such partition"); + } + + if (grub_strcmp (part->partmap->name, "gpt")) + { + grub_disk_close (disk); + return grub_error (GRUB_ERR_BAD_PART_TABLE, + "Not a GPT partition"); + } + + grub_snprintf (priority_str, sizeof(priority_str), "%u", + (grub_uint32_t)((part->gpt_attrib >> 48) & 0xfULL)); + + if (argc == 3) + { + grub_env_set (args[2], priority_str); + grub_env_export (args[2]); + } + else + { + grub_printf ("Priority is %s\n", priority_str); + } + + grub_disk_close (disk); + return GRUB_ERR_NONE; +} + + int ventoy_env_init(void) { char buf[64]; @@ -4839,6 +4898,8 @@ int ventoy_env_init(void) return 0; } + + static cmd_para ventoy_cmds[] = { { "vt_incr", ventoy_cmd_incr, 0, NULL, "{Var} {INT}", "Increase integer variable", NULL }, @@ -4971,6 +5032,7 @@ static cmd_para ventoy_cmds[] = { "vt_pop_pager", ventoy_cmd_pop_pager, 0, NULL, "", "", NULL }, { "vt_check_json_path_case", ventoy_cmd_chk_json_pathcase, 0, NULL, "", "", NULL }, { "vt_append_extra_sector", ventoy_cmd_append_ext_sector, 0, NULL, "", "", NULL }, + { "gptpriority", grub_cmd_gptpriority, 0, NULL, "", "", NULL }, }; int ventoy_register_all_cmd(void) diff --git a/GRUB2/MOD_SRC/grub-2.04/include/grub/partition.h b/GRUB2/MOD_SRC/grub-2.04/include/grub/partition.h new file mode 100644 index 00000000..639f1e61 --- /dev/null +++ b/GRUB2/MOD_SRC/grub-2.04/include/grub/partition.h @@ -0,0 +1,141 @@ +/* + * GRUB -- GRand Unified Bootloader + * Copyright (C) 1999,2000,2001,2002,2004,2006,2007 Free Software Foundation, Inc. + * + * GRUB 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. + * + * GRUB 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 GRUB. If not, see . + */ + +#ifndef GRUB_PART_HEADER +#define GRUB_PART_HEADER 1 + +#include +#include + +struct grub_disk; + +typedef struct grub_partition *grub_partition_t; + +#ifdef GRUB_UTIL +typedef enum +{ + GRUB_EMBED_PCBIOS +} grub_embed_type_t; +#endif + +typedef int (*grub_partition_iterate_hook_t) (struct grub_disk *disk, + const grub_partition_t partition, + void *data); + +/* Partition map type. */ +struct grub_partition_map +{ + /* The next partition map type. */ + struct grub_partition_map *next; + struct grub_partition_map **prev; + + /* The name of the partition map type. */ + const char *name; + + /* Call HOOK with each partition, until HOOK returns non-zero. */ + grub_err_t (*iterate) (struct grub_disk *disk, + grub_partition_iterate_hook_t hook, void *hook_data); +#ifdef GRUB_UTIL + /* Determine sectors available for embedding. */ + grub_err_t (*embed) (struct grub_disk *disk, unsigned int *nsectors, + unsigned int max_nsectors, + grub_embed_type_t embed_type, + grub_disk_addr_t **sectors); +#endif +}; +typedef struct grub_partition_map *grub_partition_map_t; + +/* Partition description. */ +struct grub_partition +{ + /* The partition number. */ + int number; + + /* The start sector (relative to parent). */ + grub_disk_addr_t start; + + /* The length in sector units. */ + grub_uint64_t len; + + /* The offset of the partition table. */ + grub_disk_addr_t offset; + + /* The index of this partition in the partition table. */ + int index; + + /* Parent partition (physically contains this partition). */ + struct grub_partition *parent; + + /* The type partition map. */ + grub_partition_map_t partmap; + + /* The type of partition whne it's on MSDOS. + Used for embedding detection. */ + grub_uint8_t msdostype; + + /* The attrib field for GPT. Needed for priority detection. */ + grub_uint64_t gpt_attrib; +}; + +grub_partition_t EXPORT_FUNC(grub_partition_probe) (struct grub_disk *disk, + const char *str); +int EXPORT_FUNC(grub_partition_iterate) (struct grub_disk *disk, + grub_partition_iterate_hook_t hook, + void *hook_data); +char *EXPORT_FUNC(grub_partition_get_name) (const grub_partition_t partition); + + +extern grub_partition_map_t EXPORT_VAR(grub_partition_map_list); + +#ifndef GRUB_LST_GENERATOR +static inline void +grub_partition_map_register (grub_partition_map_t partmap) +{ + grub_list_push (GRUB_AS_LIST_P (&grub_partition_map_list), + GRUB_AS_LIST (partmap)); +} +#endif + +static inline void +grub_partition_map_unregister (grub_partition_map_t partmap) +{ + grub_list_remove (GRUB_AS_LIST (partmap)); +} + +#define FOR_PARTITION_MAPS(var) FOR_LIST_ELEMENTS((var), (grub_partition_map_list)) + + +static inline grub_disk_addr_t +grub_partition_get_start (const grub_partition_t p) +{ + grub_partition_t part; + grub_uint64_t part_start = 0; + + for (part = p; part; part = part->parent) + part_start += part->start; + + return part_start; +} + +static inline grub_uint64_t +grub_partition_get_len (const grub_partition_t p) +{ + return p->len; +} + +#endif /* ! GRUB_PART_HEADER */ diff --git a/IMG/cpio/ventoy/loop/cloudready/ventoy-hook.sh b/IMG/cpio/ventoy/loop/cloudready/ventoy-hook.sh new file mode 100644 index 00000000..b2a586d7 --- /dev/null +++ b/IMG/cpio/ventoy/loop/cloudready/ventoy-hook.sh @@ -0,0 +1,134 @@ +#!/ventoy/busybox/sh +#************************************************************************************ +# Copyright (c) 2021, longpanda +# +# 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 . +# +#************************************************************************************ + +. /ventoy/hook/ventoy-hook-lib.sh + +vtlog "####### $0 $* ########" + +VTPATH_OLD=$PATH; PATH=$BUSYBOX_PATH:$VTOY_PATH/tool:$PATH + +mkdir /sys +mount -t sysfs sys /sys +mdev -s +sleep 2 + +while [ -n "Y" ]; do + usb_disk=$(get_ventoy_disk_name) + + if echo $usb_disk | egrep -q "nvme|mmc|nbd"; then + vtpart2=${usb_disk}p2 + else + vtpart2=${usb_disk}2 + fi + + if [ -e "${vtpart2}" ]; then + break + else + sleep 2 + mdev -s + fi +done + +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" + +blkdev_num=$($VTOY_PATH/tool/dmsetup ls | grep ventoy | sed 's/.*(\([0-9][0-9]*\),.*\([0-9][0-9]*\).*/\1:\2/') +vtDM=$(ventoy_find_dm_id ${blkdev_num}) +echo -n $vtDM > /ventoy/vtDM + +ventoy_create_dev_ventoy_part +mdev -s + +vtlog "copy out the e2fsck program ..." +mkdir /ventoy_rdroot +mkdir -p /lib /lib64 /usr/lib64 /sbin + +mount -o ro /dev/ventoy3 /ventoy_rdroot >>$VTLOG 2>&1 +cp -a /ventoy_rdroot/sbin/e2fsck /sbin/ +cp -a /ventoy_rdroot/usr/lib64/libext2fs* /usr/lib64/ +cp -a /ventoy_rdroot/usr/lib64/libcom_err* /usr/lib64/ +cp -a /ventoy_rdroot/usr/lib64/libe2p* /usr/lib64/ +cp -a /ventoy_rdroot/lib64/libblk* /lib64/ +cp -a /ventoy_rdroot/lib64/libuuid* /lib64/ +cp -a /ventoy_rdroot/lib64/libdl.* /lib64/ +cp -a /ventoy_rdroot/lib64/libdl-* /lib64/ +cp -a /ventoy_rdroot/lib64/libc.* /lib64/ +cp -a /ventoy_rdroot/lib64/libc-* /lib64/ +cp -a /ventoy_rdroot/lib64/libpthread* /lib64/ +cp -a /ventoy_rdroot/lib64/ld-* /lib64/ + +umount /ventoy_rdroot + +vtlog "=========================================" +vtlog "===== e2fsck -y -v /dev/ventoy1 =====" +e2fsck -y -v /dev/ventoy1 >>$VTLOG 2>&1 +vtlog "===== e2fsck -y -v /dev/ventoy3 =====" +e2fsck -y -v /dev/ventoy3 >>$VTLOG 2>&1 +vtlog "===== e2fsck -y -v /dev/ventoy8 =====" +e2fsck -y -v /dev/ventoy8 >>$VTLOG 2>&1 +vtlog "=========================================" + +vtlog "proc devtmpfs ..." +mkdir /newdev +mount -t devtmpfs dev /newdev + +cp -a /dev/mapper/ventoy* /newdev/mapper/ +cp -a /dev/ventoy* /newdev/ + + +vtshortname="${vtdiskname#/dev/}" +mv /newdev/${vtshortname} /newdev/backup_${vtshortname} +cp -a /dev/ventoy /newdev/${vtshortname} + +for i in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20; do + if [ -e /dev/ventoy${i} ]; then + if echo $vtdiskname | egrep -q "nvme|mmc|nbd"; then + vtpart=p$i + else + vtpart=$i + fi + + if [ -e /newdev/${vtshortname}${vtpart} ]; then + mv /newdev/${vtshortname}${vtpart} /newdev/backup_${vtshortname}${vtpart} + fi + + cp -a /dev/ventoy${i} /newdev/${vtshortname}${vtpart} + + if [ $i -eq 3 ]; then + [ -e /dev/${vtshortname}${vtpart} ] && rm -f /dev/${vtshortname}${vtpart} + cp -a /dev/ventoy${i} /dev/${vtshortname}${vtpart} + vt_root_dev="/dev/${vtshortname}${vtpart}" + vtlog "vt_root_dev=$vt_root_dev" + fi + fi +done + +cp -a $VTLOG /newdev/ventoy.log +umount /newdev + +mount -o ro $vt_root_dev /ventoy_rdroot +mount -t devtmpfs dev /ventoy_rdroot/dev + +PATH=$VTPATH_OLD diff --git a/IMG/cpio/ventoy/loop/fydeos/ventoy-hook.sh b/IMG/cpio/ventoy/loop/fydeos/ventoy-hook.sh new file mode 100644 index 00000000..b2a586d7 --- /dev/null +++ b/IMG/cpio/ventoy/loop/fydeos/ventoy-hook.sh @@ -0,0 +1,134 @@ +#!/ventoy/busybox/sh +#************************************************************************************ +# Copyright (c) 2021, longpanda +# +# 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 . +# +#************************************************************************************ + +. /ventoy/hook/ventoy-hook-lib.sh + +vtlog "####### $0 $* ########" + +VTPATH_OLD=$PATH; PATH=$BUSYBOX_PATH:$VTOY_PATH/tool:$PATH + +mkdir /sys +mount -t sysfs sys /sys +mdev -s +sleep 2 + +while [ -n "Y" ]; do + usb_disk=$(get_ventoy_disk_name) + + if echo $usb_disk | egrep -q "nvme|mmc|nbd"; then + vtpart2=${usb_disk}p2 + else + vtpart2=${usb_disk}2 + fi + + if [ -e "${vtpart2}" ]; then + break + else + sleep 2 + mdev -s + fi +done + +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" + +blkdev_num=$($VTOY_PATH/tool/dmsetup ls | grep ventoy | sed 's/.*(\([0-9][0-9]*\),.*\([0-9][0-9]*\).*/\1:\2/') +vtDM=$(ventoy_find_dm_id ${blkdev_num}) +echo -n $vtDM > /ventoy/vtDM + +ventoy_create_dev_ventoy_part +mdev -s + +vtlog "copy out the e2fsck program ..." +mkdir /ventoy_rdroot +mkdir -p /lib /lib64 /usr/lib64 /sbin + +mount -o ro /dev/ventoy3 /ventoy_rdroot >>$VTLOG 2>&1 +cp -a /ventoy_rdroot/sbin/e2fsck /sbin/ +cp -a /ventoy_rdroot/usr/lib64/libext2fs* /usr/lib64/ +cp -a /ventoy_rdroot/usr/lib64/libcom_err* /usr/lib64/ +cp -a /ventoy_rdroot/usr/lib64/libe2p* /usr/lib64/ +cp -a /ventoy_rdroot/lib64/libblk* /lib64/ +cp -a /ventoy_rdroot/lib64/libuuid* /lib64/ +cp -a /ventoy_rdroot/lib64/libdl.* /lib64/ +cp -a /ventoy_rdroot/lib64/libdl-* /lib64/ +cp -a /ventoy_rdroot/lib64/libc.* /lib64/ +cp -a /ventoy_rdroot/lib64/libc-* /lib64/ +cp -a /ventoy_rdroot/lib64/libpthread* /lib64/ +cp -a /ventoy_rdroot/lib64/ld-* /lib64/ + +umount /ventoy_rdroot + +vtlog "=========================================" +vtlog "===== e2fsck -y -v /dev/ventoy1 =====" +e2fsck -y -v /dev/ventoy1 >>$VTLOG 2>&1 +vtlog "===== e2fsck -y -v /dev/ventoy3 =====" +e2fsck -y -v /dev/ventoy3 >>$VTLOG 2>&1 +vtlog "===== e2fsck -y -v /dev/ventoy8 =====" +e2fsck -y -v /dev/ventoy8 >>$VTLOG 2>&1 +vtlog "=========================================" + +vtlog "proc devtmpfs ..." +mkdir /newdev +mount -t devtmpfs dev /newdev + +cp -a /dev/mapper/ventoy* /newdev/mapper/ +cp -a /dev/ventoy* /newdev/ + + +vtshortname="${vtdiskname#/dev/}" +mv /newdev/${vtshortname} /newdev/backup_${vtshortname} +cp -a /dev/ventoy /newdev/${vtshortname} + +for i in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20; do + if [ -e /dev/ventoy${i} ]; then + if echo $vtdiskname | egrep -q "nvme|mmc|nbd"; then + vtpart=p$i + else + vtpart=$i + fi + + if [ -e /newdev/${vtshortname}${vtpart} ]; then + mv /newdev/${vtshortname}${vtpart} /newdev/backup_${vtshortname}${vtpart} + fi + + cp -a /dev/ventoy${i} /newdev/${vtshortname}${vtpart} + + if [ $i -eq 3 ]; then + [ -e /dev/${vtshortname}${vtpart} ] && rm -f /dev/${vtshortname}${vtpart} + cp -a /dev/ventoy${i} /dev/${vtshortname}${vtpart} + vt_root_dev="/dev/${vtshortname}${vtpart}" + vtlog "vt_root_dev=$vt_root_dev" + fi + fi +done + +cp -a $VTLOG /newdev/ventoy.log +umount /newdev + +mount -o ro $vt_root_dev /ventoy_rdroot +mount -t devtmpfs dev /ventoy_rdroot/dev + +PATH=$VTPATH_OLD diff --git a/INSTALL/grub/grub.cfg b/INSTALL/grub/grub.cfg index e596a0aa..45694c73 100644 --- a/INSTALL/grub/grub.cfg +++ b/INSTALL/grub/grub.cfg @@ -1499,6 +1499,12 @@ function vtoy_unsupport_menuentry { #============================================================# # +function only_uefi_tip { + echo -e "\n This IMG file is only supported in UEFI mode. \n" + echo -e " 此 IMG 文件只支持在 UEFI 模式下启动。\n" + echo -e "\npress ENTER to exit (请按 回车 键返回) ..." + read vtInputKey +} function ventoy_img_easyos { vt_load_cpio $vtoy_path "${vt_chosen_path}" ${vtoy_iso_part} "busybox=$ventoy_busybox_ver" @@ -1742,6 +1748,74 @@ function ventoy_img_tails { vt_unset_boot_opt } +function ventoy_img_fydeos { + if [ "$grub_platform" = "pc" ]; then + only_uefi_tip + return + fi + + vt_load_cpio $vtoy_path "${vt_chosen_path}" ${vtoy_iso_part} "busybox=64" + vt_trailer_cpio ${vtoy_iso_part} "${vt_chosen_path}" noinit + + ventoy_debug_pause + + #boot image file + vt_set_boot_opt rdinit=/vtoy/vtoy ventoyos=fydeos + vt_img_hook_root + + set grubdisk=vtimghd + set grubpartA=(vtimghd,3) + set grubpartB=(vtimghd,5) + set linuxpartA=(sda,3) + set linuxpartB=(sda,5) + + set root=(vtimghd,12) + configfile (vtimghd,12)/efi/boot/grub.cfg + + vt_img_unhook_root + vt_unset_boot_opt + + unset grubdisk + unset grubpartA + unset grubpartB + unset linuxpartA + unset linuxpartB +} + +function ventoy_img_cloudready { + if [ "$grub_platform" = "pc" ]; then + only_uefi_tip + return + fi + + vt_load_cpio $vtoy_path "${vt_chosen_path}" ${vtoy_iso_part} "busybox=64" + vt_trailer_cpio ${vtoy_iso_part} "${vt_chosen_path}" noinit + + ventoy_debug_pause + + #boot image file + vt_set_boot_opt rdinit=/vtoy/vtoy ventoyos=cloudready + vt_img_hook_root + + set grubdisk=vtimghd + set grubpartA=(vtimghd,3) + set grubpartB=(vtimghd,5) + set linuxpartA=(sda,3) + set linuxpartB=(sda,5) + + set root=(vtimghd,12) + configfile (vtimghd,12)/efi/boot/grub.cfg + + vt_img_unhook_root + vt_unset_boot_opt + + unset grubdisk + unset grubpartA + unset grubpartB + unset linuxpartA + unset linuxpartB +} + function ventoy_img_memtest86 { chainloader (vtimghd,1)/efi/boot/BOOTX64.efi boot @@ -1800,19 +1874,26 @@ function img_common_menuentry { vt_get_fs_label (vtimghd,1) vtImgHd1Label - if [ -d (vtimghd,2)/lib ]; then + + if [ "$vtImgHd1Label" = "STATE" ]; then + vt_get_fs_label (vtimghd,3) vtImgHd3Label + elif [ -d (vtimghd,2)/lib ]; then vt_get_fs_label (vtimghd,2) vtImgHd2Label fi - + if [ -e (vtimghd,1)/etc/hostname ]; then vt_1st_line (vtimghd,1)/etc/hostname vtImgHostname fi - - - if [ -e (vtimghd,1)/easy.sfs ]; then - ventoy_img_easyos - elif [ -e (vtimghd,1)/volumio.initrd ]; then - ventoy_img_volumio + + if vt_str_begin "$vtImgHd3Label" "ROOT-"; then + if [ -f (vtimghd,3)/etc/os-release.d/ID ]; then + vt_1st_line (vtimghd,3)/etc/os-release.d/ID vt_release_line1 + if [ vt_str_begin "$vt_release_line1" "FydeOS" ]; then + ventoy_img_fydeos + fi + elif [ -f (vtimghd,3)/etc/cloudready-release ]; then + ventoy_img_cloudready + fi elif vt_str_begin "$vtImgHd1Label" "LAKKA"; then ventoy_img_openelec lakka elif vt_str_begin "$vtImgHd1Label" "LIBREELEC"; then @@ -1827,6 +1908,10 @@ function img_common_menuentry { ventoy_img_tails elif [ "$vtImgHd2Label" = "RECALBOX" ]; then ventoy_img_recalbox + elif [ -e (vtimghd,1)/easy.sfs ]; then + ventoy_img_easyos + elif [ -e (vtimghd,1)/volumio.initrd ]; then + ventoy_img_volumio elif [ -f (vtimghd,2)/loader/entries/ubos.conf ]; then ventoy_img_ubos elif [ -f (vtimghd,2)/etc/openwrt_version ]; then @@ -1836,7 +1921,7 @@ function img_common_menuentry { img_unsupport_tip else ventoy_img_memtest86 - fi + fi else vt_linux_chain_data "${vtoy_iso_part}${vt_chosen_path}" ventoy_acpi_param ${vtoy_chain_mem_addr} 512 @@ -1870,7 +1955,7 @@ function img_unsupport_menuentry { ############################################################# ############################################################# -set VENTOY_VERSION="1.0.50" +set VENTOY_VERSION="1.0.51" #ACPI not compatible with Window7/8, so disable by default set VTOY_PARAM_NO_ACPI=1