grub.cfg 25 KB
Newer Older
longpanda's avatar
longpanda committed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#************************************************************************************
# 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/>.
# 
#************************************************************************************

longpanda's avatar
longpanda committed
19
20
21
22
23
24
25
26
27
28
29
30
31
32
function ventoy_pause {
    if [ -n "${vtdebug_flag}" ]; then
        echo "press Enter to continue ......"
        read vtTmpPause
    fi
}

function ventoy_debug_pause {
    if [ -n "${vtdebug_flag}" ]; then
        echo "press Enter to continue ......"
        read vtTmpPause
    fi
}

longpanda's avatar
update  
longpanda committed
33
34
function ventoy_cli_console {      
    if [ "$grub_platform" = "pc" ]; then
longpanda's avatar
longpanda committed
35
36
        #terminal_output  vga_text
        terminal_output  console
longpanda's avatar
update  
longpanda committed
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
    else
        if [ "$vtoy_display_mode" != "CLI" ]; then
            terminal_output  console
        fi
    fi
}

function ventoy_gui_console {  
    if [ "$grub_platform" = "pc" ]; then
        if [ "$vtoy_display_mode" = "CLI" ]; then
            terminal_output  console
        else
            terminal_output  gfxterm
        fi
    else
        if [ "$vtoy_display_mode" != "CLI" ]; then
            terminal_output  gfxterm
        fi
    fi
}
longpanda's avatar
longpanda committed
57

longpanda's avatar
longpanda committed
58
function ventoy_power {
longpanda's avatar
longpanda committed
59
60
61
62
63
64
65
66
67
    configfile $prefix/power.cfg
}

function ventoy_diagnosis {    
    configfile $prefix/debug.cfg
}

function ventoy_localboot {    
    configfile $prefix/localboot.cfg
longpanda's avatar
longpanda committed
68
69
}

longpanda's avatar
longpanda committed
70
function ventoy_ext_menu {    
longpanda's avatar
longpanda committed
71
    if [ -e $vt_plugin_path/ventoy/ventoy_grub.cfg ]; then
longpanda's avatar
longpanda committed
72
73
74
        set ventoy_new_context=1
        configfile $vt_plugin_path/ventoy/ventoy_grub.cfg
        unset ventoy_new_context
longpanda's avatar
longpanda committed
75
76
77
78
79
    else
       echo "ventoy_grub.cfg NOT exist."
       echo -e "\npress ENTER to exit ..."
       read vtInputKey
    fi
longpanda's avatar
longpanda committed
80
81
}

longpanda's avatar
longpanda committed
82
function get_os_type {
longpanda's avatar
longpanda committed
83
84
85
86
    set vtoy_os=Linux
    
    for file in "efi/microsoft/boot/bcd" "sources/boot.wim" "boot/bcd" "bootmgr.efi" "boot/etfsboot.com" ; do        
        if vt_file_exist_nocase (loop)/$file; then        
longpanda's avatar
longpanda committed
87
88
89
90
            set vtoy_os=Windows
            break
        fi
    done
longpanda's avatar
longpanda committed
91

longpanda's avatar
longpanda committed
92
93
94
95
96
97
98
99
    if [ "$vtoy_os" = "Linux" ]; then
        if vt_strstr "$vt_system_id" "FreeBSD"; then
            set vtoy_os=Unix
        elif [ -e (loop)/bin/freebsd-version ]; then
            set vtoy_os=Unix
        fi
    fi

longpanda's avatar
longpanda committed
100
101
102
103
104
    if [ -n "${vtdebug_flag}" ]; then
        echo ISO is $vtoy_os
    fi
}

longpanda's avatar
longpanda committed
105
106
function vt_check_compatible_pe {
    #Check for PE without external tools
longpanda's avatar
longpanda committed
107
    if [ -f $1/HBCD_PE.ini ]; then
longpanda's avatar
longpanda committed
108
        set ventoy_compatible=YES        
longpanda's avatar
longpanda committed
109
110
111
    fi
}

longpanda's avatar
longpanda committed
112
function locate_initrd {
longpanda's avatar
longpanda committed
113
114
    vt_linux_locate_initrd 

longpanda's avatar
longpanda committed
115
    if [ -n "${vtdebug_flag}" ]; then        
longpanda's avatar
longpanda committed
116
        vt_linux_dump_initrd
longpanda's avatar
longpanda committed
117
        ventoy_debug_pause
longpanda's avatar
longpanda committed
118
119
120
    fi
}

longpanda's avatar
longpanda committed
121
122
function locate_wim {
    vt_windows_locate_wim_patch (loop)
longpanda's avatar
longpanda committed
123
    
longpanda's avatar
longpanda committed
124
125
126
127
128
129
    if [ -n "${vtdebug_flag}" ]; then
        echo '###############################################'
        vt_dump_wim_patch
        echo '###############################################'
        ventoy_debug_pause
    fi
longpanda's avatar
longpanda committed
130
131
}

longpanda's avatar
longpanda committed
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
function distro_specify_wim_patch {
    if [ -d (loop)/h3pe ]; then
        vt_windows_collect_wim_patch wim /BOOT/H3_10PE.WIM
        vt_windows_collect_wim_patch wim /BOOT/H3_7PE.WIM
        vt_windows_collect_wim_patch wim /BOOT/H3_8PE.WIM
        vt_windows_collect_wim_patch wim /BOOT/H3_81PE.WIM
    fi
}

