]> glassweightruler.freedombox.rocks Git - Ventoy.git/commitdiff
Fix the issue when booting the latest recalbox img file. (#1423)
authorlongpanda <admin@ventoy.net>
Sat, 5 Feb 2022 16:25:27 +0000 (00:25 +0800)
committerlongpanda <admin@ventoy.net>
Sat, 5 Feb 2022 16:25:27 +0000 (00:25 +0800)
GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_cmd.c
IMG/cpio/ventoy/hook/ventoy-hook-lib.sh
IMG/cpio/ventoy/loop/recalbox/ventoy-create-part.sh [new file with mode: 0644]
IMG/cpio/ventoy/loop/recalbox/ventoy-disk.sh
IMG/cpio/ventoy/loop/recalbox/ventoy-hook.sh
IMG/cpio/ventoy/loop/recalbox/ventoy-share.sh [new file with mode: 0644]
INSTALL/grub/grub.cfg

index b5233ccedcc3b15667d39220c07ccdca232ffce3..158d1658de8936819314c5cdeaa4be7411a32dea 100644 (file)
@@ -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:
 
index 067bfc4b0d73577da891a8a93a156baeb5b7d8ff..c2f426a7b17efd348a31bb5e2d0d9d1da2db3f99 100644 (file)
@@ -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 (file)
index 0000000..e7edeb0
--- /dev/null
@@ -0,0 +1,45 @@
+#!/ventoy/busybox/sh
+#************************************************************************************
+# Copyright (c) 2020, longpanda <admin@ventoy.net>
+# 
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License as
+# published by the Free Software Foundation; either version 3 of the
+# License, or (at your option) any later version.
+# 
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, see <http://www.gnu.org/licenses/>.
+# 
+#************************************************************************************
+
+. /ventoy/hook/ventoy-hook-lib.sh
+
+VTPATH_OLD=$PATH; PATH=$BUSYBOX_PATH:$VTOY_PATH/tool:$PATH
+
+if [ -f /vtoy_dm_table ]; then
+    vtPartCnt=$(cat /vtoy_dm_table | wc -l)
+    if [ $vtPartCnt -ne 1 ]; then
+        exit 0
+    fi
+else
+    exit 0
+fi
+
+vtlog "try patch init script"
+
+if [ -f /new_root/etc/init.d/S11share ]; then
+    cp -a /new_root/etc/init.d/S11share /new_root/overlay/S11share
+    sed "/^ *createMissingPartitions *$/r $VTOY_PATH/loop/recalbox/ventoy-share.sh" -i /new_root/overlay/S11share
+    
+    vtFile=$(ls -1 /new_root/etc/init.d/ | grep -m1 S01)
+    
+    mount --bind /new_root/overlay/S11share  /new_root/etc/init.d/$vtFile
+    vtlog "patch S11share to $vtFile"
+fi
+
+PATH=$VTPATH_OLD
index 08c9d73d5c252bc779d3b4bc3da14908c889dae7..3c6b6ee2d827e9e2472b1af0209023780e78056b 100644 (file)
@@ -36,10 +36,15 @@ if [ "$vtdiskname" = "unknown" ]; then
     exit 0
 fi
 
+if [ -f $VTOY_PATH/modules/dm-mod.ko ]; then
+    insmod $VTOY_PATH/modules/dm-mod.ko
+fi
+
 ventoy_udev_disk_common_hook "${vtdiskname#/dev/}2" "noreplace"
 
 ventoy_create_dev_ventoy_part
 
+
 PATH=$VTPATH_OLD
 
 set_ventoy_hook_finish
index b1a6ed3e52679b2801a1ed9b50da8e2614dbb798..881c236c8e09346422a36a65b58b372b1d1ade8f 100644 (file)
@@ -20,4 +20,6 @@
 . $VTOY_PATH/hook/ventoy-os-lib.sh
 
 $SED "/mount.*devtmpfs/a\ $BUSYBOX_PATH/sh $VTOY_PATH/loop/recalbox/ventoy-disk.sh" -i /init
+$SED "/switch_root/i\ $BUSYBOX_PATH/sh $VTOY_PATH/loop/recalbox/ventoy-create-part.sh" -i /init
 
+#$SED "/switch_root/i\ exec /ventoy/busybox/sh" -i /init
diff --git a/IMG/cpio/ventoy/loop/recalbox/ventoy-share.sh b/IMG/cpio/ventoy/loop/recalbox/ventoy-share.sh
new file mode 100644 (file)
index 0000000..157f5f8
--- /dev/null
@@ -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
index 4840c576f262a20dad92b09c08fa4438b4327eed..950d38ced7283e2b6f132b7a15fc39f986303fcc 100644 (file)
@@ -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