From 34a36bfc3e1b39334a1a20bfbd1c49ed9fde8513 Mon Sep 17 00:00:00 2001 From: longpanda Date: Sun, 6 Feb 2022 00:25:27 +0800 Subject: [PATCH] Fix the issue when booting the latest recalbox img file. (#1423) --- .../grub-2.04/grub-core/ventoy/ventoy_cmd.c | 12 +++++ IMG/cpio/ventoy/hook/ventoy-hook-lib.sh | 10 ++++- .../loop/recalbox/ventoy-create-part.sh | 45 +++++++++++++++++++ IMG/cpio/ventoy/loop/recalbox/ventoy-disk.sh | 5 +++ IMG/cpio/ventoy/loop/recalbox/ventoy-hook.sh | 2 + IMG/cpio/ventoy/loop/recalbox/ventoy-share.sh | 15 +++++++ INSTALL/grub/grub.cfg | 16 ++++++- 7 files changed, 102 insertions(+), 3 deletions(-) create mode 100644 IMG/cpio/ventoy/loop/recalbox/ventoy-create-part.sh create mode 100644 IMG/cpio/ventoy/loop/recalbox/ventoy-share.sh 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 b5233cce..158d1658 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 @@ -124,6 +124,7 @@ static int g_list_script_pos = 0; static char *g_part_list_buf = NULL; static int g_part_list_pos = 0; +static grub_uint64_t g_part_end_max = 0; static int g_video_mode_max = 0; static int g_video_mode_num = 0; @@ -3646,6 +3647,7 @@ end: static int ventoy_img_partition_callback (struct grub_disk *disk, const grub_partition_t partition, void *data) { + grub_uint64_t end_max = 0; int *pCnt = (int *)data; (void)disk; @@ -3654,6 +3656,12 @@ static int ventoy_img_partition_callback (struct grub_disk *disk, const grub_par 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); + + end_max = (partition->len + partition->start) * 512; + if (end_max > g_part_end_max) + { + g_part_end_max = end_max; + } return 0; } @@ -3668,6 +3676,7 @@ static grub_err_t ventoy_cmd_img_part_info(grub_extcmd_context_t ctxt, int argc, (void)ctxt; g_part_list_pos = 0; + g_part_end_max = 0; grub_env_unset("vtoy_img_part_file"); if (argc != 1) @@ -3696,6 +3705,9 @@ static grub_err_t ventoy_cmd_img_part_info(grub_extcmd_context_t ctxt, int argc, grub_snprintf(buf, sizeof(buf), "%d", cnt); grub_env_set("vtoy_img_part_cnt", buf); + + grub_snprintf(buf, sizeof(buf), "%llu", (ulonglong)g_part_end_max); + grub_env_set("vtoy_img_max_part_end", buf); end: diff --git a/IMG/cpio/ventoy/hook/ventoy-hook-lib.sh b/IMG/cpio/ventoy/hook/ventoy-hook-lib.sh index 067bfc4b..c2f426a7 100644 --- a/IMG/cpio/ventoy/hook/ventoy-hook-lib.sh +++ b/IMG/cpio/ventoy/hook/ventoy-hook-lib.sh @@ -312,7 +312,10 @@ ventoy_dm_patch() { vtKv=$($BUSYBOX_PATH/uname -r) - if [ -d /lib/modules/$vtKv/kernel/fs ]; then + if [ ! -d /lib/modules/$vtKv ]; then + vtlog "No modules directory found" + return + elif [ -d /lib/modules/$vtKv/kernel/fs ]; then vtModPath=$($FIND /lib/modules/$vtKv/kernel/fs/ -name "*.ko*" | $HEAD -n1) else vtModPath=$($FIND /lib/modules/$vtKv/kernel/ -name "xfs.ko*" | $HEAD -n1) @@ -326,7 +329,10 @@ ventoy_dm_patch() { vtlog "template module is $vtModPath $vtModName" - if echo $vtModPath | $GREP -q "[.]ko$"; then + if [ -z "$vtModPath" ]; then + vtlog "No template module found" + return + elif echo $vtModPath | $GREP -q "[.]ko$"; then $BUSYBOX_PATH/cp -a $vtModPath $VTOY_PATH/$vtModName elif echo $vtModPath | $GREP -q "[.]ko[.]xz$"; then $BUSYBOX_PATH/xzcat $vtModPath > $VTOY_PATH/$vtModName diff --git a/IMG/cpio/ventoy/loop/recalbox/ventoy-create-part.sh b/IMG/cpio/ventoy/loop/recalbox/ventoy-create-part.sh new file mode 100644 index 00000000..e7edeb0c --- /dev/null +++ b/IMG/cpio/ventoy/loop/recalbox/ventoy-create-part.sh @@ -0,0 +1,45 @@ +#!/ventoy/busybox/sh +#************************************************************************************ +# Copyright (c) 2020, 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 + +VTPATH_OLD=$PATH; PATH=$BUSYBOX_PATH:$VTOY_PATH/tool:$PATH + +if [ -f /vtoy_dm_table ]; then + vtPartCnt=$(cat /vtoy_dm_table | wc -l) + if [ $vtPartCnt -ne 1 ]; then + exit 0 + fi +else + exit 0 +fi + +vtlog "try patch init script" + +if [ -f /new_root/etc/init.d/S11share ]; then + cp -a /new_root/etc/init.d/S11share /new_root/overlay/S11share + sed "/^ *createMissingPartitions *$/r $VTOY_PATH/loop/recalbox/ventoy-share.sh" -i /new_root/overlay/S11share + + vtFile=$(ls -1 /new_root/etc/init.d/ | grep -m1 S01) + + mount --bind /new_root/overlay/S11share /new_root/etc/init.d/$vtFile + vtlog "patch S11share to $vtFile" +fi + +PATH=$VTPATH_OLD diff --git a/IMG/cpio/ventoy/loop/recalbox/ventoy-disk.sh b/IMG/cpio/ventoy/loop/recalbox/ventoy-disk.sh index 08c9d73d..3c6b6ee2 100644 --- a/IMG/cpio/ventoy/loop/recalbox/ventoy-disk.sh +++ b/IMG/cpio/ventoy/loop/recalbox/ventoy-disk.sh @@ -36,10 +36,15 @@ if [ "$vtdiskname" = "unknown" ]; then exit 0 fi +if [ -f $VTOY_PATH/modules/dm-mod.ko ]; then + insmod $VTOY_PATH/modules/dm-mod.ko +fi + ventoy_udev_disk_common_hook "${vtdiskname#/dev/}2" "noreplace" ventoy_create_dev_ventoy_part + PATH=$VTPATH_OLD set_ventoy_hook_finish diff --git a/IMG/cpio/ventoy/loop/recalbox/ventoy-hook.sh b/IMG/cpio/ventoy/loop/recalbox/ventoy-hook.sh index b1a6ed3e..881c236c 100644 --- a/IMG/cpio/ventoy/loop/recalbox/ventoy-hook.sh +++ b/IMG/cpio/ventoy/loop/recalbox/ventoy-hook.sh @@ -20,4 +20,6 @@ . $VTOY_PATH/hook/ventoy-os-lib.sh $SED "/mount.*devtmpfs/a\ $BUSYBOX_PATH/sh $VTOY_PATH/loop/recalbox/ventoy-disk.sh" -i /init +$SED "/switch_root/i\ $BUSYBOX_PATH/sh $VTOY_PATH/loop/recalbox/ventoy-create-part.sh" -i /init +#$SED "/switch_root/i\ exec /ventoy/busybox/sh" -i /init diff --git a/IMG/cpio/ventoy/loop/recalbox/ventoy-share.sh b/IMG/cpio/ventoy/loop/recalbox/ventoy-share.sh new file mode 100644 index 00000000..157f5f81 --- /dev/null +++ b/IMG/cpio/ventoy/loop/recalbox/ventoy-share.sh @@ -0,0 +1,15 @@ +echo '#################################################' > /dev/console +echo '#################################################' > /dev/console +echo '### PLEASE REBOOT AND BOOT FROM VENTOY AGAIN ###' > /dev/console +echo '#################################################' > /dev/console +echo '#################################################' > /dev/console + +echo '#################################################' > /dev/tty0 +echo '#################################################' > /dev/tty0 +echo '### PLEASE REBOOT AND BOOT FROM VENTOY AGAIN ###' > /dev/tty0 +echo '#################################################' > /dev/tty0 +echo '#################################################' > /dev/tty0 + + +sync +sleep 3600 diff --git a/INSTALL/grub/grub.cfg b/INSTALL/grub/grub.cfg index 4840c576..950d38ce 100644 --- a/INSTALL/grub/grub.cfg +++ b/INSTALL/grub/grub.cfg @@ -1688,9 +1688,23 @@ function ventoy_img_ubos { } function ventoy_img_recalbox { + if [ $vtoy_img_max_part_end -gt $vt_chosen_size ]; then + echo -e "\nPlease extend the img file size before boot it. \n" + ventoy_pause + return + fi + vt_load_cpio $vtoy_path "${vt_chosen_path}" ${vtoy_iso_part} "busybox=$ventoy_busybox_ver" vt_trailer_cpio ${vtoy_iso_part} "${vt_chosen_path}" noinit + if [ -e (vtimghd,1)/boot/recalbox ]; then + loopback recalbox (vtimghd,1)/boot/recalbox + vt_get_lib_module_ver (recalbox) /lib/modules/ vt_module_ver + if [ -n "$vt_module_ver" ]; then + vt_img_extra_initrd_append (recalbox)/lib/modules/$vt_module_ver/kernel/drivers/md/dm-mod.ko + fi + fi + ventoy_debug_pause #boot image file @@ -1971,7 +1985,7 @@ function img_common_menuentry { ventoy_img_batocera elif vt_str_begin "$vtImgHd1Label" "Tails"; then ventoy_img_tails - elif [ "$vtImgHd2Label" = "RECALBOX" ]; then + elif [ "$vtImgHd2Label" = "RECALBOX" -o "$vtImgHd1Label" = "RECALBOX" ]; then ventoy_img_recalbox elif [ "$vtImgHd1Label" = "ESYSRESCUE" ]; then ventoy_img_esysrescue