Compare commits

...
100 Commits
Author SHA1 Message Date
longpanda 6116894ab8 1.1.18 release
Ventoy CI / build (push) Canceled after 0s
Mirror GitHub to Gitee / Sync-GitHub-to-Gitee (push) Canceled after 0s
2026-10-09 12:03:06 +08:00
ca92070fac Plugson: cap Boot Conf Replace at 2 entries per mode (#3727)
Ventoy only supports replacing up to 2 config files per mode, but
Plugson's Boot Conf Replace page let users add unlimited entries with
no indication that anything past the 2nd is silently ignored. Block
the add action once 2 entries exist for the current tab and show a
warning instead.

Fixes #3593

Co-authored-by: Raj <raj@Rajs-MacBook-Pro.local>
2026-10-09 11:33:26 +08:00
Maison da SilvaandGitHub 2af829d020 Fixes accentuation and formatting in the Portuguese help text. (#3746)
* Fixes accentuation and formatting in the Portuguese help text.

Fixes accentuation and formatting in the Portuguese help text.

* Fix typos in Portuguese help text for GRUB

* Fix typo in help text for compatibility mode

* Fix Brazilian Portuguese translations in pt_BR.json

Updated Brazilian Portuguese translations for various menu strings in the GRUB configuration.
2026-10-09 11:31:50 +08:00
argothielandGitHub 2b38972540 doc: Update dependencies links (#3725)
Replace dead links.
Replace arrows with actual commands, for easier copying.
2026-10-09 11:29:24 +08:00
longpanda 85440c00a1 Add a bat for VS build 2026-10-09 10:05:18 +08:00
longpanda ab684ca049 Improve ISO partition auto mount for different Linux distros. 2026-10-09 10:04:53 +08:00
longpanda 96f3210bd0 Make the ISO partition mountable for CloneZilla. (#3274)
Ventoy CI / build (push) Canceled after 0s
Mirror GitHub to Gitee / Sync-GitHub-to-Gitee (push) Canceled after 0s
2026-10-08 18:45:50 +08:00
longpanda 490ed6ce0f 1. Improve the Linux remount feature to make the ISO partition mountable out of the box on mainstream desktop distros.
Ventoy CI / build (push) Canceled after 0s
Mirror GitHub to Gitee / Sync-GitHub-to-Gitee (push) Canceled after 0s
2. Change the ISO partition dm name to stable /dev/mapper/VentoyPart
2026-10-08 11:10:13 +08:00
longpanda 432152813e VtoyTool add cmds. 2026-10-08 11:04:39 +08:00
longpanda 2c4e686293 Optimize udev process 2026-10-05 23:28:56 +08:00
longpanda a2f6e4e31f Optimize udev process 2026-10-05 23:28:02 +08:00
longpanda 029a0a9d16 Experimental support for SteamOS recovery images. (#3712 #2875 #1815)
Ventoy CI / build (push) Canceled after 0s
Mirror GitHub to Gitee / Sync-GitHub-to-Gitee (push) Canceled after 0s
2026-09-30 19:20:12 +08:00
longpanda a67151f859 Make vt_img_extra_initrd_append cmd auto process suffix.
Different Linux distros use different kernel module file format (e.g. .ko/.ko.xz/.ko.zst ...)
Add auto detect feature to vt_img_extra_initrd_append.
2026-09-30 19:10:49 +08:00
longpanda a9331a749c Improvement for latest LinuxConsole release. (#3745)
Ventoy CI / build (push) Canceled after 0s
Mirror GitHub to Gitee / Sync-GitHub-to-Gitee (push) Canceled after 0s
2026-09-29 15:35:07 +08:00
longpanda b327e92a34 Add support for custom Syslinux-based ISO (#3760) 2026-09-29 14:32:50 +08:00
longpanda f9669af70c Fix the boot issue for Grml 2026.09 (#3751)
Ventoy CI / build (push) Canceled after 0s
Mirror GitHub to Gitee / Sync-GitHub-to-Gitee (push) Canceled after 0s
2026-09-29 09:48:31 +08:00
longpanda ca552e14c0 Change hard coded dracut hooks directory to variable. (#3753)
Ventoy CI / build (push) Canceled after 0s
Mirror GitHub to Gitee / Sync-GitHub-to-Gitee (push) Canceled after 0s
Some distros (e.g.  Fedora 45) change dracut hooks directory from /lib/dracut/hooks to /var/lib/dracut/hooks
2026-09-28 20:56:47 +08:00
longpanda 6568972abc Fix Persistence intermittently fails on Ubuntu 24.04 (#3718)
Ventoy CI / build (push) Canceled after 0s
Mirror GitHub to Gitee / Sync-GitHub-to-Gitee (push) Canceled after 0s
2026-08-06 12:51:19 +08:00
longpanda 021c237920 Fix the Windows/WinPE secure boot version check failed issue.
Conditions:
1. Secure boot is enabled.
2. Select ByPass policy in Ventoy.
3. With BIOS update to latest. (Windows CA2011 revocated)

Error message is like follows:
Security Error: Secure boot version check failed.
Your system security may be compromised!

Current version: 1.0 - Minimum allowed version: xx.0
Visit https://aka.ms/secure-boot-version-violation for more information.

The system will shutdown in 10 seconds.

......
2026-08-06 11:13:37 +08:00
longpanda 7cbdc5cf69 1.1.17 release
Ventoy CI / build (push) Has been cancelled
Mirror GitHub to Gitee / Sync-GitHub-to-Gitee (push) Has been cancelled
2026-07-24 20:56:41 +08:00
longpanda 5903c8bf52 Fix the issue that proxmox-ve can not boot after install in grub2 mode. 2026-07-24 20:53:12 +08:00
Tiago Augusto PimentaandGitHub 40895a09f6 Fix fdisk detection on BusyBox systems (#3614)
Ventoy CI / build (push) Has been cancelled
Mirror GitHub to Gitee / Sync-GitHub-to-Gitee (push) Has been cancelled
On BusyBox, fdisk -v exists but returns a non-zero exit code,
causing the script to incorrectly conclude fdisk is not available.
Use POSIX command -v instead to reliably check for fdisk.
2026-07-24 18:26:25 +08:00
HYB1022andGitHub ddc8e53156 [ko_KR] Improve Korean translation (natural phrasing & context fixes) (#3694)
* edit context, Language refinement (korean)

* Update languages.json
2026-07-24 17:31:58 +08:00
longpanda e352b76731 Fix the PATH broken in Ventoy2Disk.sh (#3615) 2026-07-24 17:21:49 +08:00
longpanda 5ebef5af77 Fix the boot issue for latest GhostBSD (#3664) 2026-07-24 16:56:59 +08:00
longpanda 9be9c7adb8 Add support for Athena OS (#3689) 2026-07-24 15:26:59 +08:00
longpanda 3751a47513 Add log for live injection process. 2026-07-24 14:14:12 +08:00
longpanda 6dd3ed3ce3 Fix the disk_write logic error (#3693)
This is indeed a logic error, but actually it does not take effect so it does not cause any install/update failure.
2026-07-24 12:25:35 +08:00
longpanda ac300d7464 Add support for some EulerOS release. 2026-07-24 11:52:45 +08:00
longpanda 0963c1d396 Fix the boot issue for some UOS release. 2026-07-24 11:49:59 +08:00
longpanda a3995a0267 Optimization for secure boot process.
Ventoy CI / build (push) Has been cancelled
Mirror GitHub to Gitee / Sync-GitHub-to-Gitee (push) Has been cancelled
2026-06-29 13:46:17 +08:00
longpanda ba87af540b Update hwinfo
Ventoy CI / build (push) Has been cancelled
Mirror GitHub to Gitee / Sync-GitHub-to-Gitee (push) Has been cancelled
2026-06-28 23:06:50 +08:00
longpanda 3d0d6c3147 Optimization for secure boot process.
Ventoy CI / build (push) Has been cancelled
Mirror GitHub to Gitee / Sync-GitHub-to-Gitee (push) Has been cancelled
2026-06-28 21:48:32 +08:00
longpanda 2915e197e9 Optimization for secure boot process.
Ventoy CI / build (push) Has been cancelled
Mirror GitHub to Gitee / Sync-GitHub-to-Gitee (push) Has been cancelled
2026-06-28 00:24:59 +08:00
longpanda 9bf8393cdf Optimization for secure boot process.
Ventoy CI / build (push) Has been cancelled
Mirror GitHub to Gitee / Sync-GitHub-to-Gitee (push) Has been cancelled
2026-06-26 18:08:39 +08:00
longpanda 05d10437b0 Remove grub.cfg max resolution script function.
Ventoy CI / build (push) Has been cancelled
Mirror GitHub to Gitee / Sync-GitHub-to-Gitee (push) Has been cancelled
2026-06-25 22:37:03 +08:00
longpanda 083e5f72ea Optimization for Secure Boot process. 2026-06-25 22:36:33 +08:00
longpanda 2f66a309e4 1.1.16 release.
Ventoy CI / build (push) Has been cancelled
Mirror GitHub to Gitee / Sync-GitHub-to-Gitee (push) Has been cancelled
2026-06-25 19:46:14 +08:00
longpanda aa75cdac7d VtoyShim build script update. 2026-06-25 19:39:15 +08:00
longpanda ccf4f7234a Fix the issue that VTOY_WIN_UEFI_RES_LOCK option reset when enter VentoyPlugson. 2026-06-25 19:38:47 +08:00
longpanda c1cad99584 Merge branch 'master' of https://github.com/Ventoy/Ventoy 2026-06-25 19:31:39 +08:00
VenusGirl❤andGitHub d9cab1cb33 Update Korean (#3649) 2026-06-25 19:31:22 +08:00
independent-argandGitHub 18f4c8afcc i18n: Update and optimize Spanish translation for grub and language JSON (#3648)
* i18n: Update Spanish translation

- Fixed grammatical inconsistencies (unified verbs to infinitive).
- Corrected missing accents and typos (árbol, gráfico, depuración).
- Standardized UI terminology to match original English text (GUI Mode).

* i18n: Update and fix typos in Spanish (Latinoamérica) translation

* docs(i18n): comprehensive Spanish localization updates

* update Spanish translations for Ventoy strings
2026-06-25 19:31:07 +08:00
Roope YrjöläandGitHub aeb46cd3c8 modified: LANGUAGES/languages.json (#3645)
Modified the finnis language translation.
2026-06-25 19:30:54 +08:00
longpanda 475de1dada Fix the boot issue with old UEFI version firmware when secure boot is disabled. 2026-06-25 19:23:48 +08:00
longpanda 31648a0d4b Fix the latest Kicksecure boot issue. (#3651) 2026-06-25 19:16:48 +08:00
longpanda d51e76daa9 1.1.15 release
Ventoy CI / build (push) Has been cancelled
Mirror GitHub to Gitee / Sync-GitHub-to-Gitee (push) Has been cancelled
2026-06-25 08:56:32 +08:00
longpanda f677d72e8d Fix the boot issue when Secure Boot is disabled in the UEFI firmware. (#3650) 2026-06-25 08:52:07 +08:00
longpanda 6418c2a09f 1.1.14
Ventoy CI / build (push) Has been cancelled
Mirror GitHub to Gitee / Sync-GitHub-to-Gitee (push) Has been cancelled
2026-06-24 20:55:20 +08:00
longpanda c2a3f181c0 Fix the secure boot issue. 2026-06-24 20:52:56 +08:00
longpanda 90e4f9db63 1.1.13 release
Ventoy CI / build (push) Has been cancelled
Mirror GitHub to Gitee / Sync-GitHub-to-Gitee (push) Has been cancelled
2026-06-24 18:41:35 +08:00
longpanda 255e84dbab Update BLOB_List.md 2026-06-24 18:41:24 +08:00
longpanda 213ce02985 add build.bat for VentoyPlugson 2026-06-24 18:41:03 +08:00
longpanda 8c2a3b44da Update BLOB_List.md 2026-06-24 17:39:31 +08:00
longpanda 536545cd39 VentoyPlugson Update
- Add missing option (VTOY_WIN_UEFI_RES_LOCK)
 - Add new option (VTOY_SECURE_BOOT_POLICY)
 - Remove deprecated option (VTOY_LINUX_REMOUNT)
2026-06-24 16:43:10 +08:00
longpanda 0f59e92a01 Fix grub i386 build issue.
Ventoy CI / build (push) Has been cancelled
Mirror GitHub to Gitee / Sync-GitHub-to-Gitee (push) Has been cancelled
2026-06-23 22:34:10 +08:00
longpanda 4b1e5ce89c Update SecureBoot.md 2026-06-23 22:11:24 +08:00
longpanda 1ed7bc9596 Ventoy Secure Boot Policy Update
- Update Ventoy grub code to match the new policy.
2026-06-23 21:19:46 +08:00
longpanda 71ac855b36 Ventoy Secure Boot Policy Update
- Update pack script (add efi file signature process)
2026-06-23 21:10:17 +08:00
longpanda 4302854b8d Ventoy Secure Boot Policy Update
- Update shim and MokManager for x86_64. I choose the shim file from Rocky Linux 9.2 because it was signed with both UEFI CA 2011 and UEFI CA 2023.
 - Update Ventoy Secure Boot CA.
2026-06-23 21:08:48 +08:00
longpanda 036f7234ad Ventoy Secure Boot Policy Update
- Add SecureBoot.md
2026-06-23 21:04:09 +08:00
longpanda 26a394ce84 Ventoy Secure Boot Policy Update
- Add Ventoy Preload module.
2026-06-23 21:02:56 +08:00
longpanda 25369d5884 Merge branch 'master' of https://github.com/Ventoy/Ventoy
Ventoy CI / build (push) Has been cancelled
Mirror GitHub to Gitee / Sync-GitHub-to-Gitee (push) Has been cancelled
2026-05-07 11:18:23 +08:00
longpanda 12387fff81 Fix the boot issue for some WinPE iso. 2026-05-07 11:17:57 +08:00
andrewczmandGitHub b54a7fe93b Polish translation - update (#3576)
Ventoy CI / build (push) Has been cancelled
Mirror GitHub to Gitee / Sync-GitHub-to-Gitee (push) Has been cancelled
* Update pl_PL.json

* Update pl_PL.json

* Update languages.json
2026-04-24 15:40:01 +08:00
longpanda dba7530b21 1.1.12
Ventoy CI / build (push) Has been cancelled
Mirror GitHub to Gitee / Sync-GitHub-to-Gitee (push) Has been cancelled
2026-04-23 18:04:05 +08:00
longpanda e9b4c86082 Fix Oracle Linux 6.9 install issue
Ventoy CI / build (push) Has been cancelled
Mirror GitHub to Gitee / Sync-GitHub-to-Gitee (push) Has been cancelled
2026-04-23 00:23:21 +08:00
longpanda dbcdf51950 Improve for UEFI boot Windows/WinPE resolution issue fix. 2026-04-23 00:00:05 +08:00
longpanda de3e6c6d1d rollback dmsetup operation.
Ventoy CI / build (push) Has been cancelled
Mirror GitHub to Gitee / Sync-GitHub-to-Gitee (push) Has been cancelled
2026-04-14 19:42:19 +08:00
longpanda 3c0df07b92 Improve for UEFI boot Windows/WinPE resolution issue fix.
Ventoy CI / build (push) Has been cancelled
Mirror GitHub to Gitee / Sync-GitHub-to-Gitee (push) Has been cancelled
2026-04-14 15:38:06 +08:00
longpanda c1c27cd30c Bugfix for ubuntu24.04.4 install failure. (#3567) 2026-04-14 11:03:02 +08:00
longpanda 167c87402c 1.1.11
Ventoy CI / build (push) Has been cancelled
Mirror GitHub to Gitee / Sync-GitHub-to-Gitee (push) Has been cancelled
. Fix the display issue when UEFI boot Windows/WinPE
. #3537
. #3532
. Add VT_WINDOWS_DISK_NONVTOY_CLOSEST_XXX  VT_LINUX_DISK_NONVTOY_CLOSEST_XXX
2026-04-05 23:11:45 +08:00
longpanda d35b8431fe Update distro check
Ventoy CI / build (push) Has been cancelled
Mirror GitHub to Gitee / Sync-GitHub-to-Gitee (push) Has been cancelled
2026-04-05 17:30:17 +08:00
Florian FuchsandGitHub a1771bd9b8 Improve booting of T2SDE live ISOs (#3526)
T2SDE changed the boot process vastly with 26.3 as it ships as a live
image now. So the injection hooks need to be customized.
2026-04-05 16:49:01 +08:00
panchenboandGitHub ed61a955bf add kylinsecos support (#3552)
Ventoy CI / build (push) Has been cancelled
Mirror GitHub to Gitee / Sync-GitHub-to-Gitee (push) Has been cancelled
2026-04-02 18:09:08 +08:00
longpanda e7cf29fd9d Add create_ventoy_iso_part_dm.sh (#3497)
Ventoy CI / build (push) Has been cancelled
Mirror GitHub to Gitee / Sync-GitHub-to-Gitee (push) Has been cancelled
2026-02-01 13:54:16 +08:00
longpandaandGitHub b5d87d394a Update imdisk download link in BuildVentoyFromSource.txt
Ventoy CI / build (push) Has been cancelled
Mirror GitHub to Gitee / Sync-GitHub-to-Gitee (push) Has been cancelled
2026-01-31 23:14:18 +08:00
longpanda 36da0e0f3d Add VT_WINDOWS_DISK_NONVTOY_CLOSEST_XXX
Ventoy CI / build (push) Has been cancelled
Mirror GitHub to Gitee / Sync-GitHub-to-Gitee (push) Has been cancelled
2026-01-23 10:47:49 +08:00
Florian FuchsandGitHub 903fd7aa01 Support booting T2SDE ISOs better (#3468)
Ventoy CI / build (push) Has been cancelled
Mirror GitHub to Gitee / Sync-GitHub-to-Gitee (push) Has been cancelled
T2 uses zstd compressed kernel modules, where dm-mod also depends on
dax module. So the default fallback to only decompress dm-mod isn't
sufficient. So we manually uncompress dax.ko and dm-mod.ko and insmod
this, as default busybox modprobe/insmod doesn't support zstd modules.
2026-01-08 16:26:35 +08:00
longpanda 81728a817c 1.1.10 release
Ventoy CI / build (push) Has been cancelled
Mirror GitHub to Gitee / Sync-GitHub-to-Gitee (push) Has been cancelled
2025-12-21 20:56:53 +08:00
longpanda f68d4a8076 Revert "added the Uzbek language я исправил потвердите (#3306)"
This reverts commit d3b911d249.
2025-12-21 20:33:25 +08:00
Ida BagusandGitHub f6c248e983 Update languages.json (#3198) 2025-12-21 20:26:14 +08:00
Ida BagusandGitHub 0906cd34fe Update id_ID.json (#3199) 2025-12-21 20:26:00 +08:00
+9
tojik_proof_93GitHubCopilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>
d3b911d249 added the Uzbek language я исправил потвердите (#3306)
* added the Uzbek language

* Potential fix for code scanning alert no. 1: DOM text reinterpreted as HTML

Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>

* Potential fix for code scanning alert no. 2: DOM text reinterpreted as HTML

Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>

* Potential fix for code scanning alert no. 3: DOM text reinterpreted as HTML

Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>

* Potential fix for code scanning alert no. 13: Time-of-check time-of-use filesystem race condition

Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>

* Potential fix for code scanning alert no. 12: Time-of-check time-of-use filesystem race condition

Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>

* Potential fix for code scanning alert no. 4: DOM text reinterpreted as HTML

Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>

* Potential fix for code scanning alert no. 11: Time-of-check time-of-use filesystem race condition

Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>

* Potential fix for code scanning alert no. 5: DOM text reinterpreted as HTML

Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>

* Potential fix for code scanning alert no. 7: Unsafe jQuery plugin

Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>

* Potential fix for code scanning alert no. 8: Unsafe jQuery plugin

Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>

* Potential fix for code scanning alert no. 14: DOM text reinterpreted as HTML

Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>

* Potential fix for code scanning alert no. 10: Time-of-check time-of-use filesystem race condition

Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>

* Potential fix for code scanning alert no. 15: Time-of-check time-of-use filesystem race condition

Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>

* Potential fix for code scanning alert no. 9: Call to `memset` may be deleted

Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>

* Update bootstrap.js

* Update ci.yml

* Potential fix for code scanning alert no. 17: Workflow does not contain permissions

Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>

* Potential fix for code scanning alert no. 16: Workflow does not contain permissions

Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>

* Update ci.yml

* Update ci.yml

---------

Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>
2025-12-21 20:23:34 +08:00
VenusGirl❤andGitHub 5c6e1c2446 Update ko_KR.txt (#3307) 2025-12-21 20:22:38 +08:00
SIDDHARTHandGitHub 3a97ab9165 Added Malayalam language support to languages.json (#3351) 2025-12-21 20:20:11 +08:00
Muhammad RamzanandGitHub 6fe6231790 Add Urdu language support for Ventoy UI (#3356)
* Add Urdu language support for Ventoy UI

* Add Urdu language support for Ventoy UI

* Add Urdu language support for Ventoy UI

* Update languages.json
2025-12-21 20:19:56 +08:00
9564f125a7 Added Persian Language (#3376)
Co-authored-by: Mojtaba Asgari <Mojtaba.asgari512@gmail.com>
2025-12-21 20:15:00 +08:00
David RefouaandGitHub e380575b91 fix grammar (#3413) 2025-12-21 20:13:04 +08:00
Moses CursorandGitHub 0fd49126bd Add Luganda help text (#3417)
Add Luganda Menu translation
2025-12-21 20:11:31 +08:00
Maison da SilvaandGitHub a466d787b8 Update ANSI for UTF-8 Lang pt-BR (#3432)
Update ANSI for UTF-8 Lang pt-BR
2025-12-21 20:11:02 +08:00
Andrew Poženel - SloDevTeamandGitHub ab5d00bafb Add and update Slovenian translations (#3445)
Added a new Slovenian help file for GRUB and replaced the existing Slovenian translation in languages.json with an updated and expanded version. The new translation provides improved accuracy and consistency for Slovenian users. I've included both authors, the previous one and myself.
2025-12-21 20:10:31 +08:00
longpanda 450caa6654 update README.md
Ventoy CI / build (push) Has been cancelled
Mirror GitHub to Gitee / Sync-GitHub-to-Gitee (push) Has been cancelled
2025-12-20 11:26:26 +08:00
longpanda ef93b55c91 Fix the LinuxGUI program crash issue in wayland environment. (#3406)
Ventoy CI / build (push) Has been cancelled
Mirror GitHub to Gitee / Sync-GitHub-to-Gitee (push) Has been cancelled
2025-12-20 09:07:08 +08:00
longpanda 4d7fcc26d4 Add support for AerynOS. (#3433)
Ventoy CI / build (push) Has been cancelled
Mirror GitHub to Gitee / Sync-GitHub-to-Gitee (push) Has been cancelled
2025-12-19 23:19:58 +08:00
longpanda 3597f15814 Fix the LinuxGUI program crash issue in wayland environment. (#3406)
Ventoy CI / build (push) Has been cancelled
Mirror GitHub to Gitee / Sync-GitHub-to-Gitee (push) Has been cancelled
2025-12-19 14:48:53 +08:00
longpanda f7e4a7a6ec Ventoy2Disk.sh supports musl libc envrionment. (#3332)
Ventoy CI / build (push) Has been cancelled
Mirror GitHub to Gitee / Sync-GitHub-to-Gitee (push) Has been cancelled
Only Ventoy2Disk.sh support, WebUI/LinuxGUI does not support.
2025-12-18 23:32:34 +08:00
longpanda 65b88aabc5 Fix the vhd.vtoy file boot issue in ext4 file system. (#3444)
Ventoy CI / build (push) Has been cancelled
Mirror GitHub to Gitee / Sync-GitHub-to-Gitee (push) Has been cancelled
2025-12-18 08:55:37 +08:00
longpanda c42abd33c2 Fix a Windows boot issue in F2 mode.
Ventoy CI / build (push) Has been cancelled
Mirror GitHub to Gitee / Sync-GitHub-to-Gitee (push) Has been cancelled
2025-12-17 22:51:58 +08:00
longpanda af34df278f Fix the boot issue with Kylin Server V11. (#3369)
Ventoy CI / build (push) Has been cancelled
Mirror GitHub to Gitee / Sync-GitHub-to-Gitee (push) Has been cancelled
2025-12-12 23:19:34 +08:00
178 changed files with 8362 additions and 2619 deletions
+96 -95
View File
@@ -46,131 +46,132 @@
<tr> <td>./IMG/cpio_x86/ventoy/tool/zstdcat</td> <td>build</td> <td>Same with ./ZSTD/zstdcat<br/>Check the file hash to confirm</td> </tr> <tr> <td>./IMG/cpio_x86/ventoy/tool/zstdcat</td> <td>build</td> <td>Same with ./ZSTD/zstdcat<br/>Check the file hash to confirm</td> </tr>
<tr> <td>./IMG/cpio_x86/ventoy/tool/zstdcat64</td> <td>build</td> <td>Same with ./ZSTD/zstdcat64<br/>Check the file hash to confirm</td> </tr> <tr> <td>./IMG/cpio_x86/ventoy/tool/zstdcat64</td> <td>build</td> <td>Same with ./ZSTD/zstdcat64<br/>Check the file hash to confirm</td> </tr>
<tr> <td>./INSTALL/EFI/BOOT/BOOTAA64.EFI</td> <td rowspan=4>build</td> <td rowspan=4>Build Instructions:<br/> ./DOC/BuildVentoyFromSource.txt 4.1-Build grub2</td> </tr> <tr> <td>./INSTALL/EFI/BOOT/BOOTAA64.EFI</td> <td rowspan=4>build</td> <td rowspan=4>Build Instructions:<br/> ./DOC/BuildVentoyFromSource.txt 4.1-Build grub2</td> </tr>
<tr> <td>./INSTALL/EFI/BOOT/BOOTMIPS.EFI</td> <tr> <td>./INSTALL/EFI/BOOT/BOOTMIPS.EFI</td> </tr>
<tr> <td>./INSTALL/EFI/BOOT/grubia32_real.efi</td> <tr> <td>./INSTALL/EFI/BOOT/grubia32_real.efi</td></tr>
<tr> <td>./INSTALL/EFI/BOOT/grubx64_real.efi</td> <tr> <td>./INSTALL/EFI/BOOT/grubx64_real.efi</td></tr>
<tr> <td>./INSTALL/EFI/BOOT/grub.efi</td> <td rowspan=6>upstream</td> <td rowspan=6>https://github.com/ValdikSS/Super-UEFIinSecureBoot-Disk </td> </tr> <tr> <td>./INSTALL/EFI/BOOT/BOOTIA32.EFI</td> <td rowspan=3>upstream</td> <td rowspan=3>https://github.com/ValdikSS/Super-UEFIinSecureBoot-Disk </td> </tr>
<tr> <td>./INSTALL/EFI/BOOT/BOOTIA32.EFI</td> <tr> <td>./INSTALL/EFI/BOOT/grubia32.efi</td></tr>
<tr> <td>./INSTALL/EFI/BOOT/BOOTX64.EFI</td> <tr> <td>./INSTALL/EFI/BOOT/mmia32.efi</td></tr>
<tr> <td>./INSTALL/EFI/BOOT/grubia32.efi</td> <tr> <td>./INSTALL/EFI/BOOT/BOOTX64.EFI</td> <td rowspan=2>upstream</td> <td rowspan=2>From Rocky Linux 9.8 x86_64 ISO file<br/>Check the file hash to confirm </td> </tr>
<tr> <td>./INSTALL/EFI/BOOT/mmia32.efi</td> <tr> <td>./INSTALL/EFI/BOOT/mmx64.efi</td></tr>
<tr> <td>./INSTALL/EFI/BOOT/MokManager.efi</td>
<tr> <td>./INSTALL/tool/aarch64/ash</td> <td rowspan=12>build</td> <td rowspan=12>Build Instructions:<br/>./DOC/BUSYBOX/build.txt</td> </tr> <tr> <td>./INSTALL/tool/aarch64/ash</td> <td rowspan=12>build</td> <td rowspan=12>Build Instructions:<br/>./DOC/BUSYBOX/build.txt</td> </tr>
<tr> <td>./INSTALL/tool/aarch64/hexdump</td> <tr> <td>./INSTALL/tool/aarch64/hexdump</td></tr>
<tr> <td>./INSTALL/tool/aarch64/xzcat</td> <tr> <td>./INSTALL/tool/aarch64/xzcat</td></tr>
<tr> <td>./INSTALL/tool/i386/ash</td> <tr> <td>./INSTALL/tool/i386/ash</td></tr>
<tr> <td>./INSTALL/tool/i386/hexdump</td> <tr> <td>./INSTALL/tool/i386/hexdump</td></tr>
<tr> <td>./INSTALL/tool/i386/xzcat</td> <tr> <td>./INSTALL/tool/i386/xzcat</td></tr>
<tr> <td>./INSTALL/tool/mips64el/ash</td> <tr> <td>./INSTALL/tool/mips64el/ash</td></tr>
<tr> <td>./INSTALL/tool/mips64el/hexdump</td> <tr> <td>./INSTALL/tool/mips64el/hexdump</td></tr>
<tr> <td>./INSTALL/tool/mips64el/xzcat</td> <tr> <td>./INSTALL/tool/mips64el/xzcat</td></tr>
<tr> <td>./INSTALL/tool/x86_64/ash</td> <tr> <td>./INSTALL/tool/x86_64/ash</td></tr>
<tr> <td>./INSTALL/tool/x86_64/hexdump</td> <tr> <td>./INSTALL/tool/x86_64/hexdump</td></tr>
<tr> <td>./INSTALL/tool/x86_64/xzcat</td> <tr> <td>./INSTALL/tool/x86_64/xzcat</td></tr>
<tr> <td>./INSTALL/tool/aarch64/Ventoy2Disk.gtk3</td> <td rowspan=6>build</td> <td rowspan=6>Build Instructions:<br/>./LinuxGUI/build_gtk.sh</td> </tr> <tr> <td>./INSTALL/tool/aarch64/Ventoy2Disk.gtk3</td> <td rowspan=6>build</td> <td rowspan=6>Build Instructions:<br/>./LinuxGUI/build_gtk.sh</td> </tr>
<tr> <td>./INSTALL/tool/i386/Ventoy2Disk.gtk3</td> <tr> <td>./INSTALL/tool/i386/Ventoy2Disk.gtk3</td></tr>
<tr> <td>./INSTALL/tool/i386/Ventoy2Disk.gtk2</td> <tr> <td>./INSTALL/tool/i386/Ventoy2Disk.gtk2</td></tr>
<tr> <td>./INSTALL/tool/mips64el/Ventoy2Disk.gtk3</td> <tr> <td>./INSTALL/tool/mips64el/Ventoy2Disk.gtk3</td></tr>
<tr> <td>./INSTALL/tool/x86_64/Ventoy2Disk.gtk3</td> <tr> <td>./INSTALL/tool/x86_64/Ventoy2Disk.gtk3</td></tr>
<tr> <td>./INSTALL/tool/x86_64/Ventoy2Disk.gtk2</td> <tr> <td>./INSTALL/tool/x86_64/Ventoy2Disk.gtk2</td></tr>
<tr> <td>./INSTALL/tool/aarch64/Ventoy2Disk.qt5</td> <td rowspan=4>build</td> <td rowspan=4>Build Instructions:<br/>./LinuxGUI/build_qt.sh</td> </tr> <tr> <td>./INSTALL/tool/aarch64/Ventoy2Disk.qt5</td> <td rowspan=4>build</td> <td rowspan=4>Build Instructions:<br/>./LinuxGUI/build_qt.sh</td> </tr>
<tr> <td>./INSTALL/tool/i386/Ventoy2Disk.qt5</td> <tr> <td>./INSTALL/tool/i386/Ventoy2Disk.qt5</td></tr>
<tr> <td>./INSTALL/tool/mips64el/Ventoy2Disk.qt5</td> <tr> <td>./INSTALL/tool/mips64el/Ventoy2Disk.qt5</td></tr>
<tr> <td>./INSTALL/tool/x86_64/Ventoy2Disk.qt5</td> <tr> <td>./INSTALL/tool/x86_64/Ventoy2Disk.qt5</td></tr>
<tr> <td>./INSTALL/tool/aarch64/Plugson</td> <td rowspan=4>build</td> <td rowspan=4>Build Instructions:<br/>./Plugson/build.sh</td> </tr> <tr> <td>./INSTALL/tool/aarch64/Plugson</td> <td rowspan=4>build</td> <td rowspan=4>Build Instructions:<br/>./Plugson/build.sh</td> </tr>
<tr> <td>./INSTALL/tool/i386/Plugson</td> <tr> <td>./INSTALL/tool/i386/Plugson</td></tr>
<tr> <td>./INSTALL/tool/mips64el/Plugson</td> <tr> <td>./INSTALL/tool/mips64el/Plugson</td></tr>
<tr> <td>./INSTALL/tool/x86_64/Plugson</td> <tr> <td>./INSTALL/tool/x86_64/Plugson</td></tr>
<tr> <td>./INSTALL/tool/aarch64/V2DServer</td> <td rowspan=4>build</td> <td rowspan=4>Build Instructions:<br/>./LinuxGUI/build.sh</td> </tr> <tr> <td>./INSTALL/tool/aarch64/V2DServer</td> <td rowspan=4>build</td> <td rowspan=4>Build Instructions:<br/>./LinuxGUI/build.sh</td> </tr>
<tr> <td>./INSTALL/tool/i386/V2DServer</td> <tr> <td>./INSTALL/tool/i386/V2DServer</td></tr>
<tr> <td>./INSTALL/tool/mips64el/V2DServer</td> <tr> <td>./INSTALL/tool/mips64el/V2DServer</td></tr>
<tr> <td>./INSTALL/tool/x86_64/V2DServer</td> <tr> <td>./INSTALL/tool/x86_64/V2DServer</td></tr>
<tr> <td>./INSTALL/tool/aarch64/mkexfatfs</td> <td rowspan=8>build</td> <td rowspan=8>Build Instructions:<br/>./DOC/BuildVentoyFromSource.txt 4.9<br/>./ExFAT/buidexfat.sh<br/>./ExFAT/buidexfat_aarch64.sh<br/>./ExFAT/buidlibfuse.sh<br/>./ExFAT/buidlibfuse_aarch64.sh<br/></td> </tr> <tr> <td>./INSTALL/tool/aarch64/mkexfatfs</td> <td rowspan=9>build</td> <td rowspan=8>Build Instructions:<br/>./DOC/BuildVentoyFromSource.txt 4.9<br/>./ExFAT/buidexfat.sh<br/>./ExFAT/buidexfat_aarch64.sh<br/>./ExFAT/buidlibfuse.sh<br/>./ExFAT/buidlibfuse_aarch64.sh<br/></td> </tr>
<tr> <td>./INSTALL/tool/aarch64/mount.exfat-fuse</td> <tr> <td>./INSTALL/tool/aarch64/mount.exfat-fuse</td></tr>
<tr> <td>./INSTALL/tool/i386/mkexfatfs</td> <tr> <td>./INSTALL/tool/i386/mkexfatfs</td></tr>
<tr> <td>./INSTALL/tool/i386/mount.exfat-fuse</td> <tr> <td>./INSTALL/tool/i386/mount.exfat-fuse</td></tr>
<tr> <td>./INSTALL/tool/mips64el/mkexfatfs</td> <tr> <td>./INSTALL/tool/mips64el/mkexfatfs</td></tr>
<tr> <td>./INSTALL/tool/mips64el/mount.exfat-fuse</td> <tr> <td>./INSTALL/tool/mips64el/mount.exfat-fuse</td></tr>
<tr> <td>./INSTALL/tool/x86_64/mkexfatfs</td> <tr> <td>./INSTALL/tool/x86_64/mkexfatfs</td></tr>
<tr> <td>./INSTALL/tool/x86_64/mount.exfat-fuse</td> <tr> <td>./INSTALL/tool/x86_64/mkexfatfs_static</td></tr>
<tr> <td>./INSTALL/tool/x86_64/mount.exfat-fuse</td> </tr>
<tr> <td>./INSTALL/tool/aarch64/vlnk</td> <td rowspan=4>build</td> <td rowspan=4>Build Instructions:<br/>./Vlnk/build.sh</td> </tr> <tr> <td>./INSTALL/tool/aarch64/vlnk</td> <td rowspan=4>build</td> <td rowspan=4>Build Instructions:<br/>./Vlnk/build.sh</td> </tr>
<tr> <td>./INSTALL/tool/i386/vlnk</td> <tr> <td>./INSTALL/tool/i386/vlnk</td></tr>
<tr> <td>./INSTALL/tool/mips64el/vlnk</td> <tr> <td>./INSTALL/tool/mips64el/vlnk</td></tr>
<tr> <td>./INSTALL/tool/x86_64/vlnk</td> <tr> <td>./INSTALL/tool/x86_64/vlnk</td></tr>
<tr> <td>./INSTALL/tool/aarch64/vtoycli</td> <td rowspan=4>build</td> <td rowspan=4>Build Instructions:<br/>./vtoycli/build.sh</td> </tr> <tr> <td>./INSTALL/tool/aarch64/vtoycli</td> <td rowspan=4>build</td> <td rowspan=4>Build Instructions:<br/>./vtoycli/build.sh</td> </tr>
<tr> <td>./INSTALL/tool/i386/vtoycli</td> <tr> <td>./INSTALL/tool/i386/vtoycli</td></tr>
<tr> <td>./INSTALL/tool/mips64el/vtoycli</td> <tr> <td>./INSTALL/tool/mips64el/vtoycli</td></tr>
<tr> <td>./INSTALL/tool/x86_64/vtoycli</td> <tr> <td>./INSTALL/tool/x86_64/vtoycli</td></tr>
<tr> <td>./INSTALL/ventoy/imdisk/32/imdisk.cpl</td> <td rowspan=6>upstream</td> <td rowspan=6>Download from imdisk project.<br/>URL & File Hash documented in<br/> ./DOC/BuildVentoyFromSource.txt 5.8</td> </tr> <tr> <td>./INSTALL/ventoy/imdisk/32/imdisk.cpl</td> <td rowspan=6>upstream</td> <td rowspan=6>Download from imdisk project.<br/>URL & File Hash documented in<br/> ./DOC/BuildVentoyFromSource.txt 5.8</td> </tr>
<tr> <td>./INSTALL/ventoy/imdisk/32/imdisk.exe</td> <tr> <td>./INSTALL/ventoy/imdisk/32/imdisk.exe</td></tr>
<tr> <td>./INSTALL/ventoy/imdisk/32/imdisk.sys</td> <tr> <td>./INSTALL/ventoy/imdisk/32/imdisk.sys</td></tr>
<tr> <td>./INSTALL/ventoy/imdisk/64/imdisk.cpl</td> <tr> <td>./INSTALL/ventoy/imdisk/64/imdisk.cpl</td></tr>
<tr> <td>./INSTALL/ventoy/imdisk/64/imdisk.exe</td> <tr> <td>./INSTALL/ventoy/imdisk/64/imdisk.exe</td></tr>
<tr> <td>./INSTALL/ventoy/imdisk/64/imdisk.sys</td> <tr> <td>./INSTALL/ventoy/imdisk/64/imdisk.sys</td></tr>
<tr> <td>./INSTALL/ventoy/iso9660_aa64.efi</td> <td rowspan=6>build</td> <td rowspan=6>Build Instructions:<br/>./DOC/BuildVentoyFromSource.txt 4.17</td> </tr> <tr> <td>./INSTALL/ventoy/iso9660_aa64.efi</td> <td rowspan=6>build</td> <td rowspan=6>Build Instructions:<br/>./DOC/BuildVentoyFromSource.txt 4.17</td> </tr>
<tr> <td>./INSTALL/ventoy/udf_aa64.efi</td> <tr> <td>./INSTALL/ventoy/udf_aa64.efi</td></tr>
<tr> <td>./INSTALL/ventoy/iso9660_ia32.efi</td> <tr> <td>./INSTALL/ventoy/iso9660_ia32.efi</td></tr>
<tr> <td>./INSTALL/ventoy/udf_ia32.efi</td> <tr> <td>./INSTALL/ventoy/udf_ia32.efi</td></tr>
<tr> <td>./INSTALL/ventoy/iso9660_x64.efi</td> <tr> <td>./INSTALL/ventoy/iso9660_x64.efi</td></tr>
<tr> <td>./INSTALL/ventoy/udf_x64.efi</td> <tr> <td>./INSTALL/ventoy/udf_x64.efi</td></tr>
<tr> <td>./INSTALL/VentoyGUI.aarch64</td> <td rowspan=4>build</td> <td rowspan=4>Build Instructions:<br/>./LinuxGUI/build_gtk.sh</td> </tr> <tr> <td>./INSTALL/VentoyGUI.aarch64</td> <td rowspan=4>build</td> <td rowspan=4>Build Instructions:<br/>./LinuxGUI/build_gtk.sh</td> </tr>
<tr> <td>./INSTALL/VentoyGUI.i386</td> <tr> <td>./INSTALL/VentoyGUI.i386</td></tr>
<tr> <td>./INSTALL/VentoyGUI.mips64el</td> <tr> <td>./INSTALL/VentoyGUI.mips64el</td></tr>
<tr> <td>./INSTALL/VentoyGUI.x86_64</td> <tr> <td>./INSTALL/VentoyGUI.x86_64</td></tr>
<tr> <td>./INSTALL/Ventoy2Disk.exe</td> <td rowspan=4>build</td> <td rowspan=4>Build Instructions:<br/>./Ventoy2Disk/Ventoy2Disk.sln</td> </tr> <tr> <td>./INSTALL/Ventoy2Disk.exe</td> <td rowspan=4>build</td> <td rowspan=4>Build Instructions:<br/>./Ventoy2Disk/Ventoy2Disk.sln</td> </tr>
<tr> <td>./INSTALL/Ventoy2Disk_ARM.exe</td> <tr> <td>./INSTALL/Ventoy2Disk_ARM.exe</td></tr>
<tr> <td>./INSTALL/Ventoy2Disk_ARM64.exe</td> <tr> <td>./INSTALL/Ventoy2Disk_ARM64.exe</td></tr>
<tr> <td>./INSTALL/Ventoy2Disk_X64.exe</td> <tr> <td>./INSTALL/Ventoy2Disk_X64.exe</td></tr>
<tr> <td>./INSTALL/ventoy/vtoyjump32.exe</td> <td rowspan=2>build</td> <td rowspan=2>Build Instructions:<br/>./vtoyjump/vtoyjump.sln</td> </tr> <tr> <td>./INSTALL/ventoy/vtoyjump32.exe</td> <td rowspan=2>build</td> <td rowspan=2>Build Instructions:<br/>./vtoyjump/vtoyjump.sln</td> </tr>
<tr> <td>./INSTALL/ventoy/vtoyjump64.exe</td> <tr> <td>./INSTALL/ventoy/vtoyjump64.exe</td></tr>
<tr> <td>./INSTALL/ventoy/ventoy_aa64.efi</td> <td rowspan=6>build</td> <td rowspan=6>Build Instructions:<br/>./EDK2/buildedk.sh</td> </tr> <tr> <td>./INSTALL/ventoy/ventoy_aa64.efi</td> <td rowspan=7>build</td> <td rowspan=7>Build Instructions:<br/>./EDK2/buildedk.sh</td> </tr>
<tr> <td>./INSTALL/ventoy/ventoy_ia32.efi</td> <tr> <td>./INSTALL/ventoy/ventoy_ia32.efi</td></tr>
<tr> <td>./INSTALL/ventoy/ventoy_x64.efi</td> <tr> <td>./INSTALL/ventoy/ventoy_x64.efi</td></tr>
<tr> <td>./INSTALL/ventoy/vtoyutil_aa64.efi</td> <tr> <td>./INSTALL/ventoy/vtoyutil_aa64.efi</td></tr>
<tr> <td>./INSTALL/ventoy/vtoyutil_ia32.efi</td> <tr> <td>./INSTALL/ventoy/vtoyutil_ia32.efi</td></tr>
<tr> <td>./INSTALL/ventoy/vtoyutil_x64.efi</td> <tr> <td>./INSTALL/ventoy/vtoyutil_x64.efi</td></tr>
<tr> <td>./INSTALL/EFI/BOOT/fbx64.efi</td></tr>
<tr> <td>./INSTALL/ventoy/ipxe.krn</td> <td>build</td> <td>Build Instructions:<br/>./IPXE/buildipxe.sh</td> </tr> <tr> <td>./INSTALL/ventoy/ipxe.krn</td> <td>build</td> <td>Build Instructions:<br/>./IPXE/buildipxe.sh</td> </tr>
<tr> <td>./INSTALL/ventoy/memdisk</td> <td>upstream</td> <td>Download from syslinux project.<br/>URL & File Hash documented in<br/> ./DOC/BuildVentoyFromSource.txt 5.9</td> </tr> <tr> <td>./INSTALL/ventoy/memdisk</td> <td>upstream</td> <td>Download from syslinux project.<br/>URL & File Hash documented in<br/> ./DOC/BuildVentoyFromSource.txt 5.9</td> </tr>
<tr> <td>./LiveCD/ISO/EFI/boot/vmlinuz64</td> <td>upstream</td> <td>Download from TinyLinux website.<br/>URL & File Hash documented in<br/> ./DOC/BuildVentoyFromSource.txt 5.14</td> </tr> <tr> <td>./LiveCD/ISO/EFI/boot/vmlinuz64</td> <td>upstream</td> <td>Download from TinyLinux website.<br/>URL & File Hash documented in<br/> ./DOC/BuildVentoyFromSource.txt 5.14</td> </tr>
<tr> <td>./LiveCDGUI/EXT/busybox-x86_64</td> <td>build</td> <td>Same with ./IMG/cpio_x86/ventoy/busybox/busybox64<br/>Check the file hash to confirm</td> </tr> <tr> <td>./LiveCDGUI/EXT/busybox-x86_64</td> <td>build</td> <td>Same with ./IMG/cpio_x86/ventoy/busybox/busybox64<br/>Check the file hash to confirm</td> </tr>
<tr> <td>./LiveCDGUI/GRUB/bootx64.efi</td> <td rowspan=2>build</td> <td rowspan=2>./DOC/BuildVentoyFromSource.txt 4.1-Build grub2</td> </tr> <tr> <td>./LiveCDGUI/GRUB/bootx64.efi</td> <td rowspan=2>build</td> <td rowspan=2>./DOC/BuildVentoyFromSource.txt 4.1-Build grub2</td> </tr>
<tr> <td>./LiveCD/GRUB/bootx64.efi</td> <tr> <td>./LiveCD/GRUB/bootx64.efi</td></tr>
<tr> <td>./LZIP/lunzip32</td> <td rowspan=3>build</td> <td rowspan=3>Build Instructions:<br/>./DOC/BuildVentoyFromSource.txt 4.19</td> </tr> <tr> <td>./LZIP/lunzip32</td> <td rowspan=3>build</td> <td rowspan=3>Build Instructions:<br/>./DOC/BuildVentoyFromSource.txt 4.19</td> </tr>
<tr> <td>./LZIP/lunzip64</td> <tr> <td>./LZIP/lunzip64</td></tr>
<tr> <td>./LZIP/lunzipaa64</td> <tr> <td>./LZIP/lunzipaa64</td></tr>
<tr> <td>./LZIP/lz4cat64</td> <td rowspan=3>build</td> <td rowspan=3>Build Instructions:<br/>./LZIP/buildlz4.txt</td> </tr> <tr> <td>./LZIP/lz4cat64</td> <td rowspan=3>build</td> <td rowspan=3>Build Instructions:<br/>./LZIP/buildlz4.txt</td> </tr>
<tr> <td>./LZIP/lz4cataa64</td> <tr> <td>./LZIP/lz4cataa64</td></tr>
<tr> <td>./LZIP/lz4catm64e</td> <tr> <td>./LZIP/lz4catm64e</td></tr>
<tr> <td>./Plugson/vs/VentoyPlugson/Release/VentoyPlugson.exe</td> <td rowspan=2>build</td> <td rowspan=2>Build Instructions:<br/>./Plugson/vs/VentoyPlugson/VentoyPlugson.sln</td> </tr> <tr> <td>./Plugson/vs/VentoyPlugson/Release/VentoyPlugson.exe</td> <td rowspan=2>build</td> <td rowspan=2>Build Instructions:<br/>./Plugson/vs/VentoyPlugson/VentoyPlugson.sln</td> </tr>
<tr> <td>./Plugson/vs/VentoyPlugson/x64/Release/VentoyPlugson_X64.exe</td> <tr> <td>./Plugson/vs/VentoyPlugson/x64/Release/VentoyPlugson_X64.exe</td></tr>
<tr> <td>./SQUASHFS/unsquashfs_32</td> <td rowspan=3>build</td> <td rowspan=3>Build Instructions:<br/>./SQUASHFS/build.sh</td> </tr> <tr> <td>./SQUASHFS/unsquashfs_32</td> <td rowspan=3>build</td> <td rowspan=3>Build Instructions:<br/>./SQUASHFS/build.sh</td> </tr>
<tr> <td>./SQUASHFS/unsquashfs_64</td> <tr> <td>./SQUASHFS/unsquashfs_64</td></tr>
<tr> <td>./SQUASHFS/unsquashfs_aa64</td> <tr> <td>./SQUASHFS/unsquashfs_aa64</td></tr>
<tr> <td>./Unix/ventoy_unix/DragonFly/sbin/dmsetup</td> <td>upstream</td> <td>Get from DragonFly ISO.<br/>URL & File Hash documented in<br/> ./DOC/BuildVentoyFromSource.txt 5.13</td> </tr> <tr> <td>./Unix/ventoy_unix/DragonFly/sbin/dmsetup</td> <td>upstream</td> <td>Get from DragonFly ISO.<br/>URL & File Hash documented in<br/> ./DOC/BuildVentoyFromSource.txt 5.13</td> </tr>
<tr> <td>./Unix/ventoy_unix/DragonFly/sbin/init</td> <td>build</td> <td>Build Instructions:<br/>./Unix/ventoy_unix_src/DragonFly/build.sh</td> </tr> <tr> <td>./Unix/ventoy_unix/DragonFly/sbin/init</td> <td>build</td> <td>Build Instructions:<br/>./Unix/ventoy_unix_src/DragonFly/build.sh</td> </tr>
<tr> <td>./VBLADE/vblade-master/vblade_32</td> <td rowspan=3>build</td> <td rowspan=3>Build Instructions:<br/>./VBLADE/vblade-master/build.sh</td> </tr> <tr> <td>./VBLADE/vblade-master/vblade_32</td> <td rowspan=3>build</td> <td rowspan=3>Build Instructions:<br/>./VBLADE/vblade-master/build.sh</td> </tr>
<tr> <td>./VBLADE/vblade-master/vblade_64</td> <tr> <td>./VBLADE/vblade-master/vblade_64</td></tr>
<tr> <td>./VBLADE/vblade-master/vblade_aa64</td> <tr> <td>./VBLADE/vblade-master/vblade_aa64</td></tr>
<tr> <td>./Vlnk/vs/VentoyVlnk/Release/VentoyVlnk.exe</td> <td>build</td> <td>Build Instructions:<br/>./Vlnk/vs/VentoyVlnk/VentoyVlnk.sln</td> </tr> <tr> <td>./Vlnk/vs/VentoyVlnk/Release/VentoyVlnk.exe</td> <td>build</td> <td>Build Instructions:<br/>./Vlnk/vs/VentoyVlnk/VentoyVlnk.sln</td> </tr>
<tr> <td>./VtoyTool/vtoytool/00/vtoytool_32</td> <td rowspan=6>build</td> <td rowspan=6>Build Instructions:<br/>./VtoyTool/build.sh</td> </tr> <tr> <td>./VtoyTool/vtoytool/00/vtoytool_32</td> <td rowspan=6>build</td> <td rowspan=6>Build Instructions:<br/>./VtoyTool/build.sh</td> </tr>
<tr> <td>./VtoyTool/vtoytool/00/vtoytool_64</td> <tr> <td>./VtoyTool/vtoytool/00/vtoytool_64</td></tr>
<tr> <td>./VtoyTool/vtoytool/00/vtoytool_aa64</td> <tr> <td>./VtoyTool/vtoytool/00/vtoytool_aa64</td></tr>
<tr> <td>./VtoyTool/vtoytool/00/vtoytool_m64e</td> <tr> <td>./VtoyTool/vtoytool/00/vtoytool_m64e</td></tr>
<tr> <td>./VtoyTool/vtoytool/01/vtoytool_64</td> <tr> <td>./VtoyTool/vtoytool/01/vtoytool_64</td></tr>
<tr> <td>./VtoyTool/vtoytool/02/vtoytool_64</td> <tr> <td>./VtoyTool/vtoytool/02/vtoytool_64</td></tr>
<tr> <td>./ZSTD/zstdcat</td> <td rowspan=3>build</td> <td rowspan=3>Build Instructions:<br/>./ZSTD/build.txt</td> </tr> <tr> <td>./ZSTD/zstdcat</td> <td rowspan=3>build</td> <td rowspan=3>Build Instructions:<br/>./ZSTD/build.txt</td> </tr>
<tr> <td>./ZSTD/zstdcat64</td> <tr> <td>./ZSTD/zstdcat64</td></tr>
<tr> <td>./ZSTD/zstdcataa64</td> <tr> <td>./ZSTD/zstdcataa64</td></tr>
<tr> <td>./IMG/cpio_x86/ventoy/busybox/busybox32</td> <td rowspan=6>build</td> <td rowspan=6>Build Instructions:<br/>./BUSYBOX/build.txt full busybox</td> </tr> <tr> <td>./IMG/cpio_x86/ventoy/busybox/busybox32</td> <td rowspan=6>build</td> <td rowspan=6>Build Instructions:<br/>./BUSYBOX/build.txt full busybox</td> </tr>
<tr> <td>./IMG/cpio_x86/ventoy/busybox/busybox64</td> <tr> <td>./IMG/cpio_x86/ventoy/busybox/busybox64</td></tr>
<tr> <td>./IMG/cpio_x86/ventoy/busybox/xzcat32_musl</td> <tr> <td>./IMG/cpio_x86/ventoy/busybox/xzcat32_musl</td></tr>
<tr> <td>./IMG/cpio_x86/ventoy/busybox/xzcat64_musl</td> <tr> <td>./IMG/cpio_x86/ventoy/busybox/xzcat64_musl</td></tr>
<tr> <td>./IMG/cpio_arm64/ventoy/busybox/busyboxaa64</td> <tr> <td>./IMG/cpio_arm64/ventoy/busybox/busyboxaa64</td></tr>
<tr> <td>./IMG/cpio_mips64/ventoy/busybox/busyboxm64e</td> <tr> <td>./IMG/cpio_mips64/ventoy/busybox/busyboxm64e</td> </tr>
<tr> <td>ISNTALL/ventoy/7z/64/7za.exe</td> <td rowspan=2>upstream</td> <td>Download from 7z project.<br/>URL & File Hash documented in<br/> ./DOC/BuildVentoyFromSource.txt 5.12</td> </tr> <tr> <td>ISNTALL/ventoy/7z/64/7za.exe</td> <td rowspan=2>upstream</td> <td>Download from 7z project.<br/>URL & File Hash documented in<br/> ./DOC/BuildVentoyFromSource.txt 5.12</td> </tr>
<tr> <td>ISNTALL/ventoy/7z/32/7za.exe</td> <tr> <td>ISNTALL/ventoy/7z/32/7za.exe</td></tr>
<tr> <td>./INSTALL/ventoy/wimboot.i386.efi</td> <td rowspan=2>build</td> <td rowspan=2>Build Instructions:<br/>./wimboot/build.sh</td> </tr> <tr> <td>./INSTALL/ventoy/wimboot.i386.efi</td> <td rowspan=2>build</td> <td rowspan=2>Build Instructions:<br/>./wimboot/build.sh</td> </tr>
<tr> <td>./INSTALL/ventoy/wimboot.x86_64</td> <tr> <td>./INSTALL/ventoy/wimboot.x86_64</td></tr>
<tr> <td> ./Unix/ventoy_unix/ClonOS/geom_ventoy_ko/13.x/64/geom_ventoy.ko</td> <td rowspan=18>build</td> <td rowspan=18>Build Instructions:<br/>./Unix/BuildUnixKmod.txt</td> </tr> <tr> <td> ./Unix/ventoy_unix/ClonOS/geom_ventoy_ko/13.x/64/geom_ventoy.ko</td> <td rowspan=18>build</td> <td rowspan=18>Build Instructions:<br/>./Unix/BuildUnixKmod.txt</td> </tr>
<tr> <td> ./Unix/ventoy_unix/FreeBSD/geom_ventoy_ko/10.x/32/geom_ventoy.ko</td></tr> <tr> <td> ./Unix/ventoy_unix/FreeBSD/geom_ventoy_ko/10.x/32/geom_ventoy.ko</td></tr>
<tr> <td> ./Unix/ventoy_unix/FreeBSD/geom_ventoy_ko/10.x/64/geom_ventoy.ko</td></tr> <tr> <td> ./Unix/ventoy_unix/FreeBSD/geom_ventoy_ko/10.x/64/geom_ventoy.ko</td></tr>
+15 -15
View File
@@ -25,22 +25,21 @@
Next I assume that you have unzipped the code into the /home directory (check /home/Ventoy-master/README.md file for the directory layout). Next I assume that you have unzipped the code into the /home directory (check /home/Ventoy-master/README.md file for the directory layout).
2.2 Download third-party source code and tool 2.2 Download third-party source code and tool
wget https://github.com/ventoy/vtoytoolchain/releases/download/1.0/dietlibc-0.34.tar.xz -O /home/Ventoy-master/DOC/dietlibc-0.34.tar.xz
https://www.fefe.de/dietlibc/dietlibc-0.34.tar.xz ===> /home/Ventoy-master/DOC/dietlibc-0.34.tar.xz wget https://musl.libc.org/releases/musl-1.2.1.tar.gz -O /home/Ventoy-master/DOC/musl-1.2.1.tar.gz
https://musl.libc.org/releases/musl-1.2.1.tar.gz ===> /home/Ventoy-master/DOC/musl-1.2.1.tar.gz wget https://ftp.gnu.org/gnu/grub/grub-2.04.tar.xz -O /home/Ventoy-master/GRUB2/grub-2.04.tar.xz
https://ftp.gnu.org/gnu/grub/grub-2.04.tar.xz ===> /home/Ventoy-master/GRUB2/grub-2.04.tar.xz wget https://codeload.github.com/tianocore/edk2/zip/edk2-stable201911 -O /home/Ventoy-master/EDK2/edk2-edk2-stable201911.zip
https://codeload.github.com/tianocore/edk2/zip/edk2-stable201911 ===> /home/Ventoy-master/EDK2/edk2-edk2-stable201911.zip wget https://codeload.github.com/relan/exfat/zip/v1.3.0 -O /home/Ventoy-master/ExFAT/exfat-1.3.0.zip
https://codeload.github.com/relan/exfat/zip/v1.3.0 ===> /home/Ventoy-master/ExFAT/exfat-1.3.0.zip wget https://codeload.github.com/libfuse/libfuse/zip/fuse-2.9.9 -O /home/Ventoy-master/ExFAT/libfuse-fuse-2.9.9.zip
https://codeload.github.com/libfuse/libfuse/zip/fuse-2.9.9 ===> /home/Ventoy-master/ExFAT/libfuse-fuse-2.9.9.zip wget https://github.com/ventoy/vtoytoolchain/releases/download/1.0/gcc-linaro-7.4.1-2019.02-x86_64_aarch64-linux-gnu.tar.xz -O /opt/gcc-linaro-7.4.1-2019.02-x86_64_aarch64-linux-gnu.tar.xz
https://releases.linaro.org/components/toolchain/binaries/7.4-2019.02/aarch64-linux-gnu/gcc-linaro-7.4.1-2019.02-x86_64_aarch64-linux-gnu.tar.xz ===> /opt/gcc-linaro-7.4.1-2019.02-x86_64_aarch64-linux-gnu.tar.xz wget https://toolchains.bootlin.com/downloads/releases/toolchains/aarch64/tarballs/aarch64--uclibc--stable-2020.08-1.tar.bz2 -O /opt/aarch64--uclibc--stable-2020.08-1.tar.bz2
https://toolchains.bootlin.com/downloads/releases/toolchains/aarch64/tarballs/aarch64--uclibc--stable-2020.08-1.tar.bz2 ===> /opt/aarch64--uclibc--stable-2020.08-1.tar.bz2 wget https://github.com/ventoy/vtoytoolchain/releases/download/1.0/mips-loongson-gcc7.3-2019.06-29-linux-gnu.tar.gz -O /opt/mips-loongson-gcc7.3-2019.06-29-linux-gnu.tar.gz
https://github.com/ventoy/vtoytoolchain/releases/download/1.0/mips-loongson-gcc7.3-2019.06-29-linux-gnu.tar.gz ===> /opt/mips-loongson-gcc7.3-2019.06-29-linux-gnu.tar.gz wget https://github.com/ventoy/musl-cross-make/releases/download/latest/output.tar.bz2 -O /opt/output.tar.bz2
https://github.com/ventoy/musl-cross-make/releases/download/latest/output.tar.bz2 ===> /opt/output.tar.bz2
http://www.tinycorelinux.net/11.x/x86_64/release/distribution_files/vmlinuz64 ===> /home/Ventoy-master/LiveCD/ISO/EFI/boot/vmlinuz64 wget http://www.tinycorelinux.net/11.x/x86_64/release/distribution_files/vmlinuz64 -O /home/Ventoy-master/LiveCD/ISO/EFI/boot/vmlinuz64
http://www.tinycorelinux.net/11.x/x86_64/release/distribution_files/corepure64.gz ===> /home/Ventoy-master/LiveCD/ISO/EFI/boot/corepure64.gz wget http://www.tinycorelinux.net/11.x/x86_64/release/distribution_files/corepure64.gz -O /home/Ventoy-master/LiveCD/ISO/EFI/boot/corepure64.gz
http://www.tinycorelinux.net/11.x/x86_64/release/distribution_files/modules64.gz ===> /home/Ventoy-master/LiveCD/ISO/EFI/boot/modules64.gz wget http://www.tinycorelinux.net/11.x/x86_64/release/distribution_files/modules64.gz -O /home/Ventoy-master/LiveCD/ISO/EFI/boot/modules64.gz
2.3 Prepare third-party tools 2.3 Prepare third-party tools
cd /home/Ventoy-master/DOC/ cd /home/Ventoy-master/DOC/
@@ -232,7 +231,7 @@
SHA-256: cde08b6a2cf5ad914f05203e18e3f7c2ed6060a63604e3d75536f19b55e8e0af SHA-256: cde08b6a2cf5ad914f05203e18e3f7c2ed6060a63604e3d75536f19b55e8e0af
5.8 imdisk 5.8 imdisk
download http://www.ltr-data.se/files/imdiskinst.exe and extract it by 7zip. download http://static.ltr-data.se/files/imdiskinst_2.0.10.exe and extract it by 7zip.
INSTALL/ventoy/imdisk/64/imdisk.sys --> sys/amd64/imdisk.sys SHA-256: 6702202220268787e361f5a82dae53362c8e6c6dcd240bb01b44dd77ae0788da INSTALL/ventoy/imdisk/64/imdisk.sys --> sys/amd64/imdisk.sys SHA-256: 6702202220268787e361f5a82dae53362c8e6c6dcd240bb01b44dd77ae0788da
INSTALL/ventoy/imdisk/64/imdisk.exe --> cli/amd64/imdisk.exe SHA-256: 9759175380af836869443e5f21ce2e33022125d154bc6b3d1c04dc36b190de04 INSTALL/ventoy/imdisk/64/imdisk.exe --> cli/amd64/imdisk.exe SHA-256: 9759175380af836869443e5f21ce2e33022125d154bc6b3d1c04dc36b190de04
@@ -274,3 +273,4 @@
5.14 ./LiveCD/ISO/EFI/boot/vmlinuz64 5.14 ./LiveCD/ISO/EFI/boot/vmlinuz64
download from http://www.tinycorelinux.net/11.x/x86_64/archive/11.0/distribution_files/vmlinuz64 download from http://www.tinycorelinux.net/11.x/x86_64/archive/11.0/distribution_files/vmlinuz64
vmlinuz64 SHA-256: 641077fc1f9914af244c248453005f56536ba9e7f54ba3e52402f26709ddb8a5 vmlinuz64 SHA-256: 641077fc1f9914af244c248453005f56536ba9e7f54ba3e52402f26709ddb8a5
+113
View File
@@ -0,0 +1,113 @@
#!/bin/sh
if [ -z "$1" ]; then
EDKARCH=X64
postfix=x64
elif [ "$1" = "ia32" ]; then
EDKARCH=IA32
postfix=ia32
shift
elif [ "$1" = "aa64" ]; then
EDKARCH=AARCH64
postfix=aa64
shift
fi
cd edk2-edk2-stable201911
rm -rf ./Conf/.cache
rm -f ./Conf/.AutoGenIdFile.txt
VTEFI_PATH=Build/MdeModule/RELEASE_GCC48/$EDKARCH/MdeModulePkg/Application/VtoyShim/VtoyShim/OUTPUT/VtoyShim.efi
DST_PATH=../../INSTALL/EFI/BOOT/fb${postfix}.efi
rm -f $VTEFI_PATH
rm -f $DST_PATH
unset WORKSPACE
source ./edksetup.sh
if [ "$EDKARCH" = "AARCH64" ]; then
PATH=$PATH:/opt/gcc-linaro-7.4.1-2019.02-x86_64_aarch64-linux-gnu/bin \
GCC48_AARCH64_PREFIX=aarch64-linux-gnu- \
build -p MdeModulePkg/MdeModulePkg.dsc -a $EDKARCH -b RELEASE -t GCC48 -m MdeModulePkg/Application/VtoyShim/VtoyShim.inf
else
build -p MdeModulePkg/MdeModulePkg.dsc -a $EDKARCH -b RELEASE -t GCC48 -m MdeModulePkg/Application/VtoyShim/VtoyShim.inf
fi
if [ -e $VTEFI_PATH ]; then
objdump -h "$VTEFI_PATH"
echo ""
objcopy \
--add-section .sbat="MdeModulePkg/Application/VtoyShim/sbat.csv" \
--set-section-flags .sbat=alloc,load,readonly,data \
"$VTEFI_PATH" "$DST_PATH"
#find the right sbat section VMA
tmpfile=$(mktemp)
cnt1=$(objdump -h "$DST_PATH" | grep -P '^\s*[0-9][0-9]* \.' | wc -l)
cnt2=$(objdump -h "$DST_PATH" | grep -P 'ALLOC' | wc -l)
if [ $cnt1 -ne $cnt2 ]; then
echo "Section count mismatch $cnt1 $cnt2"
objdump -h "$DST_PATH"
exit 1
fi
objdump -h "$DST_PATH" | grep -P '^\s*[0-9][0-9]* \.' > $tmpfile
sbat_size=$(stat -c '%s' MdeModulePkg/Application/VtoyShim/sbat.csv)
sbat_size_hex=$(printf '0x%08x' $sbat_size)
lmax='0000000000000000'
lsize='0000000000000000'
while read line; do
echo $line
lbase=$(echo $line | awk '{print $4}')
if expr "$lmax" \< "$lbase" > /dev/null; then
lmax=$lbase
lsize=$(echo $line | awk '{print $3}')
fi
echo "max=$lmax size=$lsize"
done < $tmpfile
rm -f $tmpfile
lvma=$((0x${lsize}+0x${lmax}))
lvma_align=`printf '0x%08x' $(( (lvma + 4095) / 4096 * 4096 ))`
echo "sbat section lvma_align=$lvma_align"
objcopy --adjust-section-vma .sbat=$lvma_align "$DST_PATH"
img_base=$(objdump -p "$DST_PATH" | grep ImageBase | awk '{print $2}')
size_img=0x$(objdump -p "$DST_PATH" | grep SizeOfImage | awk '{print $2}')
sbat_end=`printf '0x%08x' $(($lvma_align+$sbat_size_hex))`
if [ "$img_base" != "0000000000000000" ]; then
echo "#### ImageBase is not 0 $img_base"
exit 1
fi
echo "size_img=$size_img sbat_size=$sbat_size_hex sbat_range $lvma_align - $sbat_end"
if expr "$size_img" \< "$sbat_end" > /dev/null; then
echo "SizeOfImage $size_img less than sbat section addr $sbat_end"
exit 1
else
echo "SizeOfImage $size_img >= $sbat_end is OK"
fi
objdump -h "$DST_PATH"
echo -e '\n\n====================== SUCCESS ========================\n\n'
cd ..
else
echo -e '\n\n====================== FAILED ========================\n\n'
cd ..
exit 1
fi
+4
View File
@@ -19,3 +19,7 @@ sh ./build.sh aa64 || exit 1
echo '======== build EDK2 for x86_64-efi ===============' echo '======== build EDK2 for x86_64-efi ==============='
sh ./build.sh || exit 1 sh ./build.sh || exit 1
echo '======== build EDK2 for x86_64-efi ==============='
sh ./build_shim.sh || exit 1
@@ -1263,6 +1263,11 @@ EFI_STATUS EFIAPI VentoyEfiMain
return Status; return Status;
} }
if (g_os_param_reserved[11])
{
ventoy_lock_res(g_os_param_reserved[11]);
}
ventoy_disable_ex_filesystem(); ventoy_disable_ex_filesystem();
if (gMemdiskMode) if (gMemdiskMode)
@@ -1341,6 +1346,11 @@ EFI_STATUS EFIAPI VentoyEfiMain
ventoy_enable_ex_filesystem(); ventoy_enable_ex_filesystem();
if (g_os_param_reserved[11])
{
ventoy_unlock_res();
}
return EFI_SUCCESS; return EFI_SUCCESS;
} }
@@ -23,6 +23,8 @@
#define COMPILE_ASSERT(expr) extern char __compile_assert[(expr) ? 1 : -1] #define COMPILE_ASSERT(expr) extern char __compile_assert[(expr) ? 1 : -1]
#define VTOY_SHIM_POLICY_GUID {0x90a29d14, 0x3968, 0x48fe, { 0x85, 0x81, 0x6b, 0x7f, 0x7d, 0xc4, 0x70, 0x55 }};
#define VENTOY_GUID { 0x77772020, 0x2e77, 0x6576, { 0x6e, 0x74, 0x6f, 0x79, 0x2e, 0x6e, 0x65, 0x74 }} #define VENTOY_GUID { 0x77772020, 0x2e77, 0x6576, { 0x6e, 0x74, 0x6f, 0x79, 0x2e, 0x6e, 0x65, 0x74 }}
typedef enum ventoy_chain_type typedef enum ventoy_chain_type
@@ -428,6 +430,8 @@ EFI_STATUS ventoy_hook_1st_cdrom_start(VOID);
EFI_STATUS ventoy_hook_1st_cdrom_stop(VOID); EFI_STATUS ventoy_hook_1st_cdrom_stop(VOID);
EFI_STATUS ventoy_disable_ex_filesystem(VOID); EFI_STATUS ventoy_disable_ex_filesystem(VOID);
EFI_STATUS ventoy_enable_ex_filesystem(VOID); EFI_STATUS ventoy_enable_ex_filesystem(VOID);
EFI_STATUS ventoy_lock_res(UINT8 LockType);
EFI_STATUS ventoy_unlock_res(VOID);
#endif #endif
@@ -25,6 +25,10 @@
ENTRY_POINT = VentoyEfiMain ENTRY_POINT = VentoyEfiMain
[BuildOptions]
# Force standard GNU ld to pack and align ELF segments to 4KB page boundaries
GCC:*_*_*_DLINK_FLAGS = -Wl,-z,common-page-size=0x1000 -Wl,-z,max-page-size=0x1000
[Sources] [Sources]
Ventoy.h Ventoy.h
Ventoy.c Ventoy.c
@@ -1797,3 +1797,176 @@ EFI_STATUS ventoy_hook_1st_cdrom_stop(VOID)
return EFI_SUCCESS; return EFI_SUCCESS;
} }
#if 0
/* For force highest resolution for Windows/WinPE */
#endif
STATIC UINT32 g_org_mode_num = 0;
STATIC EFI_GRAPHICS_OUTPUT_PROTOCOL_SET_MODE g_org_set_mode = NULL;
STATIC EFI_STATUS EFIAPI ventoy_set_mode
(
IN EFI_GRAPHICS_OUTPUT_PROTOCOL *This,
IN UINT32 ModeNumber
)
{
(void)This;
(void)ModeNumber;
/* Force highest resolution */
return EFI_SUCCESS;
}
STATIC EFI_STATUS EFIAPI ventoy_set_mode2
(
IN EFI_GRAPHICS_OUTPUT_PROTOCOL *This,
IN UINT32 ModeNumber
)
{
UINTN Size;
EFI_STATUS rc;
EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *info = NULL;
/* Force >= 1024x768 */
rc = This->QueryMode(This, ModeNumber, &Size, &info);
if (rc == EFI_SUCCESS)
{
if (info->HorizontalResolution < 1024 || info->VerticalResolution < 768)
{
return EFI_SUCCESS;
}
}
return g_org_set_mode(This, ModeNumber);
}
EFI_STATUS ventoy_lock_res(UINT8 LockType)
{
UINT32 i = 0;
UINT32 x = 0;
UINT32 y = 0;
UINT32 SelMode = 0;
UINT32 CurMode = 0;
UINT32 Highest = 0;
UINT32 M1024_768 = MAX_UINT32;
UINTN Size;
EFI_STATUS rc;
EFI_GRAPHICS_OUTPUT_PROTOCOL *gop = NULL;
EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *info = NULL;
/* already hook */
if (g_org_set_mode)
{
return EFI_SUCCESS;
}
/* 1: Highest 2: 1024x768 3: >= 1024x768 */
if (LockType == 0 || LockType > 3)
{
return EFI_SUCCESS;
}
rc = gBS->LocateProtocol(&gEfiGraphicsOutputProtocolGuid, NULL, (void **)&gop);
if (rc != EFI_SUCCESS)
{
debug("Failed to locate GOP protocol");
return EFI_SUCCESS;
}
if (LockType == 3)
{
g_org_mode_num = MAX_UINT32;
g_org_set_mode = gop->SetMode;
gop->SetMode = ventoy_set_mode2;
return EFI_SUCCESS;
}
CurMode = gop->Mode->Mode;
for (i = 0 ; i < gop->Mode->MaxMode ; i++)
{
/* Get mode information */
if (gop->QueryMode(gop, i, &Size, &info) == EFI_SUCCESS)
{
if (info->HorizontalResolution == 1024 && info->VerticalResolution == 768)
{
M1024_768 = i;
}
if (x < info->HorizontalResolution ||
(x == info->HorizontalResolution && y < info->VerticalResolution))
{
Highest = i;
x = info->HorizontalResolution;
y = info->VerticalResolution;
}
}
}
if (LockType == 1)
{
SelMode = Highest;
}
else
{
if (M1024_768 == MAX_UINT32)
{
SelMode = Highest;
}
else
{
SelMode = M1024_768;
x = 1024;
y = 768;
}
}
if (SelMode != CurMode)
{
gop->SetMode(gop, SelMode);
}
debug("Lock resolution to Mode:%d %d x %d", SelMode, x, y);
g_org_mode_num = CurMode;
g_org_set_mode = gop->SetMode;
gop->SetMode = ventoy_set_mode;
return EFI_SUCCESS;
}
EFI_STATUS ventoy_unlock_res(VOID)
{
EFI_STATUS rc;
EFI_GRAPHICS_OUTPUT_PROTOCOL *gop = NULL;
/* not hooked yet */
if (!g_org_set_mode)
{
return EFI_SUCCESS;
}
rc = gBS->LocateProtocol(&gEfiGraphicsOutputProtocolGuid, NULL, (void **)&gop);
if (rc != EFI_SUCCESS)
{
debug("Failed to locate GOP protocol");
return EFI_SUCCESS;
}
if (g_org_mode_num != MAX_UINT32)
{
g_org_set_mode(gop, g_org_mode_num);
}
gop->SetMode = g_org_set_mode;
g_org_set_mode = NULL;
return EFI_SUCCESS;
}
@@ -0,0 +1,739 @@
/******************************************************************************
* VtoyShim.c
*
* Copyright (c) 2017 - 2018, Intel Corporation. All rights reserved.<BR>
* SPDX-License-Identifier: BSD-2-Clause-Patent
*
*/
#include <Uefi.h>
#include <Library/DebugLib.h>
#include <Library/PrintLib.h>
#include <Library/UefiLib.h>
#include <Library/BaseMemoryLib.h>
#include <Library/DevicePathLib.h>
#include <Library/MemoryAllocationLib.h>
#include <Library/UefiBootServicesTableLib.h>
#include <Library/UefiRuntimeServicesTableLib.h>
#include <Library/UefiApplicationEntryPoint.h>
#include <Library/PeCoffLib.h>
#include <Protocol/LoadedImage.h>
#include <Guid/FileInfo.h>
#include <Guid/FileSystemInfo.h>
#include <Guid/ImageAuthentication.h>
#include <Protocol/BlockIo.h>
#include <Protocol/RamDisk.h>
#include <Protocol/SimpleFileSystem.h>
#include <Protocol/DevicePathToText.h>
#include <Protocol/DevicePathFromText.h>
#include <Protocol/LoadedImage.h>
#include <Protocol/Security.h>
#include <Protocol/Security2.h>
#include <IndustryStandard/PeImage.h>
#include <VtoyShim.h>
#define CUR_SBAT_VER 1
STATIC UINT8 gVtoyGrubSha256Hash[32] __attribute__((aligned(32))) = {
0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26,
0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26,
0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26,
0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26
};
STATIC BOOLEAN gGrubLaunched = FALSE;
STATIC EFI_GUID gShimLockGUID = SHIM_LOCK_GUID;
STATIC EFI_GUID gMsftDBXSVNOwnerGUID = MSFT_DBX_SVN_OWN_GUID;
STATIC EFI_GUID gBootMgrDBXSVNGUID = EFI_BOOTMGR_DBXSVN_GUID;
STATIC EFI_SECURITY_FILE_AUTHENTICATION_STATE gSysSecFileAuth = NULL;
STATIC EFI_SECURITY2_FILE_AUTHENTICATION gSysSec2FileAuth = NULL;
STATIC BOOLEAN gVtoyByPassSB = FALSE; /* must be FALSE by default for revoke */
STATIC VTOY_SHIM gVtoyShimProtocol;
STATIC EFI_HANDLE gVtoyShimProtHandle;
STATIC SHIM_LOCK gShimLock;
STATIC EFI_EXIT_BOOT_SERVICES gSysExitBootServices = NULL;
STATIC EFI_GET_VARIABLE gSysGetVariable = NULL;
STATIC VOID EFIAPI HookSystemService(VOID);
STATIC VOID EFIAPI UnHookSystemService(VOID);
STATIC VOID EFIAPI VtoyLog(CONST CHAR16 *Format, ...)
{
VA_LIST Marker;
CHAR16 Buffer[512];
UINTN BufLen = 0;
Buffer[0] = 0;
VA_START(Marker, Format);
BufLen = UnicodeVSPrint(Buffer, sizeof(Buffer), Format, Marker);
VA_END(Marker);
if (gST->ConOut && gST->ConOut->OutputString)
{
gST->ConOut->OutputString(gST->ConOut, Buffer);
}
}
STATIC VOID EFIAPI DumpDevicePath(const EFI_DEVICE_PATH_PROTOCOL *DevicePath)
{
CHAR16 *DPStr = NULL;
if (DevicePath)
{
DPStr = ConvertDevicePathToText(DevicePath, TRUE, TRUE);
}
if (DPStr)
{
vLog(L"%s", DPStr);
FreePool(DPStr);
}
else
{
vLog(L"NULL");
}
}
STATIC VOID EFIAPI ShowSBWarning(const EFI_DEVICE_PATH_PROTOCOL *DevicePath)
{
vLog(L"\r\n=======================================================");
vLog(L"=======================================================\r\n");
DumpDevicePath(DevicePath);
vLog(L"\r\n####### Ventoy Security Boot Violation ##########\r\n");
vLog(L"=======================================================");
vLog(L"=======================================================");
VtoySleep(5);
}
STATIC VOID * EFIAPI FindShimFuncAddr(UINT64 FuncOffset)
{
EFI_STATUS Status;
SHIM_IMAGE_LOADER *ImgLoader = NULL;
EFI_GUID ShimImgLoaderGuid = SHIM_IMAGE_LOADER_GUID;
Status = gBS->LocateProtocol(&ShimImgLoaderGuid, NULL, (VOID **)&ImgLoader);
if (EFI_ERROR(Status) || !ImgLoader || !ImgLoader->LoadImage)
{
vLog(L"Failed to locate shim image loader protocol %lx %p", Status, ImgLoader);
return NULL;
}
if (NM_SHIM_LOAD_IMAGE_OFFSET > FuncOffset)
{
return (UINT8 *)ImgLoader->LoadImage - (NM_SHIM_LOAD_IMAGE_OFFSET - FuncOffset);
}
else
{
return (UINT8 *)ImgLoader->LoadImage + (FuncOffset - NM_SHIM_LOAD_IMAGE_OFFSET);
}
}
EFI_STATUS EFIAPI LaunchRealGrub(EFI_HANDLE ImageHandle, CONST CHAR16 *FileName)
{
EFI_STATUS Status;
UINTN BufferSize = 0;
CHAR16 *DevDpStr = NULL;
CHAR16 *NewDpStr = NULL;
EFI_HANDLE ChildHandle = NULL;
EFI_LOADED_IMAGE_PROTOCOL *Li = NULL;
EFI_DEVICE_PATH_PROTOCOL *DeviceDP = NULL;
EFI_DEVICE_PATH_PROTOCOL *TargetDp = NULL;
Status = gBS->HandleProtocol(ImageHandle, &gEfiLoadedImageProtocolGuid, (VOID**)&Li);
if (EFI_ERROR(Status))
{
vLog(L"Failed to locate loaded image protocol %lx", Status);
return Status;
}
DeviceDP = DevicePathFromHandle(Li->DeviceHandle);
if (!DeviceDP || !IsDevicePathValid(DeviceDP, 0))
{
vLog(L"Failed to get device path of device handle %p", Li->DeviceHandle);
Status = EFI_NOT_FOUND;
goto END;
}
DevDpStr = ConvertDevicePathToText(DeviceDP, FALSE, TRUE);
if (!DevDpStr)
{
vLog(L"Failed to convert device path to text");
Status = EFI_OUT_OF_RESOURCES;
goto END;
}
BufferSize = (StrLen(DevDpStr) + 64) * sizeof(CHAR16);
NewDpStr = (CHAR16 *)AllocatePool(BufferSize);
if (!NewDpStr)
{
vLog(L"Failed to alloc new device path string buffer size:%lu", BufferSize);
Status = EFI_OUT_OF_RESOURCES;
goto END;
}
UnicodeSPrint(NewDpStr, BufferSize, L"%s/EFI/BOOT/%s", DevDpStr, FileName);
TargetDp = ConvertTextToDevicePath(NewDpStr);
if (!TargetDp)
{
vLog(L"Failed to convert new text <%s> to device path", NewDpStr);
Status = EFI_NOT_FOUND;
goto END;
}
Status = gBS->LoadImage(FALSE, ImageHandle, TargetDp, NULL, 0, &ChildHandle);
if (EFI_ERROR(Status))
{
vLog(L"Failed to LoadImage %lx", Status);
goto END;
}
Status = gBS->StartImage(ChildHandle, NULL, NULL);
if (EFI_ERROR(Status))
{
vLog(L"Failed to StartImage %lx", Status);
gBS->UnloadImage(ChildHandle);
goto END;
}
END:
CheckFreePool(DevDpStr);
CheckFreePool(NewDpStr);
CheckFreePool(TargetDp);
return Status;
}
STATIC EFI_STATUS EFIAPI CheckVtoyGrub
(
VOID *FileBuffer,
UINTN FileSize
)
{
UINT8 Sha256Hash[64];
if (!FileBuffer || FileSize < sizeof(EFI_IMAGE_DOS_HEADER))
{
vErr(L"Invalid FileBuffer:%p or size:%ld", FileBuffer, FileSize);
return EFI_SECURITY_VIOLATION;
}
ZeroMem(Sha256Hash, sizeof(Sha256Hash));
calc_sha256(FileBuffer, (UINT64)FileSize, Sha256Hash);
if (CompareMem(Sha256Hash, gVtoyGrubSha256Hash, 32) != 0)
{
vErr(L"Ventoy hash check failed.");
gRT->ResetSystem(EfiResetWarm, EFI_SECURITY_VIOLATION, 0, NULL);
return EFI_SECURITY_VIOLATION;
}
return EFI_SUCCESS;
}
STATIC EFI_STATUS EFIAPI SecurityPolicyAuth
(
const EFI_SECURITY_ARCH_PROTOCOL *This,
UINT32 AuthenticationStatus,
const EFI_DEVICE_PATH_PROTOCOL *DevicePathConst
)
{
/*
* Some old UEFI firmware (without Security2 protocol) will hang when run OpenVolume.
* So finally I decide not to support such UEFI firmware.
* It means that for UEFI firmware before 2.5 (about 2015) Ventoy only supports Bypass policy.
*
*/
(VOID)This;
(VOID)AuthenticationStatus;
(VOID)DevicePathConst;
return EFI_SUCCESS;
}
STATIC EFI_STATUS EFIAPI Security2PolicyAuth
(
const EFI_SECURITY2_ARCH_PROTOCOL *This,
const EFI_DEVICE_PATH_PROTOCOL *DevicePath,
VOID *FileBuffer,
UINTN FileSize,
BOOLEAN BootPolicy
)
{
EFI_STATUS Status;
/* Just return OK if the user choose to bypass SB */
if (gVtoyByPassSB)
{
return EFI_SUCCESS;
}
if (!gGrubLaunched)
{
return CheckVtoyGrub(FileBuffer, FileSize);
}
/*
* Step 1:
* Use original UEFI firmware auth API.
* If it's OK, it may be signed with Microsoft UEFI CA. (e.g. bootmgr/shim/...)
*/
if (gSysSec2FileAuth)
{
Status = gSysSec2FileAuth(This, DevicePath, FileBuffer, FileSize, BootPolicy);
if (!EFI_ERROR(Status))
{
return EFI_SUCCESS;
}
}
/*
* Step 2:
* Use shim verify API.
* If it's OK, it may be signed with a MOK key. (e.g. Ventoy EFI files)
*/
if (gShimLock.Verify)
{
if (FileBuffer && FileSize > 0 && FileSize < 0xFFFFFFFFUL)
{
Status = gShimLock.Verify(FileBuffer, (UINT32)FileSize);
if (!EFI_ERROR(Status))
{
return EFI_SUCCESS;
}
}
}
ShowSBWarning(DevicePath);
return EFI_SECURITY_VIOLATION;
}
STATIC EFI_STATUS EFIAPI HookSecurityPolicy(VOID)
{
EFI_STATUS Status;
EFI_STATUS Status2;
EFI_SECURITY_ARCH_PROTOCOL *Security = NULL;
EFI_SECURITY2_ARCH_PROTOCOL *Security2 = NULL;
Status = gBS->LocateProtocol(&gEfiSecurityArchProtocolGuid, NULL, (VOID **)&Security);
Status2 = gBS->LocateProtocol(&gEfiSecurity2ArchProtocolGuid, NULL, (VOID **)&Security2);
if (EFI_ERROR(Status) && EFI_ERROR(Status2))
{
vLog(L"Failed to locate security or security2 protocol. %lx %lx %p %p",
Status, Status2, Security, Security2);
return EFI_NOT_FOUND;
}
if (Security2)
{
gSysSec2FileAuth = Security2->FileAuthentication;
Security2->FileAuthentication = Security2PolicyAuth;
}
if (Security)
{
gSysSecFileAuth = Security->FileAuthenticationState;
Security->FileAuthenticationState = SecurityPolicyAuth;
}
return EFI_SUCCESS;
}
STATIC VOID EFIAPI UnHookSecurityPolicy(VOID)
{
EFI_STATUS Status;
EFI_STATUS Status2;
EFI_SECURITY_ARCH_PROTOCOL *Security = NULL;
EFI_SECURITY2_ARCH_PROTOCOL *Security2 = NULL;
if (!gSysSec2FileAuth && !gSysSecFileAuth)
{
return;
}
Status = gBS->LocateProtocol(&gEfiSecurityArchProtocolGuid, NULL, (VOID **)&Security);
Status2 = gBS->LocateProtocol(&gEfiSecurity2ArchProtocolGuid, NULL, (VOID **)&Security2);
if (EFI_ERROR(Status) && EFI_ERROR(Status2))
{
vLog(L"Failed to locate security or security2 protocol. %lx %lx %p %p",
Status, Status2, Security, Security2);
return;
}
if (Security2 && gSysSec2FileAuth && Security2->FileAuthentication == Security2PolicyAuth)
{
Security2->FileAuthentication = gSysSec2FileAuth;
gSysSec2FileAuth = NULL;
}
if (Security && gSysSecFileAuth && Security->FileAuthenticationState == SecurityPolicyAuth)
{
Security->FileAuthenticationState = gSysSecFileAuth;
gSysSecFileAuth = NULL;
}
}
STATIC VOID EFIAPI VtoyByPassSB(VOID)
{
gVtoyByPassSB = TRUE;
}
STATIC VOID EFIAPI VtoyCheckSB(VOID)
{
gVtoyByPassSB = FALSE;
}
STATIC VOID EFIAPI VtoyLaunched(VOID)
{
gGrubLaunched = TRUE;
}
STATIC VOID EFIAPI UnInstallVtoyShimProtocol(VOID)
{
EFI_GUID Guid = VTOY_SHIM_POLICY_GUID;
if (gVtoyShimProtHandle)
{
gBS->UninstallProtocolInterface(gVtoyShimProtHandle, &Guid, &gVtoyShimProtocol);
gVtoyShimProtHandle = NULL;
}
}
STATIC EFI_STATUS EFIAPI InstallVtoyShimProtocol(VOID)
{
EFI_STATUS Status;
EFI_GUID Guid = VTOY_SHIM_POLICY_GUID;
VTOY_SHIM *Prot = NULL;
gVtoyShimProtocol.ByPassSB = VtoyByPassSB;
gVtoyShimProtocol.CheckSB = VtoyCheckSB;
gVtoyShimProtocol.Launched = VtoyLaunched;
Status = gBS->LocateProtocol(&Guid, NULL, (VOID**)&Prot);
if (!EFI_ERROR(Status))
{
vLog(L"Ventoy shim already loaded, cannot be nested.");
return EFI_ALREADY_STARTED;
}
Status = gBS->InstallProtocolInterface(&gVtoyShimProtHandle, &Guid,
EFI_NATIVE_INTERFACE, &gVtoyShimProtocol);
if (EFI_ERROR(Status))
{
vLog(L"Failed to install protocol %lx", Status);
}
return Status;
}
STATIC BOOLEAN EFIAPI IsSecureBootEnabled(VOID)
{
UINT8 SecureBoot = 0;
UINTN DataSize;
EFI_STATUS Status;
DataSize = sizeof(SecureBoot);
Status = gST->RuntimeServices->GetVariable(L"SecureBoot", &gEfiGlobalVariableGuid, NULL,
&DataSize, &SecureBoot);
if (EFI_ERROR(Status))
{
return FALSE;
}
return SecureBoot ? TRUE : FALSE;
}
STATIC BOOLEAN EFIAPI IsSetupMode(VOID)
{
UINT8 SetupMode = 0;
UINTN DataSize;
EFI_STATUS Status;
DataSize = sizeof(SetupMode);
Status = gST->RuntimeServices->GetVariable(L"SetupMode", &gEfiGlobalVariableGuid, NULL,
&DataSize, &SetupMode);
if (EFI_ERROR(Status))
{
return FALSE;
}
return SetupMode ? TRUE : FALSE;
}
STATIC EFI_STATUS EFIAPI ShimEfiMain
(
IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable
)
{
EFI_STATUS Status;
SHIM_LOCK *ShimLock = NULL;
shim_void_func_pf Func1 = NULL;
shim_void_func_pf Func2 = NULL;
/* We must be launched by shim */
Status = gBS->LocateProtocol(&gShimLockGUID, NULL, (VOID**)&ShimLock);
if (EFI_ERROR(Status) || !ShimLock)
{
vErr(L"Failed to locate SHIM LOCK Protocol %lx", Status);
return Status;
}
/* Backup shim Lock because we will remove it later */
gShimLock.Verify = ShimLock->Verify;
gShimLock.Hash = ShimLock->Hash;
gShimLock.Context = ShimLock->Context;
Status = InstallVtoyShimProtocol();
if (EFI_ERROR(Status))
{
vErr(L"Failed to install ventoy shim protocol");
return Status;
}
/*
* IMPORTANT: All recent shim implementations hook the UEFI Boot Services
* (e.g. LoadImage, StartImage) to enforce signature verification.
*
* We must restore the original system service pointers here. If we fail to do this,
* we will be unable to launch Ventoy-signed EFI binaries or any other unsigned
* EFI applications later, even when the user has explicitly opted to disable
* all Secure Boot validation checks.
*
* To the best of my knowledge, there is no official way to remove these hooks.
* This is a tricky hack that relies on shim's internal implementation details.
* It may break in future versions of shim, and a better approach may exist.
*
*/
Func1 = FindShimFuncAddr(NM_UNHOOK_SYSTEM_SERVICES_OFFSET);
Func2 = FindShimFuncAddr(NM_UNINSTALL_SHIM_PROTOCOLS_OFFSET);
if (!Func1 || !Func2)
{
vErr(L"Can not find shim func %p %p", Func1, Func2);
Status = EFI_NOT_FOUND;
goto END;
}
Func1(); /* call shim unhook_system_services() */
Func2(); /* call shim uninstall_shim_protocols() */
HookSystemService();
/* Hook the system security policy */
Status = HookSecurityPolicy();
if (EFI_ERROR(Status))
{
vErr(L"Failed to hook system security policy");
goto END;
}
/* Finally launch Ventoy grub */
Status = LaunchRealGrub(ImageHandle, REAL_GRUB_FILE);
if (EFI_ERROR(Status))
{
vErr(L"Failed to finally launch real grub %s", REAL_GRUB_FILE);
goto END;
}
END:
/* UnHook system security policy */
UnHookSecurityPolicy();
UnInstallVtoyShimProtocol();
UnHookSystemService();
return Status;
}
STATIC EFI_STATUS EFIAPI VtoyHookDBX(UINTN DataSize, VOID *Data)
{
UINT32 i = 0;
UINT32 Count = 0;
UINTN Offset = 0;
EFI_SIGNATURE_LIST *pstCurSig = NULL;
EFI_SIGNATURE_DATA *pstSigData = NULL;
for (Offset = 0; Offset + sizeof(EFI_SIGNATURE_LIST) <= DataSize; Offset += pstCurSig->SignatureListSize)
{
pstCurSig = (EFI_SIGNATURE_LIST *)((UINT8 *)Data + Offset);
if (pstCurSig->SignatureSize == 0 || pstCurSig->SignatureListSize == 0 ||
Offset + pstCurSig->SignatureListSize > DataSize ||
pstCurSig->SignatureListSize < sizeof(EFI_SIGNATURE_LIST) + pstCurSig->SignatureHeaderSize)
{
break;
}
if (!CompareGuid(&pstCurSig->SignatureType, &gEfiCertSha256Guid))
{
continue;
}
pstSigData = (EFI_SIGNATURE_DATA *)((UINT8 *)pstCurSig + sizeof(EFI_SIGNATURE_LIST) + pstCurSig->SignatureHeaderSize);
Count = (pstCurSig->SignatureListSize - sizeof(EFI_SIGNATURE_LIST) - pstCurSig->SignatureHeaderSize) / pstCurSig->SignatureSize;
#if 0
if (Count > 0 && pstCurSig->SignatureSize == 48)
{
vDbg(L"Make a fake SVN signature for test");
CopyMem(&pstSigData->SignatureOwner, &gMsftDBXSVNOwnerGUID, sizeof(EFI_GUID));
ZeroMem(pstSigData->SignatureData, pstCurSig->SignatureSize);
CopyMem(&pstSigData->SignatureData + 1, &gBootMgrDBXSVNGUID, sizeof(EFI_GUID));
pstSigData->SignatureData[0] = 1;
DBX_SVN_SET(pstSigData->SignatureData, 100);
break;
}
#endif
for (i = 0; i < Count; i++)
{
if (CompareGuid(&pstSigData->SignatureOwner, &gMsftDBXSVNOwnerGUID) &&
CompareGuid((CONST EFI_GUID *)(pstSigData->SignatureData + 1), &gBootMgrDBXSVNGUID))
{
DBX_SVN_SET(pstSigData->SignatureData, 1);
return EFI_SUCCESS;
}
pstSigData = (EFI_SIGNATURE_DATA *)((UINT8 *)pstSigData + pstCurSig->SignatureSize);
}
}
return EFI_SUCCESS;
}
EFI_STATUS EFIAPI VtoyGetVariable
(
IN CHAR16 *VariableName,
IN EFI_GUID *VendorGuid,
OUT UINT32 *Attributes, OPTIONAL
IN OUT UINTN *DataSize,
OUT VOID *Data OPTIONAL
)
{
BOOLEAN bChk = FALSE;
EFI_STATUS Status;
if (gVtoyByPassSB && VariableName && VendorGuid && DataSize && Data)
{
bChk = TRUE;
}
Status = gSysGetVariable(VariableName, VendorGuid, Attributes, DataSize, Data);
if (bChk && EFI_SUCCESS == Status)
{
if (EFI_VAR_MATCH(&gShimLockGUID, L"MokSBState"))
{
*(UINT8 *)Data = 1;
}
else if (EFI_VAR_MATCH(&gEfiImageSecurityDatabaseGuid, L"dbx"))
{
VtoyHookDBX(*DataSize, Data);
}
}
return Status;
}
STATIC VOID EFIAPI UnHookSystemService(VOID)
{
UINT32 uiNewCRC = 0;
EFI_TABLE_HEADER *Hdr = &gST->RuntimeServices->Hdr;
if (gSysExitBootServices)
{
gBS->ExitBootServices = gSysExitBootServices;
gSysExitBootServices = NULL;
}
if (gSysGetVariable)
{
gST->RuntimeServices->GetVariable = gSysGetVariable;
gSysGetVariable = NULL;
Hdr->CRC32 = 0;
gBS->CalculateCrc32(Hdr, Hdr->HeaderSize, &uiNewCRC);
Hdr->CRC32 = uiNewCRC;
}
}
STATIC EFI_STATUS EFIAPI VtoyExitBootServices
(
IN EFI_HANDLE ImageHandle,
IN UINTN MapKey
)
{
EFI_EXIT_BOOT_SERVICES SysExitBS;
/* UnHookSystemService will set gSysExitBootServices NULL */
SysExitBS = gSysExitBootServices;
UnHookSecurityPolicy();
UnInstallVtoyShimProtocol();
UnHookSystemService();
return SysExitBS(ImageHandle, MapKey);
}
STATIC VOID EFIAPI HookSystemService(VOID)
{
UINT32 uiNewCRC = 0;
EFI_TABLE_HEADER *Hdr = &gST->RuntimeServices->Hdr;
gSysExitBootServices = gBS->ExitBootServices;
gBS->ExitBootServices = VtoyExitBootServices;
gSysGetVariable = gST->RuntimeServices->GetVariable;
gST->RuntimeServices->GetVariable = VtoyGetVariable;
Hdr->CRC32 = 0;
gBS->CalculateCrc32(Hdr, Hdr->HeaderSize, &uiNewCRC);
Hdr->CRC32 = uiNewCRC;
}
EFI_STATUS EFIAPI VtoyShimEfiMain
(
IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable
)
{
BOOLEAN IsSetup = FALSE;
BOOLEAN IsSecureBoot = FALSE;
EFI_STATUS Status;
IsSetup = IsSetupMode();
IsSecureBoot = IsSecureBootEnabled();
if (!IsSecureBoot || IsSetup)
{
/* If secure boot is not enabled or in SetupMode, nothing needed, just launch Ventoy grub */
Status = LaunchRealGrub(ImageHandle, REAL_GRUB_FILE);
if (EFI_ERROR(Status))
{
vErr(L"Failed to launch %s", REAL_GRUB_FILE);
}
}
else
{
Status = ShimEfiMain(ImageHandle, SystemTable);
}
return Status;
}
@@ -0,0 +1,132 @@
/******************************************************************************
* VtoyShim.h
*
* Copyright (c) 2017 - 2018, Intel Corporation. All rights reserved.<BR>
* SPDX-License-Identifier: BSD-2-Clause-Patent
*
*/
#ifndef __VTOYSHIM_H__
#define __VTOYSHIM_H__
#if defined (MDE_CPU_IA32)
#define REAL_GRUB_FILE L"grubia32_real.efi"
#elif defined (MDE_CPU_X64)
#define REAL_GRUB_FILE L"grubx64_real.efi"
#elif defined (MDE_CPU_AARCH64)
#define REAL_GRUB_FILE L"grubaa64_real.efi"
#else
#error "Not supported now"
#endif
/* The following definations are copied from shim source code */
#define SHIM_LOCK_GUID {0x605dab50, 0xe046, 0x4300, {0xab, 0xb6, 0x3d, 0xd8, 0x10, 0xdd, 0x8b, 0x23 } }
#define MSFT_DBX_SVN_OWN_GUID { 0x9d132b6c, 0x59d5, 0x4388, {0xab, 0x1c, 0x18, 0x5c, 0xfc, 0xb2, 0xeb, 0x92}}
#define EFI_BOOTMGR_DBXSVN_GUID { 0x9d132b61, 0x59d5, 0x4388, {0xab, 0x1c, 0x18, 0x5c, 0x3c, 0xb2, 0xeb, 0x92}}
#define EFI_VAR_MATCH(pguid, name) \
(CompareMem((pguid), VendorGuid, 16) == 0 && StrCmp(VariableName, (name)) == 0)
#define DBX_SVN_SET(SigData, SVN) \
do { \
SigData[17] = 0; \
SigData[18] = 0; \
SigData[19] = (SVN); \
SigData[20] = 0; \
} while (0)
typedef
EFI_STATUS
(*EFI_SHIM_LOCK_VERIFY) (
IN VOID *buffer,
IN UINT32 size
);
typedef
EFI_STATUS
(*EFI_SHIM_LOCK_HASH) (
IN char *data,
IN int datasize,
PE_COFF_LOADER_IMAGE_CONTEXT *context,
UINT8 *sha256hash,
UINT8 *sha1hash
);
typedef
EFI_STATUS
(*EFI_SHIM_LOCK_CONTEXT) (
IN VOID *data,
IN unsigned int datasize,
PE_COFF_LOADER_IMAGE_CONTEXT *context
);
typedef struct _SHIM_LOCK {
EFI_SHIM_LOCK_VERIFY Verify;
EFI_SHIM_LOCK_HASH Hash;
EFI_SHIM_LOCK_CONTEXT Context;
} SHIM_LOCK;
#define SHIM_IMAGE_LOADER_GUID {0x1f492041, 0xfadb, 0x4e59, {0x9e, 0x57, 0x7c, 0xaf, 0xe7, 0x3a, 0x55, 0xab } }
typedef struct _SHIM_IMAGE_LOADER {
EFI_IMAGE_LOAD LoadImage;
EFI_IMAGE_START StartImage;
EFI_EXIT Exit;
EFI_IMAGE_UNLOAD UnloadImage;
} SHIM_IMAGE_LOADER;
typedef VOID (*shim_void_func_pf)(VOID);
/*
* The two offset here are extract from the shim file which used in Ventoy.
* nm BOOTX64.EFI | grep shim_load_image
* nm BOOTX64.EFI | grep unhook_system_services
* nm BOOTX64.EFI | grep uninstall_shim_protocols
*
* It means that they must be updated every time Ventoy update the shim file.
*
*/
#define NM_SHIM_LOAD_IMAGE_OFFSET 0x2dc12
#define NM_UNHOOK_SYSTEM_SERVICES_OFFSET 0x2e278
#define NM_UNINSTALL_SHIM_PROTOCOLS_OFFSET 0x26264
#define VtoySleep(sec) gBS->Stall(1000000 * (sec))
#define vLog(fmt, ...) VtoyLog(fmt "\r\n", ##__VA_ARGS__)
#define vErr(fmt, ...) VtoyLog(fmt "\r\n", ##__VA_ARGS__); VtoySleep(5)
#define vDbg(fmt, ...) VtoyLog(fmt "\r\n", ##__VA_ARGS__); VtoySleep(1)
#define CheckFreePool(p) \
do { \
if (p) { \
FreePool(p); \
(p) = NULL; \
}\
} while (0)
#define VTOY_SHIM_POLICY_GUID {0x90a29d14, 0x3968, 0x48fe, { 0x85, 0x81, 0x6b, 0x7f, 0x7d, 0xc4, 0x70, 0x55 }};
typedef VOID (EFIAPI *VTOY_BYPASS_SB)(VOID);
typedef VOID (EFIAPI *VTOY_CHECK_SB)(VOID);
typedef VOID (EFIAPI *VTOY_LAUNCHED)(VOID);
typedef struct _VTOY_SHIM{
VTOY_BYPASS_SB ByPassSB;
VTOY_BYPASS_SB CheckSB;
VTOY_LAUNCHED Launched;
} VTOY_SHIM;
void calc_sha256(const void *data, UINT64 len, void *output);
#endif
@@ -0,0 +1,86 @@
#************************************************************************************
# Copyright (c) 2026, 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/>.
#
#************************************************************************************
[Defines]
INF_VERSION = 0x00010005
BASE_NAME = VtoyShim
FILE_GUID = 6d7c7406-b32c-461f-8454-ddaa5243d93d
MODULE_TYPE = UEFI_APPLICATION
VERSION_STRING = 1.0
ENTRY_POINT = VtoyShimEfiMain
[BuildOptions]
# Force standard GNU ld to pack and align ELF segments to 4KB page boundaries
GCC:*_*_*_DLINK_FLAGS = -Wl,-z,common-page-size=0x1000 -Wl,-z,max-page-size=0x1000
[Sources]
VtoyShim.h
VtoyShim.c
sha256.c
[Packages]
MdePkg/MdePkg.dec
MdeModulePkg/MdeModulePkg.dec
ShellPkg/ShellPkg.dec
[LibraryClasses]
UefiApplicationEntryPoint
UefiLib
DevicePathLib
DebugLib
[Guids]
gEfiGlobalVariableGuid
gEfiImageSecurityDatabaseGuid
gEfiCertSha256Guid
gShellVariableGuid
gEfiVirtualCdGuid
gEfiFileInfoGuid
[Protocols]
gEfiSecurityArchProtocolGuid
gEfiSecurity2ArchProtocolGuid
gEfiLoadedImageProtocolGuid
gEfiBlockIoProtocolGuid
gEfiDevicePathProtocolGuid
gEfiDevicePathToTextProtocolGuid
gEfiDevicePathFromTextProtocolGuid
gEfiSimpleFileSystemProtocolGuid
gEfiRamDiskProtocolGuid
gEfiAbsolutePointerProtocolGuid
gEfiAcpiTableProtocolGuid
gEfiBlockIo2ProtocolGuid
gEfiBusSpecificDriverOverrideProtocolGuid
gEfiComponentNameProtocolGuid
gEfiComponentName2ProtocolGuid
gEfiDriverBindingProtocolGuid
gEfiDiskIoProtocolGuid
gEfiDiskIo2ProtocolGuid
gEfiGraphicsOutputProtocolGuid
gEfiHiiConfigAccessProtocolGuid
gEfiHiiFontProtocolGuid
gEfiLoadFileProtocolGuid
gEfiLoadFile2ProtocolGuid
gEfiLoadedImageProtocolGuid
gEfiLoadedImageDevicePathProtocolGuid
gEfiPciIoProtocolGuid
gEfiSerialIoProtocolGuid
gEfiSimpleTextInProtocolGuid
gEfiSimpleTextInputExProtocolGuid
gEfiSimpleTextOutProtocolGuid
@@ -0,0 +1,2 @@
sbat,1,SBAT Version,sbat,1,https://github.com/rhboot/shim/blob/main/SBAT.md
ventoy-shim,1,Ventoy,ventoy-shim,1.0,https://www.ventoy.net/
1 sbat 1 SBAT Version sbat 1 https://github.com/rhboot/shim/blob/main/SBAT.md
2 ventoy-shim 1 Ventoy ventoy-shim 1.0 https://www.ventoy.net/
@@ -0,0 +1,170 @@
/******************************************************************************
* VtoyShim.c
*
* Copyright (c) 2017 - 2018, Intel Corporation. All rights reserved.<BR>
* SPDX-License-Identifier: BSD-2-Clause-Patent
*
*/
#include <Uefi.h>
#include <Library/DebugLib.h>
#include <Library/PrintLib.h>
#include <Library/UefiLib.h>
#include <Library/BaseMemoryLib.h>
static const UINT32 sha256_initial_h[8]
= { 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a,
0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19 };
static const UINT32 sha256_round_k[64]
= { 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1,
0x923f82a4, 0xab1c5ed5, 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,
0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, 0xe49b69c1, 0xefbe4786,
0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147,
0x06ca6351, 0x14292967, 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,
0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, 0xa2bfe8a1, 0xa81a664b,
0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a,
0x5b9cca4f, 0x682e6ff3, 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,
0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2 };
static void sha256_endian_reverse64(UINT64 input, UINT8 *output) {
output[7] = (input >> 0) & 0xff;
output[6] = (input >> 8) & 0xff;
output[5] = (input >> 16) & 0xff;
output[4] = (input >> 24) & 0xff;
output[3] = (input >> 32) & 0xff;
output[2] = (input >> 40) & 0xff;
output[1] = (input >> 48) & 0xff;
output[0] = (input >> 56) & 0xff;
}
static UINT32 sha256_endian_read32(UINT8 *input) {
UINT32 output = 0;
output |= (input[0] << 24);
output |= (input[1] << 16);
output |= (input[2] << 8);
output |= (input[3] << 0);
return output;
}
static void sha256_endian_reverse32(UINT32 input, UINT8 *output) {
output[3] = (input >> 0) & 0xff;
output[2] = (input >> 8) & 0xff;
output[1] = (input >> 16) & 0xff;
output[0] = (input >> 24) & 0xff;
}
static UINT32 sha256_ror(UINT32 input, UINT32 by) {
return (input >> by) | (((input & ((1 << by) - 1))) << (32 - by));
}
void calc_sha256(const void *data, UINT64 len, void *output)
{
int i = 0;
int j = 0;
UINT8 padding[80];
UINT64 current = (len + 1) % 64;
// want to be == 56 % 64.
UINT64 needed = (64 + 56 - current) % 64;
UINT64 extra = needed + 9;
UINT64 total = len + extra;
UINT32 v[8];
UINT64 cursor = 0;
for(i = 1; i < 80; i++)
{
padding[i] = 0;
}
padding[0] = 0x80;
sha256_endian_reverse64(len * 8, padding + total - len - 8);
for(i = 0; i < 8; i++)
{
v[i] = sha256_initial_h[i];
}
for(cursor = 0; cursor * 64 < total; cursor++)
{
UINT32 t[8];
UINT32 w[64];
for(i = 0; i < 8; i++)
{
t[i] = v[i];
}
if(cursor * 64 + 64 <= len)
{
for(j = 0; j < 16; j++)
{
w[j] = sha256_endian_read32((UINT8 *)data + cursor * 64 + j * 4);
}
}
else
{
if(cursor * 64 < len)
{
UINT64 size = len - cursor * 64;
if(size > 0)
{
CopyMem(w, (UINT8 *)data + cursor * 64, size);
}
CopyMem((UINT8 *)w + size, padding, 64 - size);
}
else
{
UINT64 off = (cursor * 64 - len) % 64;
CopyMem((UINT8 *)w, padding + off, 64);
}
for(j = 0; j < 16; j++)
{
w[j] = sha256_endian_read32((UINT8 *)&w[j]);
}
}
for(j = 16; j < 64; j++)
{
UINT32 s1 = sha256_ror(w[j - 2], 17) ^ sha256_ror(w[j - 2], 19) ^ (w[j - 2] >> 10);
UINT32 s0 = sha256_ror(w[j - 15], 7) ^ sha256_ror(w[j - 15], 18) ^ (w[j - 15] >> 3);
w[j] = s1 + w[j - 7] + s0 + w[j - 16];
}
for(j = 0; j < 64; j++)
{
UINT32 ch = (t[4] & t[5]) ^ (~t[4] & t[6]);
UINT32 maj = (t[0] & t[1]) ^ (t[0] & t[2]) ^ (t[1] & t[2]);
UINT32 S0 = sha256_ror(t[0], 2) ^ sha256_ror(t[0], 13) ^ sha256_ror(t[0], 22);
UINT32 S1 = sha256_ror(t[4], 6) ^ sha256_ror(t[4], 11) ^ sha256_ror(t[4], 25);
UINT32 t1 = t[7] + S1 + ch + sha256_round_k[j] + w[j];
UINT32 t2 = S0 + maj;
t[7] = t[6];
t[6] = t[5];
t[5] = t[4];
t[4] = t[3] + t1;
t[3] = t[2];
t[2] = t[1];
t[1] = t[0];
t[0] = t1 + t2;
}
for(i = 0; i < 8; i++)
{
v[i] += t[i];
}
}
for(i = 0; i < 8; i++)
{
sha256_endian_reverse32(v[i], (UINT8 *)output + i * 4);
}
}
@@ -21,6 +21,8 @@
#ifndef __VTOYUTIL_H__ #ifndef __VTOYUTIL_H__
#define __VTOYUTIL_H__ #define __VTOYUTIL_H__
#define VTOY_SHIM_POLICY_GUID {0x90a29d14, 0x3968, 0x48fe, { 0x85, 0x81, 0x6b, 0x7f, 0x7d, 0xc4, 0x70, 0x55 }};
#pragma pack(1) #pragma pack(1)
typedef EFI_STATUS (*VTOY_UTIL_PROC_PF)(IN EFI_HANDLE ImageHandle, IN CONST CHAR16 *CmdLine); typedef EFI_STATUS (*VTOY_UTIL_PROC_PF)(IN EFI_HANDLE ImageHandle, IN CONST CHAR16 *CmdLine);
@@ -24,6 +24,9 @@
VERSION_STRING = 1.0 VERSION_STRING = 1.0
ENTRY_POINT = VtoyUtilEfiMain ENTRY_POINT = VtoyUtilEfiMain
[BuildOptions]
# Force standard GNU ld to pack and align ELF segments to 4KB page boundaries
GCC:*_*_*_DLINK_FLAGS = -Wl,-z,common-page-size=0x1000 -Wl,-z,max-page-size=0x1000
[Sources] [Sources]
VtoyUtil.h VtoyUtil.h
@@ -205,6 +205,7 @@
[Components] [Components]
MdeModulePkg/Application/Ventoy/Ventoy.inf MdeModulePkg/Application/Ventoy/Ventoy.inf
MdeModulePkg/Application/VtoyUtil/VtoyUtil.inf MdeModulePkg/Application/VtoyUtil/VtoyUtil.inf
MdeModulePkg/Application/VtoyShim/VtoyShim.inf
MdeModulePkg/Application/VDiskChain/VDiskChain.inf MdeModulePkg/Application/VDiskChain/VDiskChain.inf
MdeModulePkg/Application/HelloWorld/HelloWorld.inf MdeModulePkg/Application/HelloWorld/HelloWorld.inf
MdeModulePkg/Application/DumpDynPcd/DumpDynPcd.inf MdeModulePkg/Application/DumpDynPcd/DumpDynPcd.inf
@@ -0,0 +1,98 @@
/* fwsetup.c - Reboot into firmware setup menu. */
/*
* GRUB -- GRand Unified Bootloader
* Copyright (C) 2012 Free Software Foundation, Inc.
*
* GRUB 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.
*
* GRUB 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 GRUB. If not, see <http://www.gnu.org/licenses/>.
*/
#include <grub/types.h>
#include <grub/mm.h>
#include <grub/misc.h>
#include <grub/efi/api.h>
#include <grub/efi/efi.h>
#include <grub/command.h>
#include <grub/i18n.h>
GRUB_MOD_LICENSE ("GPLv3+");
static grub_efi_boolean_t efifwsetup_is_supported (void);
static grub_err_t
grub_cmd_fwsetup (grub_command_t cmd __attribute__ ((unused)),
int argc __attribute__ ((unused)),
char **args __attribute__ ((unused)))
{
grub_efi_uint64_t *old_os_indications;
grub_efi_uint64_t os_indications = GRUB_EFI_OS_INDICATIONS_BOOT_TO_FW_UI;
grub_err_t status;
grub_size_t oi_size;
grub_efi_guid_t global = GRUB_EFI_GLOBAL_VARIABLE_GUID;
if (argc >= 1 && grub_strcmp(args[0], "--is-supported") == 0)
return !efifwsetup_is_supported ();
if (!efifwsetup_is_supported ())
return grub_error (GRUB_ERR_INVALID_COMMAND,
N_("reboot to firmware setup is not supported by the current firmware"));
old_os_indications = grub_efi_get_variable ("OsIndications", &global,
&oi_size);
if (old_os_indications != NULL && oi_size == sizeof (os_indications))
os_indications |= *old_os_indications;
status = grub_efi_set_variable ("OsIndications", &global, &os_indications,
sizeof (os_indications));
if (status != GRUB_ERR_NONE)
return status;
grub_reboot ();
return GRUB_ERR_BUG;
}
static grub_command_t cmd = NULL;
static grub_efi_boolean_t
efifwsetup_is_supported (void)
{
grub_efi_uint64_t *os_indications_supported = NULL;
grub_size_t oi_size = 0;
grub_efi_guid_t global = GRUB_EFI_GLOBAL_VARIABLE_GUID;
os_indications_supported = grub_efi_get_variable ("OsIndicationsSupported",
&global, &oi_size);
if (!os_indications_supported)
return 0;
if (*os_indications_supported & GRUB_EFI_OS_INDICATIONS_BOOT_TO_FW_UI)
return 1;
return 0;
}
GRUB_MOD_INIT (efifwsetup)
{
cmd = grub_register_command ("fwsetup", grub_cmd_fwsetup, NULL,
N_("Reboot into firmware setup menu."));
}
GRUB_MOD_FINI (efifwsetup)
{
if (cmd)
grub_unregister_command (cmd);
}
@@ -0,0 +1,313 @@
/*
* GRUB -- GRand Unified Bootloader
* Copyright (C) 2009,2010 Free Software Foundation, Inc.
*
* GRUB 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.
*
* GRUB 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 GRUB. If not, see <http://www.gnu.org/licenses/>.
*/
#include <grub/mm.h>
#include <grub/dl.h>
#include <grub/command.h>
#include <grub/term.h>
#include <grub/i18n.h>
#include <grub/misc.h>
GRUB_MOD_LICENSE ("GPLv3+");
static grub_uint8_t g_terminal_lock = 0;
struct grub_term_autoload *grub_term_input_autoload = NULL;
struct grub_term_autoload *grub_term_output_autoload = NULL;
struct abstract_terminal
{
struct abstract_terminal *next;
struct abstract_terminal *prev;
const char *name;
grub_err_t (*init) (struct abstract_terminal *term);
grub_err_t (*fini) (struct abstract_terminal *term);
};
static grub_err_t
handle_command (int argc, char **args, struct abstract_terminal **enabled,
struct abstract_terminal **disabled,
struct grub_term_autoload *autoloads,
const char *active_str,
const char *available_str)
{
int i;
struct abstract_terminal *term;
struct grub_term_autoload *aut;
if (argc == 0)
{
grub_puts_ (active_str);
for (term = *enabled; term; term = term->next)
grub_printf ("%s ", term->name);
grub_printf ("\n");
grub_puts_ (available_str);
for (term = *disabled; term; term = term->next)
grub_printf ("%s ", term->name);
/* This is quadratic but we don't expect mode than 30 terminal
modules ever. */
for (aut = autoloads; aut; aut = aut->next)
{
for (term = *disabled; term; term = term->next)
if (grub_strcmp (term->name, aut->name) == 0
|| (aut->name[0] && aut->name[grub_strlen (aut->name) - 1] == '*'
&& grub_memcmp (term->name, aut->name,
grub_strlen (aut->name) - 1) == 0))
break;
if (!term)
for (term = *enabled; term; term = term->next)
if (grub_strcmp (term->name, aut->name) == 0
|| (aut->name[0] && aut->name[grub_strlen (aut->name) - 1] == '*'
&& grub_memcmp (term->name, aut->name,
grub_strlen (aut->name) - 1) == 0))
break;
if (!term)
grub_printf ("%s ", aut->name);
}
grub_printf ("\n");
return GRUB_ERR_NONE;
}
i = 0;
if (grub_strcmp (args[0], "--append") == 0
|| grub_strcmp (args[0], "--remove") == 0)
i++;
if (i == argc)
return grub_error (GRUB_ERR_BAD_ARGUMENT, N_ ("no terminal specified"));
for (; i < argc; i++)
{
int again = 0;
while (1)
{
for (term = *disabled; term; term = term->next)
if (grub_strcmp (args[i], term->name) == 0
|| (grub_strcmp (args[i], "ofconsole") == 0
&& grub_strcmp ("console", term->name) == 0))
break;
if (term == 0)
for (term = *enabled; term; term = term->next)
if (grub_strcmp (args[i], term->name) == 0
|| (grub_strcmp (args[i], "ofconsole") == 0
&& grub_strcmp ("console", term->name) == 0))
break;
if (term)
break;
if (again)
return grub_error (GRUB_ERR_BAD_ARGUMENT,
N_("terminal `%s' isn't found"),
args[i]);
for (aut = autoloads; aut; aut = aut->next)
if (grub_strcmp (args[i], aut->name) == 0
|| (grub_strcmp (args[i], "ofconsole") == 0
&& grub_strcmp ("console", aut->name) == 0)
|| (aut->name[0] && aut->name[grub_strlen (aut->name) - 1] == '*'
&& grub_memcmp (args[i], aut->name,
grub_strlen (aut->name) - 1) == 0))
{
grub_dl_t mod;
mod = grub_dl_load (aut->modname);
if (mod)
grub_dl_ref (mod);
grub_errno = GRUB_ERR_NONE;
break;
}
if (grub_memcmp (args[i], "serial_usb",
sizeof ("serial_usb") - 1) == 0
&& grub_term_poll_usb)
{
grub_term_poll_usb (1);
again = 1;
continue;
}
if (!aut)
return grub_error (GRUB_ERR_BAD_ARGUMENT,
N_("terminal `%s' isn't found"),
args[i]);
again = 1;
}
}
if (grub_strcmp (args[0], "--append") == 0)
{
for (i = 1; i < argc; i++)
{
for (term = *disabled; term; term = term->next)
if (grub_strcmp (args[i], term->name) == 0
|| (grub_strcmp (args[i], "ofconsole") == 0
&& grub_strcmp ("console", term->name) == 0))
break;
if (term)
{
if (term->init && term->init (term) != GRUB_ERR_NONE)
return grub_errno;
grub_list_remove (GRUB_AS_LIST (term));
grub_list_push (GRUB_AS_LIST_P (enabled), GRUB_AS_LIST (term));
}
}
return GRUB_ERR_NONE;
}
if (grub_strcmp (args[0], "--remove") == 0)
{
for (i = 1; i < argc; i++)
{
for (term = *enabled; term; term = term->next)
if (grub_strcmp (args[i], term->name) == 0
|| (grub_strcmp (args[i], "ofconsole") == 0
&& grub_strcmp ("console", term->name) == 0))
break;
if (term)
{
if (!term->next && term == *enabled)
return grub_error (GRUB_ERR_BAD_ARGUMENT,
"can't remove the last terminal");
grub_list_remove (GRUB_AS_LIST (term));
if (term->fini)
term->fini (term);
grub_list_push (GRUB_AS_LIST_P (disabled), GRUB_AS_LIST (term));
}
}
return GRUB_ERR_NONE;
}
for (i = 0; i < argc; i++)
{
for (term = *disabled; term; term = term->next)
if (grub_strcmp (args[i], term->name) == 0
|| (grub_strcmp (args[i], "ofconsole") == 0
&& grub_strcmp ("console", term->name) == 0))
break;
if (term)
{
if (term->init && term->init (term) != GRUB_ERR_NONE)
return grub_errno;
grub_list_remove (GRUB_AS_LIST (term));
grub_list_push (GRUB_AS_LIST_P (enabled), GRUB_AS_LIST (term));
}
}
{
struct abstract_terminal *next;
for (term = *enabled; term; term = next)
{
next = term->next;
for (i = 0; i < argc; i++)
if (grub_strcmp (args[i], term->name) == 0
|| (grub_strcmp (args[i], "ofconsole") == 0
&& grub_strcmp ("console", term->name) == 0))
break;
if (i == argc)
{
if (!term->next && term == *enabled)
return grub_error (GRUB_ERR_BAD_ARGUMENT,
"can't remove the last terminal");
grub_list_remove (GRUB_AS_LIST (term));
if (term->fini)
term->fini (term);
grub_list_push (GRUB_AS_LIST_P (disabled), GRUB_AS_LIST (term));
}
}
}
return GRUB_ERR_NONE;
}
static grub_err_t
grub_cmd_terminal_lock (grub_command_t cmd __attribute__ ((unused)),
int argc, char **args)
{
(void)argc;
(void)args;
if (args[0] && args[0][0] == '1')
g_terminal_lock = 1;
else
g_terminal_lock = 0;
return 0;
}
static grub_err_t
grub_cmd_terminal_input (grub_command_t cmd __attribute__ ((unused)),
int argc, char **args)
{
(void) GRUB_FIELD_MATCH (grub_term_inputs, struct abstract_terminal *, next);
(void) GRUB_FIELD_MATCH (grub_term_inputs, struct abstract_terminal *, prev);
(void) GRUB_FIELD_MATCH (grub_term_inputs, struct abstract_terminal *, name);
(void) GRUB_FIELD_MATCH (grub_term_inputs, struct abstract_terminal *, init);
(void) GRUB_FIELD_MATCH (grub_term_inputs, struct abstract_terminal *, fini);
if (g_terminal_lock) return 0;
return handle_command (argc, args,
(struct abstract_terminal **) (void *) &grub_term_inputs,
(struct abstract_terminal **) (void *) &grub_term_inputs_disabled,
grub_term_input_autoload,
N_ ("Active input terminals:"),
N_ ("Available input terminals:"));
}
static grub_err_t
grub_cmd_terminal_output (grub_command_t cmd __attribute__ ((unused)),
int argc, char **args)
{
(void) GRUB_FIELD_MATCH (grub_term_outputs, struct abstract_terminal *, next);
(void) GRUB_FIELD_MATCH (grub_term_outputs, struct abstract_terminal *, prev);
(void) GRUB_FIELD_MATCH (grub_term_outputs, struct abstract_terminal *, name);
(void) GRUB_FIELD_MATCH (grub_term_outputs, struct abstract_terminal *, init);
(void) GRUB_FIELD_MATCH (grub_term_outputs, struct abstract_terminal *, fini);
if (g_terminal_lock) return 0;
return handle_command (argc, args,
(struct abstract_terminal **) (void *) &grub_term_outputs,
(struct abstract_terminal **) (void *) &grub_term_outputs_disabled,
grub_term_output_autoload,
N_ ("Active output terminals:"),
N_ ("Available output terminals:"));
}
static grub_command_t cmd_terminal_input, cmd_terminal_output, cmd_lock_terminal;
GRUB_MOD_INIT(terminal)
{
cmd_lock_terminal =
grub_register_command ("terminal_lock", grub_cmd_terminal_lock,
0, N_("lock terminal."));
cmd_terminal_input =
grub_register_command ("terminal_input", grub_cmd_terminal_input,
N_("[--append|--remove] "
"[TERMINAL1] [TERMINAL2] ..."),
N_("List or select an input terminal."));
cmd_terminal_output =
grub_register_command ("terminal_output", grub_cmd_terminal_output,
N_("[--append|--remove] "
"[TERMINAL1] [TERMINAL2] ..."),
N_("List or select an output terminal."));
}
GRUB_MOD_FINI(terminal)
{
grub_unregister_command (cmd_lock_terminal);
grub_unregister_command (cmd_terminal_input);
grub_unregister_command (cmd_terminal_output);
}
@@ -0,0 +1,117 @@
/* font_cmd.c - Font command definition. */
/*
* GRUB -- GRand Unified Bootloader
* Copyright (C) 2003,2005,2006,2007,2008,2009 Free Software Foundation, Inc.
*
* GRUB 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.
*
* GRUB 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 GRUB. If not, see <http://www.gnu.org/licenses/>.
*/
#include <grub/font.h>
#include <grub/dl.h>
#include <grub/misc.h>
#include <grub/command.h>
#include <grub/i18n.h>
static grub_uint8_t g_font_lock = 0;
static grub_err_t
loadfont_command (grub_command_t cmd __attribute__ ((unused)),
int argc,
char **args)
{
if (argc == 0)
return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("filename expected"));
if (g_font_lock) return 0;
while (argc--)
if (grub_font_load (*args++) == 0)
{
if (!grub_errno)
return grub_error (GRUB_ERR_BAD_FONT, "invalid font");
return grub_errno;
}
return GRUB_ERR_NONE;
}
static grub_err_t
lsfonts_command (grub_command_t cmd __attribute__ ((unused)),
int argc __attribute__ ((unused)),
char **args __attribute__ ((unused)))
{
struct grub_font_node *node;
grub_puts_ (N_("Loaded fonts:"));
for (node = grub_font_list; node; node = node->next)
{
grub_font_t font = node->value;
grub_printf ("%s\n", grub_font_get_name (font));
}
return GRUB_ERR_NONE;
}
static grub_err_t
lockfont_command (grub_command_t cmd __attribute__ ((unused)),
int argc __attribute__ ((unused)),
char **args __attribute__ ((unused)))
{
if (args[0] && args[0][0] == '1')
{
g_font_lock = 1;
}
else
{
g_font_lock = 0;
}
return GRUB_ERR_NONE;
}
static grub_command_t cmd_loadfont, cmd_lsfonts, cmd_lockfont;
#if defined (GRUB_MACHINE_MIPS_LOONGSON) || defined (GRUB_MACHINE_COREBOOT)
void grub_font_init (void)
#else
GRUB_MOD_INIT(font)
#endif
{
grub_font_loader_init ();
cmd_loadfont =
grub_register_command ("loadfont", loadfont_command,
N_("FILE..."),
N_("Specify one or more font files to load."));
cmd_lsfonts =
grub_register_command ("lsfonts", lsfonts_command,
0, N_("List the loaded fonts."));
cmd_lockfont =
grub_register_command ("lockfont", lockfont_command,
0, N_("Lock fonts."));
}
#if defined (GRUB_MACHINE_MIPS_LOONGSON) || defined (GRUB_MACHINE_COREBOOT)
void grub_font_fini (void)
#else
GRUB_MOD_FINI(font)
#endif
{
/* TODO: Determine way to free allocated resources.
Warning: possible pointer references could be in use. */
grub_unregister_command (cmd_loadfont);
grub_unregister_command (cmd_lsfonts);
grub_unregister_command (cmd_lockfont);
}
@@ -0,0 +1,200 @@
/* corecmd.c - critical commands which are registered in kernel */
/*
* GRUB -- GRand Unified Bootloader
* Copyright (C) 2009 Free Software Foundation, Inc.
*
* GRUB 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.
*
* GRUB 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 GRUB. If not, see <http://www.gnu.org/licenses/>.
*/
#include <grub/mm.h>
#include <grub/dl.h>
#include <grub/err.h>
#include <grub/env.h>
#include <grub/misc.h>
#include <grub/term.h>
#include <grub/file.h>
#include <grub/device.h>
#include <grub/command.h>
#include <grub/i18n.h>
/* set ENVVAR=VALUE */
static grub_err_t
grub_core_cmd_set (struct grub_command *cmd __attribute__ ((unused)),
int argc, char *argv[])
{
char *var;
char *val;
if (argc < 1)
{
struct grub_env_var *env;
FOR_SORTED_ENV (env)
grub_printf ("%s=%s\n", env->name, grub_env_get (env->name));
return 0;
}
var = argv[0];
val = grub_strchr (var, '=');
if (! val)
return grub_error (GRUB_ERR_BAD_ARGUMENT, "not an assignment");
val[0] = 0;
grub_env_set (var, val + 1);
val[0] = '=';
return 0;
}
static grub_err_t
grub_core_cmd_unset (struct grub_command *cmd __attribute__ ((unused)),
int argc, char *argv[])
{
if (argc < 1)
return grub_error (GRUB_ERR_BAD_ARGUMENT,
N_("one argument expected"));
grub_env_unset (argv[0]);
return 0;
}
/* insmod MODULE */
static grub_err_t
grub_core_cmd_insmod (struct grub_command *cmd __attribute__ ((unused)),
int argc, char *argv[])
{
grub_dl_t mod;
if (argc == 0)
return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("one argument expected"));
/* For simple, just disable insmod when SecureBoot is enabled. */
if (g_sys_sb && g_sb_policy == VTOY_SB_POLICY_CHECK)
{
return grub_error (GRUB_ERR_BAD_SIGNATURE, "Cannot insmod when SecureBoot is enabled and Policy is check.");
}
if (grub_strcmp(argv[0], "steamenv") == 0) {
grub_printf("Ventoy skip module steamenv ...\n");
return 0;
}
if (argv[0][0] == '/' || argv[0][0] == '(' || argv[0][0] == '+')
mod = grub_dl_load_file (argv[0]);
else
mod = grub_dl_load (argv[0]);
if (mod)
grub_dl_ref (mod);
return 0;
}
static int
grub_mini_print_devices (const char *name, void *data __attribute__ ((unused)))
{
grub_printf ("(%s) ", name);
return 0;
}
static int
grub_mini_print_files (const char *filename,
const struct grub_dirhook_info *info,
void *data __attribute__ ((unused)))
{
grub_printf ("%s%s ", filename, info->dir ? "/" : "");
return 0;
}
/* ls [ARG] */
static grub_err_t
grub_core_cmd_ls (struct grub_command *cmd __attribute__ ((unused)),
int argc, char *argv[])
{
if (argc < 1)
{
grub_device_iterate (grub_mini_print_devices, NULL);
grub_xputs ("\n");
grub_refresh ();
}
else
{
char *device_name;
grub_device_t dev = 0;
grub_fs_t fs;
char *path;
device_name = grub_file_get_device_name (argv[0]);
if (grub_errno)
goto fail;
dev = grub_device_open (device_name);
if (! dev)
goto fail;
fs = grub_fs_probe (dev);
path = grub_strchr (argv[0], ')');
if (! path)
path = argv[0];
else
path++;
if (! *path && ! device_name)
{
grub_error (GRUB_ERR_BAD_ARGUMENT, "invalid argument");
goto fail;
}
if (! *path)
{
if (grub_errno == GRUB_ERR_UNKNOWN_FS)
grub_errno = GRUB_ERR_NONE;
grub_printf ("(%s): Filesystem is %s.\n",
device_name, fs ? fs->name : "unknown");
}
else if (fs)
{
(fs->fs_dir) (dev, path, grub_mini_print_files, NULL);
grub_xputs ("\n");
grub_refresh ();
}
fail:
if (dev)
grub_device_close (dev);
grub_free (device_name);
}
return grub_errno;
}
void
grub_register_core_commands (void)
{
grub_command_t cmd;
cmd = grub_register_command ("set", grub_core_cmd_set,
N_("[ENVVAR=VALUE]"),
N_("Set an environment variable."));
if (cmd)
cmd->flags |= GRUB_COMMAND_FLAG_EXTRACTOR;
grub_register_command ("unset", grub_core_cmd_unset,
N_("ENVVAR"),
N_("Remove an environment variable."));
grub_register_command ("ls", grub_core_cmd_ls,
N_("[ARG]"), N_("List devices or files."));
grub_register_command ("insmod", grub_core_cmd_insmod,
N_("MODULE"), N_("Insert a module."));
}
@@ -22,6 +22,9 @@
#include <grub/misc.h> #include <grub/misc.h>
#include <grub/mm.h> #include <grub/mm.h>
grub_uint8_t g_sys_sb = 0;
grub_uint8_t g_sb_policy = VTOY_SB_POLICY_BYPASS;
/* The initial context. */ /* The initial context. */
static struct grub_env_context initial_context; static struct grub_env_context initial_context;
@@ -377,6 +377,8 @@ cmd_initrd (const char *line, struct syslinux_menu *menu)
{ {
struct initrd_list *ninitrd; struct initrd_list *ninitrd;
const char *comma; const char *comma;
char *pcPos;
if (!menu->entries) if (!menu->entries)
return grub_error (GRUB_ERR_BAD_ARGUMENT, "kernel without label"); return grub_error (GRUB_ERR_BAD_ARGUMENT, "kernel without label");
@@ -393,6 +395,14 @@ cmd_initrd (const char *line, struct syslinux_menu *menu)
grub_free (ninitrd); grub_free (ninitrd);
return grub_errno; return grub_errno;
} }
pcPos = grub_strstr(ninitrd->file, " quiet");
if (pcPos)
{
*pcPos = 0;
}
ninitrd->next = NULL; ninitrd->next = NULL;
if (menu->entries->initrds_last) if (menu->entries->initrds_last)
menu->entries->initrds_last->next = ninitrd; menu->entries->initrds_last->next = ninitrd;
@@ -493,16 +493,44 @@ static grub_err_t
grub_cmd_extra_initrd_append (grub_command_t cmd __attribute__ ((unused)), grub_cmd_extra_initrd_append (grub_command_t cmd __attribute__ ((unused)),
int argc, char *argv[]) int argc, char *argv[])
{ {
grub_uint32_t i;
int newclen = 0; int newclen = 0;
char *pos = NULL; char *pos = NULL;
char *end = NULL; char *end = NULL;
char buf[256] = {0}; char buf[256] = {0};
const char *suffix = NULL;
const char *check_suffix[] = { ".ko", ".ko.zst", ".ko.xz", ".ko.gz" };
if (argc != 1) if (argc != 1)
{ {
return 1; return 1;
} }
if (grub_strstr(argv[0], ".ko"))
{
if (ventoy_check_file_exist("%s", argv[0]))
{
suffix = "";
}
}
else
{
for (i = 0; i < sizeof(check_suffix) / sizeof(check_suffix[0]); i++)
{
if (ventoy_check_file_exist("%s%s", argv[0], check_suffix[i]))
{
suffix = check_suffix[i];
break;
}
}
}
if (!suffix)
{
grub_printf("ko file <%s> not exist\n", argv[0]);
return 0;
}
for (pos = argv[0]; *pos; pos++) for (pos = argv[0]; *pos; pos++)
{ {
if (*pos == '/') if (*pos == '/')
@@ -517,11 +545,11 @@ grub_cmd_extra_initrd_append (grub_command_t cmd __attribute__ ((unused)),
newclen = (int)grub_strlen(end + 1); newclen = (int)grub_strlen(end + 1);
if ((110 + newclen) % 4 == 0) if ((110 + newclen) % 4 == 0)
{ {
grub_snprintf(buf, sizeof(buf), "newc:.%s:%s", end + 1, argv[0]); grub_snprintf(buf, sizeof(buf), "newc:.%s%s:%s%s", end + 1, suffix, argv[0], suffix);
} }
else else
{ {
grub_snprintf(buf, sizeof(buf), "newc:%s:%s", end + 1, argv[0]); grub_snprintf(buf, sizeof(buf), "newc:%s%s:%s%s", end + 1, suffix, argv[0], suffix);
} }
if (ventoy_extra_initrd_num < 256) if (ventoy_extra_initrd_num < 256)
@@ -533,6 +561,7 @@ grub_cmd_extra_initrd_append (grub_command_t cmd __attribute__ ((unused)),
return 0; return 0;
} }
static grub_err_t static grub_err_t
grub_cmd_extra_initrd_reset (grub_command_t cmd __attribute__ ((unused)), grub_cmd_extra_initrd_reset (grub_command_t cmd __attribute__ ((unused)),
int argc, char *argv[]) int argc, char *argv[])
@@ -35,6 +35,8 @@
#include <grub/i18n.h> #include <grub/i18n.h>
#include <grub/lib/cmdline.h> #include <grub/lib/cmdline.h>
#include <grub/linux.h> #include <grub/linux.h>
#include <grub/time.h>
#include <grub/env.h>
#include <grub/machine/kernel.h> #include <grub/machine/kernel.h>
GRUB_MOD_LICENSE ("GPLv3+"); GRUB_MOD_LICENSE ("GPLv3+");
@@ -673,16 +675,44 @@ static grub_err_t
grub_cmd_extra_initrd_append (grub_command_t cmd __attribute__ ((unused)), grub_cmd_extra_initrd_append (grub_command_t cmd __attribute__ ((unused)),
int argc, char *argv[]) int argc, char *argv[])
{ {
grub_uint32_t i;
int newclen = 0; int newclen = 0;
char *pos = NULL; char *pos = NULL;
char *end = NULL; char *end = NULL;
char buf[256] = {0}; char buf[256] = {0};
const char *suffix = NULL;
const char *check_suffix[] = { ".ko", ".ko.zst", ".ko.xz", ".ko.gz" };
if (argc != 1) if (argc != 1)
{ {
return 1; return 1;
} }
if (grub_strstr(argv[0], ".ko"))
{
if (ventoy_check_file_exist("%s", argv[0]))
{
suffix = "";
}
}
else
{
for (i = 0; i < sizeof(check_suffix) / sizeof(check_suffix[0]); i++)
{
if (ventoy_check_file_exist("%s%s", argv[0], check_suffix[i]))
{
suffix = check_suffix[i];
break;
}
}
}
if (!suffix)
{
grub_printf("ko file <%s> not exist\n", argv[0]);
return 0;
}
for (pos = argv[0]; *pos; pos++) for (pos = argv[0]; *pos; pos++)
{ {
if (*pos == '/') if (*pos == '/')
@@ -697,11 +727,11 @@ grub_cmd_extra_initrd_append (grub_command_t cmd __attribute__ ((unused)),
newclen = (int)grub_strlen(end + 1); newclen = (int)grub_strlen(end + 1);
if ((110 + newclen) % 4 == 0) if ((110 + newclen) % 4 == 0)
{ {
grub_snprintf(buf, sizeof(buf), "newc:.%s:%s", end + 1, argv[0]); grub_snprintf(buf, sizeof(buf), "newc:.%s%s:%s%s", end + 1, suffix, argv[0], suffix);
} }
else else
{ {
grub_snprintf(buf, sizeof(buf), "newc:%s:%s", end + 1, argv[0]); grub_snprintf(buf, sizeof(buf), "newc:%s%s:%s%s", end + 1, suffix, argv[0], suffix);
} }
if (ventoy_extra_initrd_num < 256) if (ventoy_extra_initrd_num < 256)
@@ -713,6 +743,7 @@ grub_cmd_extra_initrd_append (grub_command_t cmd __attribute__ ((unused)),
return 0; return 0;
} }
static grub_err_t static grub_err_t
grub_cmd_extra_initrd_reset (grub_command_t cmd __attribute__ ((unused)), grub_cmd_extra_initrd_reset (grub_command_t cmd __attribute__ ((unused)),
int argc, char *argv[]) int argc, char *argv[])
@@ -750,6 +781,16 @@ grub_linux_boot (void)
grub_size_t mmap_size; grub_size_t mmap_size;
grub_size_t cl_offset; grub_size_t cl_offset;
/* To be simple, just deny to boot linux kernel when SecureBoot is enabled and Policy is check */
if (g_sys_sb && g_sb_policy == VTOY_SB_POLICY_CHECK)
{
grub_printf("\n\n ######### Can not do linux boot in SecureBoot Policy Check #######\n\n");
grub_refresh();
grub_sleep(5);
grub_errno = GRUB_ERR_BAD_SIGNATURE;
return 0;
}
ventoy_preboot(); ventoy_preboot();
#ifdef GRUB_MACHINE_IEEE1275 #ifdef GRUB_MACHINE_IEEE1275
@@ -441,16 +441,44 @@ static grub_err_t
grub_cmd_extra_initrd_append (grub_command_t cmd __attribute__ ((unused)), grub_cmd_extra_initrd_append (grub_command_t cmd __attribute__ ((unused)),
int argc, char *argv[]) int argc, char *argv[])
{ {
grub_uint32_t i;
int newclen = 0; int newclen = 0;
char *pos = NULL; char *pos = NULL;
char *end = NULL; char *end = NULL;
char buf[256] = {0}; char buf[256] = {0};
const char *suffix = NULL;
const char *check_suffix[] = { ".ko", ".ko.zst", ".ko.xz", ".ko.gz" };
if (argc != 1) if (argc != 1)
{ {
return 1; return 1;
} }
if (grub_strstr(argv[0], ".ko"))
{
if (ventoy_check_file_exist("%s", argv[0]))
{
suffix = "";
}
}
else
{
for (i = 0; i < sizeof(check_suffix) / sizeof(check_suffix[0]); i++)
{
if (ventoy_check_file_exist("%s%s", argv[0], check_suffix[i]))
{
suffix = check_suffix[i];
break;
}
}
}
if (!suffix)
{
grub_printf("ko file <%s> not exist\n", argv[0]);
return 0;
}
for (pos = argv[0]; *pos; pos++) for (pos = argv[0]; *pos; pos++)
{ {
if (*pos == '/') if (*pos == '/')
@@ -465,11 +493,11 @@ grub_cmd_extra_initrd_append (grub_command_t cmd __attribute__ ((unused)),
newclen = (int)grub_strlen(end + 1); newclen = (int)grub_strlen(end + 1);
if ((110 + newclen) % 4 == 0) if ((110 + newclen) % 4 == 0)
{ {
grub_snprintf(buf, sizeof(buf), "newc:.%s:%s", end + 1, argv[0]); grub_snprintf(buf, sizeof(buf), "newc:.%s%s:%s%s", end + 1, suffix, argv[0], suffix);
} }
else else
{ {
grub_snprintf(buf, sizeof(buf), "newc:%s:%s", end + 1, argv[0]); grub_snprintf(buf, sizeof(buf), "newc:%s%s:%s%s", end + 1, suffix, argv[0], suffix);
} }
if (ventoy_extra_initrd_num < 256) if (ventoy_extra_initrd_num < 256)
@@ -1134,6 +1134,7 @@ show_menu (grub_menu_t menu, int nested, int autobooted)
while (1) while (1)
{ {
int ndown; int ndown;
char *pos = NULL;
int boot_entry; int boot_entry;
grub_menu_entry_t e; grub_menu_entry_t e;
int auto_boot; int auto_boot;
@@ -1176,14 +1177,27 @@ show_menu (grub_menu_t menu, int nested, int autobooted)
if (2 == e->argc && e->args && e->args[1] && grub_strncmp(e->args[1], "VTOY_RUN_RET", 12) == 0) if (2 == e->argc && e->args && e->args[1] && grub_strncmp(e->args[1], "VTOY_RUN_RET", 12) == 0)
break; break;
else if (2 == e->argc && e->args && e->args[1] && grub_strncmp(e->args[1], "VTOY_RUN_SET", 12) == 0) { else if (2 == e->argc && e->args && e->args[1] && grub_strncmp(e->args[1], "VTOY_RUN_SET_", 13) == 0) {
ndown = (int)grub_strtol(e->args[1] + 12, NULL, 10); pos = NULL;
ndown = (int)grub_strtol(e->args[1] + 13, &pos, 10);
while (ndown > 0) while (ndown > 0)
{ {
ventoy_menu_push_key(GRUB_TERM_KEY_DOWN); ventoy_menu_push_key(GRUB_TERM_KEY_DOWN);
ndown--; ndown--;
} }
ventoy_menu_push_key('\n'); ventoy_menu_push_key('\n');
if (pos && *pos == '_')
{
ndown = (int)grub_strtol(pos + 1, NULL, 10);
while (ndown > 0)
{
ventoy_menu_push_key(GRUB_TERM_KEY_DOWN);
ndown--;
}
}
break; break;
} }
} }
+215 -27
View File
@@ -49,6 +49,14 @@ int g_ventoy_debug = 0;
static int g_efi_os = 0xFF; static int g_efi_os = 0xFF;
grub_uint32_t g_ventoy_plat_data; grub_uint32_t g_ventoy_plat_data;
static grub_uint8_t g_timeout_lock = 0;
static grub_uint8_t g_theme_lock = 0;
static char *g_lock_theme = NULL;
#ifdef GRUB_MACHINE_EFI
static VTOY_SHIM *g_vtoy_shim = NULL;
#endif
void ventoy_debug(const char *fmt, ...) void ventoy_debug(const char *fmt, ...)
{ {
va_list args; va_list args;
@@ -232,6 +240,29 @@ int ventoy_strncmp (const char *pattern, const char *str, grub_size_t n)
return (int)(grub_uint8_t)*pattern - (int)(grub_uint8_t)*str; return (int)(grub_uint8_t)*pattern - (int)(grub_uint8_t)*str;
} }
void ventoy_timeout_lock(int lock)
{
g_timeout_lock = lock ? 1 : 0;
}
void ventoy_theme_lock(int lock)
{
const char *env = NULL;
g_theme_lock = 0;
grub_check_free(g_lock_theme);
if (lock)
{
env = grub_env_get("theme");
if (env)
{
g_lock_theme = grub_strdup(env);
g_theme_lock = 1;
}
}
}
grub_err_t ventoy_env_int_set(const char *name, int value) grub_err_t ventoy_env_int_set(const char *name, int value)
{ {
char buf[16]; char buf[16];
@@ -298,9 +329,152 @@ void ventoy_memfile_env_set(const char *prefix, const void *buf, unsigned long l
return; return;
} }
#ifdef GRUB_MACHINE_EFI
static void ventoy_get_uefi_version(char *str, grub_size_t len)
{
grub_efi_uint8_t uefi_minor_1, uefi_minor_2;
uefi_minor_1 = (grub_efi_system_table->hdr.revision & 0xffff) / 10;
uefi_minor_2 = (grub_efi_system_table->hdr.revision & 0xffff) % 10;
grub_snprintf(str, len, "%d.%d", (grub_efi_system_table->hdr.revision >> 16), uefi_minor_1);
if (uefi_minor_2)
grub_snprintf(str, len, "%s.%d", str, uefi_minor_2);
}
static void ventoy_get_pi_version(char *str, grub_size_t len)
{
grub_uint32_t data = 0;
grub_efi_uintn_t i = 0;
grub_efi_guid_t dxest =
{ 0x05ad34ba, 0x6f02, 0x4214, {0x95, 0x2e, 0x4d, 0xa0, 0x39, 0x8e, 0x2b, 0xb9 } };
for (i = 0; i < grub_efi_system_table->num_table_entries; i++)
{
if (grub_memcmp(&dxest, &grub_efi_system_table->configuration_table[i].vendor_guid, 16) == 0)
{
grub_memcpy(&data, (char *)grub_efi_system_table->configuration_table[i].vendor_table + 8, 4);
break;
}
}
grub_snprintf(str, len, "%d.%d", (data >> 16) & 0xFFFF, (data & 0xFFFF) / 10);
}
int ventoy_set_sb_policy(void)
{
const char *env = NULL;
static int set_once = 0;
/* no need when SecureBoot is disabled */
if (g_sys_sb == 0)
{
return 0;
}
/* can only set once */
if (set_once > 0)
{
return 0;
}
set_once = 1;
/* VTOY_SECURE_BOOT_POLICY only take affect once during init */
env = grub_env_get("VTOY_SECURE_BOOT_POLICY");
if (env)
{
g_sb_policy = (grub_uint8_t)(env[0] - '0');
}
if (g_sb_policy == VTOY_SB_POLICY_BYPASS)
{
if (g_vtoy_shim && g_vtoy_shim->ByPassSB)
{
g_vtoy_shim->ByPassSB();
}
}
else if (g_sb_policy == VTOY_SB_POLICY_CHECK)
{
if (g_vtoy_shim && g_vtoy_shim->CheckSB)
{
g_vtoy_shim->CheckSB();
}
}
return 0;
}
static void ventoy_get_uefi_sb(void)
{
grub_uint8_t secure_boot = 0;
grub_uint8_t setup_mode = 0;
grub_uint8_t *var = NULL;
grub_size_t size = 0;
grub_efi_guid_t global = GRUB_EFI_GLOBAL_VARIABLE_GUID;
var = grub_efi_get_variable("SecureBoot", &global, &size);
if (var && size == 1 && *var == 1)
{
secure_boot = 1;
}
grub_check_free(var);
size = 0;
var = grub_efi_get_variable("SetupMode", &global, &size);
if (var && size == 1 && *var == 1)
{
setup_mode = 1;
}
if (secure_boot == 1 && setup_mode == 0)
{
g_sys_sb = 1;
}
grub_check_free(var);
}
static int ventoy_secure_boot_init(void)
{
grub_efi_guid_t ProtGuid = VTOY_SHIM_POLICY_GUID;
ventoy_get_uefi_sb();
if (g_sys_sb == 0)
{
return 0;
}
if (g_ventoy_plat_data == VTOY_PLAT_X86_64_UEFI)
{
g_vtoy_shim = grub_efi_locate_protocol(&ProtGuid, NULL);
if (g_vtoy_shim == NULL || g_vtoy_shim->ByPassSB == NULL ||
g_vtoy_shim->CheckSB == NULL || g_vtoy_shim->Launched == NULL)
{
/*
* Generally when SecureBoot enabled, Ventoy grub must be launched by Ventoy Shim.
* But there are some exceptions:
* 1. Ventoy key was enrolled directly to the UEFI DB
* 2. Some UEFI firmware (MSI) has Image Execution Policy as Always Execute which
* means Secure Boot is effectively disabled.
*/
}
else
{
g_vtoy_shim->Launched();
}
}
return 0;
}
#endif
static int ventoy_arch_mode_init(void) static int ventoy_arch_mode_init(void)
{ {
#ifdef GRUB_MACHINE_EFI #ifdef GRUB_MACHINE_EFI
if (grub_strcmp(GRUB_TARGET_CPU, "i386") == 0) if (grub_strcmp(GRUB_TARGET_CPU, "i386") == 0)
{ {
g_ventoy_plat_data = VTOY_PLAT_I386_UEFI; g_ventoy_plat_data = VTOY_PLAT_I386_UEFI;
@@ -329,19 +503,6 @@ static int ventoy_arch_mode_init(void)
return 0; return 0;
} }
#ifdef GRUB_MACHINE_EFI
static void ventoy_get_uefi_version(char *str, grub_size_t len)
{
grub_efi_uint8_t uefi_minor_1, uefi_minor_2;
uefi_minor_1 = (grub_efi_system_table->hdr.revision & 0xffff) / 10;
uefi_minor_2 = (grub_efi_system_table->hdr.revision & 0xffff) % 10;
grub_snprintf(str, len, "%d.%d", (grub_efi_system_table->hdr.revision >> 16), uefi_minor_1);
if (uefi_minor_2)
grub_snprintf(str, len, "%s.%d", str, uefi_minor_2);
}
#endif
static int ventoy_calc_totalmem(grub_uint64_t addr, grub_uint64_t size, grub_memory_type_t type, void *data) static int ventoy_calc_totalmem(grub_uint64_t addr, grub_uint64_t size, grub_memory_type_t type, void *data)
{ {
grub_uint64_t *total_mem = (grub_uint64_t *)data; grub_uint64_t *total_mem = (grub_uint64_t *)data;
@@ -367,8 +528,12 @@ static int ventoy_hwinfo_init(void)
#ifdef GRUB_MACHINE_EFI #ifdef GRUB_MACHINE_EFI
ventoy_get_uefi_version(str, sizeof(str)); ventoy_get_uefi_version(str, sizeof(str));
ventoy_env_export("grub_uefi_version", str); ventoy_env_export("grub_uefi_version", str);
ventoy_get_pi_version(str, sizeof(str));
ventoy_env_export("grub_pi_version", str);
#else #else
ventoy_env_export("grub_uefi_version", "NA"); ventoy_env_export("grub_uefi_version", "NA");
ventoy_env_export("grub_pi_version", "NA");
#endif #endif
return 0; return 0;
@@ -415,6 +580,19 @@ static char * ventoy_global_var_write_hook(struct grub_env_var *var, const char
return grub_strdup(val); return grub_strdup(val);
} }
static char * ventoy_timeout_write_hook(struct grub_env_var *var, const char *val)
{
(void)var;
return grub_strdup(g_timeout_lock ? "-1" : val);
}
static char * ventoy_theme_write_hook(struct grub_env_var *var, const char *val)
{
(void)var;
return grub_strdup(g_theme_lock ? g_lock_theme : val);
}
int ventoy_global_var_init(void) int ventoy_global_var_init(void)
{ {
int i; int i;
@@ -426,16 +604,20 @@ int ventoy_global_var_init(void)
grub_register_variable_hook(g_global_vars[i].name, ventoy_global_var_read_hook, ventoy_global_var_write_hook); grub_register_variable_hook(g_global_vars[i].name, ventoy_global_var_read_hook, ventoy_global_var_write_hook);
} }
grub_register_variable_hook("timeout", NULL, ventoy_timeout_write_hook);
grub_register_variable_hook("theme", NULL, ventoy_theme_write_hook);
return 0; return 0;
} }
static ctrl_var_cfg g_ctrl_vars[] = static ctrl_var_cfg g_ctrl_vars[] =
{ {
{ "VTOY_WIN11_BYPASS_CHECK", 1 }, { "VTOY_WIN11_BYPASS_CHECK", "1" },
{ "VTOY_WIN11_BYPASS_NRO", 1 }, { "VTOY_WIN11_BYPASS_NRO", "1" },
{ "VTOY_LINUX_REMOUNT", 0 }, { "VTOY_LINUX_REMOUNT", "0" },
{ "VTOY_SECONDARY_BOOT_MENU", 1 }, { "VTOY_SECONDARY_BOOT_MENU", "1" },
{ NULL, 0 } { "VTOY_WIN_UEFI_RES_LOCK", "3" },
{ NULL, "" }
}; };
static const char * ventoy_ctrl_var_read_hook(struct grub_env_var *var, const char *val) static const char * ventoy_ctrl_var_read_hook(struct grub_env_var *var, const char *val)
@@ -446,7 +628,7 @@ static const char * ventoy_ctrl_var_read_hook(struct grub_env_var *var, const ch
{ {
if (grub_strcmp(g_ctrl_vars[i].name, var->name) == 0) if (grub_strcmp(g_ctrl_vars[i].name, var->name) == 0)
{ {
return g_ctrl_vars[i].value ? "1" : "0"; return g_ctrl_vars[i].szval;
} }
} }
@@ -461,14 +643,14 @@ static char * ventoy_ctrl_var_write_hook(struct grub_env_var *var, const char *v
{ {
if (grub_strcmp(g_ctrl_vars[i].name, var->name) == 0) if (grub_strcmp(g_ctrl_vars[i].name, var->name) == 0)
{ {
if (val && val[0] == '1' && val[1] == 0) if (val && grub_isdigit(val[0]) && val[1] == 0)
{ {
g_ctrl_vars[i].value = 1; g_ctrl_vars[i].szval[0] = val[0];
return grub_strdup("1"); return grub_strdup(val);
} }
else else
{ {
g_ctrl_vars[i].value = 0; g_ctrl_vars[i].szval[0] = '0';
return grub_strdup("0"); return grub_strdup("0");
} }
} }
@@ -479,12 +661,13 @@ static char * ventoy_ctrl_var_write_hook(struct grub_env_var *var, const char *v
int ventoy_ctrl_var_init(void) int ventoy_ctrl_var_init(void)
{ {
int i; ctrl_var_cfg *cfg = g_ctrl_vars;
for (i = 0; g_ctrl_vars[i].name; i++) while (cfg->name)
{ {
ventoy_env_export(g_ctrl_vars[i].name, g_ctrl_vars[i].value ? "1" : "0"); ventoy_env_export(cfg->name, cfg->szval);
grub_register_variable_hook(g_ctrl_vars[i].name, ventoy_ctrl_var_read_hook, ventoy_ctrl_var_write_hook); grub_register_variable_hook(cfg->name, ventoy_ctrl_var_read_hook, ventoy_ctrl_var_write_hook);
cfg++;
} }
return 0; return 0;
@@ -495,6 +678,11 @@ GRUB_MOD_INIT(ventoy)
ventoy_hwinfo_init(); ventoy_hwinfo_init();
ventoy_env_init(); ventoy_env_init();
ventoy_arch_mode_init(); ventoy_arch_mode_init();
#ifdef GRUB_MACHINE_EFI
ventoy_secure_boot_init();
#endif
ventoy_register_all_cmd(); ventoy_register_all_cmd();
} }
@@ -896,6 +896,36 @@ static grub_err_t ventoy_cmd_strstr(grub_extcmd_context_t ctxt, int argc, char *
return (grub_strstr(args[0], args[1])) ? 0 : 1; return (grub_strstr(args[0], args[1])) ? 0 : 1;
} }
static grub_err_t ventoy_cmd_istrstr(grub_extcmd_context_t ctxt, int argc, char **args)
{
grub_err_t ret = 1;
char *s1 = NULL;
char *s2 = NULL;
(void)ctxt;
if (argc != 2)
{
return 1;
}
s1 = grub_strdup(args[0]);
s2 = grub_strdup(args[1]);
if (s1 == NULL || s2 == NULL)
{
goto end;
}
ventoy_str_toupper(s1);
ventoy_str_toupper(s2);
ret = (grub_strstr(s1, s2)) ? 0 : 1;
end:
grub_check_free(s1);
grub_check_free(s2);
return ret;
}
static grub_err_t ventoy_cmd_strbegin(grub_extcmd_context_t ctxt, int argc, char **args) static grub_err_t ventoy_cmd_strbegin(grub_extcmd_context_t ctxt, int argc, char **args)
{ {
char *c0, *c1; char *c0, *c1;
@@ -3245,6 +3275,25 @@ void ventoy_fill_os_param(grub_file_t file, ventoy_os_param *param)
param->vtoy_reserved[6] = file->vlnk; param->vtoy_reserved[6] = file->vlnk;
grub_memcpy(param->vtoy_reserved + 7, g_ventoy_part_info->MBR.BootCode + 0x1b8, 4); grub_memcpy(param->vtoy_reserved + 7, g_ventoy_part_info->MBR.BootCode + 0x1b8, 4);
/* Windows UEFI force resolution lock */
if (g_ventoy_chain_type == 1) /* Windows */
{
val = ventoy_get_env("VTOY_WIN_UEFI_RES_LOCK");
if (val && val[1] == 0)
{
if (val[0] == '1')
{
param->vtoy_reserved[11] = 1;
}
else if (val[0] == '2')
{
param->vtoy_reserved[11] = 2;
}
}
}
/* calculate checksum */ /* calculate checksum */
for (i = 0; i < sizeof(ventoy_os_param); i++) for (i = 0; i < sizeof(ventoy_os_param); i++)
{ {
@@ -3410,6 +3459,7 @@ int ventoy_get_block_list(grub_file_t file, ventoy_img_chunk_list *chunklist, gr
static grub_err_t ventoy_cmd_img_sector(grub_extcmd_context_t ctxt, int argc, char **args) static grub_err_t ventoy_cmd_img_sector(grub_extcmd_context_t ctxt, int argc, char **args)
{ {
int rc; int rc;
int fs_type;
grub_file_t file; grub_file_t file;
grub_disk_addr_t start; grub_disk_addr_t start;
char errmsg[128]; char errmsg[128];
@@ -3432,7 +3482,8 @@ static grub_err_t ventoy_cmd_img_sector(grub_extcmd_context_t ctxt, int argc, ch
grub_free(g_img_chunk_list.chunk); grub_free(g_img_chunk_list.chunk);
} }
if (ventoy_get_fs_type(file->fs->name) >= ventoy_fs_max) fs_type = ventoy_get_fs_type(file->fs->name);
if (fs_type >= ventoy_fs_max)
{ {
grub_file_close(file); grub_file_close(file);
return grub_error(GRUB_ERR_BAD_ARGUMENT, "Unsupported filesystem %s\n", file->fs->name); return grub_error(GRUB_ERR_BAD_ARGUMENT, "Unsupported filesystem %s\n", file->fs->name);
@@ -3458,8 +3509,11 @@ static grub_err_t ventoy_cmd_img_sector(grub_extcmd_context_t ctxt, int argc, ch
if (rc) if (rc)
{ {
vtoy_tip(10, "%s\n\nWill exit in 10 seconds...\n", errmsg); if (fs_type == ventoy_fs_btrfs)
grub_exit(); {
vtoy_tip(10, "%s\n\nWill exit in 10 seconds...\n", errmsg);
grub_exit();
}
return grub_error(GRUB_ERR_NOT_IMPLEMENTED_YET, "%s\n", errmsg); return grub_error(GRUB_ERR_NOT_IMPLEMENTED_YET, "%s\n", errmsg);
} }
@@ -4234,6 +4288,11 @@ static grub_err_t ventoy_cmd_check_mode(grub_extcmd_context_t ctxt, int argc, ch
} }
else if (args[0][0] == '1') else if (args[0][0] == '1')
{ {
if (argc == 2 && ventoy_check_mode_by_name(args[1], "vtcompat"))
{
return 0;
}
return g_ventoy_iso_raw ? 0 : 1; return g_ventoy_iso_raw ? 0 : 1;
} }
else if (args[0][0] == '2') else if (args[0][0] == '2')
@@ -4698,22 +4757,10 @@ static grub_err_t ventoy_cmd_img_unhook_root(grub_extcmd_context_t ctxt, int arg
#ifdef GRUB_MACHINE_EFI #ifdef GRUB_MACHINE_EFI
static grub_err_t ventoy_cmd_check_secureboot_var(grub_extcmd_context_t ctxt, int argc, char **args) static grub_err_t ventoy_cmd_check_secureboot_var(grub_extcmd_context_t ctxt, int argc, char **args)
{ {
int ret = 1;
grub_uint8_t *var;
grub_size_t size;
grub_efi_guid_t global = GRUB_EFI_GLOBAL_VARIABLE_GUID;
(void)ctxt; (void)ctxt;
(void)argc; (void)argc;
(void)args; (void)args;
return g_sys_sb ? 0 : 1;
var = grub_efi_get_variable("SecureBoot", &global, &size);
if (var && *var == 1)
{
return 0;
}
return ret;
} }
#else #else
static grub_err_t ventoy_cmd_check_secureboot_var(grub_extcmd_context_t ctxt, int argc, char **args) static grub_err_t ventoy_cmd_check_secureboot_var(grub_extcmd_context_t ctxt, int argc, char **args)
@@ -5094,7 +5141,7 @@ int ventoy_load_part_table(const char *diskname)
return 0; return 0;
} }
static void ventoy_prompt_end(void) void ventoy_prompt_end(void)
{ {
int op = 0; int op = 0;
char c; char c;
@@ -6207,7 +6254,8 @@ static grub_err_t ventoy_cmd_need_secondary_menu(grub_extcmd_context_t ctxt, int
if (ventoy_check_mode_by_name(args[0], "vtgrub2") || if (ventoy_check_mode_by_name(args[0], "vtgrub2") ||
ventoy_check_mode_by_name(args[0], "vtwimboot") || ventoy_check_mode_by_name(args[0], "vtwimboot") ||
ventoy_check_mode_by_name(args[0], "vtmemdisk") || ventoy_check_mode_by_name(args[0], "vtmemdisk") ||
ventoy_check_mode_by_name(args[0], "vtnormal") ventoy_check_mode_by_name(args[0], "vtnormal") ||
ventoy_check_mode_by_name(args[0], "vtcompat")
) )
{ {
return 1; return 1;
@@ -6388,6 +6436,92 @@ static grub_err_t ventoy_cmd_load_menu_lang(grub_extcmd_context_t ctxt, int argc
VENTOY_CMD_RETURN(0); VENTOY_CMD_RETURN(0);
} }
static grub_err_t ventoy_cmd_update_sb_policy(grub_extcmd_context_t ctxt, int argc, char **args)
{
(void)ctxt;
(void)argc;
(void)args;
#ifdef GRUB_MACHINE_EFI
ventoy_set_sb_policy();
#endif
VENTOY_CMD_RETURN(0);
}
static grub_err_t ventoy_cmd_timeout_lock(grub_extcmd_context_t ctxt, int argc, char **args)
{
(void)ctxt;
(void)argc;
if (args[0] && args[0][0] == '1')
{
ventoy_timeout_lock(1);
}
else
{
ventoy_timeout_lock(0);
}
VENTOY_CMD_RETURN(0);
}
static grub_err_t ventoy_cmd_theme_lock(grub_extcmd_context_t ctxt, int argc, char **args)
{
(void)ctxt;
(void)argc;
if (args[0] && args[0][0] == '1')
{
ventoy_theme_lock(1);
}
else
{
ventoy_theme_lock(0);
}
VENTOY_CMD_RETURN(0);
}
static grub_err_t ventoy_cmd_sb_info(grub_extcmd_context_t ctxt, int argc, char **args)
{
(void)ctxt;
(void)argc;
(void)args;
#ifdef GRUB_MACHINE_EFI
const char *policy = NULL;
grub_efi_guid_t security =
{ 0xA46423E3, 0x4617, 0x49f1, {0xB9, 0xFF, 0xD1, 0xBF, 0xA9, 0x11, 0x58, 0x39 } };
grub_efi_guid_t security2 =
{ 0x94ab2f58, 0x1438, 0x4ef1, {0x91, 0x52, 0x18, 0x94, 0x1a, 0x3a, 0x0e, 0x68 } };
if (g_sb_policy == VTOY_SB_POLICY_BYPASS)
{
policy = "ByPass";
}
else if (g_sb_policy == VTOY_SB_POLICY_CHECK)
{
policy = "Check";
}
else
{
policy = "XXX";
}
grub_printf("UEFI Security %s\n", grub_efi_locate_protocol(&security, NULL) ? "Yes" : "No");
grub_printf("UEFI Security2 %s\n", grub_efi_locate_protocol(&security2, NULL) ? "Yes" : "No");
grub_printf("Ventoy Secure Policy %s\n", policy);
#else
grub_printf("Non EFI mode!\n");
#endif
grub_refresh();
VENTOY_CMD_RETURN(0);
}
static int ventoy_chksum_pathcmp(int chktype, char *rlpath, char *rdpath) static int ventoy_chksum_pathcmp(int chktype, char *rlpath, char *rdpath)
{ {
char *pos1 = NULL; char *pos1 = NULL;
@@ -6873,6 +7007,7 @@ static cmd_para ventoy_cmds[] =
{ "vt_incr", ventoy_cmd_incr, 0, NULL, "{Var} {INT}", "Increase integer variable", NULL }, { "vt_incr", ventoy_cmd_incr, 0, NULL, "{Var} {INT}", "Increase integer variable", NULL },
{ "vt_mod", ventoy_cmd_mod, 0, NULL, "{Int} {Int} {Var}", "mod integer variable", NULL }, { "vt_mod", ventoy_cmd_mod, 0, NULL, "{Int} {Int} {Var}", "mod integer variable", NULL },
{ "vt_strstr", ventoy_cmd_strstr, 0, NULL, "", "", NULL }, { "vt_strstr", ventoy_cmd_strstr, 0, NULL, "", "", NULL },
{ "vt_istrstr", ventoy_cmd_istrstr, 0, NULL, "", "", NULL },
{ "vt_str_begin", ventoy_cmd_strbegin, 0, NULL, "", "", NULL }, { "vt_str_begin", ventoy_cmd_strbegin, 0, NULL, "", "", NULL },
{ "vt_str_casebegin", ventoy_cmd_strcasebegin, 0, NULL, "", "", NULL }, { "vt_str_casebegin", ventoy_cmd_strcasebegin, 0, NULL, "", "", NULL },
{ "vt_debug", ventoy_cmd_debug, 0, NULL, "{on|off}", "turn debug on/off", NULL }, { "vt_debug", ventoy_cmd_debug, 0, NULL, "{on|off}", "turn debug on/off", NULL },
@@ -7034,6 +7169,13 @@ static cmd_para ventoy_cmds[] =
{ "vt_cmp_checksum", ventoy_cmd_cmp_checksum, 0, NULL, "", "", NULL }, { "vt_cmp_checksum", ventoy_cmd_cmp_checksum, 0, NULL, "", "", NULL },
{ "vt_push_menu_lang", ventoy_cmd_push_menulang, 0, NULL, "", "", NULL }, { "vt_push_menu_lang", ventoy_cmd_push_menulang, 0, NULL, "", "", NULL },
{ "vt_pop_menu_lang", ventoy_cmd_pop_menulang, 0, NULL, "", "", NULL }, { "vt_pop_menu_lang", ventoy_cmd_pop_menulang, 0, NULL, "", "", NULL },
{ "vt_linux_initrd", ventoy_cmd_linux_initrd, 0, NULL, "", "", NULL },
{ "vt_sbinfo", ventoy_cmd_sb_info, 0, NULL, "", "", NULL },
{ "vt_update_sb_policy", ventoy_cmd_update_sb_policy, 0, NULL, "", "", NULL },
{ "vt_timeout_lock", ventoy_cmd_timeout_lock, 0, NULL, "", "", NULL },
{ "vt_theme_lock", ventoy_cmd_theme_lock, 0, NULL, "", "", NULL },
}; };
@@ -37,6 +37,7 @@
#define VTOY_SIZE_4MB (4 * 1024 * 1024) #define VTOY_SIZE_4MB (4 * 1024 * 1024)
#define VTOY_SIZE_512KB (512 * 1024) #define VTOY_SIZE_512KB (512 * 1024)
#define VTOY_SIZE_1KB 1024 #define VTOY_SIZE_1KB 1024
#define VTOY_SIZE_4KB 4096
#define VTOY_SIZE_32KB (32 * 1024) #define VTOY_SIZE_32KB (32 * 1024)
#define VTOY_SIZE_128KB (128 * 1024) #define VTOY_SIZE_128KB (128 * 1024)
@@ -194,6 +195,18 @@ typedef struct cpio_newc_header
#define check_free(p, func) if (p) { func(p); p = NULL; } #define check_free(p, func) if (p) { func(p); p = NULL; }
#define grub_check_free(p) if (p) { grub_free(p); p = NULL; } #define grub_check_free(p) if (p) { grub_free(p); p = NULL; }
#define VTOY_SHIM_POLICY_GUID {0x90a29d14, 0x3968, 0x48fe, { 0x85, 0x81, 0x6b, 0x7f, 0x7d, 0xc4, 0x70, 0x55 }};
typedef void (*VTOY_BYPASS_SB)(void);
typedef void (*VTOY_CHECK_SB)(void);
typedef void (*VTOY_LAUNCHED)(void);
typedef struct _VTOY_SHIM{
VTOY_BYPASS_SB ByPassSB;
VTOY_CHECK_SB CheckSB;
VTOY_LAUNCHED Launched;
} VTOY_SHIM;
typedef int (*grub_char_check_func)(int c); typedef int (*grub_char_check_func)(int c);
#define ventoy_is_decimal(str) ventoy_string_check(str, grub_isdigit) #define ventoy_is_decimal(str) ventoy_string_check(str, grub_isdigit)
@@ -648,6 +661,8 @@ int ventoy_str_all_digit(const char *str);
int ventoy_str_all_alnum(const char *str); int ventoy_str_all_alnum(const char *str);
int ventoy_str_len_alnum(const char *str, int len); int ventoy_str_len_alnum(const char *str, int len);
char * ventoy_str_basename(char *path); char * ventoy_str_basename(char *path);
void ventoy_timeout_lock(int lock);
void ventoy_theme_lock(int lock);
grub_err_t ventoy_env_int_set(const char *name, int value); grub_err_t ventoy_env_int_set(const char *name, int value);
int ventoy_str_chrcnt(const char *str, char c); int ventoy_str_chrcnt(const char *str, char c);
int ventoy_strcmp(const char *pattern, const char *str); int ventoy_strcmp(const char *pattern, const char *str);
@@ -662,6 +677,7 @@ grub_uint32_t ventoy_get_iso_boot_catlog(grub_file_t file);
int ventoy_has_efi_eltorito(grub_file_t file, grub_uint32_t sector); int ventoy_has_efi_eltorito(grub_file_t file, grub_uint32_t sector);
grub_err_t ventoy_cmd_linux_chain_data(grub_extcmd_context_t ctxt, int argc, char **args); grub_err_t ventoy_cmd_linux_chain_data(grub_extcmd_context_t ctxt, int argc, char **args);
grub_err_t ventoy_cmd_linux_systemd_menu(grub_extcmd_context_t ctxt, int argc, char **args); grub_err_t ventoy_cmd_linux_systemd_menu(grub_extcmd_context_t ctxt, int argc, char **args);
grub_err_t ventoy_cmd_linux_initrd(grub_extcmd_context_t ctxt, int argc, char **args);
grub_err_t ventoy_cmd_linux_limine_menu(grub_extcmd_context_t ctxt, int argc, char **args); grub_err_t ventoy_cmd_linux_limine_menu(grub_extcmd_context_t ctxt, int argc, char **args);
grub_err_t ventoy_cmd_linux_locate_initrd(grub_extcmd_context_t ctxt, int argc, char **args); grub_err_t ventoy_cmd_linux_locate_initrd(grub_extcmd_context_t ctxt, int argc, char **args);
grub_err_t ventoy_cmd_initrd_count(grub_extcmd_context_t ctxt, int argc, char **args); grub_err_t ventoy_cmd_initrd_count(grub_extcmd_context_t ctxt, int argc, char **args);
@@ -1279,6 +1295,7 @@ typedef struct systemd_menu_ctx
{ {
char *dev; char *dev;
char *buf; char *buf;
const char *initrd_cmd;
int pos; int pos;
int len; int len;
}systemd_menu_ctx; }systemd_menu_ctx;
@@ -1293,7 +1310,7 @@ typedef struct global_var_cfg
typedef struct ctrl_var_cfg typedef struct ctrl_var_cfg
{ {
const char *name; const char *name;
int value; char szval[2];
}ctrl_var_cfg; }ctrl_var_cfg;
#define vtoy_check_goto_out(p) if (!p) goto out #define vtoy_check_goto_out(p) if (!p) goto out
@@ -1323,6 +1340,8 @@ int ventoy_ctrl_var_init(void);
int ventoy_global_var_init(void); int ventoy_global_var_init(void);
grub_err_t ventoy_cmd_push_menulang(grub_extcmd_context_t ctxt, int argc, char **args); grub_err_t ventoy_cmd_push_menulang(grub_extcmd_context_t ctxt, int argc, char **args);
grub_err_t ventoy_cmd_pop_menulang(grub_extcmd_context_t ctxt, int argc, char **args); grub_err_t ventoy_cmd_pop_menulang(grub_extcmd_context_t ctxt, int argc, char **args);
void ventoy_prompt_end(void);
int ventoy_set_sb_policy(void);
#endif /* __VENTOY_DEF_H__ */ #endif /* __VENTOY_DEF_H__ */
@@ -1867,7 +1867,7 @@ static int ventoy_systemd_conf_hook(const char *filename, const struct grub_dirh
ctx->pos = oldpos; ctx->pos = oldpos;
goto out; goto out;
} }
vtoy_len_ssprintf(ctx->buf, ctx->pos, ctx->len, " echo \"Downloading kernel ...\"\n linux %s ", tag); vtoy_len_ssprintf(ctx->buf, ctx->pos, ctx->len, " echo \"Loading kernel ...\"\n linux %s ", tag);
/* kernel options */ /* kernel options */
grub_memcpy(filebuf, bkbuf, file->size); grub_memcpy(filebuf, bkbuf, file->size);
@@ -1876,7 +1876,7 @@ static int ventoy_systemd_conf_hook(const char *filename, const struct grub_dirh
/* initrd xxx xxx xxx */ /* initrd xxx xxx xxx */
vtoy_len_ssprintf(ctx->buf, ctx->pos, ctx->len, " echo \"Downloading initrd ...\"\n initrd "); vtoy_len_ssprintf(ctx->buf, ctx->pos, ctx->len, " echo \"Loading initrd ...\"\n %s ", ctx->initrd_cmd);
grub_memcpy(filebuf, bkbuf, file->size); grub_memcpy(filebuf, bkbuf, file->size);
tag = ventoy_systemd_conf_tag(filebuf, "initrd", 1); tag = ventoy_systemd_conf_tag(filebuf, "initrd", 1);
while (tag) while (tag)
@@ -1893,6 +1893,34 @@ out:
return 0; return 0;
} }
grub_err_t ventoy_cmd_linux_initrd(grub_extcmd_context_t ctxt, int argc, char **args)
{
int i;
int pos = 0;
char *buf = NULL;
(void)ctxt;
buf = (char *)grub_malloc(VTOY_SIZE_4KB);
if (!buf)
{
return 1;
}
pos += grub_snprintf(buf + pos, VTOY_SIZE_4KB - pos, "initrd mem:%s:size:%s",
grub_env_get("ventoy_cpio_addr"), grub_env_get("ventoy_cpio_size"));
for (i = 0; i < argc; i++)
{
pos += grub_snprintf(buf + pos, VTOY_SIZE_4KB - pos, " newc:initrd%03d:%s", i + 1, args[i]);
}
grub_script_execute_sourcecode(buf);
grub_free(buf);
return 0;
}
grub_err_t ventoy_cmd_linux_systemd_menu(grub_extcmd_context_t ctxt, int argc, char **args) grub_err_t ventoy_cmd_linux_systemd_menu(grub_extcmd_context_t ctxt, int argc, char **args)
{ {
static char *buf = NULL; static char *buf = NULL;
@@ -1936,6 +1964,7 @@ grub_err_t ventoy_cmd_linux_systemd_menu(grub_extcmd_context_t ctxt, int argc, c
ctx.dev = args[0]; ctx.dev = args[0];
ctx.buf = buf; ctx.buf = buf;
ctx.initrd_cmd = args[2] ? args[2] : "initrd";
ctx.pos = 0; ctx.pos = 0;
ctx.len = VTOY_LINUX_SYSTEMD_MENU_MAX_BUF; ctx.len = VTOY_LINUX_SYSTEMD_MENU_MAX_BUF;
fs->fs_dir(dev, "/loader/entries", ventoy_systemd_conf_hook, &ctx); fs->fs_dir(dev, "/loader/entries", ventoy_systemd_conf_hook, &ctx);
@@ -525,42 +525,18 @@ grub_err_t ventoy_cmd_unix_freebsd_ver(grub_extcmd_context_t ctxt, int argc, cha
VENTOY_CMD_RETURN(GRUB_ERR_NONE); VENTOY_CMD_RETURN(GRUB_ERR_NONE);
} }
grub_err_t ventoy_cmd_unix_freebsd_ver_elf(grub_extcmd_context_t ctxt, int argc, char **args) static int ventoy_freebsd_ver_elf(int bit64, grub_elf_t elf, const char *section, const char *env, char *data)
{ {
int j; int j = 0;
int k; int k = 0;
grub_elf_t elf = NULL; int ret = 1;
char *str = NULL;
void *hdr = NULL;
grub_off_t offset = 0; grub_off_t offset = 0;
grub_uint32_t len = 0; grub_uint32_t len = 0;
char *str = NULL;
char *data = NULL;
void *hdr = NULL;
char ver[64] = {0}; char ver[64] = {0};
(void)ctxt; if (bit64)
(void)argc;
(void)args;
if (argc != 3)
{
debug("Invalid argc %d\n", argc);
return 1;
}
data = grub_zalloc(8192);
if (!data)
{
goto out;
}
elf = grub_elf_open(args[0], GRUB_FILE_TYPE_LINUX_INITRD);
if (!elf)
{
debug("Failed to open file %s\n", args[0]);
goto out;
}
if (args[1][0] == '6')
{ {
Elf64_Ehdr *e = &(elf->ehdr.ehdr64); Elf64_Ehdr *e = &(elf->ehdr.ehdr64);
Elf64_Shdr *h; Elf64_Shdr *h;
@@ -592,11 +568,11 @@ grub_err_t ventoy_cmd_unix_freebsd_ver_elf(grub_extcmd_context_t ctxt, int argc,
for (t = h, i = 0; i < e->e_shnum; i++) for (t = h, i = 0; i < e->e_shnum; i++)
{ {
if (grub_strcmp(str + t->sh_name, ".data") == 0) if (grub_strcmp(str + t->sh_name, section) == 0)
{ {
offset = t->sh_offset; offset = t->sh_offset;
len = t->sh_size; len = t->sh_size;
debug("find .data section at %u %u\n", (grub_uint32_t)offset, len); debug("find %s section at %u %u\n", section, (grub_uint32_t)offset, len);
break; break;
} }
t = (Elf64_Shdr *)((char *)t + e->e_shentsize); t = (Elf64_Shdr *)((char *)t + e->e_shentsize);
@@ -634,11 +610,11 @@ grub_err_t ventoy_cmd_unix_freebsd_ver_elf(grub_extcmd_context_t ctxt, int argc,
for (t = h, i = 0; i < e->e_shnum; i++) for (t = h, i = 0; i < e->e_shnum; i++)
{ {
if (grub_strcmp(str + t->sh_name, ".data") == 0) if (grub_strcmp(str + t->sh_name, section) == 0)
{ {
offset = t->sh_offset; offset = t->sh_offset;
len = t->sh_size; len = t->sh_size;
debug("find .data section at %u %u\n", (grub_uint32_t)offset, len); debug("find %s section at %u %u\n", section, (grub_uint32_t)offset, len);
break; break;
} }
t = (Elf32_Shdr *)((char *)t + e->e_shentsize); t = (Elf32_Shdr *)((char *)t + e->e_shentsize);
@@ -647,7 +623,7 @@ grub_err_t ventoy_cmd_unix_freebsd_ver_elf(grub_extcmd_context_t ctxt, int argc,
if (offset == 0 || len == 0) if (offset == 0 || len == 0)
{ {
debug(".data section not found %s\n", args[0]); debug("%s section not found\n", section);
goto out; goto out;
} }
@@ -672,21 +648,64 @@ grub_err_t ventoy_cmd_unix_freebsd_ver_elf(grub_extcmd_context_t ctxt, int argc,
} }
} }
if (ver[0]) if (ver[0])
{ {
k = (int)grub_strtoul(ver, NULL, 10); k = (int)grub_strtoul(ver, NULL, 10);
debug("freebsd version:<%s> <%d.x>\n", ver, k); debug("%s freebsd version:<%s> <%d.x>\n", section, ver, k);
grub_snprintf(ver, sizeof(ver), "%d.x", k); grub_snprintf(ver, sizeof(ver), "%d.x", k);
ventoy_set_env(args[2], ver); ventoy_set_env(env, ver);
ret = 0;
} }
else else
{ {
debug("freebsd version:<%s>\n", "NOT FOUND"); debug("%s freebsd version:<%s>\n", section, "NOT FOUND");
ret = 1;
} }
out: out:
grub_check_free(str); grub_check_free(str);
grub_check_free(hdr); grub_check_free(hdr);
return ret;
}
grub_err_t ventoy_cmd_unix_freebsd_ver_elf(grub_extcmd_context_t ctxt, int argc, char **args)
{
int ret = 0;
int bit64 = 0;
char *data = NULL;
grub_elf_t elf = NULL;
(void)ctxt;
if (argc != 3)
{
debug("Invalid argc %d\n", argc);
return 1;
}
data = grub_zalloc(8192);
if (!data)
{
goto out;
}
elf = grub_elf_open(args[0], GRUB_FILE_TYPE_LINUX_INITRD);
if (!elf)
{
debug("Failed to open file %s\n", args[0]);
goto out;
}
bit64 = (args[1][0] == '6') ? 1 : 0;
ret = ventoy_freebsd_ver_elf(bit64, elf, ".data", args[2], data);
if (ret != 0)
{
ret = ventoy_freebsd_ver_elf(bit64, elf, ".rodata", args[2], data);
}
out:
grub_check_free(data); grub_check_free(data);
check_free(elf, grub_elf_close); check_free(elf, grub_elf_close);
@@ -24,6 +24,11 @@
#include <grub/types.h> #include <grub/types.h>
#include <grub/menu.h> #include <grub/menu.h>
#define VTOY_SB_POLICY_BYPASS 0
#define VTOY_SB_POLICY_CHECK 1
extern grub_uint8_t EXPORT_VAR(g_sys_sb);
extern grub_uint8_t EXPORT_VAR(g_sb_policy);
struct grub_env_var; struct grub_env_var;
typedef const char *(*grub_env_read_hook_t) (struct grub_env_var *var, typedef const char *(*grub_env_read_hook_t) (struct grub_env_var *var,
@@ -125,6 +125,7 @@ typedef struct ventoy_os_param
* vtoy_reserved[5]: vtoy_linux_remount * vtoy_reserved[5]: vtoy_linux_remount
* vtoy_reserved[6]: vtoy_vlnk * vtoy_reserved[6]: vtoy_vlnk
* vtoy_reserved[7~10]: vtoy_disk_sig[4] used for vlnk * vtoy_reserved[7~10]: vtoy_disk_sig[4] used for vlnk
* vtoy_reserved[11]: vtoy_win_uefi_max_res
* *
*/ */
grub_uint8_t vtoy_reserved[32]; // Internal use by ventoy grub_uint8_t vtoy_reserved[32]; // Internal use by ventoy
@@ -0,0 +1,9 @@
#!/ventoy/busybox/sh
. /ventoy/hook/ventoy-hook-lib.sh
PATH=$BUSYBOX_PATH:$VTOY_PATH/tool:$PATH
vtlog "####### $0 $* ########"
ventoy_copy_udev_auto_rules
@@ -0,0 +1,19 @@
#!/ventoy/busybox/sh
. /ventoy/hook/ventoy-hook-lib.sh
PATH=$BUSYBOX_PATH:$VTOY_PATH/tool:$PATH
vtlog "####### $0 $* ########"
vtoy_udev_auto_hook() {
if grep -q 'break.*=.*postmount' /init; then
vtlog "udev auto before postmount"
sed "/break.*=.*postmount/i\\$BUSYBOX_PATH/sh $VTOY_PATH/hook/manjaro/ventoy-uauto-exec.sh" -i /init
elif [ -d $VT_DRACUT_HOOKS/pre-pivot ]; then
vtlog "dracut distro"
ventoy_dracut_pivot_udev_rule
fi
}
vtoy_udev_auto_hook
@@ -20,6 +20,6 @@
. $VTOY_PATH/hook/ventoy-os-lib.sh . $VTOY_PATH/hook/ventoy-os-lib.sh
ventoy_set_inotify_script blackPanther/ventoy-inotifyd-hook.sh ventoy_set_inotify_script blackPanther/ventoy-inotifyd-hook.sh
$BUSYBOX_PATH/cp -a $VTOY_PATH/hook/blackPanther/ventoy-inotifyd-start.sh /lib/dracut/hooks/pre-udev/00-ventoy-inotifyd-start.sh $BUSYBOX_PATH/cp -a $VTOY_PATH/hook/blackPanther/ventoy-inotifyd-start.sh $VT_DRACUT_HOOKS/pre-udev/00-ventoy-inotifyd-start.sh
$SED "s#printf\(.*\)\$CMDLINE#printf\1 root=/dev/ventoy \$CMDLINE root=/dev/ventoy#" -i /lib/dracut-lib.sh $SED "s#printf\(.*\)\$CMDLINE#printf\1 root=/dev/ventoy \$CMDLINE root=/dev/ventoy#" -i /lib/dracut-lib.sh
@@ -0,0 +1,16 @@
#!/ventoy/busybox/sh
. /ventoy/hook/ventoy-hook-lib.sh
PATH=$BUSYBOX_PATH:$VTOY_PATH/tool:$PATH
vtlog "####### $0 $* ########"
vtoy_udev_auto_hook() {
if [ -d $VT_DRACUT_HOOKS/pre-pivot ]; then
vtlog "dracut distro"
ventoy_dracut_pivot_udev_rule
fi
}
vtoy_udev_auto_hook
@@ -0,0 +1,19 @@
find_cow_device() {
tgt_pers_label="${1}"
vt_pers_label=""
vt_pers_dev=""
if [ -f /ventoy/ventoy_persistent_label -a -f /ventoy/ventoy_persistent_dev ]; then
vt_pers_label=$(cat /ventoy/ventoy_persistent_label)
vt_pers_dev=$(cat /ventoy/ventoy_persistent_dev)
fi
if [ "$tgt_pers_label" = "$vt_pers_label" ]; then
echo "$vt_pers_dev"
else
find_cow_device_back "$@"
fi
}
find_cow_device_back() {
@@ -31,6 +31,19 @@ if [ -e /init ] && $GREP -q '^mountroot$' /init; then
$SED "s#^ *LIVEMEDIA=.*#LIVEMEDIA=/dev/mapper/ventoy#" -i /scripts/casper $SED "s#^ *LIVEMEDIA=.*#LIVEMEDIA=/dev/mapper/ventoy#" -i /scripts/casper
fi fi
fi fi
#workaround for issue #3718
if [ -f $VTOY_PATH/ventoy_persistent_map -a -f /scripts/casper-helpers ]; then
echo 'fix casper cow udev issue' >> $VTLOG
if $GREP -q '^find_cow_device\(\).*{' /scripts/casper-helpers; then
VTINS_LINE=$($GREP -n '^find_cow_device\(\).*{' /scripts/casper-helpers | $AWK -F':' '{print $1}')
$AWK "NR < $VTINS_LINE" /scripts/casper-helpers > /ventoy/casper-helpers-tmp
$CAT $VTOY_PATH/hook/debian/casper-perst-wa.sh >> /ventoy/casper-helpers-tmp
$AWK "NR > $VTINS_LINE" /scripts/casper-helpers >> /ventoy/casper-helpers-tmp
$CAT /ventoy/casper-helpers-tmp > /scripts/casper-helpers
fi
fi
elif [ -e "$CD_DETECT" ]; then elif [ -e "$CD_DETECT" ]; then
echo "$CD_DETECT exist, now add hook in it..." >> $VTLOG echo "$CD_DETECT exist, now add hook in it..." >> $VTLOG
$SED "1 a $BUSYBOX_PATH/sh $VTOY_PATH/hook/debian/disk_mount_hook.sh" -i "$CD_DETECT" $SED "1 a $BUSYBOX_PATH/sh $VTOY_PATH/hook/debian/disk_mount_hook.sh" -i "$CD_DETECT"
@@ -36,19 +36,24 @@ if [ "$vtdiskname" = "unknown" ]; then
exit 0 exit 0
fi fi
if grep -q 'device-mapper' /proc/devices; then
vtlog "dm-mod already loaded"
else
vtlog "dm-mod not loaded, get from squashfs"
vtoydm -i -f $VTOY_PATH/ventoy_image_map -d $vtdiskname > $VTOY_PATH/iso_file_list vtoydm -i -f $VTOY_PATH/ventoy_image_map -d $vtdiskname > $VTOY_PATH/iso_file_list
vtline=$(grep '[-][-] drivers-.*\.squashfs' $VTOY_PATH/iso_file_list) vtline=$(grep '[-][-] drivers-.*\.squashfs' $VTOY_PATH/iso_file_list)
sector=$(echo $vtline | awk '{print $(NF-1)}') sector=$(echo $vtline | awk '{print $(NF-1)}')
length=$(echo $vtline | awk '{print $NF}') length=$(echo $vtline | awk '{print $NF}')
vtoydm -e -f $VTOY_PATH/ventoy_image_map -d $vtdiskname -s $sector -l $length -o $VTOY_PATH/driver.squashfs vtoydm -e -f $VTOY_PATH/ventoy_image_map -d $vtdiskname -s $sector -l $length -o $VTOY_PATH/driver.squashfs
mount -t squashfs $VTOY_PATH/driver.squashfs /lib/modules mount -t squashfs $VTOY_PATH/driver.squashfs /lib/modules
modprobe dm-mod modprobe dm-mod
umount /lib/modules umount /lib/modules
rm -f $VTOY_PATH/driver.squashfs rm -f $VTOY_PATH/driver.squashfs
fi
ventoy_udev_disk_common_hook "${vtdiskname#/dev/}2" "noreplace" ventoy_udev_disk_common_hook "${vtdiskname#/dev/}2" "noreplace"
+4 -2
View File
@@ -33,11 +33,13 @@ echo "_vtRet1=$_vtRet1 _vtRet2=$_vtRet2 ..." >> $VTLOG
if [ $_vtRet1 -ne 0 -a $_vtRet2 -eq 0 ]; then if [ $_vtRet1 -ne 0 -a $_vtRet2 -eq 0 ]; then
vtFindFlag=0 vtFindFlag=0
$GREP '`value from`' /usr/* -r | $AWK -F: '{print $1}' | while read vtline; do $GREP '`value from`' /usr/* -r | $AWK -F: '{print $1}' > $VTOY_PATH/.porteus
while read vtline; do
echo "hooking $vtline ..." >> $VTLOG echo "hooking $vtline ..." >> $VTLOG
$SED "s#\`value from\`#$vtPath#g" -i $vtline $SED "s#\`value from\`#$vtPath#g" -i $vtline
vtFindFlag=1 vtFindFlag=1
done done < $VTOY_PATH/.porteus
rm -f $VTOY_PATH/.porteus
if [ $vtFindFlag -eq 0 ]; then if [ $vtFindFlag -eq 0 ]; then
if $GREP -q '`value from`' /linuxrc; then if $GREP -q '`value from`' /linuxrc; then
+5
View File
@@ -17,5 +17,10 @@
# #
#************************************************************************************ #************************************************************************************
if $GREP -q 'rdinit=/vtoy/vtoy' /proc/cmdline; then
echo "fix rdinit" >> $VTLOG
$SED "/switch_root.*\/mnt\/.installer-mp/i\ sh $VTOY_PATH/hook/debian/pve-wa.sh /mnt/.installer-mp/sbin/unconfigured.sh" -i /init
fi
$SED "/\/sys\/block\/hd\*/i\ $BUSYBOX_PATH/sh $VTOY_PATH/hook/debian/pve-disk.sh" -i /init $SED "/\/sys\/block\/hd\*/i\ $BUSYBOX_PATH/sh $VTOY_PATH/hook/debian/pve-disk.sh" -i /init
$SED "s#/sys/block/hd\*#/sys/block/dm* /sys/block/hd*#" -i /init $SED "s#/sys/block/hd\*#/sys/block/dm* /sys/block/hd*#" -i /init
+20
View File
@@ -0,0 +1,20 @@
#!/bin/sh
script=$1
tmpscript=${script}.tmp
LINE=$(grep -n 'proc.*proc.*proc' $script | awk -F':' '{print $1}')
sed -n "1,${LINE}p" $script >> $tmpscript
echo "if grep -q 'rdinit=/vtoy/vtoy' /proc/cmdline; then" >> $tmpscript
echo " sed 's#rdinit=/vtoy/vtoy##g' /proc/cmdline > /etc/cmdline" >> $tmpscript
echo " mount --bind /etc/cmdline /proc/cmdline" >> $tmpscript
echo "fi" >> $tmpscript
let LINE++
sed -n "${LINE},\$p" $script >> $tmpscript
cat $tmpscript > $script
@@ -0,0 +1,11 @@
[Unit]
Description=Ventoy CloneZilla Device Cheat
After=systemd-udevd.service
[Service]
Type=oneshot
ExecStart=mv /dev/VTISOPART /dev/bk_VTISOPART
ExecStart=cp -a /dev/DMXXX /dev/VTISOPART
[Install]
WantedBy=sysinit.target
@@ -0,0 +1,3 @@
[Unit]
Wants=ventoy-curtin-wa.service
After=ventoy-curtin-wa.service
@@ -0,0 +1,8 @@
[Unit]
Description=Ventoy subiquity curtin Workaround
[Service]
Type=oneshot
ExecStart=/etc/ventoy/ventoy-curtin-wa.sh
PrivateMounts=no
ProtectSystem=no
@@ -0,0 +1,27 @@
#!/bin/bash
exec >> /var/log/ventoy-curtin-wa.log 2>&1
set -x
if [ -e /tmp/ventoy_storage_config.py ]; then
echo "no need to patch again"
elif [ -d /snap/ubuntu-desktop-bootstrap/current/lib ]; then
PyVer=$(ls -1 /snap/ubuntu-desktop-bootstrap/current/lib | grep -m1 python)
echo "Python Path: $PyVer"
OldFile=/snap/ubuntu-desktop-bootstrap/current/lib/$PyVer/site-packages/curtin/storage_config.py
NewFile=/tmp/ventoy_storage_config.py
if [ -e $OldFile ]; then
echo "Patch curtin storage config script"
cp -a $OldFile $NewFile
#skip Ventoy dm device
sed 's#\(if *\(.*\)\[.MAJOR.\] *in *\["11", *"2"\]\)#\1 or re.match(r"[vV]entoy.*|vtoy.*", \2.get("DM_NAME") or "")#g' -i $NewFile
mount --bind $NewFile $OldFile
else
echo "curin file not exist"
fi
else
echo "curin snap dir not exit"
fi
@@ -58,6 +58,9 @@ ventoy_get_debian_distro() {
if $GREP -q 'Tails' /etc/os-release; then if $GREP -q 'Tails' /etc/os-release; then
echo 'tails'; return echo 'tails'; return
fi fi
if $GREP -q 'NAME="Kylin"' /etc/os-release; then
echo 'kylin'; return
fi
fi fi
if $GREP -q 'slax/' /proc/cmdline; then if $GREP -q 'slax/' /proc/cmdline; then
@@ -0,0 +1,48 @@
#!/ventoy/busybox/sh
. /ventoy/hook/ventoy-hook-lib.sh
PATH=$BUSYBOX_PATH:$VTOY_PATH/tool:$PATH
vtlog "####### $0 $* ########"
subiquity_curtin_workaround() {
mkdir -p /root/etc/ventoy
ventoy_copy_file /ventoy/hook/debian/ventoy-curtin-wa.sh /root/etc/ventoy/ventoy-curtin-wa.sh 0755
ventoy_copy_file /ventoy/hook/debian/ventoy-curtin-wa.conf /root/etc/ventoy/ventoy-curtin-wa.conf 0644
ventoy_copy_file /ventoy/hook/debian/ventoy-curtin-wa.service /root/etc/ventoy/ventoy-curtin-wa.service 0644
ln -sf /etc/ventoy/ventoy-curtin-wa.service /root/etc/systemd/system/ventoy-curtin-wa.service
vtDepDir=/root/etc/systemd/system/snap.ubuntu-desktop-bootstrap.subiquity-server.service.d
mkdir -p $vtDepDir
ln -sf /etc/ventoy/ventoy-curtin-wa.conf $vtDepDir/10-ventoy-curtin-wa.conf
}
vroot=$(ventoy_new_root_dir)
if [ -z "$vroot" ]; then
vtlog "new sysroot not found"
else
ventoy_copy_udev_auto_rules
if ls $vroot/etc/udev/rules.d | grep -q 'snap.*desktop'; then
subiquity_curtin_workaround
else
vtlog "no snap desktop detected"
fi
fi
if [ -d $vroot/usr/share/clonezilla ]; then
vtlog "add cheat service for clonezilla"
vtDM=$($VTOY_PATH/tool/dmsetup info VentoyPart | grep Major | sed "s/.*[^0-9]\([0-9][0-9]*\)$/\1/")
vtRAWDISKNAME=$(head -n1 $VTOY_PATH/ventoy_raw_table | awk '{print $4}')
cp -a /ventoy/hook/debian/ventoy-clonezilla-cheat.service /ventoy/udevtmp.service
sed "s/DMXXX/dm-${vtDM}/g" -i /ventoy/udevtmp.service
sed "s/VTISOPART/${vtRAWDISKNAME#/dev/}/g" -i /ventoy/udevtmp.service
ventoy_copy_file /ventoy/udevtmp.service $vroot/etc/systemd/system/ventoy-clonezilla-cheat.service 0644
echo 'enable ventoy-clonezilla-cheat.service' > $vroot/etc/systemd/system-preset/90-ventoy-clonezilla.preset
ln -sf /etc/systemd/system/ventoy-clonezilla-cheat.service $vroot/etc/systemd/system/sysinit.target.wants/ventoy-clonezilla-cheat.service
fi
@@ -0,0 +1,36 @@
#!/ventoy/busybox/sh
. /ventoy/hook/ventoy-hook-lib.sh
PATH=$BUSYBOX_PATH:$VTOY_PATH/tool:$PATH
vtlog "####### $0 $* ########"
vtoy_udev_auto_hook() {
if [ -e /etc/os-release ]; then
if grep -q 'ID=ubuntu' /etc/os-release; then
if egrep -q 'VERSION_ID=\"2[2-9]\.|VERSION_ID=\"3[0-9]\.' /etc/os-release; then
vtlog "ubuntu distro"
sed "/^mountroot$/a\\$BUSYBOX_PATH/sh $VTOY_PATH/hook/debian/ventoy-uauto-exec.sh" -i /init
return
fi
fi
fi
if [ -e /init ]; then
if $GREP -q '^mountroot$' /init; then
vtlog "mountroot distro"
sed "/^mountroot$/a\\$BUSYBOX_PATH/sh $VTOY_PATH/hook/debian/ventoy-uauto-exec.sh" -i /init
return
fi
if $GREP -q '^ *exec.*switch_root' /init; then
vtlog "switch_root distro"
sed "/^ *exec.*switch_root/i\\$BUSYBOX_PATH/sh $VTOY_PATH/hook/debian/ventoy-uauto-exec.sh" -i /init
return
fi
fi
}
vtoy_udev_auto_hook
@@ -17,6 +17,8 @@
# #
#************************************************************************************ #************************************************************************************
$CAT /proc/cmdline > /ventoy/cmdline
$SED 's#live-media=[^ ]*#live-media=/dev/mapper/ventoy#g' -i /ventoy/cmdline
if [ -e /init ] && $GREP -q '^mountroot$' /init; then if [ -e /init ] && $GREP -q '^mountroot$' /init; then
echo "Here before mountroot ..." >> $VTLOG echo "Here before mountroot ..." >> $VTLOG
@@ -25,6 +27,8 @@ if [ -e /init ] && $GREP -q '^mountroot$' /init; then
$SED "/^mountroot$/i\\export LIVEMEDIA=/dev/mapper/ventoy" -i /init $SED "/^mountroot$/i\\export LIVEMEDIA=/dev/mapper/ventoy" -i /init
$SED "/^mountroot$/i\\export LIVE_MEDIA=/dev/mapper/ventoy" -i /init $SED "/^mountroot$/i\\export LIVE_MEDIA=/dev/mapper/ventoy" -i /init
$SED "/mount *[-]t *proc/a\\mount --bind /ventoy/cmdline /proc/cmdline" -i /init
if $GREP -q 'live-media=' /proc/cmdline; then if $GREP -q 'live-media=' /proc/cmdline; then
if [ -f /scripts/casper ] && $GREP -q '^ *LIVEMEDIA=' /scripts/casper; then if [ -f /scripts/casper ] && $GREP -q '^ *LIVEMEDIA=' /scripts/casper; then
$SED "s#^ *LIVEMEDIA=.*#LIVEMEDIA=/dev/mapper/ventoy#" -i /scripts/casper $SED "s#^ *LIVEMEDIA=.*#LIVEMEDIA=/dev/mapper/ventoy#" -i /scripts/casper
@@ -0,0 +1,10 @@
#!/ventoy/busybox/sh
. /ventoy/hook/ventoy-hook-lib.sh
PATH=$BUSYBOX_PATH:$VTOY_PATH/tool:$PATH
vtlog "####### $0 $* ########"
ventoy_copy_udev_auto_rules
@@ -0,0 +1,25 @@
#!/ventoy/busybox/sh
. /ventoy/hook/ventoy-hook-lib.sh
PATH=$BUSYBOX_PATH:$VTOY_PATH/tool:$PATH
vtlog "####### $0 $* ########"
vtoy_udev_auto_hook() {
if [ -e /init ]; then
if $GREP -q '^mountroot$' /init; then
vtlog "mountroot distro"
sed "/^mountroot$/a\\$BUSYBOX_PATH/sh $VTOY_PATH/hook/deepin/ventoy-uauto-exec.sh" -i /init
return
fi
if $GREP -q '^ *exec.*switch_root' /init; then
vtlog "switch_root distro"
sed "/^ *exec.*switch_root/i\\$BUSYBOX_PATH/sh $VTOY_PATH/hook/deepin/ventoy-uauto-exec.sh" -i /init
return
fi
fi
}
vtoy_udev_auto_hook
@@ -0,0 +1,12 @@
ACTION=="add|change", SUBSYSTEM=="block", KERNEL=="dm-*", \
ENV{DM_NAME}=="[vV]entoy*", \
ENV{DM_UDEV_DISABLE_SUBSYSTEM_RULES_FLAG}="", \
ENV{DM_UDEV_DISABLE_DISK_RULES_FLAG}="", \
ENV{DM_UDEV_DISABLE_OTHER_RULES_FLAG}=""
ACTION=="add|change", SUBSYSTEM=="block", KERNEL=="dm-*", \
ENV{DM_NAME}=="vtoy*", \
ENV{DM_UDEV_DISABLE_SUBSYSTEM_RULES_FLAG}="", \
ENV{DM_UDEV_DISABLE_DISK_RULES_FLAG}="", \
ENV{DM_UDEV_DISABLE_OTHER_RULES_FLAG}=""
@@ -0,0 +1,5 @@
ACTION=="add|change", KERNEL=="dm-[0-9]*", ENV{DM_NAME}=="ventoy[0-9]*", \
ENV{DM_UDEV_DISABLE_SYBSYSTEM_RULES_FLAG}="", \
ENV{DM_UDEV_DISABLE_DISK_RULES_FLAG}="", \
ENV{DM_UDEV_DISABLE_OTHER_RULES_FLAG}="", \
IMPORT{program}="/ventoy/hook/default/ventoy-udev.sh $env{DM_NAME}"
@@ -0,0 +1,12 @@
ACTION=="add|change", SUBSYSTEM=="block", KERNEL=="DMXXX", \
ENV{DM_UDEV_DISABLE_SUBSYSTEM_RULES_FLAG}="", \
ENV{DM_UDEV_DISABLE_DISK_RULES_FLAG}="", \
ENV{DM_UDEV_DISABLE_OTHER_RULES_FLAG}="", \
ENV{UDISKS_SYSTEM}="0", \
ENV{UDISKS_REMOVABLE}="1", \
ENV{UDISKS_AUTO}="1", \
ENV{UDISKS_AUTOMOUNTABLE}="1"
KERNEL=="yyy", SUBSYSTEM=="block", ENV{UDISKS_IGNORE}="1"
@@ -0,0 +1,14 @@
#!/ventoy/busybox/sh
. /ventoy/hook/ventoy-hook-lib.sh
vtlog "####### $0 $* ########"
for vroot in sysroot newroot root; do
if [ -e $vroot/etc/selinux/config ]; then
$SED "s/SELINUX=enforcing/SELINUX=permissive/g" -i $vroot/etc/selinux/config
break
fi
done
$BUSYBOX_PATH/true
@@ -0,0 +1,9 @@
#!/ventoy/busybox/sh
. /ventoy/hook/ventoy-hook-lib.sh
vtlog "####### $0 $* ########"
ventoy_copy_udev_auto_rules
$BUSYBOX_PATH/true
@@ -0,0 +1,16 @@
#!/ventoy/busybox/sh
. /ventoy/hook/ventoy-hook-lib.sh
PATH=$BUSYBOX_PATH:$VTOY_PATH/tool:$PATH
vtlog "####### $0 $* ########"
vtoy_udev_auto_hook() {
if [ -d $VT_DRACUT_HOOKS/pre-pivot ]; then
vtlog "dracut distro"
ventoy_dracut_pivot_udev_rule
fi
}
vtoy_udev_auto_hook
@@ -0,0 +1,9 @@
#!/bin/sh
for i in 0 1 2 3 4 5 6 7 8 9; do
[ -b /dev/DMXXX ] && break
sleep 1
done
udevadm trigger --subsystem-match=block --sysname-match=DMXXX
udevadm settle
@@ -0,0 +1,11 @@
[Unit]
Description=Ventoy DM device udev attributes
After=systemd-udevd.service
[Service]
Type=oneshot
ExecStart=-udevadm trigger --subsystem-match=block --sysname-match=DMXXX
ExecStart=udevadm settle
[Install]
WantedBy=sysinit.target
@@ -0,0 +1,22 @@
#!/bin/sh
PATH=$PATH:/ventoy/busybox:/ventoy/tool
echo "$@" >> /ventoy/log
VT_DMNAME=$1
VT_PART_NUM="${VT_DMNAME#*ventoy}"
VT_PARENT_DEV="/dev/mapper/ventoy"
VT_PARTUUID=
[ -b "$VT_PARENT_DEV" ] || exit 0
VT_PARTUUID=$(/ventoy/tool/vtoygpt $VT_PARENT_DEV $VT_PART_NUM | awk '{print $2}')
echo "$VT_DMNAME PARTUUID=$VT_PARTUUID" >> /ventoy/log
if [ -n "$VT_PARTUUID" ]; then
echo "ID_PART_ENTRY_UUID=$VT_PARTUUID"
echo "ID_PART_ENTRY_NUMBER=$VT_PART_NUM"
echo "ID_PART_ENTRY_SCHEME=gpt"
fi
@@ -0,0 +1,24 @@
#!/ventoy/busybox/sh
. /ventoy/hook/ventoy-hook-lib.sh
vtlog "######### $0 $* ############"
if is_ventoy_hook_finished; then
exit 0
fi
wait_for_usb_disk_ready
vtdiskname=$(get_ventoy_disk_name)
if [ "$vtdiskname" = "unknown" ]; then
vtlog "ventoy disk not found"
exit 0
fi
vtlog "vtdiskname=$vtdiskname"
ventoy_udev_disk_common_hook "${vtdiskname#/dev/}2" "noreplace"
# OK finish
set_ventoy_hook_finish
@@ -0,0 +1,7 @@
function ft_mountCdromDir()
{
/ventoy/busybox/sh /ventoy/hook/euleros/disk_mount_hook.sh
ft_mountCdromDirXX "$@"
}
@@ -0,0 +1,42 @@
#!/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/>.
#
#************************************************************************************
. $VTOY_PATH/hook/ventoy-os-lib.sh
TRANSFILE=/usr/Euler/project/load/filetransfer.sh
LINE=$($GREP -n 'function ft_mountCdromDir' $TRANSFILE | $AWK -F':' '{print $1}')
echo "LINE=$LINE" >> $VTLOG
$SED 's#FT_SR_DEV=.*#FT_SR_DEV=/dev/mapper/ventoy#g' -i $TRANSFILE
$SED 's/function ft_mountCdromDir/function ft_mountCdromDirXX/' -i $TRANSFILE
let LINE--
$SED -n "1,${LINE}p" $TRANSFILE >> /ventoy/filetransfer.sh
$CAT $VTOY_PATH/hook/euleros/hook_func.sh >> /ventoy/filetransfer.sh
let LINE++
$SED -n "${LINE},\$p" $TRANSFILE >> /ventoy/filetransfer.sh
$BUSYBOX_PATH/mv /ventoy/filetransfer.sh $TRANSFILE
#fix the euler os shell script
$SED 's/-z ${harddisk_disk_list}/-z "${harddisk_disk_list}"/' -i /usr/Euler/project/disk/disk_tool.sh
+32
View File
@@ -0,0 +1,32 @@
#!/ventoy/busybox/sh
. /ventoy/hook/ventoy-hook-lib.sh
VTPATH_OLD=$PATH; PATH=$BUSYBOX_PATH:$VTOY_PATH/tool:$PATH
for i in 0 1 2 3 4 5 6 7 8 9; do
vtdiskname=$(get_ventoy_disk_name)
if [ "$vtdiskname" = "unknown" ]; then
vtlog "wait for disk ..."
$SLEEP 2
else
break
fi
done
echo '############ Copy ISO file to memory ... ###############'
vtoydm -C -f $VTOY_PATH/ventoy_image_map -d $vtdiskname -o $VTOY_PATH/dump.iso
[ -d /ventoy/tmpmnt ] || mkdir /ventoy/tmpmnt
mount /ventoy/dump.iso /ventoy/tmpmnt
cp -a /ventoy/tmpmnt/* $1/
umount /ventoy/tmpmnt
rm -f /ventoy/dump.iso
echo '############ Copy ISO file to memory finished OK ###############'
sleep 2
PATH=$VTPATH_OLD
@@ -30,6 +30,9 @@ elif $GREP -q 'setting up the root filesystem' /init; then
elif [ -d /etc/udev/rules.d ] || [ -d /lib/udev/rules.d ]; then elif [ -d /etc/udev/rules.d ] || [ -d /lib/udev/rules.d ]; then
ventoy_systemd_udevd_work_around ventoy_systemd_udevd_work_around
ventoy_add_udev_rule "$VTOY_PATH/hook/default/udev_disk_hook.sh %k noreplace" ventoy_add_udev_rule "$VTOY_PATH/hook/default/udev_disk_hook.sh %k noreplace"
elif $GREP -q 'NVIDIA CORPORATION' /init; then
$SED "s/while true; do/while false; do/" -i /init
$SED "/^FOUNDDEV=/a\ $BUSYBOX_PATH/sh $VTOY_PATH/hook/gentoo/mats-hook.sh \"\${ROOTFS}/\${MNTNV}\"" -i /init
else else
$SED "/mdev *-s/a\ $BUSYBOX_PATH/sh $VTOY_PATH/hook/gentoo/disk_hook.sh" -i /init $SED "/mdev *-s/a\ $BUSYBOX_PATH/sh $VTOY_PATH/hook/gentoo/disk_hook.sh" -i /init
fi fi
+1 -1
View File
@@ -23,4 +23,4 @@ $SED "s#printf\(.*\)\$CMDLINE#printf\1\$CMDLINE root=live:/dev/mapper/ventoy#" -
ventoy_set_inotify_script gobo/ventoy-inotifyd-hook.sh ventoy_set_inotify_script gobo/ventoy-inotifyd-hook.sh
$BUSYBOX_PATH/cp -a $VTOY_PATH/hook/gobo/ventoy-inotifyd-start.sh /lib/dracut/hooks/pre-udev/01-ventoy-inotifyd-start.sh $BUSYBOX_PATH/cp -a $VTOY_PATH/hook/gobo/ventoy-inotifyd-start.sh $VT_DRACUT_HOOKS/pre-udev/01-ventoy-inotifyd-start.sh
@@ -0,0 +1,16 @@
#!/ventoy/busybox/sh
. /ventoy/hook/ventoy-hook-lib.sh
PATH=$BUSYBOX_PATH:$VTOY_PATH/tool:$PATH
vtlog "####### $0 $* ########"
vtoy_udev_auto_hook() {
if [ -d $VT_DRACUT_HOOKS/pre-pivot ]; then
vtlog "dracut distro"
ventoy_dracut_pivot_udev_rule
fi
}
vtoy_udev_auto_hook
@@ -0,0 +1,9 @@
#!/ventoy/busybox/sh
. /ventoy/hook/ventoy-hook-lib.sh
PATH=$BUSYBOX_PATH:$VTOY_PATH/tool:$PATH
vtlog "####### $0 $* ########"
ventoy_copy_udev_auto_rules
@@ -0,0 +1,19 @@
#!/ventoy/busybox/sh
. /ventoy/hook/ventoy-hook-lib.sh
PATH=$BUSYBOX_PATH:$VTOY_PATH/tool:$PATH
vtlog "####### $0 $* ########"
vtoy_udev_auto_hook() {
if grep -q 'break.*=.*postmount' /init; then
vtlog "udev auto before postmount"
sed "/break.*=.*postmount/i\\$BUSYBOX_PATH/sh $VTOY_PATH/hook/hyperbola/ventoy-uauto-exec.sh" -i /init
elif [ -d $VT_DRACUT_HOOKS/pre-pivot ]; then
vtlog "dracut distro"
ventoy_dracut_pivot_udev_rule
fi
}
vtoy_udev_auto_hook
@@ -0,0 +1,9 @@
#!/ventoy/busybox/sh
. /ventoy/hook/ventoy-hook-lib.sh
PATH=$BUSYBOX_PATH:$VTOY_PATH/tool:$PATH
vtlog "####### $0 $* ########"
ventoy_copy_udev_auto_rules
@@ -0,0 +1,25 @@
#!/ventoy/busybox/sh
. /ventoy/hook/ventoy-hook-lib.sh
PATH=$BUSYBOX_PATH:$VTOY_PATH/tool:$PATH
vtlog "####### $0 $* ########"
vtoy_udev_auto_hook() {
if [ -e /init ]; then
if $GREP -q '^mountroot$' /init; then
vtlog "mountroot distro"
sed "/^mountroot$/a\\$BUSYBOX_PATH/sh $VTOY_PATH/hook/kaos/ventoy-uauto-exec.sh" -i /init
return
fi
if $GREP -q '^ *exec.*switch_root' /init; then
vtlog "switch_root distro"
sed "/^ *exec.*switch_root/i\\$BUSYBOX_PATH/sh $VTOY_PATH/hook/kaos/ventoy-uauto-exec.sh" -i /init
return
fi
fi
}
vtoy_udev_auto_hook
+1 -1
View File
@@ -24,4 +24,4 @@ $SED "s#printf\(.*\)\$CMDLINE#printf\1\$CMDLINE root=/dev/ventoy#" -i /lib/dracu
$BUSYBOX_PATH/rm -f /usr/lib/systemd/system-generators/systemd-fstab-generator /lib/systemd/system-generators/systemd-fstab-generator $BUSYBOX_PATH/rm -f /usr/lib/systemd/system-generators/systemd-fstab-generator /lib/systemd/system-generators/systemd-fstab-generator
ventoy_set_inotify_script lunar/ventoy-inotifyd-hook.sh ventoy_set_inotify_script lunar/ventoy-inotifyd-hook.sh
$BUSYBOX_PATH/cp -a $VTOY_PATH/hook/lunar/ventoy-inotifyd-start.sh /lib/dracut/hooks/pre-udev/01-ventoy-inotifyd-start.sh $BUSYBOX_PATH/cp -a $VTOY_PATH/hook/lunar/ventoy-inotifyd-start.sh $VT_DRACUT_HOOKS/pre-udev/01-ventoy-inotifyd-start.sh
+1 -1
View File
@@ -23,7 +23,7 @@
#ventoy_add_udev_rule "$VTOY_PATH/hook/mageia/udev_disk_hook.sh %k noreplace" #ventoy_add_udev_rule "$VTOY_PATH/hook/mageia/udev_disk_hook.sh %k noreplace"
ventoy_set_inotify_script mageia/ventoy-inotifyd-hook.sh ventoy_set_inotify_script mageia/ventoy-inotifyd-hook.sh
$BUSYBOX_PATH/cp -a $VTOY_PATH/hook/mageia/ventoy-inotifyd-start.sh /lib/dracut/hooks/pre-udev/99-ventoy-inotifyd-start.sh $BUSYBOX_PATH/cp -a $VTOY_PATH/hook/mageia/ventoy-inotifyd-start.sh $VT_DRACUT_HOOKS/pre-udev/99-ventoy-inotifyd-start.sh
@@ -0,0 +1,9 @@
#!/ventoy/busybox/sh
. /ventoy/hook/ventoy-hook-lib.sh
PATH=$BUSYBOX_PATH:$VTOY_PATH/tool:$PATH
vtlog "####### $0 $* ########"
ventoy_copy_udev_auto_rules
@@ -0,0 +1,16 @@
#!/ventoy/busybox/sh
. /ventoy/hook/ventoy-hook-lib.sh
PATH=$BUSYBOX_PATH:$VTOY_PATH/tool:$PATH
vtlog "####### $0 $* ########"
vtoy_udev_auto_hook() {
if grep -q 'break.*=.*postmount' /init; then
vtlog "udev auto before postmount"
sed "/break.*=.*postmount/i\\$BUSYBOX_PATH/sh $VTOY_PATH/hook/manjaro/ventoy-uauto-exec.sh" -i /init
fi
}
vtoy_udev_auto_hook
@@ -93,9 +93,9 @@ else
vtPriority=01 vtPriority=01
fi fi
$BUSYBOX_PATH/cp -a $VTOY_PATH/hook/openEuler/ventoy-inotifyd-start.sh /lib/dracut/hooks/pre-udev/${vtPriority}-ventoy-inotifyd-start.sh $BUSYBOX_PATH/cp -a $VTOY_PATH/hook/openEuler/ventoy-inotifyd-start.sh $VT_DRACUT_HOOKS/pre-udev/${vtPriority}-ventoy-inotifyd-start.sh
$BUSYBOX_PATH/cp -a $VTOY_PATH/hook/openEuler/ventoy-timeout.sh /lib/dracut/hooks/initqueue/timeout/${vtPriority}-ventoy-timeout.sh $BUSYBOX_PATH/cp -a $VTOY_PATH/hook/openEuler/ventoy-timeout.sh $VT_DRACUT_HOOKS/initqueue/timeout/${vtPriority}-ventoy-timeout.sh
$BUSYBOX_PATH/cp -a $VTOY_PATH/hook/openEuler/ventoy-repo.sh /lib/dracut/hooks/pre-pivot/99-ventoy-repo.sh $BUSYBOX_PATH/cp -a $VTOY_PATH/hook/openEuler/ventoy-repo.sh $VT_DRACUT_HOOKS/pre-pivot/99-ventoy-repo.sh
if [ -f /sbin/dmsquash-live-root ]; then if [ -f /sbin/dmsquash-live-root ]; then
echo "patch /sbin/dmsquash-live-root ..." >> $VTLOG echo "patch /sbin/dmsquash-live-root ..." >> $VTLOG
@@ -109,5 +109,5 @@ fi
if [ -f $VTOY_PATH/autoinstall ]; then if [ -f $VTOY_PATH/autoinstall ]; then
cp -a $VTOY_PATH/hook/openEuler/ventoy-autoexp.sh /lib/dracut/hooks/pre-mount/99-ventoy-autoexp.sh cp -a $VTOY_PATH/hook/openEuler/ventoy-autoexp.sh $VT_DRACUT_HOOKS/pre-mount/99-ventoy-autoexp.sh
fi fi
@@ -0,0 +1,16 @@
#!/ventoy/busybox/sh
. /ventoy/hook/ventoy-hook-lib.sh
PATH=$BUSYBOX_PATH:$VTOY_PATH/tool:$PATH
vtlog "####### $0 $* ########"
vtoy_udev_auto_hook() {
if [ -d $VT_DRACUT_HOOKS/pre-pivot ]; then
vtlog "dracut distro"
ventoy_dracut_pivot_udev_rule
fi
}
vtoy_udev_auto_hook
@@ -72,6 +72,12 @@ ventoy_udev_disk_common_hook $* "noreplace"
$BUSYBOX_PATH/mount $VTOY_DM_PATH /mnt/ventoy $BUSYBOX_PATH/mount $VTOY_DM_PATH /mnt/ventoy
#fix Oracle Linux 6.9 install issue
if $GREP -q -i 'Oracle Linux' /mnt/ventoy/.discinfo; then
ln -s /mnt/ventoy /mnt/source
fi
# #
# We do a trick for rhel6 series here. # We do a trick for rhel6 series here.
# Use /dev/$vtCheatLoop and wapper it as a removable cdrom with bind mount. # Use /dev/$vtCheatLoop and wapper it as a removable cdrom with bind mount.
+5 -5
View File
@@ -24,7 +24,7 @@
if [ -f $VTOY_PATH/autoinstall ]; then if [ -f $VTOY_PATH/autoinstall ]; then
VTKS="inst.ks=file:$VTOY_PATH/autoinstall" VTKS="inst.ks=file:$VTOY_PATH/autoinstall"
cp -a $VTOY_PATH/hook/rhel7/ventoy-autoexp.sh /lib/dracut/hooks/pre-mount/99-ventoy-autoexp.sh cp -a $VTOY_PATH/hook/rhel7/ventoy-autoexp.sh $VT_DRACUT_HOOKS/pre-mount/99-ventoy-autoexp.sh
else else
for vtParam in $($CAT /proc/cmdline); do for vtParam in $($CAT /proc/cmdline); do
if echo $vtParam | $GREP -q 'ks=file:/'; then if echo $vtParam | $GREP -q 'ks=file:/'; then
@@ -119,7 +119,7 @@ fi
echo "vtNeedRepo=$vtNeedRepo" >> $VTLOG echo "vtNeedRepo=$vtNeedRepo" >> $VTLOG
if [ "$vtNeedRepo" = "yes" ]; then if [ "$vtNeedRepo" = "yes" ]; then
$BUSYBOX_PATH/cp -a $VTOY_PATH/hook/rhel7/ventoy-repo.sh /lib/dracut/hooks/pre-pivot/99-ventoy-repo.sh $BUSYBOX_PATH/cp -a $VTOY_PATH/hook/rhel7/ventoy-repo.sh $VT_DRACUT_HOOKS/pre-pivot/99-ventoy-repo.sh
fi fi
@@ -161,8 +161,8 @@ else
vtPriority=01 vtPriority=01
fi fi
$BUSYBOX_PATH/cp -a $VTOY_PATH/hook/rhel7/ventoy-inotifyd-start.sh /lib/dracut/hooks/pre-udev/${vtPriority}-ventoy-inotifyd-start.sh $BUSYBOX_PATH/cp -a $VTOY_PATH/hook/rhel7/ventoy-inotifyd-start.sh $VT_DRACUT_HOOKS/pre-udev/${vtPriority}-ventoy-inotifyd-start.sh
$BUSYBOX_PATH/cp -a $VTOY_PATH/hook/rhel7/ventoy-timeout.sh /lib/dracut/hooks/initqueue/timeout/${vtPriority}-ventoy-timeout.sh $BUSYBOX_PATH/cp -a $VTOY_PATH/hook/rhel7/ventoy-timeout.sh $VT_DRACUT_HOOKS/initqueue/timeout/${vtPriority}-ventoy-timeout.sh
if [ -e /sbin/dmsquash-live-root ]; then if [ -e /sbin/dmsquash-live-root ]; then
@@ -178,7 +178,7 @@ fi
#For Fedora CoreOS #For Fedora CoreOS
if $GREP -i -q 'fedora.*coreos' /etc/os-release; then if $GREP -i -q 'fedora.*coreos' /etc/os-release; then
$SED "s#isosrc=.*#isosrc=/dev/mapper/ventoy#" -i /lib/systemd/system-generators/live-generator $SED "s#isosrc=.*#isosrc=/dev/mapper/ventoy#" -i /lib/systemd/system-generators/live-generator
cp -a $VTOY_PATH/hook/rhel7/ventoy-make-link.sh /lib/dracut/hooks/pre-mount/99-ventoy-premount-mklink.sh cp -a $VTOY_PATH/hook/rhel7/ventoy-make-link.sh $VT_DRACUT_HOOKS/pre-mount/99-ventoy-premount-mklink.sh
fi fi
@@ -34,7 +34,7 @@ if is_inotify_ventoy_part $3; then
vtlog "find ventoy partition ..." vtlog "find ventoy partition ..."
vtReplaceOpt=noreplace vtReplaceOpt=noreplace
if [ -f /lib/dracut/hooks/pre-pivot/99-ventoy-repo.sh ]; then if [ -f $VT_DRACUT_HOOKS/pre-pivot/99-ventoy-repo.sh ]; then
vtReplaceOpt="" vtReplaceOpt=""
fi fi
@@ -30,5 +30,5 @@ else
#don't call it too early issue 2225 #don't call it too early issue 2225
#$BUSYBOX_PATH/sh $vtHook n /dev "${vtdisk#/dev/}2" #$BUSYBOX_PATH/sh $vtHook n /dev "${vtdisk#/dev/}2"
cp -a $VTOY_PATH/hook/rhel7/ventoy-inotifyd-call.sh /lib/dracut/hooks/initqueue/settled/90-ventoy-inotifyd-call.sh cp -a $VTOY_PATH/hook/rhel7/ventoy-inotifyd-call.sh $VT_DRACUT_HOOKS/initqueue/settled/90-ventoy-inotifyd-call.sh
fi fi
@@ -0,0 +1,27 @@
#!/ventoy/busybox/sh
. /ventoy/hook/ventoy-hook-lib.sh
PATH=$BUSYBOX_PATH:$VTOY_PATH/tool:$PATH
vtlog "####### $0 $* ########"
vtoy_udev_auto_hook() {
if [ -e /etc/os-release ]; then
if grep -q 'ID=fedora' /etc/os-release; then
if grep -q 'VERSION_ID=[3-9][0-9]' /etc/os-release; then
vtlog "fedora distro"
ventoy_dracut_pivot_udev_rule
ventoy_dracut_pivot_selinux_off
return
fi
fi
fi
if [ -d $VT_DRACUT_HOOKS/pre-pivot ]; then
vtlog "dracut distro"
ventoy_dracut_pivot_udev_rule
fi
}
vtoy_udev_auto_hook
@@ -0,0 +1,16 @@
#!/ventoy/busybox/sh
. /ventoy/hook/ventoy-hook-lib.sh
PATH=$BUSYBOX_PATH:$VTOY_PATH/tool:$PATH
vtlog "####### $0 $* ########"
vtoy_udev_auto_hook() {
if [ -d $VT_DRACUT_HOOKS/pre-pivot ]; then
vtlog "dracut distro"
ventoy_dracut_pivot_udev_rule
fi
}
vtoy_udev_auto_hook
+13 -1
View File
@@ -25,7 +25,19 @@ fi
VTPATH_OLD=$PATH; PATH=$BUSYBOX_PATH:$VTOY_PATH/tool:$PATH VTPATH_OLD=$PATH; PATH=$BUSYBOX_PATH:$VTOY_PATH/tool:$PATH
modprobe dm-mod vtlog "Loading dax and dm-mod module ..."
$BUSYBOX_PATH/modprobe dax > /dev/null 2>&1
$BUSYBOX_PATH/modprobe dm-mod > /dev/null 2>&1
if $GREP -q 'device-mapper' /proc/devices; then
vtlog "dm-mod module check success ..."
else
vtlog "Need to extract dax and dm-mod module ..."
$VTOY_PATH/tool/zstdcat /lib/modules/$(uname -r)/drivers/dax/dax.ko.zst > $VTOY_PATH/extract_dax.ko
$BUSYBOX_PATH/insmod $VTOY_PATH/extract_dax.ko
$VTOY_PATH/tool/zstdcat /lib/modules/$(uname -r)/drivers/md/dm-mod.ko.zst > $VTOY_PATH/extract_dm_mod.ko
$BUSYBOX_PATH/insmod $VTOY_PATH/extract_dm_mod.ko
fi
wait_for_usb_disk_ready wait_for_usb_disk_ready
+2
View File
@@ -19,6 +19,8 @@
. $VTOY_PATH/hook/ventoy-os-lib.sh . $VTOY_PATH/hook/ventoy-os-lib.sh
$SED "/Searching/i $BUSYBOX_PATH/sh $VTOY_PATH/hook/t2/disk_hook.sh" -i /init
$SED "/disktype/i x=/dev/ventoy" -i /init
$SED "/getdevice *devicefile/i $BUSYBOX_PATH/sh $VTOY_PATH/hook/t2/disk_hook.sh" -i /init $SED "/getdevice *devicefile/i $BUSYBOX_PATH/sh $VTOY_PATH/hook/t2/disk_hook.sh" -i /init
$SED "/getdevice *devicefile/a devicefile=/dev/ventoy" -i /init $SED "/getdevice *devicefile/a devicefile=/dev/ventoy" -i /init
+373 -3
View File
@@ -32,6 +32,11 @@ VTOY_DM_PATH=/dev/mapper/ventoy
VTOY_DEBUG_LEVEL=$($BUSYBOX_PATH/hexdump -n 1 -s 450 -e '1/1 "%02x"' $VTOY_PATH/ventoy_os_param) VTOY_DEBUG_LEVEL=$($BUSYBOX_PATH/hexdump -n 1 -s 450 -e '1/1 "%02x"' $VTOY_PATH/ventoy_os_param)
VTOY_LINUX_REMOUNT=$($BUSYBOX_PATH/hexdump -n 1 -s 454 -e '1/1 "%02x"' $VTOY_PATH/ventoy_os_param) VTOY_LINUX_REMOUNT=$($BUSYBOX_PATH/hexdump -n 1 -s 454 -e '1/1 "%02x"' $VTOY_PATH/ventoy_os_param)
VTOY_VLNK_BOOT=$($BUSYBOX_PATH/hexdump -n 1 -s 455 -e '1/1 "%02x"' $VTOY_PATH/ventoy_os_param) VTOY_VLNK_BOOT=$($BUSYBOX_PATH/hexdump -n 1 -s 455 -e '1/1 "%02x"' $VTOY_PATH/ventoy_os_param)
if [ -d /var/lib/dracut/hooks ]; then
VT_DRACUT_HOOKS=/var/lib/dracut/hooks
else
VT_DRACUT_HOOKS=/lib/dracut/hooks
fi
if [ "$VTOY_DEBUG_LEVEL" = "01" ]; then if [ "$VTOY_DEBUG_LEVEL" = "01" ]; then
if [ -e /dev/console ]; then if [ -e /dev/console ]; then
@@ -39,6 +44,7 @@ if [ "$VTOY_DEBUG_LEVEL" = "01" ]; then
fi fi
fi fi
vtlog() { vtlog() {
if [ "$VTLOG" = "$VTOY_PATH/log" ]; then if [ "$VTLOG" = "$VTOY_PATH/log" ]; then
echo "$*" >>$VTLOG echo "$*" >>$VTLOG
@@ -58,6 +64,14 @@ vterr() {
} }
ventoy_copy_file() {
cp -a "$1" "$2"
if [ -n "$3" ]; then
chmod $3 "$2"
fi
}
is_ventoy_hook_finished() { is_ventoy_hook_finished() {
[ -e $VTOY_PATH/hook_finish ] [ -e $VTOY_PATH/hook_finish ]
} }
@@ -67,8 +81,11 @@ set_ventoy_hook_finish() {
if [ -f /ventoy/ventoy_iso_part_dm_cmd ]; then if [ -f /ventoy/ventoy_iso_part_dm_cmd ]; then
echo "### create iso part raw dm" >> $VTLOG echo "### create iso part raw dm" >> $VTLOG
$CAT $VTOY_PATH/ventoy_raw_table >> $VTLOG
echo "### iso part dm cmd" >> $VTLOG
$CAT /ventoy/ventoy_iso_part_dm_cmd >> $VTLOG
$BUSYBOX_PATH/sh /ventoy/ventoy_iso_part_dm_cmd >>$VTLOG 2>&1 $BUSYBOX_PATH/sh /ventoy/ventoy_iso_part_dm_cmd >>$VTLOG 2>&1
$BUSYBOX_PATH/rm -f /ventoy/ventoy_iso_part_dm_cmd $BUSYBOX_PATH/mv /ventoy/ventoy_iso_part_dm_cmd /ventoy/ventoy_iso_part_dm_cmd_bk
fi fi
} }
@@ -160,10 +177,10 @@ ventoy_get_vblade_bin() {
} }
ventoy_find_bin_path() { ventoy_find_bin_path() {
#must use built-in dmsetup, so first try ventoy path. Otherwise ubuntu installer unhappy. #3567
if $BUSYBOX_PATH/which "$1" > /dev/null; then if $BUSYBOX_PATH/which "$1" > /dev/null; then
$BUSYBOX_PATH/which "$1"; return $BUSYBOX_PATH/which "$1"; return
fi fi
for vt_path in '/bin' '/sbin' '/usr/bin' '/usr/sbin' '/usr/local/bin' '/usr/local/sbin' '/root/bin'; do for vt_path in '/bin' '/sbin' '/usr/bin' '/usr/sbin' '/usr/local/bin' '/usr/local/sbin' '/root/bin'; do
if [ -e "$vt_path/$1" ]; then if [ -e "$vt_path/$1" ]; then
echo "$vt_path/$1"; return echo "$vt_path/$1"; return
@@ -266,7 +283,66 @@ create_ventoy_device_mapper() {
fi fi
RAWDISKNAME=$($HEAD -n1 $VTOY_PATH/ventoy_raw_table | $AWK '{print $4}') RAWDISKNAME=$($HEAD -n1 $VTOY_PATH/ventoy_raw_table | $AWK '{print $4}')
echo "$VT_DM_BIN create ${RAWDISKNAME#/dev/} $VTOY_PATH/ventoy_raw_table" > /ventoy/ventoy_iso_part_dm_cmd echo "$VT_DM_BIN create VentoyPart $VTOY_PATH/ventoy_raw_table" > /ventoy/ventoy_iso_part_dm_cmd
echo "echo 1 > $VTOY_PATH/ventoy_raw_dm_done" >> /ventoy/ventoy_iso_part_dm_cmd
}
create_ventoy_loop_device_mapper() {
vtLoop1=${1#/dev/}
vtLoop2=${2#/dev/}
vtlog "create_ventoy_loop_device_mapper $*"
VT_DM_BIN=$(ventoy_find_bin_path dmsetup)
if [ -z "$VT_DM_BIN" ]; then
vtlog "no dmsetup avaliable, lastly try inbox dmsetup"
VT_DM_BIN=$VTOY_PATH/tool/dmsetup
fi
vtlog "dmsetup avaliable in system $VT_DM_BIN"
if ventoy_check_dm_module; then
vtlog "device-mapper module check success"
else
vterr "Error: no dm module avaliable"
fi
vtLoop2Size=$(cat /sys/block/$vtLoop2/size)
echo "0 65 linear $1 0" > $VTOY_PATH/ventoy_dm_table
echo "65 $vtLoop2Size linear $2 0" >> $VTOY_PATH/ventoy_dm_table
$VT_DM_BIN "--readonly" create ventoy $VTOY_PATH/ventoy_dm_table >>$VTLOG 2>&1
}
create_ventoy_wrapper_device_mapper() {
vtlog "create_ventoy_wrapper_device_mapper $*"
VT_DM_BIN=$(ventoy_find_bin_path dmsetup)
if [ -z "$VT_DM_BIN" ]; then
vtlog "no dmsetup avaliable, lastly try inbox dmsetup"
VT_DM_BIN=$VTOY_PATH/tool/dmsetup
fi
vtlog "dmsetup avaliable in system $VT_DM_BIN"
if ventoy_check_dm_module "$1"; then
vtlog "device-mapper module check success"
else
vterr "Error: no dm module avaliable"
fi
$VTOY_PATH/tool/vtoydm -w -f $VTOY_PATH/ventoy_image_map -d $1 > $VTOY_PATH/ventoy_dm_table
VT_LOOP_DEV=$(losetup -f)
losetup $VT_LOOP_DEV /ventoy/dmwrapper.bin
$SED "s#/dev/loop0#$VT_LOOP_DEV#" -i $VTOY_PATH/ventoy_dm_table
if [ -z "$2" ]; then
$VT_DM_BIN create ventoy $VTOY_PATH/ventoy_dm_table >>$VTLOG 2>&1
else
$VT_DM_BIN "$2" create ventoy $VTOY_PATH/ventoy_dm_table >>$VTLOG 2>&1
fi
} }
create_persistent_device_mapper() { create_persistent_device_mapper() {
@@ -507,6 +583,9 @@ ventoy_create_persistent_link() {
VTLABEL=casper-rw VTLABEL=casper-rw
fi fi
echo "$VTLABEL" > $VTOY_PATH/ventoy_persistent_label
echo "/dev/$vtDM" > $VTOY_PATH/ventoy_persistent_dev
vtlog "Persistent Label: ##${VTLABEL}##" vtlog "Persistent Label: ##${VTLABEL}##"
if ! [ -e /dev/disk/by-label/$VTLABEL ]; then if ! [ -e /dev/disk/by-label/$VTLABEL ]; then
@@ -583,6 +662,57 @@ ventoy_udev_disk_common_hook() {
fi fi
} }
ventoy_create_wrapper_dm() {
if echo $1 | $EGREP -q "nvme.*p[0-9]$|mmc.*p[0-9]$|nbd.*p[0-9]$"; then
VTDISK="${1:0:-2}"
else
VTDISK="${1:0:-1}"
fi
if [ -e /vtoy/vtoy ]; then
VTRWMOD=""
else
VTRWMOD="--readonly"
fi
# create device mapper for iso image file
if create_ventoy_wrapper_device_mapper "/dev/$VTDISK" $VTRWMOD; then
vtlog "==== create wrapper ventoy device mapper success ===="
else
vtlog "==== create wrapper ventoy device mapper failed ===="
$SLEEP 3
if $GREP -q "/dev/$VTDISK" /proc/mounts; then
$GREP "/dev/$VTDISK" /proc/mounts | while read vtLine; do
vtPart=$(echo $vtLine | $AWK '{print $1}')
vtMnt=$(echo $vtLine | $AWK '{print $2}')
vtlog "$vtPart is mounted on $vtMnt now umount it ..."
$BUSYBOX_PATH/umount $vtMnt
done
fi
if create_ventoy_wrapper_device_mapper "/dev/$VTDISK" $VTRWMOD; then
vtlog "==== create wrapper ventoy device mapper success after retry ===="
else
vtlog "==== create wrapper ventoy device mapper failed after retry ===="
return
fi
fi
if [ "$2" = "noreplace" ]; then
vtlog "no need to replace block device"
else
ventoy_copy_device_mapper "/dev/$1"
fi
if [ -f $VTOY_PATH/ventoy_persistent_map ]; then
create_persistent_device_mapper "/dev/$VTDISK"
ventoy_create_persistent_link
fi
}
ventoy_create_dev_ventoy_part() { ventoy_create_dev_ventoy_part() {
blkdev_num=$($VTOY_PATH/tool/dmsetup ls | $GREP ventoy | $SED 's/.*(\([0-9][0-9]*\),.*\([0-9][0-9]*\).*/\1 \2/') blkdev_num=$($VTOY_PATH/tool/dmsetup ls | $GREP ventoy | $SED 's/.*(\([0-9][0-9]*\),.*\([0-9][0-9]*\).*/\1 \2/')
$BUSYBOX_PATH/mknod -m 0666 /dev/ventoy b $blkdev_num $BUSYBOX_PATH/mknod -m 0666 /dev/ventoy b $blkdev_num
@@ -602,6 +732,37 @@ ventoy_create_dev_ventoy_part() {
} }
ventoy_remove_all_dm() {
if [ -e /vtoy_dm_table ]; then
vtPartid=1
$CAT /vtoy_dm_table | while read vtline; do
vtlog "dmsetup remove ventoy${vtPartid}"
$VTOY_PATH/tool/dmsetup remove ventoy${vtPartid}
vtPartid=$(expr $vtPartid + 1)
done
fi
vtlog "dmsetup remove ventoy"
$VTOY_PATH/tool/dmsetup remove ventoy >> $VTLOG 2>&1
rm -f /dev/ventoy*
if [ -e $VTOY_PATH/ventoy_raw_dm_done ]; then
vtlog "dmsetup remove VentoyPart"
$VTOY_PATH/tool/dmsetup remove VentoyPart
rm -f $VTOY_PATH/ventoy_iso_part_dm_cmd
fi
if [ -e $VTOY_PATH/persistent_dm_table ]; then
if $VTOY_PATH/tool/dmsetup ls | $GREP -qw vtoy_persistent; then
vtlog "dmsetup remove vtoy_persistent"
$VTOY_PATH/tool/dmsetup remove vtoy_persistent
else
vtlog "no need to remove DM vtoy_persistent"
fi
fi
}
ventoy_create_chromeos_ventoy_part() { ventoy_create_chromeos_ventoy_part() {
blkdev_num=$($VTOY_PATH/tool/dmsetup ls | $GREP ventoy | $SED 's/.*(\([0-9][0-9]*\),.*\([0-9][0-9]*\).*/\1 \2/') blkdev_num=$($VTOY_PATH/tool/dmsetup ls | $GREP ventoy | $SED 's/.*(\([0-9][0-9]*\),.*\([0-9][0-9]*\).*/\1 \2/')
$BUSYBOX_PATH/mknod -m 0666 /dev/ventoy b $blkdev_num $BUSYBOX_PATH/mknod -m 0666 /dev/ventoy b $blkdev_num
@@ -719,3 +880,212 @@ ventoy_wait_dir() {
fi fi
done done
} }
ventoy_load_iso_part_fs_ko() {
vtFS=$($VTOY_PATH/tool/vtoydump -s /ventoy/ventoy_os_param)
vtlog "ISO part FS is $vtFS"
for vtModProbe in /usr/sbin/modprobe /sbin/modprobe /bin/modprobe $BUSYBOX_PATH/modprobe; do
if [ -e $vtModProbe ]; then
break
fi
done
vtlog "modprobe is $vtModProbe"
if [ "$vtFS" = "ext" ]; then
vtlog "modprobe ext2/3/4"
$vtModProbe ext2 >> $VTLOG 2>&1
$vtModProbe ext3 >> $VTLOG 2>&1
$vtModProbe ext4 >> $VTLOG 2>&1
elif [ "$vtFS" = "ntfs" ]; then
vtlog "modprobe ntfs3"
$vtModProbe ntfs3 >> $VTLOG 2>&1
elif [ "$vtFS" = "fat" ]; then
vtlog "modprobe vfat"
$vtModProbe vfat >> $VTLOG 2>&1
else
vtlog "modprobe $vtFS"
$vtModProbe $vtFS >> $VTLOG 2>&1
fi
}
ventoy_iso_part_fs_supported() {
vtFS=$($VTOY_PATH/tool/vtoydump -s /ventoy/ventoy_os_param)
if [ "$vtFS" = "ext" ]; then
vtPattern='ext[2-4]'
elif [ "$vtFS" = "fat" ]; then
vtPattern='vfat'
elif [ "$vtFS" = "ntfs" ]; then
vtPattern='ntfs3'
else
vtPattern="$vtFS"
fi
vtlog "vtFS=$vtFS Pattern=$vtPattern"
if $EGREP -q "$vtPattern" /proc/filesystems; then
vtlog "ISO part FS supported OK"
$BUSYBOX_PATH/true
else
vtlog "ISO part FS is NOT supported"
$BUSYBOX_PATH/false
fi
}
ventoy_mount_iso_part() {
vtDisk=$1
vtMnt=$2
vtlog "mount iso partition $vtDisk"
if [ -z "$vtMnt" ]; then
vtMnt=$VTOY_PATH/tmpmnt
fi
mkdir -p $vtMnt
if echo $vtDisk | $EGREP -q "nvme|mmc|nbd"; then
vtpart1=${vtDisk}p1
else
vtpart1=${vtDisk}1
fi
vtFS=$($VTOY_PATH/tool/vtoydump -s /ventoy/ventoy_os_param)
if [ "$vtFS" = "ntfs" ]; then
vtlog "mount -t ntfs3 $vtpart1 $vtMnt"
mount -t ntfs3 $vtpart1 $vtMnt >> $VTLOG 2>&1
elif [ "$vtFS" = "fat" ]; then
vtlog "mount -t vfat $vtpart1 $vtMnt"
mount -t vfat $vtpart1 $vtMnt >> $VTLOG 2>&1
else
vtlog "mount $vtpart1 $vtMnt"
mount $vtpart1 $vtMnt >> $VTLOG 2>&1
fi
}
ventoy_losetup_iso() {
vtMnt=$1
if [ -z "$vtMnt" ]; then
vtMnt=$VTOY_PATH/tmpmnt
fi
for vtLosetup in /usr/sbin/losetup /sbin/losetup /bin/losetup $BUSYBOX_PATH/losetup; do
if [ -e $vtLosetup ]; then
break
fi
done
vtisoname=$(get_ventoy_iso_name)
dd if=/dev/zero of=/ventoy/isoheader.bin bs=512 count=1 >/dev/null 2>&1
dd if="${vtMnt}${vtisoname}" bs=512 skip=1 count=64 >>/ventoy/isoheader.bin 2>>/dev/null
vtfreeloop1=$($vtLosetup -f)
if $vtLosetup -r $vtfreeloop1 /ventoy/isoheader.bin >> $VTLOG 2>&1; then
vtfreeloop2=$($vtLosetup -f)
if $vtLosetup -r --offset=33280 $vtfreeloop2 "${vtMnt}${vtisoname}" >> $VTLOG 2>&1; then
echo -n "$vtfreeloop1 $vtfreeloop2" > /ventoy/vtoy_dm_loop_dev
fi
fi
}
ventoy_mount_iso() {
if [ "$1" = "ko" ]; then
shift
ventoy_load_iso_part_fs_ko
fi
if ventoy_iso_part_fs_supported; then
if ventoy_mount_iso_part $1; then
if ventoy_losetup_iso; then
create_ventoy_loop_device_mapper $($CAT /ventoy/vtoy_dm_loop_dev)
return
else
vtlog "losetup ISO file FAILED"
fi
else
vtlog "mount iso partition FAILED"
fi
fi
$BUSYBOX_PATH/false
}
ventoy_init_udev_auto_rules() {
ventoy_copy_file /ventoy/hook/default/11-ventoy-dm.rules /etc/udev/rules.d/11-ventoy-dm.rules 0644
}
ventoy_new_root_dir() {
for vroot in sysroot newroot new_root root live/aufs pup_new; do
if [ -d $vroot/etc/udev/rules.d ]; then
echo "$vroot"
return
fi
done
echo ''
}
ventoy_copy_udev_auto_rules() {
if ! [ -e $VTOY_PATH/ventoy_raw_dm_done ]; then
vtlog "ventoy_raw_dm_done not exist, no need for udev auto rule"
return
fi
vtlog "==== Copy udev auto rules ===="
vroot=$(ventoy_new_root_dir)
if [ -z "$vroot" ]; then
vtlog "no new root found"
return
else
vtlog "new root is $vroot"
fi
cp -a /ventoy/hook/default/90-ventoy-auto.rules /ventoy/udevtmp.rules
vtDM=$($VTOY_PATH/tool/dmsetup info VentoyPart | $GREP Major | $SED "s/.*[^0-9]\([0-9][0-9]*\)$/\1/")
$SED "s/DMXXX/dm-${vtDM}/g" -i /ventoy/udevtmp.rules
vtRAWDISKNAME=$($HEAD -n1 $VTOY_PATH/ventoy_raw_table | $AWK '{print $4}')
$SED "s/yyy/${vtRAWDISKNAME#/dev/}/g" -i /ventoy/udevtmp.rules
vtlog "VentoyPart is /dev/dm-${vtDM} map to $vtRAWDISKNAME NewRoot is $vroot"
ventoy_copy_file /ventoy/udevtmp.rules $vroot/etc/udev/rules.d/90-ventoy-auto.rules 0644
ventoy_copy_file /ventoy/udevtmp.rules $vroot/etc/udev/rules.d/11-ventoy-auto.rules 0644
if $GREP -q 'init=.*sysvinit' /proc/cmdline; then
vtlog "copy sysvinit udev trigger script"
cp -a /ventoy/hook/default/ventoy-udev-trigger.rc /ventoy/udevtmp.rc
$SED "s/DMXXX/dm-${vtDM}/g" -i /ventoy/udevtmp.rc
mkdir -p $vroot/etc/boot.d
ventoy_copy_file /ventoy/udevtmp.rc $vroot/etc/boot.d/S01-ventoy-udev-trigger 0755
elif [ -d $vroot/etc/systemd/system ]; then
vtlog "copy systemd udev trigger service"
mkdir -p $vroot/etc/systemd/system/sysinit.target.wants
cp -a /ventoy/hook/default/ventoy-udev-trigger.service /ventoy/udevtmp.service
$SED "s/DMXXX/dm-${vtDM}/g" -i /ventoy/udevtmp.service
ventoy_copy_file /ventoy/udevtmp.service $vroot/etc/systemd/system/ventoy-udev-trigger.service 0644
mkdir -p $vroot/etc/systemd/system-preset
echo 'enable ventoy-udev-trigger.service' > $vroot/etc/systemd/system-preset/80-ventoy-udev.preset
$BUSYBOX_PATH/ln -sf /etc/systemd/system/ventoy-udev-trigger.service $vroot/etc/systemd/system/sysinit.target.wants/ventoy-udev-trigger.service
else
vtlog "sysinit wants dir not exist"
fi
}
ventoy_dracut_pivot_udev_rule() {
echo "#!/bin/sh" > $VT_DRACUT_HOOKS/pre-pivot/99-ventoy-udev-rules.sh
echo "/ventoy/busybox/sh $VTOY_PATH/hook/default/ventoy-pivot-udev-rule.sh" >> $VT_DRACUT_HOOKS/pre-pivot/99-ventoy-udev-rules.sh
}
ventoy_dracut_pivot_selinux_off() {
echo "#!/bin/sh" > $VT_DRACUT_HOOKS/pre-pivot/99-ventoy-selinux-off.sh
echo "/ventoy/busybox/sh $VTOY_PATH/hook/default/ventoy-pivot-selinux-off.sh" >> $VT_DRACUT_HOOKS/pre-pivot/99-ventoy-selinux-off.sh
}
+20
View File
@@ -22,6 +22,13 @@ VT_PRINTK_LEVEL=0
VT_UDEV_RULE_FILE_NAME="99-ventoy.rules" VT_UDEV_RULE_FILE_NAME="99-ventoy.rules"
VT_UDEV_RULE_PREFIX="ACTION==\"add\", SUBSYSTEM==\"block\"," VT_UDEV_RULE_PREFIX="ACTION==\"add\", SUBSYSTEM==\"block\","
if [ -d /var/lib/dracut/hooks ]; then
VT_DRACUT_HOOKS=/var/lib/dracut/hooks
else
VT_DRACUT_HOOKS=/lib/dracut/hooks
fi
ventoy_close_printk() { ventoy_close_printk() {
VT_PRINTK_LEVEL=$($CAT /proc/sys/kernel/printk | $AWK '{print $1}') VT_PRINTK_LEVEL=$($CAT /proc/sys/kernel/printk | $AWK '{print $1}')
if [ -e /proc/sys/kernel/printk ]; then if [ -e /proc/sys/kernel/printk ]; then
@@ -56,6 +63,14 @@ ventoy_get_udev_conf_path() {
echo "$VT_RULE_DIR/$VT_UDEV_RULE_FILE_NAME" echo "$VT_RULE_DIR/$VT_UDEV_RULE_FILE_NAME"
} }
ventoy_add_udev_auto_rule() {
VT_RULE_DIR=$(ventoy_get_udev_conf_dir)
cp -a $VTOY_PATH/hook/default/90-ventoy-auto.rules $VT_RULE_DIR/11-ventoy-auto.rules
cp -a $VTOY_PATH/hook/default/90-ventoy-auto.rules $VT_RULE_DIR/90-ventoy-auto.rules
chmod 0644 $VT_RULE_DIR/*ventoy*
}
ventoy_add_kernel_udev_rule() { ventoy_add_kernel_udev_rule() {
VT_UDEV_RULE_PATH=$(ventoy_get_udev_conf_path) VT_UDEV_RULE_PATH=$(ventoy_get_udev_conf_path)
echo "KERNEL==\"$1\", $VT_UDEV_RULE_PREFIX RUN+=\"$2\"" >> $VT_UDEV_RULE_PATH echo "KERNEL==\"$1\", $VT_UDEV_RULE_PREFIX RUN+=\"$2\"" >> $VT_UDEV_RULE_PATH
@@ -171,3 +186,8 @@ ventoy_iso_scan_check() {
[ $vtCheckOk -eq 1 ] [ $vtCheckOk -eq 1 ]
} }
ventoy_wrapper_dracut_hook() {
echo "#/bin/sh" > $2
echo "$BUSYBOX_PATH/sh $1" >> $2
}
+119
View File
@@ -0,0 +1,119 @@
#!/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
if is_ventoy_hook_finished; then
exit 0
fi
vtlog "####### $0 $* ########"
VTPATH_OLD=$PATH; PATH=$BUSYBOX_PATH:$VTOY_PATH/tool:$PATH
wait_for_usb_disk_ready
vtdiskname=$(get_ventoy_disk_name)
if [ "$vtdiskname" = "unknown" ]; then
vtlog "ventoy disk not found"
exit 0
fi
/usr/bin/insmod $VTOY_PATH/modules/dm-mod.ko*
ventoy_udev_disk_common_hook "${vtdiskname#/dev/}2" "noreplace"
ventoy_create_dev_ventoy_part
mkdir -p /ventoy/tmpmnt
mount /dev/ventoy3 /ventoy/tmpmnt
mount --bind /ventoy/tmpmnt/lib/modules /lib/modules
for mod in loop iso9660 ntfs ntfs3 exfat ext2 ext3 ext4 xfs btrfs; do
vtlog "modprobe $mod"
/usr/bin/modprobe $mod >> $VTLOG 2>&1
done
umount /lib/modules
umount /ventoy/tmpmnt
ventoy_remove_all_dm
vtimgname=$(get_ventoy_iso_name)
if [ "$vtimgname" = "unknown" -o -z "$vtimgname" ]; then
vterr "image file path not found"
exit 0
fi
if echo "$vtdiskname" | $EGREP -q "nvme|mmc|nbd"; then
vtdatapart=${vtdiskname}p1
else
vtdatapart=${vtdiskname}1
fi
# rw: the holo hook mounts the image rootfs rw
mkdir -p /run/ventoy-media
if mount "$vtdatapart" /run/ventoy-media >>$VTLOG 2>&1; then
vtlog "mounted $vtdatapart at /run/ventoy-media OK"
mount | grep ventoy >>$VTLOG 2>&1
else
vtlog "mounted $vtdatapart at /run/ventoy-media failed"
exit 0
fi
vtimgfile="/run/ventoy-media${vtimgname}"
if ! [ -f "$vtimgfile" ]; then
vterr "$vtimgfile not found on data partition"
umount /run/ventoy-media >>$VTLOG 2>&1
exit 0
fi
vtloopdev=$(losetup -f)
if [ -z "$vtloopdev" ]; then
vterr "no free loop device"
exit 0
fi
if ! losetup -P "$vtloopdev" "$vtimgfile" >>$VTLOG 2>&1; then
vterr "losetup $vtloopdev $vtimgfile failed"
exit 0
fi
vtlog "attached $vtimgfile to $vtloopdev"
vtloop=0
while ! [ -e "${vtloopdev}p2" ]; do
let vtloop=vtloop+1
if [ $vtloop -gt 10 ]; then
break
fi
$SLEEP 0.3
done
# exact /dev path avoids PARTLABEL/LABEL/UUID collisions with an installed SteamOS
if [ -e "${vtloopdev}p2" ]; then
ln -s "${vtloopdev}p2" /dev/steamos-media-efi
vtlog "/dev/steamos-media-efi -> ${vtloopdev}p2"
else
vterr "${vtloopdev}p2 not created, partition scan failed"
fi
@@ -0,0 +1,33 @@
#!/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/>.
#
#************************************************************************************
. $VTOY_PATH/hook/ventoy-os-lib.sh
# inject the disk hook before the run_hook phase of the stock mkinitcpio /init
# if $GREP -q "run_hookfunctions 'run_hook' 'hook'" /init; then
# echo "insert ventoy-disk.sh before run_hook" >> $VTLOG
# $SED "/run_hookfunctions 'run_hook' 'hook'/i\\$BUSYBOX_PATH/sh $VTOY_PATH/loop/steamos/ventoy-disk-new.sh" -i /init
# else
# echo "run_hook anchor not found in /init" >> $VTLOG
# fi
$SED "s/udev /udev ventoy /g" -i /config
cp -a $VTOY_PATH/loop/steamos/ventoy.hook /hooks/ventoy
+16
View File
@@ -0,0 +1,16 @@
#!/usr/bin/ash
run_earlyhook() {
:
}
run_hook() {
msg ":: Ventoy hook..."
/ventoy/busybox/sh /ventoy/loop/steamos/ventoy-disk.sh
}
run_cleanuphook() {
:
}
# vim: set ft=sh ts=4 sw=4 et:
+30 -5
View File
@@ -100,7 +100,11 @@ ventoy_get_os_type() {
echo 'rhel7'; return echo 'rhel7'; return
elif $GREP -q 'euleros' /proc/version; then elif $GREP -q 'euleros' /proc/version; then
echo 'rhel7'; return if [ -d /usr/Euler/project/init ]; then
echo 'euleros'; return
else
echo 'rhel7'; return
fi
# SUSE # SUSE
elif $GREP -q 'SUSE' /proc/version; then elif $GREP -q 'SUSE' /proc/version; then
@@ -169,7 +173,7 @@ ventoy_get_os_type() {
echo 'debian'; return echo 'debian'; return
elif $GREP -q 'Solus' /etc/os-release; then elif $GREP -q 'Solus' /etc/os-release; then
echo 'rhel7'; return echo 'rhel7'; return
elif $GREP -q 'openEuler' /etc/os-release; then elif $GREP -q -i 'openEuler' /etc/os-release; then
echo 'openEuler'; return echo 'openEuler'; return
elif $GREP -q 'fuyu' /etc/os-release; then elif $GREP -q 'fuyu' /etc/os-release; then
echo 'openEuler'; return echo 'openEuler'; return
@@ -177,6 +181,10 @@ ventoy_get_os_type() {
echo 'deepin'; return echo 'deepin'; return
elif $GREP -q 'chinauos' /etc/os-release; then elif $GREP -q 'chinauos' /etc/os-release; then
echo 'deepin'; return echo 'deepin'; return
elif $GREP -qi 'aerynos' /etc/os-release; then
echo 'rhel7'; return
elif $GREP -qi 'ID_LIKE=debian' /etc/os-release; then
echo 'debian'; return
fi fi
fi fi
@@ -312,8 +320,8 @@ ventoy_get_os_type() {
fi fi
if [ -e /init ]; then if [ -e /etc/initrd-release ]; then
if $GREP -q -m1 'T2 SDE' /init; then if $GREP -q -m1 't2sde' /etc/initrd-release; then
echo 't2'; return echo 't2'; return
fi fi
fi fi
@@ -373,6 +381,13 @@ ventoy_get_os_type() {
echo 'openEuler'; return echo 'openEuler'; return
fi fi
fi fi
if [ -f /etc/kylin-release ]; then
if $GREP -i -q -m1 'Kylin.*Server.* V1[1-9] ' /etc/kylin-release; then
echo 'openEuler'; return
fi
fi
if $GREP -q 'chimera' /proc/version; then if $GREP -q 'chimera' /proc/version; then
echo 'chimera'; return echo 'chimera'; return
@@ -391,6 +406,9 @@ ventoy_get_os_type() {
fi fi
fi fi
if [ -f /scripts/casper ]; then
echo "debian"; return
fi
echo "default" echo "default"
} }
@@ -400,6 +418,9 @@ echo "OS=###${VTOS}###" >>$VTLOG
if [ -e "$VTOY_PATH/hook/$VTOS/ventoy-hook.sh" ]; then if [ -e "$VTOY_PATH/hook/$VTOS/ventoy-hook.sh" ]; then
$BUSYBOX_PATH/sh "$VTOY_PATH/hook/$VTOS/ventoy-hook.sh" $BUSYBOX_PATH/sh "$VTOY_PATH/hook/$VTOS/ventoy-hook.sh"
fi fi
if [ -e "$VTOY_PATH/hook/$VTOS/ventoy-uauto-hook.sh" ]; then
$BUSYBOX_PATH/sh "$VTOY_PATH/hook/$VTOS/ventoy-uauto-hook.sh"
fi
@@ -425,7 +446,11 @@ fi
# # # #
#################################################################### ####################################################################
if [ -f "/live_injection_7ed136ec_7a61_4b54_adc3_ae494d5106ea/hook.sh" ]; then if [ -f "/live_injection_7ed136ec_7a61_4b54_adc3_ae494d5106ea/hook.sh" ]; then
$BUSYBOX_PATH/sh "/live_injection_7ed136ec_7a61_4b54_adc3_ae494d5106ea/hook.sh" $VTOS echo "==== Begin Call live injection hook.sh $VTOS" >> $VTLOG
$BUSYBOX_PATH/sh "/live_injection_7ed136ec_7a61_4b54_adc3_ae494d5106ea/hook.sh" $VTOS >>$VTLOG 2>&1
echo "==== Finish Call live injection hook.sh $VTOS" >> $VTLOG
else
echo "No live injection" >> $VTLOG
fi fi
+4 -4
View File
@@ -43,7 +43,7 @@ done
# # # #
#################################################################### ####################################################################
$BUSYBOX_PATH/mkdir -p /ventoy/modules $BUSYBOX_PATH/mkdir -p /ventoy/modules
$BUSYBOX_PATH/ls -1a / | $EGREP '\.ko$|\.ko.[gx]z$' | while read vtline; do $BUSYBOX_PATH/ls -1a / | $EGREP '\.ko$|\.ko.[gx]z$|\.ko.zst$' | while read vtline; do
if [ "${vtline:0:1}" = "." ]; then if [ "${vtline:0:1}" = "." ]; then
$BUSYBOX_PATH/mv /${vtline} /ventoy/modules/${vtline:1} $BUSYBOX_PATH/mv /${vtline} /ventoy/modules/${vtline:1}
else else
@@ -205,7 +205,7 @@ ventoy_get_os_type() {
echo 'debian'; return echo 'debian'; return
elif $GREP -q 'Solus' /etc/os-release; then elif $GREP -q 'Solus' /etc/os-release; then
echo 'rhel7'; return echo 'rhel7'; return
elif $GREP -q 'openEuler' /etc/os-release; then elif $GREP -q -i 'openEuler' /etc/os-release; then
echo 'openEuler'; return echo 'openEuler'; return
elif $GREP -q 'fuyu' /etc/os-release; then elif $GREP -q 'fuyu' /etc/os-release; then
echo 'openEuler'; return echo 'openEuler'; return
@@ -344,8 +344,8 @@ ventoy_get_os_type() {
fi fi
if [ -e /init ]; then if [ -e /etc/initrd-release ]; then
if $GREP -q -m1 'T2 SDE' /init; then if $GREP -q -m1 't2sde' /etc/initrd-release; then
echo 't2'; return echo 't2'; return
fi fi
fi fi
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+2 -1
View File
@@ -11,7 +11,8 @@ Ventoy2Disk.sh CMD [ OPTION ] /dev/sdX
OPTION: (optional) OPTION: (optional)
-r SIZE_MB preserve some space at the bottom of the disk (only for install) -r SIZE_MB preserve some space at the bottom of the disk (only for install)
-s enable secure boot support (default is disabled) -s enable secure boot support (default is enabled)
-S disable secure boot support (default is enabled)
-g use GPT partition style, default is MBR style (only for install) -g use GPT partition style, default is MBR style (only for install)
Please refer https://www.ventoy.net/en/doc_start.html for details. Please refer https://www.ventoy.net/en/doc_start.html for details.
+19 -10
View File
@@ -1,7 +1,5 @@
#!/bin/sh #!/bin/sh
OLDDIR=$(pwd)
if ! [ -f ./tool/ventoy_lib.sh ]; then if ! [ -f ./tool/ventoy_lib.sh ]; then
if [ -f ${0%Ventoy2Disk.sh}/tool/ventoy_lib.sh ]; then if [ -f ${0%Ventoy2Disk.sh}/tool/ventoy_lib.sh ]; then
cd ${0%Ventoy2Disk.sh} cd ${0%Ventoy2Disk.sh}
@@ -21,7 +19,7 @@ elif uname -m | grep -E -q 'mips64'; then
else else
export TOOLDIR=i386 export TOOLDIR=i386
fi fi
export PATH="./tool/$TOOLDIR:$PATH" export PATH="$(pwd)/tool/$TOOLDIR:$PATH"
echo '' echo ''
@@ -61,6 +59,24 @@ if [ $? -eq 0 ]; then
done done
fi fi
#use static linked mkexfatfs for musl-libc environment
if [ -f mkexfatfs_static ]; then
if ldd --version 2>&1 | grep -qi musl; then
mv mkexfatfs mkexfatfs_shared
mv mkexfatfs_static mkexfatfs
else
if ./mkexfatfs -V > /dev/null 2>&1; then
echo "mkexfatfs can not run, check static version" >> ./log.txt
else
if ./mkexfatfs_static -V > /dev/null 2>&1; then
echo "Use static version of mkexfatfs" >> ./log.txt
mv mkexfatfs mkexfatfs_shared
mv mkexfatfs_static mkexfatfs
fi
fi
fi
fi
cd ../../ cd ../../
chmod +x -R ./tool/$TOOLDIR chmod +x -R ./tool/$TOOLDIR
@@ -70,10 +86,3 @@ if [ -f /bin/bash ]; then
else else
ash ./tool/VentoyWorker.sh $* ash ./tool/VentoyWorker.sh $*
fi fi
if [ -n "$OLDDIR" ]; then
CURDIR=$(pwd)
if [ "$CURDIR" != "$OLDDIR" ]; then
cd "$OLDDIR"
fi
fi

Some files were not shown because too many files have changed in this diff Show More