function distro_specify_wim_patch_phase2 {
    if [ -f (loop)/boot/boot.wim ]; then
        vt_windows_collect_wim_patch wim /boot/boot.wim
    fi
}


longpanda's avatar
longpanda committed
148
149
150
151
152
153
154
155
156
157
158
159
160
161
function distro_specify_initrd_file {
    if [ -e (loop)/boot/all.rdz ]; then
        vt_linux_specify_initrd_file /boot/all.rdz
    elif [ -e (loop)/boot/xen.gz ]; then 
        if [ -e (loop)/install.img ]; then
            vt_linux_specify_initrd_file /install.img
        fi
    elif [ -d (loop)/casper ]; then 
        if [ -e (loop)/casper/initrd ]; then
            vt_linux_specify_initrd_file /casper/initrd
        fi
        if [ -e (loop)/casper/initrd-oem ]; then
            vt_linux_specify_initrd_file /casper/initrd-oem
        fi
longpanda's avatar
longpanda committed
162
163
164
165
166
167
168
169
170
171
    elif [ -e (loop)/boot/grub/initrd.xz ]; then
        vt_linux_specify_initrd_file /boot/grub/initrd.xz
    elif [ -e (loop)/initrd.gz ]; then
        vt_linux_specify_initrd_file /initrd.gz
    elif [ -e (loop)/slax/boot/initrfs.img ]; then
        vt_linux_specify_initrd_file /slax/boot/initrfs.img
    elif [ -e (loop)/pmagic/initrd.img ]; then
        vt_linux_specify_initrd_file /pmagic/initrd.img
    elif [ -e (loop)/boot/initrd.xz ]; then
        vt_linux_specify_initrd_file /boot/initrd.xz
longpanda's avatar
longpanda committed
172
173
    elif [ -f (loop)/boot/initrd ]; then
        vt_linux_specify_initrd_file /boot/initrd
longpanda's avatar
longpanda committed
174
175
176
177
    elif [ -f (loop)/boot/x86_64/loader/initrd ]; then
        vt_linux_specify_initrd_file /boot/x86_64/loader/initrd
    elif [ -f (loop)/boot/initramfs-x86_64.img ]; then
        vt_linux_specify_initrd_file /boot/initramfs-x86_64.img
longpanda's avatar
longpanda committed
178
        
longpanda's avatar
longpanda committed
179
180
181
182

    fi
}

longpanda's avatar
longpanda committed
183

longpanda's avatar
longpanda committed
184
185
186
function distro_specify_initrd_file_phase2 {
    if [ -f (loop)/boot/initrd.img ]; then
        vt_linux_specify_initrd_file /boot/initrd.img
longpanda's avatar
longpanda committed
187
188
    elif [ -f (loop)/Setup/initrd.gz ]; then
        vt_linux_specify_initrd_file /Setup/initrd.gz
longpanda's avatar
longpanda committed
189
190
191
192
    elif [ -f (loop)/isolinux/initramfs ]; then
        vt_linux_specify_initrd_file /isolinux/initramfs
    elif [ -f (loop)/boot/iniramfs.igz ]; then
        vt_linux_specify_initrd_file /boot/iniramfs.igz
longpanda's avatar
longpanda committed
193
194
    elif [ -f (loop)/initrd-x86_64 ]; then
        vt_linux_specify_initrd_file /initrd-x86_64
longpanda's avatar
longpanda committed
195
    elif [ -f (loop)/live/initrd.img ]; then 
longpanda's avatar
longpanda committed
196
        vt_linux_specify_initrd_file /live/initrd.img
longpanda's avatar
longpanda committed
197
198
    elif [ -f (loop)/initrd.img ]; then 
        vt_linux_specify_initrd_file /initrd.img
longpanda's avatar
longpanda committed
199
200
    elif [ -f (loop)/sysresccd/boot/x86_64/sysresccd.img ]; then 
        vt_linux_specify_initrd_file /sysresccd/boot/x86_64/sysresccd.img
longpanda's avatar
longpanda committed
201
202
    elif [ -f (loop)/CDlinux/initrd ]; then 
        vt_linux_specify_initrd_file /CDlinux/initrd
longpanda's avatar
longpanda committed
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
    elif [ -f (loop)/parabola/boot/x86_64/parabolaiso.img ]; then 
        vt_linux_specify_initrd_file /parabola/boot/x86_64/parabolaiso.img
        if [ -f (loop)/parabola/boot/i686/parabolaiso.img ]; then 
            vt_linux_specify_initrd_file /parabola/boot/i686/parabolaiso.img
        fi
    elif [ -f (loop)/EFI/BOOT/initrd.img ]; then 
        #Qubes
        vt_linux_specify_initrd_file /EFI/BOOT/initrd.img
        if [ "$grub_platform" != "pc" ]; then
            vt_add_replace_file 0 "initrd.img"    
        fi
    elif [ -f (loop)/initrd ]; then 
        vt_linux_specify_initrd_file /initrd
    elif [ -f (loop)/live/initrd1 ]; then 
        vt_linux_specify_initrd_file /live/initrd1
        
longpanda's avatar
longpanda committed
219
220
221
    fi
}

