From b347c1b5da1852eabaf0c3a15476ea0cd6b28e2e Mon Sep 17 00:00:00 2001 From: longpanda Date: Fri, 25 Jun 2021 11:49:45 +0800 Subject: [PATCH] Optimization for booting OpenWrt --- .../grub-2.04/grub-core/ventoy/ventoy_cmd.c | 31 ++++++++-- IMG/cpio/ventoy/loop/openwrt/ventoy-disk.sh | 53 ++++++++++++++++++ IMG/cpio/ventoy/loop/openwrt/ventoy-hook.sh | 29 ---------- INSTALL/grub/grub.cfg | 25 ++++++--- INSTALL/tool/aarch64/vtoygpt | Bin 97136 -> 97136 bytes INSTALL/tool/i386/vtoygpt | Bin 22144 -> 22144 bytes INSTALL/tool/mips64el/vtoygpt | Bin 60576 -> 60576 bytes INSTALL/tool/x86_64/vtoygpt | Bin 19304 -> 19304 bytes 8 files changed, 96 insertions(+), 42 deletions(-) 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 6826e25f..6f9d7262 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 @@ -4204,8 +4204,18 @@ static int ventoy_fs_enum_1st_file(const char *filename, const struct grub_dirho return 0; } +static int ventoy_fs_enum_1st_dir(const char *filename, const struct grub_dirhook_info *info, void *data) +{ + if (info->dir && filename && filename[0] != '.') + { + grub_snprintf((char *)data, 256, "%s", filename); + return 1; + } -static grub_err_t ventoy_cmd_fs_enum_1st_file(grub_extcmd_context_t ctxt, int argc, char **args) + return 0; +} + +static grub_err_t ventoy_fs_enum_1st_child(int argc, char **args, grub_fs_dir_hook_t hook) { int rc = 1; char *device_name = NULL; @@ -4213,11 +4223,9 @@ static grub_err_t ventoy_cmd_fs_enum_1st_file(grub_extcmd_context_t ctxt, int ar grub_fs_t fs = NULL; char name[256] ={0}; - (void)ctxt; - if (argc != 3) { - debug("ventoy_cmd_fs_enum_1st_file, invalid param num %d\n", argc); + debug("ventoy_fs_enum_1st_child, invalid param num %d\n", argc); return 1; } @@ -4242,7 +4250,7 @@ static grub_err_t ventoy_cmd_fs_enum_1st_file(grub_extcmd_context_t ctxt, int ar goto end; } - fs->fs_dir(dev, args[1], ventoy_fs_enum_1st_file, name); + fs->fs_dir(dev, args[1], hook, name); if (name[0]) { ventoy_set_env(args[2], name); @@ -4258,6 +4266,18 @@ end: return rc; } +static grub_err_t ventoy_cmd_fs_enum_1st_file(grub_extcmd_context_t ctxt, int argc, char **args) +{ + (void)ctxt; + return ventoy_fs_enum_1st_child(argc, args, ventoy_fs_enum_1st_file); +} + +static grub_err_t ventoy_cmd_fs_enum_1st_dir(grub_extcmd_context_t ctxt, int argc, char **args) +{ + (void)ctxt; + return ventoy_fs_enum_1st_child(argc, args, ventoy_fs_enum_1st_dir); +} + static grub_err_t ventoy_cmd_basename(grub_extcmd_context_t ctxt, int argc, char **args) { char c; @@ -4491,6 +4511,7 @@ static cmd_para ventoy_cmds[] = { "vt_check_part_exist", ventoy_cmd_part_exist, 0, NULL, "", "", NULL }, { "vt_get_fs_label", ventoy_cmd_get_fs_label, 0, NULL, "", "", NULL }, { "vt_fs_enum_1st_file", ventoy_cmd_fs_enum_1st_file, 0, NULL, "", "", NULL }, + { "vt_fs_enum_1st_dir", ventoy_cmd_fs_enum_1st_dir, 0, NULL, "", "", NULL }, { "vt_file_basename", ventoy_cmd_basename, 0, NULL, "", "", NULL }, { "vt_file_basefile", ventoy_cmd_basefile, 0, NULL, "", "", NULL }, { "vt_enum_video_mode", ventoy_cmd_enum_video_mode, 0, NULL, "", "", NULL }, diff --git a/IMG/cpio/ventoy/loop/openwrt/ventoy-disk.sh b/IMG/cpio/ventoy/loop/openwrt/ventoy-disk.sh index 0345da61..a59e8948 100644 --- a/IMG/cpio/ventoy/loop/openwrt/ventoy-disk.sh +++ b/IMG/cpio/ventoy/loop/openwrt/ventoy-disk.sh @@ -27,6 +27,59 @@ vtlog "####### $0 $* ########" VTPATH_OLD=$PATH; PATH=$BUSYBOX_PATH:$VTOY_PATH/tool:$PATH + +check_insmod() { + if [ -f "$1" ]; then + vtlog "insmod $1" + insmod "$1" >> $VTOY_PATH/log 2>&1 + else + vtlog "$1 not exist" + fi +} + +wrt_insmod() { + kbit=$1 + kv=$(uname -r) + + vtlog "insmod $kv $kbit" + + check_insmod /ventoy_openwrt/$kv/$kbit/dax.ko + check_insmod /ventoy_openwrt/$kv/$kbit/dm-mod.ko +} + +insmod_dm_mod() { + if grep -q "device-mapper" /proc/devices; then + vtlog "device-mapper enabled by system 0" + return + fi + + check_insmod /ventoy/modules/dax.ko + check_insmod /ventoy/modules/dm-mod.ko + + if grep -q "device-mapper" /proc/devices; then + vtlog "device-mapper enabled by system 1" + return + fi + + if [ -f /ventoy_openwrt.xz ]; then + tar xf /ventoy_openwrt.xz -C / + rm -f /ventoy_openwrt.xz + fi + + if uname -m | egrep -q "amd64|x86_64"; then + wrt_insmod 64 + else + wrt_insmod generic + if lsmod | grep -q 'dm-mod'; then + vterr "insmod generic failed" + else + wrt_insmod legacy + fi + fi +} + +insmod_dm_mod + for i in $(ls /sys/class/block/); do if ! [ -e /dev/$i ]; then blkdev_num=$(sed 's/:/ /g' /sys/class/block/$i/dev) diff --git a/IMG/cpio/ventoy/loop/openwrt/ventoy-hook.sh b/IMG/cpio/ventoy/loop/openwrt/ventoy-hook.sh index 7f822de2..f6c1c8c6 100644 --- a/IMG/cpio/ventoy/loop/openwrt/ventoy-hook.sh +++ b/IMG/cpio/ventoy/loop/openwrt/ventoy-hook.sh @@ -21,37 +21,8 @@ VTPATH_OLD=$PATH; PATH=$BUSYBOX_PATH:$VTOY_PATH/tool:$PATH -wrt_insmod() { - kbit=$1 - kv=$(uname -r) - - echo "insmod $kv $kbit" >> $VTOY_PATH/log - - [ -f /ventoy_openwrt/$kv/$kbit/dax.ko ] && insmod /ventoy_openwrt/$kv/$kbit/dax.ko > /dev/null 2>&1 - [ -f /ventoy_openwrt/$kv/$kbit/dm-mod.ko ] && insmod /ventoy_openwrt/$kv/$kbit/dm-mod.ko > /dev/null 2>&1 -} - - mkdir /sys mount -t sysfs sys /sys mdev -s - -if [ -f /ventoy_openwrt.xz ]; then - tar xf /ventoy_openwrt.xz -C / - rm -f /ventoy_openwrt.xz -fi - - -if uname -m | egrep -q "amd64|x86_64"; then - wrt_insmod 64 -else - wrt_insmod generic - if lsmod | grep -q 'dm-mod'; then - echo "insmod generic failed" >> $VTOY_PATH/log - else - wrt_insmod legacy - fi -fi - sh $VTOY_PATH/loop/openwrt/ventoy-disk.sh diff --git a/INSTALL/grub/grub.cfg b/INSTALL/grub/grub.cfg index 2ea25859..7f3347da 100644 --- a/INSTALL/grub/grub.cfg +++ b/INSTALL/grub/grub.cfg @@ -1626,14 +1626,23 @@ function ventoy_img_openwrt { set ventoy_busybox_ver=64 fi - if [ ! -f ${vtoy_iso_part}/ventoy/ventoy_openwrt.xz ]; then - ventoy_gui_console - echo -e "\n ventoy_openwrt.xz not found. Please refer https://www.ventoy.net/en/doc_openwrt.html.\n" - echo -e " 未找到 ventoy_openwrt.xz 文件。请参考 https://www.ventoy.net/cn/doc_openwrt.html\n" - echo -e "\n press ENTER to exit (请按 回车 键返回) ..." - read vtInputKey - ventoy_cli_console - return + vt_fs_enum_1st_dir (vtimghd,2) /lib/modules/ vt_dir_name + + if [ -f (vtimghd,2)/lib/modules/$vt_dir_name/dm-mod.ko ]; then + vt_img_extra_initrd_append (vtimghd,2)/lib/modules/$vt_dir_name/dm-mod.ko + if [ -f (vtimghd,2)/lib/modules/$vt_dir_name/dax.ko ]; then + vt_img_extra_initrd_append (vtimghd,2)/lib/modules/$vt_dir_name/dax.ko + fi + else + if [ ! -f ${vtoy_iso_part}/ventoy/ventoy_openwrt.xz ]; then + ventoy_gui_console + echo -e "\n ventoy_openwrt.xz not found. Please refer https://www.ventoy.net/en/doc_openwrt.html.\n" + echo -e " 未找到 ventoy_openwrt.xz 文件。请参考 https://www.ventoy.net/cn/doc_openwrt.html\n" + echo -e "\n press ENTER to exit (请按 回车 键返回) ..." + read vtInputKey + ventoy_cli_console + return + fi fi if vt_img_check_range "${vtoy_iso_part}${vt_chosen_path}"; then diff --git a/INSTALL/tool/aarch64/vtoygpt b/INSTALL/tool/aarch64/vtoygpt index 978b10cda5681a5b2f6a7d0724a98bca86653b6b..420aefca5116510375ba33881e1f1fac9b7f6125 100644 GIT binary patch delta 21 dcmezHjrGGf)(tnAn7EyqZ!>Mb&BQph0swdp39|qI delta 21 dcmezHjrGGf)(tnAnAjbgZ!>Mb&BQph0swc|39bMD diff --git a/INSTALL/tool/i386/vtoygpt b/INSTALL/tool/i386/vtoygpt index 1916a57f1e42d4d158fd2c44625cb2f2090958b6..127f080c5bd351fd85d6e4a93dcee4f93b800bf9 100644 GIT binary patch delta 46 zcmV+}0MY+|tpR|o0g&Vr>vnMo26^Lhl0LX_((3_^RgKYevG|Dr0l<@j0#558 G0)a^KQxq-$ delta 48 zcmV-00MGyEmI3IN0kCKR6jn)w1Eow5vnQJcD7OcN$&Njd9J71@9037