X-Git-Url: https://glassweightruler.freedombox.rocks/gitweb/Ventoy.git/blobdiff_plain/6b22a6200e8f72d3260d292800a8786666623bfc..17f9e2fd09d973d39885348fee4906da3aa190ac:/INSTALL/grub/grub.cfg diff --git a/INSTALL/grub/grub.cfg b/INSTALL/grub/grub.cfg index a53de0a..8b5396f 100644 --- a/INSTALL/grub/grub.cfg +++ b/INSTALL/grub/grub.cfg @@ -599,33 +599,36 @@ function ventoy_unix_comm_proc { function uefi_windows_menu_func { vt_windows_reset + unset vt_cur_wimboot_mode if vt_check_mode 4 "$vt_chosen_name"; then - vt_windows_chain_data "${1}${chosen_path}" - ventoy_debug_pause - vtoy_wimboot_func - else - if [ "$ventoy_compatible" = "NO" ]; then - - if [ "$ventoy_fs_probe" = "iso9660" ]; then - loopback -d loop - vt_iso9660_nojoliet 1 - loopback loop "$1$2" - fi - - for file in "efi/microsoft/boot/bcd"; do - vt_windows_collect_wim_patch bcd (loop)/$file - done + set vt_cur_wimboot_mode=1 + fi - vt_windows_count_wim_patch vt_wim_cnt - if [ $vt_wim_cnt -eq 0 ]; then - distro_specify_wim_patch_phase2 - fi - - ventoy_debug_pause - locate_wim "${chosen_path}" + if [ "$ventoy_compatible" = "NO" -o "$vt_cur_wimboot_mode" = "1" ]; then + if [ "$ventoy_fs_probe" = "iso9660" ]; then + loopback -d loop + vt_iso9660_nojoliet 1 + loopback loop "$1$2" fi - vt_windows_chain_data "${1}${chosen_path}" - ventoy_debug_pause + + for file in "efi/microsoft/boot/bcd"; do + vt_windows_collect_wim_patch bcd (loop)/$file + done + + vt_windows_count_wim_patch vt_wim_cnt + if [ $vt_wim_cnt -eq 0 ]; then + distro_specify_wim_patch_phase2 + fi + + ventoy_debug_pause + locate_wim "${chosen_path}" + fi + + vt_windows_chain_data "${1}${chosen_path}" + ventoy_debug_pause + + if [ "$vt_cur_wimboot_mode" = "1" ]; then + vtoy_wimboot_func fi if [ -n "$vtoy_chain_mem_addr" ]; then @@ -784,6 +787,10 @@ function uefi_linux_menu_func { unset vtGrub2Mode if vt_check_mode 3 "$vt_chosen_name"; then set vtGrub2Mode=1 + elif vt_str_begin "$vt_volume_id" "HOLO_"; then + if [ -d (loop)/loader/entries ]; then + set vtGrub2Mode=1 + fi elif vt_str_begin "$vt_volume_id" "KRD"; then if [ -f (loop)/boot/grub/grub.cfg.sig ]; then set vtGrub2Mode=1 @@ -817,6 +824,18 @@ function uefi_linux_menu_func { break fi done + if [ $vtback_cfg_find -eq 0 ]; then + if [ -f (loop)/loader/loader.conf -a -d (loop)/loader/entries ]; then + if vt_str_begin "$vt_volume_id" "HOLO_"; then + set root=(loop,2) + vt_systemd_menu (loop,2) vt_sys_menu_mem + else + vt_systemd_menu (loop) vt_sys_menu_mem + fi + set vtback_cfg_find=1 + configfile "mem:${vt_sys_menu_mem_addr}:size:${vt_sys_menu_mem_size}" + fi + fi if [ "$vtback_cfg_find" = "0" ]; then echo " " @@ -913,6 +932,14 @@ function uefi_iso_menu_func { vt_check_compatible (loop) fi + if vt_need_secondary_menu "$vt_chosen_name"; then + vt_show_secondary_menu "$vt_chosen_path" "$vtoy_os" $vt_chosen_size + if vt_check_mode 0 "$vt_chosen_name"; then + uefi_iso_memdisk $vtoy_iso_part "$vt_chosen_path" + return + fi + fi + vt_img_sector "${1}${chosen_path}" if [ "$ventoy_fs_probe" = "iso9660" ]; then @@ -964,17 +991,7 @@ function vtoy_windows_wimboot { echo vtoy_wimboot_prefix=$vtoy_wimboot_prefix vtoy_wimboot_bit=$vtoy_wimboot_bit vt_wimkernel=$vt_wimkernel fi - for wmfile in sources/boot.wim boot/bcd boot/boot.sdi; do - if [ ! -f $vtoy_wimboot_prefix/$wmfile ]; then - return - fi - done - - if [ -f $vtoy_wimboot_prefix/sources/install.wim -o -f $vtoy_wimboot_prefix/sources/install.esd ]; then - vt_windows_wimboot_data "$vtoy_wimboot_prefix/sources/boot.wim" vtoy_init_exe - else - return - fi + vt_windows_wimboot_data "$vtoy_wimboot_prefix/sources/boot.wim" vtoy_init_exe vtoy_wim_bit if [ "$grub_platform" = "pc" ]; then linux16 "$vtoy_path/$vt_wimkernel" quiet @@ -1014,39 +1031,42 @@ function vtoy_windows_wimboot { } function vtoy_winpe_wimboot { - unset vtoy_boot_mgr_exe - unset vtoy_boot_mgr_efi - set vtoy_wimboot_prefix=(loop) - set vtoy_bcd_path="$1" - set vtoy_sdi_path="$2" - set vtoy_wim_path="$3" - set vtoy_mgr_flag="$4" + unset vtoy_boot_sdi_legacy + unset vtoy_boot_sdi_efi + + set vtoy_wimboot_prefix=(loop) + set vtoy_wim_path="$1" - if [ $vtoy_mgr_flag -eq 1 ]; then - set vtoy_boot_mgr_exe="newc:bootmgr.exe:$vtoy_wimboot_prefix/$5" - elif [ $vtoy_mgr_flag -eq 2 ]; then - set vtoy_boot_mgr_efi="vf=bootmgr.efi:$vtoy_wimboot_prefix/$5" - elif [ $vtoy_mgr_flag -eq 3 ]; then - set vtoy_boot_mgr_exe="newc:bootmgr.exe:$vtoy_wimboot_prefix/$5" - set vtoy_boot_mgr_efi="vf=bootmgr.efi:$vtoy_wimboot_prefix/$6" + if [ -n "${vtdebug_flag}" ]; then + echo "winpe_wimboot $1 $2 $3" + fi + + if [ "$2" != "0" ]; then + set vtoy_boot_sdi_legacy="newc:boot.sdi:$vtoy_wimboot_prefix/$2" + set vtoy_boot_sdi_efi="vf=boot.sdi:$vtoy_wimboot_prefix/$2" fi - vt_windows_wimboot_data $vtoy_wimboot_prefix/$vtoy_wim_path vtoy_init_exe + vt_windows_wimboot_data $vtoy_wimboot_prefix/$vtoy_wim_path vtoy_init_exe vtoy_wim_bit if [ "$grub_platform" = "pc" ]; then - linux16 "$vtoy_path/$vt_wimkernel" quiet + linux16 "$vtoy_path/$vt_wimkernel" quiet ventoy_debug_pause - vt_set_wim_load_prompt 1 "Loading files......" + vt_set_wim_load_prompt 1 "Loading files......" initrd16 newc:$vtoy_init_exe:mem:${vtoy_wimboot_mem_addr}:size:${vtoy_wimboot_mem_size} \ - $vtoy_boot_mgr_exe \ - newc:vtoy_wimboot:$vtoy_wimboot_prefix/$vtoy_bcd_path \ - newc:bcd:$vtoy_wimboot_prefix/$vtoy_bcd_path \ - newc:boot.sdi:$vtoy_wimboot_prefix/$vtoy_sdi_path \ + newc:vtoy_wimboot:$vtoy_path/$vt_wimkernel \ + newc:bootmgr.exe:mem:${vtoy_pe_bootmgr_mem_addr}:size:${vtoy_pe_bootmgr_mem_size} \ + newc:bcd:mem:${vtoy_pe_bcd_mem_addr}:size:${vtoy_pe_bcd_mem_size} \ + $vtoy_boot_sdi_legacy \ newc:boot.wim:$vtoy_wimboot_prefix/$vtoy_wim_path - vt_set_wim_load_prompt 0 + vt_set_wim_load_prompt 0 boot else + if [ "$VTOY_EFI_ARCH" = "x64" -a "$vtoy_wim_bit" = "32" ]; then + echo -e "\nThis is 32bit Windows and does NOT support x86_64 UEFI firmware.\n" + echo -e "这是32位的 Windows 系统,不支持当前的64位 UEFI 环境。\n" + fi + vt_set_wim_load_prompt 1 "Loading files......" vt_load_file_to_mem "nodecompress" $vtoy_wimboot_prefix/$vtoy_wim_path vtoy_wimfile_mem vt_set_wim_load_prompt 0 @@ -1056,14 +1076,19 @@ function vtoy_winpe_wimboot { else set vtoy_wimfile_path=$vtoy_wimboot_prefix/$vtoy_wim_path fi + + unset vtoy_boot_efi_path + if [ -F (loop)/efi/boot/boot${VTOY_EFI_ARCH}.efi ]; then + set vtoy_boot_efi_path="vf=bootx64.efi:(loop)/efi/boot/boot${VTOY_EFI_ARCH}.efi" + fi ventoy_cli_console chainloader "$vtoy_path/$vt_wimkernel" quiet \ "vf=$vtoy_init_exe:mem:${vtoy_wimboot_mem_addr}:size:${vtoy_wimboot_mem_size}" \ - "vf=vtoy_wimboot:$vtoy_wimboot_prefix/$vtoy_bcd_path" \ - "$vtoy_boot_mgr_efi" \ - "vf=bcd:$vtoy_wimboot_prefix/$vtoy_bcd_path" \ - "vf=boot.sdi:$vtoy_wimboot_prefix/$vtoy_sdi_path" \ + "vf=vtoy_wimboot:$vtoy_path/$vt_wimkernel" \ + "vf=bcd:mem:${vtoy_pe_bcd_mem_addr}:size:${vtoy_pe_bcd_mem_size}" \ + "$vtoy_boot_sdi_efi" \ + "$vtoy_boot_efi_path" \ "vf=boot.wim:$vtoy_wimfile_path" \ pfsize=$vtoy_chain_file_size \ pfread=$vtoy_chain_file_read @@ -1073,8 +1098,6 @@ function vtoy_winpe_wimboot { } function vtoy_wimboot_func { - echo -e "\n===================== VENTOY WIMBOOT ===================\n" - if [ "$grub_platform" = "pc" ]; then set vt_wimkernel=wimboot.x86_64.xz else @@ -1085,46 +1108,75 @@ function vtoy_wimboot_func { fi fi - if vt_str_begin "$vt_volume_id" "Modified-Win10PEx64"; then - vtoy_winpe_wimboot 'Boot/bcd' 'Boot/boot.sdi' 'sources/boot.wim' 1 'bootmgr.exe' - else + if vt_is_standard_winiso (loop); then + echo -e "\n==================== VENTOY WIMBOOT ==================\n" vtoy_windows_wimboot + else + vt_sel_winpe_wim (loop) + if [ -n "$vtoy_pe_wim_path" ]; then + echo -e "\n==================== VENTOY WIMBOOT ==================\n" + + vt_fs_ignore_case 1 + vt_load_file_to_mem "auto" $vtoy_path/common_bcd.xz vtoy_pe_bcd_mem + + set vt_sdi_path=0 + for vsdi in "boot/boot.sdi" "2K10/FONTS/boot.sdi" "SSTR/boot.sdi" "ISPE/BOOT.SDI" \ + "boot/uqi.sdi" "ISYL/boot.sdi" "WEPE/WEPE.SDI" ; do + if [ -F "(loop)/$vsdi" ]; then + set vt_sdi_path=$vsdi + break + fi + done + + if [ "$grub_platform" = "pc" ]; then + vt_load_file_to_mem "auto" $vtoy_path/common_bootmgr.xz vtoy_pe_bootmgr_mem + vtoy_winpe_wimboot "$vtoy_pe_wim_path" "$vt_sdi_path" 1 + else + vtoy_winpe_wimboot "$vtoy_pe_wim_path" "$vt_sdi_path" 0 + fi + + vt_fs_ignore_case 0 + fi fi } function legacy_windows_menu_func { vt_windows_reset + unset vt_cur_wimboot_mode if vt_check_mode 4 "$vt_chosen_name"; then - vt_windows_chain_data "${1}${chosen_path}" - ventoy_debug_pause - vtoy_wimboot_func - else - if [ "$ventoy_compatible" = "NO" ]; then - - if [ "$ventoy_fs_probe" = "iso9660" ]; then - loopback -d loop - vt_iso9660_nojoliet 1 - loopback loop "$1$2" - fi - - for file in "boot/bcd" "/efi/microsoft/boot/bcd" "SSTR/BCD" "boot/bce"; do - vt_windows_collect_wim_patch bcd (loop)/$file - done - - distro_specify_wim_patch + set vt_cur_wimboot_mode=1 + fi + + if [ "$ventoy_compatible" = "NO" -o "$vt_cur_wimboot_mode" = "1" ]; then + if [ "$ventoy_fs_probe" = "iso9660" ]; then + loopback -d loop + vt_iso9660_nojoliet 1 + loopback loop "$1$2" + fi + + for file in "boot/bcd" "/efi/microsoft/boot/bcd" "SSTR/BCD" "boot/bce"; do + vt_windows_collect_wim_patch bcd (loop)/$file + done + + distro_specify_wim_patch - vt_windows_count_wim_patch vt_wim_cnt - if [ $vt_wim_cnt -eq 0 ]; then - distro_specify_wim_patch_phase2 - fi - - ventoy_debug_pause - locate_wim "${chosen_path}" + vt_windows_count_wim_patch vt_wim_cnt + if [ $vt_wim_cnt -eq 0 ]; then + distro_specify_wim_patch_phase2 fi - vt_windows_chain_data "${1}${chosen_path}" ventoy_debug_pause + if [ -z "$vt_cur_wimboot_mode" ]; then + locate_wim "${chosen_path}" + fi + fi + + vt_windows_chain_data "${1}${chosen_path}" + ventoy_debug_pause + + if [ "$vt_cur_wimboot_mode" = "1" ]; then + vtoy_wimboot_func fi if [ -n "$vtoy_chain_mem_addr" ]; then @@ -1206,10 +1258,19 @@ function legacy_linux_menu_func { ventoy_debug_pause if [ -n "$vtoy_chain_mem_addr" ]; then + unset vtGrub2Mode if vt_check_mode 3 "$vt_chosen_name"; then + set vtGrub2Mode=1 + elif vt_str_begin "$vt_volume_id" "HOLO_"; then + if [ -d (loop)/loader/entries ]; then + set vtGrub2Mode=1 + fi + fi + + if [ -n "$vtGrub2Mode" ]; then ventoy_acpi_param ${vtoy_chain_mem_addr} 2048 ventoy_cli_console - + # fallback set vtback_root=$root vt_push_last_entry @@ -1228,6 +1289,18 @@ function legacy_linux_menu_func { break fi done + if [ $vtback_cfg_find -eq 0 ]; then + if [ -f (loop)/loader/loader.conf -a -d (loop)/loader/entries ]; then + if vt_str_begin "$vt_volume_id" "HOLO_"; then + set root=(loop,2) + vt_systemd_menu (loop,2) vt_sys_menu_mem + else + vt_systemd_menu (loop) vt_sys_menu_mem + fi + set vtback_cfg_find=1 + configfile "mem:${vt_sys_menu_mem_addr}:size:${vt_sys_menu_mem_size}" + fi + fi vt_unset_boot_opt set root=$vtback_root @@ -1291,6 +1364,14 @@ function legacy_iso_menu_func { vt_check_compatible (loop) fi + if vt_need_secondary_menu "$vt_chosen_name"; then + vt_show_secondary_menu "$vt_chosen_path" "$vtoy_os" $vt_chosen_size + if vt_check_mode 0 "$vt_chosen_name"; then + legacy_iso_memdisk $vtoy_iso_part "$vt_chosen_path" + return + fi + fi + vt_img_sector "${1}${chosen_path}" if [ "$ventoy_fs_probe" = "iso9660" ]; then @@ -2222,7 +2303,7 @@ function img_unsupport_menuentry { ############################################################# ############################################################# -set VENTOY_VERSION="1.0.79" +set VENTOY_VERSION="1.0.80" #ACPI not compatible with Window7/8, so disable by default set VTOY_PARAM_NO_ACPI=1 @@ -2280,6 +2361,11 @@ if [ "$vtoy_dev" = "tftp" ]; then done loadfont ascii + if [ -n "$vtoy_efi_part" ]; then + vt_load_file_to_mem "auto" $vtoy_efi_part/grub/fonts/unicode.pf2 vtoy_font_mem + loadfont mem:${vtoy_font_mem_addr}:size:${vtoy_font_mem_size} + fi + if [ -f $vtoy_iso_part/ventoy/ventoy.json ]; then set vt_plugin_path=$vtoy_iso_part else