longpanda's avatar
longpanda committed
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
function ventoy_freebsd_proc {
    if regexp "^12_[0-9]" $vt_volume_id; then
        set vt_freebsd_ver=12.x
    elif regexp "^11_[0-9]" $vt_volume_id; then
        set vt_freebsd_ver=11.x
    elif regexp "^10_[0-9]" $vt_volume_id; then
        set vt_freebsd_ver=10.x
    elif [ -e (loop)/bin/freebsd-version ]; then
        vt_unix_parse_freebsd_ver (loop)/bin/freebsd-version vt_userland_ver
        if regexp "\"12\.[0-9]-" $vt_userland_ver; then
            set vt_freebsd_ver=12.x
        elif regexp "\"11\.[0-9]-" $vt_userland_ver; then
            set vt_freebsd_ver=11.x
        elif regexp "\"10\.[0-9]-" $vt_userland_ver; then
            set vt_freebsd_ver=10.x
        fi
    else
        set vt_freebsd_ver=12.x
    fi

    if file --is-i386-kfreebsd (loop)/boot/kernel/kernel; then
        set vt_freebsd_bit=32
    else
        set vt_freebsd_bit=64
    fi

    if [ -n "${vtdebug_flag}" ]; then
        echo "This is FreeBSD $vt_freebsd_ver ${vt_freebsd_bit}bit"
    fi
    
    for file in "geom_nop" "ipmi"; do        
        if [ -e (loop)/boot/kernel/${file}.ko ]; then                    
            set vt_unix_ko=$file
            break
        fi
    done
    
    vt_unix_replace_ko $vt_unix_ko (vtunix)/ventoy_unix/FreeBSD/geom_ventoy_ko/$vt_freebsd_ver/$vt_freebsd_bit/geom_ventoy.ko.xz
    vt_unix_replace_conf FreeBSD ${1}${chosen_path} 
}

function ventoy_unix_comm_proc {
    vt_unix_reset
    
    if [ "$ventoy_compatible" = "NO" ]; then
        loopback vtunix $vtoy_efi_part/ventoy/ventoy_unix.cpio
        
        set vt_unix_type=unknown
        if vt_strstr "$vt_system_id" "FreeBSD"; then
            ventoy_freebsd_proc $1 ${chosen_path}
        elif [ -e (loop)/bin/freebsd-version ]; then        
            ventoy_freebsd_proc $1 ${chosen_path}
        else
            if [ -n "${vtdebug_flag}" ]; then
                echo "Unknown unix type"
            fi
        fi
    fi
    
    vt_unix_chain_data ${1}${chosen_path}    
    ventoy_debug_pause
}


longpanda's avatar
longpanda committed
286
287
function uefi_windows_menu_func {
    vt_windows_reset
longpanda's avatar
longpanda committed
288
289
290
291
292
293
294

    if [ "$ventoy_compatible" = "NO" ]; then   
        
        if [ "$ventoy_fs_probe" = "iso9660" ]; then
            loopback -d loop
            vt_iso9660_nojoliet 1            
            loopback loop $1$2
longpanda's avatar
longpanda committed
295
        fi
longpanda's avatar
longpanda committed
296
297
298
299
        
        for file in "efi/microsoft/boot/bcd"; do
            vt_windows_collect_wim_patch bcd (loop)/$file                
        done
longpanda's avatar
longpanda committed
300

longpanda's avatar
longpanda committed
301
302
303
304
305
306
307
        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
longpanda's avatar
bug fix  
longpanda committed
308
309
    fi

longpanda's avatar
longpanda committed
310
311
312
    vt_windows_chain_data ${1}${chosen_path}    
    ventoy_debug_pause
    
longpanda's avatar
longpanda committed
313
    if [ -n "$vtoy_chain_mem_addr" ]; then
longpanda's avatar
update  
longpanda committed
314
        ventoy_cli_console
longpanda's avatar
longpanda committed
315
316
317
318
        chainloader ${vtoy_path}/ventoy_x64.efi  env_param=${env_param} isoefi=${LoadIsoEfiDriver} ${vtdebug_flag} mem:${vtoy_chain_mem_addr}:size:${vtoy_chain_mem_size}
        boot
    else
        echo "chain empty failed"
longpanda's avatar
longpanda committed
319
        ventoy_pause
longpanda's avatar
longpanda committed
320
321
322
323
324
    fi
}

function uefi_linux_menu_func {
    if [ "$ventoy_compatible" = "NO" ]; then    
longpanda's avatar
longpanda committed
325
326
327
328
329
330
331
        
        if [ "$ventoy_fs_probe" = "udf" ]; then
            loopback -d loop            
            set ventoy_fs_probe=iso9660
            loopback loop $1$2
        fi
        
longpanda's avatar
longpanda committed
332
        vt_load_cpio  ${vtoy_path}/ventoy.cpio   $2 $1
longpanda's avatar
longpanda committed
333
334
335

        vt_linux_clear_initrd
        
longpanda's avatar
longpanda committed
336
337
338
        if [ -d (loop)/pmagic ]; then
            vt_linux_specify_initrd_file /pmagic/initrd.img
        else
longpanda's avatar
longpanda committed
339
340
            for file in "boot/grub/grub.cfg" "EFI/BOOT/grub.cfg" "EFI/boot/grub.cfg" "efi/boot/grub.cfg" "EFI/BOOT/BOOTX64.conf" "/grub/grub.cfg"; do
                if [ -e (loop)/$file ]; then                    
longpanda's avatar
longpanda committed
341
342
343
344
                    vt_linux_parse_initrd_grub  file  (loop)/$file
                fi
            done
        fi
longpanda's avatar
longpanda committed
345

longpanda's avatar
longpanda committed
346
        # special process for special distros
longpanda's avatar
longpanda committed
347
348
349
350
        if [ -d (loop)/loader/entries ]; then
            vt_linux_parse_initrd_grub  dir  (loop)/loader/entries/
        elif [ -d (loop)/boot/grub ]; then
            vt_linux_parse_initrd_grub  dir  (loop)/boot/grub/
longpanda's avatar
longpanda committed
351
352
        fi
        
longpanda's avatar
longpanda committed
353
        distro_specify_initrd_file
longpanda's avatar
longpanda committed
354
        
longpanda's avatar
longpanda committed
355
356
357
358
359
360
361
362
363
364
365
        vt_linux_initrd_count vtcount
        if [ $vtcount -eq 0 ]; then
            distro_specify_initrd_file_phase2
            
            if [ "$vt_efi_dir" = "NO" ]; then
                if [ -f (loop)/efi.img ];  then
                    vt_add_replace_file 0 "initrd"
                fi
            fi
        fi
        
longpanda's avatar
longpanda committed
366
        locate_initrd
longpanda's avatar
longpanda committed
367
368
369
370
371
372
373
374
375
376
377
378
        
        if [ -d (loop)/loader/entries ]; then
            vt_linux_get_main_initrd_index vtindex
            
            if [ -d (loop)/arch ]; then
                if [ -f (loop)/arch/boot/x86_64/archiso.img ]; then
                    vt_add_replace_file $vtindex "EFI\\archiso\\archiso.img"
                elif [ -f (loop)/boot/initramfs_x86_64.img ]; then
                    vt_add_replace_file $vtindex "boot\\initramfs_x86_64.img"
                fi
            elif [ -f (loop)/EFI/BOOT/initrd.gz ]; then
                vt_add_replace_file $vtindex "EFI\\BOOT\\initrd.gz"
longpanda's avatar
longpanda committed
379
380
            elif [ -f (loop)/loader/entries/thinstation.conf ]; then
                vt_add_replace_file $vtindex "boot\\initrd"
longpanda's avatar
longpanda committed
381
            fi
longpanda's avatar
longpanda committed
382
383
384
385
        elif [ -d (loop)/EFI/boot/entries ]; then
            if [ -f (loop)/parabola/boot/x86_64/parabolaiso.img ]; then
                vt_add_replace_file 0 "EFI\\parabolaiso\\parabolaiso.img"
            fi
longpanda's avatar
longpanda committed
386
387
388
389
390
        elif [ -e (loop)/syslinux/alt0/full.cz ]; then
            vt_add_replace_file 0 "EFI\\BOOT\\full.cz"            
            set FirstTryBootFile='@EFI@BOOT@grubx64.efi'
        fi
        
longpanda's avatar
longpanda committed
391
392
393
394
395
    fi
    
    vt_linux_chain_data ${1}${chosen_path}

    if [ -n "$vtoy_chain_mem_addr" ]; then
longpanda's avatar
update  
longpanda committed
396
        ventoy_cli_console       
longpanda's avatar
longpanda committed
397
        chainloader ${vtoy_path}/ventoy_x64.efi  env_param=${env_param} isoefi=${LoadIsoEfiDriver} FirstTry=${FirstTryBootFile} ${vtdebug_flag} mem:${vtoy_chain_mem_addr}:size:${vtoy_chain_mem_size}
longpanda's avatar
longpanda committed
398
399
400
        boot
    else
        echo "chain empty failed"
longpanda's avatar
longpanda committed
401
        ventoy_pause
longpanda's avatar
longpanda committed
402
403
404
    fi
}

longpanda's avatar
longpanda committed
405
406
407
408
409
410
411
412
413
414
415
416
function uefi_unix_menu_func {
    ventoy_unix_comm_proc $1 ${chosen_path}
    
    if [ -n "$vtoy_chain_mem_addr" ]; then
        ventoy_cli_console
        chainloader ${vtoy_path}/ventoy_x64.efi  env_param=${env_param} isoefi=${LoadIsoEfiDriver} FirstTry=${FirstTryBootFile} ${vtdebug_flag} mem:${vtoy_chain_mem_addr}:size:${vtoy_chain_mem_size}
        boot
    else
        echo "chain empty failed"
        ventoy_pause
    fi
}
longpanda's avatar
longpanda committed
417
418
419
420
421
422
423

function uefi_iso_menu_func {

    if [ -d (loop)/ ]; then
        loopback -d loop
    fi

longpanda's avatar
bug fix  
longpanda committed
424
425
    if [ -n "$vtisouefi" ]; then
        set LoadIsoEfiDriver=on
longpanda's avatar
longpanda committed
426
        unset vtisouefi
longpanda's avatar
longpanda committed
427
    elif vt_check_mode 2; then
longpanda's avatar
longpanda committed
428
        set LoadIsoEfiDriver=on
longpanda's avatar
bug fix  
longpanda committed
429
430
431
432
    else
        unset LoadIsoEfiDriver
    fi

longpanda's avatar
longpanda committed
433
    vt_chosen_img_path chosen_path
434
435
    vt_select_auto_install ${chosen_path}
    vt_select_persistence ${chosen_path}
longpanda's avatar
longpanda committed
436
437
438
439
440

    if vt_is_udf ${1}${chosen_path}; then
        set ventoy_fs_probe=udf
    else
        set ventoy_fs_probe=iso9660
longpanda's avatar
longpanda committed
441
        vt_iso9660_nojoliet 0
longpanda's avatar
longpanda committed
442
443
444
    fi

    loopback loop ${1}${chosen_path}
longpanda's avatar
longpanda committed
445
    vt_parse_iso_volume ${1}${chosen_path} vt_system_id vt_volume_id
longpanda's avatar
longpanda committed
446
447
    get_os_type (loop)
    
longpanda's avatar
longpanda committed
448
449
450
451
452
453
454
455
    if [ -d (loop)/EFI ]; then
        set vt_efi_dir=YES
    elif [ -d (loop)/efi ]; then
        set vt_efi_dir=YES
    else
        set vt_efi_dir=NO
    fi
    
longpanda's avatar
longpanda committed
456
457
458
    if [ -n "$vtcompat" ]; then
        set ventoy_compatible=YES
        unset vtcompat
longpanda's avatar
longpanda committed
459
    elif vt_check_mode 1; then
longpanda's avatar
longpanda committed
460
461
462
463
        set ventoy_compatible=YES
    else
        vt_check_compatible (loop)
    fi
longpanda's avatar
longpanda committed
464
465
466
467
    
    vt_img_sector ${1}${chosen_path}
    
    if [ "$vtoy_os" = "Windows" ]; then
longpanda's avatar
longpanda committed
468
        vt_check_compatible_pe (loop)        
longpanda's avatar
longpanda committed
469
        uefi_windows_menu_func  $1 ${chosen_path}
longpanda's avatar
longpanda committed
470
471
    elif [ "$vtoy_os" = "Unix" ]; then
        uefi_unix_menu_func $1 ${chosen_path}
longpanda's avatar
longpanda committed
472
    else
longpanda's avatar
longpanda committed
473
        uefi_linux_menu_func  $1 ${chosen_path}
longpanda's avatar
longpanda committed
474
475
    fi

longpanda's avatar
update  
longpanda committed
476
    ventoy_gui_console
longpanda's avatar
longpanda committed
477
478
}

longpanda's avatar
longpanda committed
479
480
481
482
483
484
function uefi_iso_memdisk {    
    vt_chosen_img_path chosen_path

    echo 'Loading ISO file to memory ...'
    vt_load_iso_to_mem ${1}${chosen_path} vtoy_iso_buf
    
longpanda's avatar
update  
longpanda committed
485
    ventoy_cli_console
longpanda's avatar
longpanda committed
486
487
    chainloader ${vtoy_path}/ventoy_x64.efi memdisk env_param=${env_param} isoefi=${LoadIsoEfiDriver} ${vtdebug_flag} mem:${vtoy_iso_buf_addr}:size:${vtoy_iso_buf_size}
    boot
longpanda's avatar
longpanda committed
488
    
longpanda's avatar
update  
longpanda committed
489
    ventoy_gui_console
longpanda's avatar
longpanda committed
490
491
492
}


longpanda's avatar
longpanda committed
493
494
495
function legacy_windows_menu_func {
    vt_windows_reset
    
longpanda's avatar
longpanda committed
496
497
498
499
500
501
    if [ "$ventoy_compatible" = "NO" ]; then   
        
        if [ "$ventoy_fs_probe" = "iso9660" ]; then
            loopback -d loop
            vt_iso9660_nojoliet 1
            loopback loop $1$2
longpanda's avatar
longpanda committed
502
        fi
longpanda's avatar
longpanda committed
503
504
505
506
507
508
509
510
511
512
513
514
515
516
        
        for file in "boot/bcd" "/efi/microsoft/boot/bcd" "SSTR/BCD"; 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
longpanda's avatar
longpanda committed
517
    fi
longpanda's avatar
longpanda committed
518
519
520

    vt_windows_chain_data ${1}${chosen_path}    
    ventoy_debug_pause    
longpanda's avatar
longpanda committed
521
522
    
    if [ -n "$vtoy_chain_mem_addr" ]; then
longpanda's avatar
longpanda committed
523
        linux16   $vtoy_path/ipxe.krn ${vtdebug_flag} ibft mem:${vtoy_chain_mem_addr}:size:${vtoy_chain_mem_size}
longpanda's avatar
longpanda committed
524
525
526
        boot
    else
        echo "chain empty failed"
longpanda's avatar
longpanda committed
527
        ventoy_pause
longpanda's avatar
longpanda committed
528
529
530
531
532
    fi
}

function legacy_linux_menu_func {
    if [ "$ventoy_compatible" = "NO" ]; then
longpanda's avatar
longpanda committed
533
534
535
536
537
538
539

        if [ "$ventoy_fs_probe" = "udf" ]; then
            loopback -d loop
            set ventoy_fs_probe=iso9660
            loopback loop $1$2
        fi
    
longpanda's avatar
longpanda committed
540
        vt_load_cpio  $vtoy_path/ventoy.cpio  $2 $1
longpanda's avatar
longpanda committed
541
542
543

        vt_linux_clear_initrd
        
longpanda's avatar
longpanda committed
544
545
546
547
548
549
550
551
552
        if [ -d (loop)/pmagic ]; then
            vt_linux_specify_initrd_file /pmagic/initrd.img
        else
            for dir in "isolinux" "boot/isolinux" "boot/x86_64/loader" "syslinux" "boot/syslinux"; do
                if [ -d (loop)/$dir ]; then
                    vt_linux_parse_initrd_isolinux   (loop)/$dir/
                fi
            done
        fi
longpanda's avatar
longpanda committed
553
554
        
        # special process for special distros
longpanda's avatar
longpanda committed
555
556
557
558
559
560
561
562
563
        #archlinux
        if [ -d (loop)/arch/boot/syslinux ]; then
            vt_linux_parse_initrd_isolinux   (loop)/arch/boot/syslinux/  /arch/
            vt_linux_parse_initrd_isolinux   (loop)/arch/boot/syslinux/  /arch/boot/syslinux/
            
        #manjaro
        elif [ -d (loop)/manjaro ]; then
            if [ -e (loop)/boot/grub/kernels.cfg ]; then
                vt_linux_parse_initrd_grub  file  (loop)/boot/grub/kernels.cfg
longpanda's avatar
longpanda committed
564
            fi
longpanda's avatar
longpanda committed
565
566
        elif [ -e (loop)/boot/grub/grub.cfg ]; then                
            vt_linux_parse_initrd_grub  file  (loop)/boot/grub/grub.cfg
longpanda's avatar
longpanda committed
567
568
        fi
        
longpanda's avatar
longpanda committed
569
        distro_specify_initrd_file
longpanda's avatar
longpanda committed
570
        
longpanda's avatar
longpanda committed
571
572
573
574
575
        vt_linux_initrd_count vtcount
        if [ $vtcount -eq 0 ]; then
            distro_specify_initrd_file_phase2
        fi
        
longpanda's avatar
longpanda committed
576
577
578
        locate_initrd
    fi
    
longpanda's avatar
longpanda committed
579
580
    vt_linux_chain_data ${1}${chosen_path}    
    ventoy_debug_pause
longpanda's avatar
longpanda committed
581
    
longpanda's avatar
longpanda committed
582
583
    if [ -n "$vtoy_chain_mem_addr" ]; then
        linux16   $vtoy_path/ipxe.krn ${vtdebug_flag}  mem:${vtoy_chain_mem_addr}:size:${vtoy_chain_mem_size}
longpanda's avatar
longpanda committed
584
585
586
        boot
    else
        echo "chain empty failed"
longpanda's avatar
longpanda committed
587
        ventoy_pause
longpanda's avatar
longpanda committed
588
589
590
    fi
}

longpanda's avatar
longpanda committed
591
592
593
594
595
596
597
598
599
600
601
602
603
604

function legacy_unix_menu_func {    
    ventoy_unix_comm_proc $1 ${chosen_path}
    
    if [ -n "$vtoy_chain_mem_addr" ]; then
        linux16   $vtoy_path/ipxe.krn ${vtdebug_flag}  mem:${vtoy_chain_mem_addr}:size:${vtoy_chain_mem_size}
        boot
    else
        echo "chain empty failed"
        ventoy_pause
    fi
}


longpanda's avatar
longpanda committed
605
606
607
608
609
610
611
function legacy_iso_menu_func {

    if [ -d (loop)/ ]; then
        loopback -d loop
    fi

    vt_chosen_img_path chosen_path
612
613
    vt_select_auto_install ${chosen_path}
    vt_select_persistence ${chosen_path}
longpanda's avatar
longpanda committed
614
615
616
617
618

    if vt_is_udf ${1}${chosen_path}; then
        set ventoy_fs_probe=udf
    else
        set ventoy_fs_probe=iso9660
longpanda's avatar
longpanda committed
619
620
        vt_iso9660_nojoliet 0
    fi
longpanda's avatar
longpanda committed
621
    
longpanda's avatar
longpanda committed
622
    loopback loop ${1}${chosen_path}
longpanda's avatar
longpanda committed
623
    vt_parse_iso_volume ${1}${chosen_path} vt_system_id vt_volume_id
longpanda's avatar
longpanda committed
624
    get_os_type (loop)
longpanda's avatar
longpanda committed
625

longpanda's avatar
longpanda committed
626
627
628
    if [ -n "$vtcompat" ]; then
        set ventoy_compatible=YES
        unset vtcompat
longpanda's avatar
longpanda committed
629
    elif vt_check_mode 1; then
longpanda's avatar
longpanda committed
630
631
632
633
        set ventoy_compatible=YES
    else
        vt_check_compatible (loop)
    fi
longpanda's avatar
longpanda committed
634
635
    
    vt_img_sector ${1}${chosen_path}
longpanda's avatar
bug fix  
longpanda committed
636

longpanda's avatar
longpanda committed
637
    if [ "$vtoy_os" = "Windows" ]; then
longpanda's avatar
longpanda committed
638
        vt_check_compatible_pe (loop)        
longpanda's avatar
longpanda committed
639
        legacy_windows_menu_func  $1 ${chosen_path}
longpanda's avatar
longpanda committed
640
641
    elif [ "$vtoy_os" = "Unix" ]; then
        legacy_unix_menu_func $1 ${chosen_path}
longpanda's avatar
longpanda committed
642
    else
longpanda's avatar
longpanda committed
643
        legacy_linux_menu_func  $1 ${chosen_path}
longpanda's avatar
longpanda committed
644
645
646
    fi
}

longpanda's avatar
longpanda committed
647
648
function legacy_iso_memdisk {
    vt_chosen_img_path chosen_path
longpanda's avatar
longpanda committed
649

longpanda's avatar
longpanda committed
650
651
652
653
654
    linux16   $vtoy_path/memdisk iso raw    
    echo "Loading ISO file to memory ..."
    initrd16  ${1}${chosen_path}
    boot
}
longpanda's avatar
longpanda committed
655

656
function iso_common_menuentry {
longpanda's avatar
longpanda committed
657
658
659
    unset vt_system_id
    unset vt_volume_id
    
longpanda's avatar
longpanda committed
660
661
    if [ "$grub_platform" = "pc" ]; then
        if vt_check_mode 0; then
longpanda's avatar
longpanda committed
662
            legacy_iso_memdisk $vtoy_iso_part
longpanda's avatar
longpanda committed
663
        else
longpanda's avatar
longpanda committed
664
            legacy_iso_menu_func $vtoy_iso_part
longpanda's avatar
longpanda committed
665
666
667
        fi
    else
        if vt_check_mode 0; then
longpanda's avatar
longpanda committed
668
            uefi_iso_memdisk $vtoy_iso_part 
longpanda's avatar
longpanda committed
669
        else
longpanda's avatar
longpanda committed
670
            uefi_iso_menu_func $vtoy_iso_part                
longpanda's avatar
longpanda committed
671
672
673
674
        fi
    fi      
}

longpanda's avatar
longpanda committed
675
function common_unsupport_menuentry {
676
    echo -e "\n The name of the iso file could NOT contain space or non-ascii characters. \n"
longpanda's avatar
longpanda committed
677
678
679
    echo -e " 文件名中不能有中文或空格 \n"    
    echo -e "\npress ENTER to exit (请按 回车 键返回) ..."    
    read vtInputKey
680
681
}

longpanda's avatar
longpanda committed
682
683
684
function iso_unsupport_menuentry {
    common_unsupport_menuentry
}
685
686
687

function wim_common_menuentry {
    vt_chosen_img_path chosen_path
longpanda's avatar
longpanda committed
688
    vt_wim_chain_data ${vtoy_iso_part}${chosen_path}
longpanda's avatar
longpanda committed
689
690
    
    ventoy_debug_pause    
691
692
693
694
695
    
    if [ -n "$vtoy_chain_mem_addr" ]; then
        if [ "$grub_platform" = "pc" ]; then
            linux16   $vtoy_path/ipxe.krn ${vtdebug_flag}  mem:${vtoy_chain_mem_addr}:size:${vtoy_chain_mem_size}
        else
longpanda's avatar
update  
longpanda committed
696
            ventoy_cli_console
697
            chainloader ${vtoy_path}/ventoy_x64.efi  env_param=${env_param} isoefi=${LoadIsoEfiDriver} ${vtdebug_flag} mem:${vtoy_chain_mem_addr}:size:${vtoy_chain_mem_size}
longpanda's avatar
update  
longpanda committed
698
            ventoy_gui_console
699
700
701
702
        fi
        boot
    else
        echo "chain empty failed"
longpanda's avatar
longpanda committed
703
        ventoy_pause
704
705
706
707
    fi
}

function wim_unsupport_menuentry {
longpanda's avatar
longpanda committed
708
709
710
711
712
713
    common_unsupport_menuentry
}

function efi_common_menuentry {
    vt_chosen_img_path chosen_path
    
longpanda's avatar
update  
longpanda committed
714
    ventoy_cli_console    
longpanda's avatar
longpanda committed
715
    chainloader ${vtoy_iso_part}${chosen_path}
longpanda's avatar
longpanda committed
716
    boot
longpanda's avatar
update  
longpanda committed
717
    ventoy_gui_console
longpanda's avatar
longpanda committed
718
719
720
721
}

function efi_unsupport_menuentry {
    common_unsupport_menuentry
722
}
longpanda's avatar
longpanda committed
723

longpanda's avatar
longpanda committed
724
725


longpanda's avatar
longpanda committed
726
727
728
729
730
731
732
733
#############################################################
#############################################################
#############################################################
#######                 Main Process              ###########
#############################################################
#############################################################
#############################################################

longpanda's avatar
longpanda committed
734
set VENTOY_VERSION="1.0.17"
longpanda's avatar
longpanda committed
735
736
737
738
739

# Default menu display mode, you can change it as you want.
#    0: List mode   
#    1: TreeView mode
set VTOY_DEFAULT_MENU_MODE=0
longpanda's avatar
longpanda committed
740

741
set VTOY_MEM_DISK_STR="[Memdisk]"
longpanda's avatar
longpanda committed
742
set VTOY_ISO_RAW_STR="Compatible Mode"
longpanda's avatar
longpanda committed
743
744
set VTOY_ISO_UEFI_DRV_STR="UEFI FS"

longpanda's avatar
longpanda committed
745
set VTOY_F2_CMD="ventoy_power"
longpanda's avatar
longpanda committed
746
747
set VTOY_F4_CMD="ventoy_localboot"
set VTOY_F5_CMD="ventoy_diagnosis"
longpanda's avatar
longpanda committed
748
set VTOY_F6_CMD="ventoy_ext_menu"
longpanda's avatar
longpanda committed
749
750
751
752
753
754

if [ "$grub_platform" = "pc" ]; then
    set VTOY_TEXT_MENU_VER="Ventoy $VENTOY_VERSION BIOS  www.ventoy.net"
else
    set VTOY_TEXT_MENU_VER="Ventoy $VENTOY_VERSION UEFI  www.ventoy.net"
fi
longpanda's avatar
longpanda committed
755

longpanda's avatar
longpanda committed
756
757
758
vt_device $root  vtoy_dev

if [ "$vtoy_dev" = "tftp" ]; then
longpanda's avatar
longpanda committed
759
    set vtoy_path=($root)
longpanda's avatar
longpanda committed
760
    for vtid in 0 1 2 3; do
longpanda's avatar
longpanda committed
761
        if [ -d (hd$vtid,2)/ventoy ]; then
longpanda's avatar
longpanda committed
762
            set vtoy_iso_part=(hd$vtid,1)
763
            set vtoy_efi_part=(hd$vtid,2)
longpanda's avatar
longpanda committed
764
765
766
            break
        fi
    done
longpanda's avatar
longpanda committed
767
    loadfont ascii
longpanda's avatar
longpanda committed
768

longpanda's avatar
longpanda committed
769
770
    if [ -f $vtoy_iso_part/ventoy/ventoy.json ]; then
       set vt_plugin_path=$vtoy_iso_part
longpanda's avatar
longpanda committed
771
772
773
774
    else
        set vt_plugin_path=$prefix
        vt_load_plugin $vt_plugin_path
    fi
longpanda's avatar
longpanda committed
775
else
longpanda's avatar
longpanda committed
776
777
778
779
780
781
    if [ "$prefix" = "(ventoydisk)/grub" ]; then
        set vtoy_path=(ventoydisk)/ventoy
    else
        set vtoy_path=($root)/ventoy
    fi

longpanda's avatar
longpanda committed
782
    set vtoy_iso_part=($vtoy_dev,1)
783
    set vtoy_efi_part=($vtoy_dev,2)
longpanda's avatar
longpanda committed
784
    loadfont unicode
longpanda's avatar
longpanda committed
785
    set vt_plugin_path=$vtoy_iso_part
longpanda's avatar
longpanda committed
786
787
788
fi


789
#Load Plugin
longpanda's avatar
longpanda committed
790
791
if [ -f $vtoy_iso_part/ventoy/ventoy.json ]; then
   vt_load_plugin $vtoy_iso_part
longpanda's avatar
longpanda committed
792
793
fi

longpanda's avatar
longpanda committed
794
795
796
797
798
799
if [ -n "$VTOY_MENU_TIMEOUT" ]; then
    set timeout=$VTOY_MENU_TIMEOUT
else
    unset timeout
fi

longpanda's avatar
longpanda committed
800
801
if [ -f $vtoy_iso_part/ventoy/ventoy_wimboot.img ]; then
    vt_load_wimboot $vtoy_iso_part/ventoy/ventoy_wimboot.img
802
803
804
805
elif [ -f $vtoy_efi_part/ventoy/ventoy_wimboot.img ]; then
    vt_load_wimboot $vtoy_efi_part/ventoy/ventoy_wimboot.img
fi

806
807
808

if [ $VTOY_DEFAULT_MENU_MODE -eq 0 ]; then
    set VTOY_F3_CMD="vt_dynamic_menu 1 1"
longpanda's avatar
longpanda committed
809
    set VTOY_HOTKEY_TIP="F1:Memdisk  F2:Power  F3:TreeView  F4:Localboot  F5:Debug  F6:ExMenu"
810
811
else
    set VTOY_F3_CMD="vt_dynamic_menu 1 0"
longpanda's avatar
longpanda committed
812
    set VTOY_HOTKEY_TIP="F1:Memdisk  F2:Power  F3:ListView  F4:Localboot  F5:Debug  F6:ExMenu"
813
814
815
fi


longpanda's avatar
longpanda committed
816
817
818
819
820
if [ -n "$vtoy_gfxmode" ]; then
    set gfxmode=$vtoy_gfxmode
else
    set gfxmode=1920x1080,1366x768,1024x768
fi
longpanda's avatar
longpanda committed
821

longpanda's avatar
longpanda committed
822
823
if [ "$vtoy_display_mode" = "CLI" ]; then
    terminal_output  console
longpanda's avatar
update  
longpanda committed
824
825
826
827
828
829
else    
    if [ -n "$vtoy_theme" ]; then
        set theme=$vtoy_theme
    else
        set theme=$prefix/themes/ventoy/theme.txt
    fi
longpanda's avatar
longpanda committed
830
831
832
    terminal_output  gfxterm
fi

longpanda's avatar
longpanda committed
833
834
835
836
837
838
839
840
841
842
843
#export necessary variable
export theme
export gfxmode
export vtoy_dev
export vtoy_iso_part
export vtoy_efi_part
export VENTOY_VERSION




longpanda's avatar
longpanda committed
844
845
#colect all image files (iso files)
set ventoy_img_count=0
longpanda's avatar
longpanda committed
846
vt_list_img $vtoy_iso_part ventoy_img_count
longpanda's avatar
longpanda committed
847

longpanda's avatar
longpanda committed
848
849
#Main menu
if [ $ventoy_img_count -gt 0 ]; then
longpanda's avatar
longpanda committed
850
851
852
853
854
    if [ $VTOY_DEFAULT_MENU_MODE -eq 0 ]; then
        vt_dynamic_menu 0 0 
    else
        vt_dynamic_menu 0 1
    fi
longpanda's avatar
longpanda committed
855
else
856
857
858
859
860
861
862
863
    if [ -n "$VTOY_NO_ISO_TIP" ]; then
        NO_ISO_MENU="No ISO files found, $VTOY_NO_ISO_TIP"
    elif [ -n "$VTOY_DEFAULT_SEARCH_ROOT" ]; then
        NO_ISO_MENU="No ISO files found, please check VTOY_DEFAULT_SEARCH_ROOT"
    else
        NO_ISO_MENU="No ISO files found"
    fi
    menuentry "$NO_ISO_MENU (Press enter to reboot ...)" {
longpanda's avatar
longpanda committed
864
865
866
867
        echo -e "\n    Rebooting ... "
        reboot
    }
fi